如果每次对话都从零开始,Agent 很难持续理解用户和项目;如果把所有历史对话都塞回上下文,系统又会越来越慢、越来越容易受到旧信息干扰。记忆的本质不是“保存更多内容”,而是决定什么值得留下、什么时候取出、如何证明它仍然有效。
一、短期上下文和长期记忆
短期记忆是当前任务的工作区:最近的用户消息、工具结果、计划和未解决问题。它服务于当下决策,过期后可以压缩或丢弃。
长期记忆则跨越多个会话保存稳定信息,例如用户明确确认的偏好、项目的架构决策或已经验证的业务规则。长期记忆不应该等同于聊天记录,因为聊天记录包含大量试探、错误和一次性信息。
一条记忆至少应该带有内容、来源、时间和置信度。对于可能变化的事实,还需要失效时间或版本信息:
内容:项目使用 pnpm 作为包管理器
来源:仓库 package.json
确认时间:2026-09-01
状态:当前有效
二、记忆什么时候写入
自动把每句话都存下来,通常会得到一个噪声数据库。更稳妥的写入规则是:
- 用户明确要求记住的内容,进入候选记忆。
- 多次重复且对未来任务有帮助的事实,可以提升为长期记忆。
- 一次性的情绪、猜测和未验证结论,不应默认持久化。
- 涉及隐私或权限的数据,必须有明确的保存范围和删除方式。
写入前可以让一个独立步骤判断“未来是否会用到”和“来源是否足够可靠”,写入后再去重、分类并关联项目。记忆系统应该允许用户查看和删除,而不是只提供一个不可见的黑盒。
三、RAG 的链路不止是向量搜索
一个可解释的检索流程通常包含:
原始资料 -> 解析与切分 -> 建立索引 -> 查询改写 -> 召回 -> 重排 -> 上下文拼装
切分时要保留标题层级、代码块、表格和来源位置。只按固定字符数切块很容易把定义和条件拆开,导致召回的片段没有足够语义。
向量检索适合寻找语义相近的表达,关键词检索适合精确匹配错误码、类名、版本号和专有名词。两者结合后,再用重排模型根据当前问题重新排序,通常比单一检索更稳定:
| 方法 | 擅长 | 常见问题 |
|---|---|---|
| 稠密向量 | 同义表达、概念关联 | 精确标识符不一定稳定 |
| 稀疏/关键词 | 错误码、名称、版本 | 对改写和隐含语义不敏感 |
| 混合召回 | 同时覆盖语义和精确匹配 | 参数和成本更多 |
| 重排 | 结合完整问题判断相关性 | 增加延迟和计算量 |
四、检索结果也必须经过验证
召回了片段,不代表它就是答案。Agent 应该知道每个结论来自哪个文档、哪一段内容,以及文档是否已经过期。对于高风险任务,可以要求它输出证据引用,并在生成后检查结论是否真的被证据支持。
如果多个文档互相冲突,系统不应静默选择其中一个。应该保留版本和时间,明确提示冲突,或者把决策交给用户。知识库的“新鲜度”也是质量指标:一条过期但相关性很高的内容,可能比没有召回更危险。
五、让记忆成为可治理的数据
记忆和知识库都需要生命周期管理:创建、更新、失效、删除和审计。至少应该记录以下指标:
- 命中率:相关内容是否被召回。
- 证据覆盖:最终答案中的关键结论是否有来源。
- 新鲜度:使用的资料距离最后更新多久。
- 删除完成度:被删除的信息是否从索引、缓存和摘要中一并消失。
在 Agent 中,记忆不是越多越好。好的记忆系统会让模型少问重复问题,却不会让旧结论在没有证据时支配新的事实。
参考阅读
- 李博杰:《深入理解 AI Agent:设计原理与工程实践》,v1.3,2026-07-29。