1. Agent 为什么需要记忆
LLM 本身是无状态的:每次对话都从上下文重新开始。MCP 的记忆工具给 Agent 补上"记得住"的能力——记住用户偏好、历史决定、领域知识,跨会话复用。记忆是 Agent 从"每次重新认识你"进化到"越来越懂你"的关键基础设施。
1.1 记忆的类型
| 记忆类型 | 内容 | 存储形态 | 检索方式 |
|---|---|---|---|
| 短期记忆 | 当前会话上下文 | 对话窗口 | 直接包含 |
| 长期记忆 | 跨会话事实/偏好 | 外部存储 | 检索注入 |
| 语义记忆 | 知识/概念 | 向量/知识图谱 | 语义检索 |
| 程序性记忆 | 怎么做某事 | 工具/工作流 | 触发加载 |
1.2 MCP 记忆工具的价值
# 没有记忆工具: 每次会话都要重新交代偏好/历史
# 有记忆工具
# 1) 用户偏好: "上次你说喜欢简洁回复" → 跨会话生效
# 2) 项目上下文: "这个仓库的构建命令" → 记住
# 3) 决策历史: "上次选了方案 A 因为 X" → 避免重复纠结
# 4) 领域知识: 注入团队规范/业务知识
2. 记忆工具的基本模式
2.1 三类核心操作
# 记忆工具的经典三操作
# 1) 写入记忆: remember(key, content, metadata)
# 2) 检索记忆: recall(query, limit) → 相关记忆
# 3) 删除/更新: forget(key) / update(key, content)
# 工具命名示例
# memory/save / memory/search / memory/delete
# 原则: 记忆操作要可检索(不是"存了就忘")
2.2 写入的工程规范
# 写什么
# 1) 事实性记忆: 偏好、事实、决定(可验证)
# 2) 少写过程噪音: 别把每句对话都存(记忆污染)
# 3) 带元数据: 时间、来源、重要性、主题
# 4) 可冲突: 旧记忆与新事实冲突 → 更新而非堆叠
# 模型主动存 vs 工具自动存
# 主动: 模型判断"这值得记住"再存(精确,需模型判断力)
# 自动: 关键事件自动落库(全,但噪音多)
# 实践: 混合——自动捕获 + 模型精选
2.3 检索的工程规范
# 检索什么
# 1) 按主题/实体检索(结构化)
# 2) 按语义检索(向量,近似相关)
# 3) 时间范围过滤(近期优先)
# 检索结果注入上下文(不超过预算 token)
# 重要性: 检索要"少而准",别把记忆库全倒进上下文
3. 向量记忆与语义检索
3.1 语义记忆的形态
# 向量记忆: 把记忆文本向量化,按语义相似检索
# 适用: 自然语言描述的记忆(偏好、笔记、讨论)
# 优点: 不问"精确关键词"也能召回相关
# 需要: 向量存储(向量数据库/嵌入 + 索引)
# 工作流
# 1) 写入时: 内容 → 嵌入向量 → 存向量 + 原文
# 2) 检索时: 查询 → 嵌入 → 相似度 Top-K
3.2 向量工具的设计
# 工具: memory/search(query, topK)
# 服务器内部
# 1) 查询文本嵌入
# 2) 向量相似检索(余弦相似度)
# 3) 返回 Top-K(带分数,供模型判断相关度)
# 注意
# 1) 嵌入模型与写入/检索一致(同模型)
# 2) 阈值: 相似度低于阈值别硬给(避免无关记忆)
# 3) 结合关键词过滤(精确 vs 语义互补)
4. 结构化记忆与知识图谱
4.1 记忆图谱(实体-关系)
# 场景: 记住"用户与项目、决定、偏好的关系"
# 结构化存储: 实体(用户/项目/工具)+ 关系(属于/偏好/决定)
# 查询: "这个项目用了什么技术栈" → 实体关系检索
# 优点
# 1) 精确(关系明确)
# 2) 可推理(A 关联 B,B 关联 C → 间接)
# 3) 可更新(关系增删改)
# 代价: 维护成本高(实体抽取/关系建模)
4.2 图谱 vs 向量的选择
| 维度 | 向量记忆 | 记忆图谱 |
|---|---|---|
| 检索 | 语义相似 | 关系精确 |
| 查询类型 | “关于 X 的笔记” | “X 与 Y 的关系” |
| 维护 | 低(嵌入即可) | 高(结构化建模) |
| 更新 | 重嵌入 | 关系操作 |
| 组合 | 常用 | 精确场景 |
# 实践: 向量为主(覆盖大部分自然记忆)
# 图谱用于"关系密集"领域(项目/人员/决策)
# 可共存: 图谱实体也能向量化混合检索
5. 跨会话持久化的实现
5.1 存储后端选型
| 后端 | 特点 | 适用 |
|---|---|---|
| SQLite 本地 | 零部署、单用户 | 本机工具 |
| Redis | 快、可过期 | 短期偏好/缓存 |
| 向量库(Milvus/pgvector) | 语义检索 | 大规模记忆 |
| 文档库(对象存储) | 原始内容 | 长文档记忆 |
# 选型: 单用户本机 → SQLite;多用户服务 → 服务器数据库
# 记忆是"长期资产": 选可靠持久化(别存内存/临时)
5.2 一致性与版本
# 记忆更新的并发
# 同一记忆并发写 → 版本号 + 乐观锁
# 冲突: 新事实覆盖旧事实要可追溯(保留历史或 diff)
# 删除: 用户要求删除记忆 → 真删(含向量索引)
# 备份: 记忆是用户资产,定期备份/导出
5.3 记忆的上下文预算
# 检索注入必须控制 token
# 1) 检索 Top-K 按预算限制
# 2) 记忆条目截断(只注入关键部分)
# 3) 模型可"需要更多时再深查"(分级注入)
# 4) 别把整个记忆库塞进上下文(超预算 + 噪音)
6. 记忆的隐私与治理
6.1 记忆即用户数据
# 记忆可能包含敏感信息(偏好、联系方式、业务秘密)
# 治理要求
# 1) 明确告知: 用户知道"Agent 记住了什么"
# 2) 可查看: 提供"查看我的记忆"工具
# 3) 可删除: 一键清除(GDPR 删除权意识)
# 4) 最小化: 只存必要信息,不默认全存
# 5) 加密: 敏感记忆加密存储(见安全实践)
6.2 记忆的边界
# 记忆使用边界
# 1) 单用户记忆隔离(别串用户)
# 2) 团队/共享记忆: 权限控制(谁能看/写)
# 3) 敏感记忆: 默认不自动写,需确认
# 4) 过期清理: 不重要记忆定期清理(防污染检索)
7. 记忆错误的防护
7.1 三类记忆错误
| 错误 | 表现 | 防护 |
|---|---|---|
| 幻觉记忆 | 模型"以为"记住了不存在的事 | 检索带来源 + 置信度 |
| 过期记忆 | 事实变了仍按旧记忆回答 | 带时间戳 + 更新机制 |
| 记忆污染 | 噪音/错误写入干扰检索 | 写入质量门 + 定期清理 |
7.2 让记忆"可证伪"
# 记忆应带来源与时间(谁、何时、从哪来)
# 回答时基于记忆但可质疑: "根据 3 月的记录……"
# 冲突时: 多个记忆冲突 → 显式标注,别静默选一个
# 用户纠正: 提供"纠正记忆"的路径(更新而非追加)
8. 记忆工具的测试
# 1) 写入-检索闭环: 存 → 语义检索能召回
# 2) 冲突更新: 新记忆覆盖旧记忆,检索返回新值
# 3) 过期清理: 过期条目被排除在检索外
# 4) 隔离: 多用户记忆互不串
# 5) 删除: 删除后检索不到(含向量)
# 6) 上下文预算: 检索注入不超过限制
9. 常见陷阱
- 记忆污染:把所有对话都存,检索全是噪音——只存值得记的。
- 记忆幻觉:检索到的记忆当作"当前事实",不核对时间/来源。
- 串用户:多用户共用记忆库,隐私泄露。
- 遗忘能力缺失:只有"存"和"取",没有"改"和"删"。
- 上下文爆炸:记忆检索超预算,反而稀释主上下文。
10. 总结
MCP 记忆与持久化工具的工程要点:记该记的(事实/偏好)、检索少而准、可查看可删除、带时间来源。向量记忆服务语义检索、图谱服务关系查询、存储选可靠后端、隐私治理当用户数据对待。记忆让 Agent 从"每次重新认识"进化为"越来越懂"——但要有克制地记、有把握地用、有边界的存。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。