导语:当 Agent 从“一问一答”走向“长期协作”,记忆系统就不再是附加功能,而是决定体验上限的基础设施。一个好的 Agent 记忆系统,既要让用户感到“它懂我” 🙂,又要避免把所有历史都塞进上下文,造成成本、隐私和错误累积问题。本文围绕 Agent 记忆系统设计的思路与实践,分享一套可落地的设计方法。
一、为什么 Agent 需要记忆?
传统聊天机器人通常只依赖当前输入和有限上下文,适合短任务;但 Agent 往往要持续完成目标,例如长期跟进项目、维护用户偏好、复用工具调用结果、根据历史行为调整回复方式。没有记忆,Agent 每次都像“失忆重启”;记忆设计不好,又可能变成“什么都记、什么都信”的风险源。
实用的 Agent 记忆系统,本质上是在回答三个问题:记什么、怎么记、何时用。例如 LangGraph 文档将记忆分为短期记忆和长期记忆:短期记忆用于同一会话或线程内的多轮上下文,长期记忆用于跨会话保存用户级或应用级信息 [1]。这个分类非常适合作为工程设计的起点。
二、记忆的基本分层
1. 短期记忆:维持当前任务连续性
短期记忆关注“当前对话正在发生什么”。它通常包括最近消息、当前任务状态、工具调用结果、中间推理状态等。比如用户先说“帮我整理这份方案”,后面又说“把第二部分改得更简洁”,Agent 必须知道“第二部分”指代什么。
工程上,短期记忆常通过 thread_id、session_id 或 conversation_id 绑定。LangGraph 提供 checkpointer 思路,让 Agent 在同一 thread_id 下保存和恢复状态;生产环境通常不建议只用内存存储,而应使用数据库等持久化方案 [1]。
2. 长期记忆:沉淀可复用信息
长期记忆关注“未来还会有价值的信息”。它可以包括用户偏好、稳定身份信息、项目背景、团队规则、常用输出格式、历史决策等。LangChain 的长期记忆文档提到,长期记忆可跨不同 conversation 和 session 被存储与召回,并可按 namespace 和 key 组织为 JSON 文档 [2]。
但长期记忆不是聊天记录归档。真正有价值的是经过抽取、压缩和验证后的结构化信息。例如“用户喜欢简洁回答”比保存十段原始聊天更有用;“项目 A 的目标用户是中小企业采购负责人”比散落在多个对话中的描述更适合检索。
3. 工作记忆:服务当前推理过程
除了短期和长期,还可以引入“工作记忆”。它不一定长期保存,而是在一次任务执行中记录计划、步骤、约束、草稿和工具结果。工作记忆的生命周期通常比单条消息长,但比长期记忆短。它适合复杂任务,例如代码迁移、报告生成、客户问题排查等。
三、记忆系统的核心设计思路
1. 先定义记忆 Schema
不要一开始就把所有内容写入向量库。更稳妥的方式是先定义记忆类型和字段,例如:
- 用户偏好:语言、语气、格式、常用单位、禁用风格。
- 事实信息:姓名、角色、组织、项目背景,但必须注意隐私和授权。
- 任务状态:待办事项、截止时间、当前进度、依赖关系。
- 领域知识:业务术语、产品规则、流程说明。
- 反馈记录:用户明确指出的错误、偏好修正和质量要求。
Schema 的好处是可控、可审计、可更新。相比“整段文本直接入库”,结构化记忆更容易判断冲突、过期和适用范围。
2. 写入记忆要有门槛
Agent 不应把每一句话都当成长期记忆。建议设计写入规则:只有当信息具有稳定性、可复用性、明确表达或用户授权时,才进入长期记忆。例如“我今天有点累”通常不应保存;“以后请用简体中文、分点回答”则适合作为偏好保存。
实践中可以将写入分为三类:自动写入、待确认写入、禁止写入。低风险偏好可以自动写入;身份、健康、财务等敏感信息应谨慎处理;临时情绪、密码、令牌、一次性验证码等应禁止保存。
3. 召回记忆要看场景
记忆召回不是越多越好。过多记忆会污染上下文,让 Agent 误用旧信息。建议按任务意图、用户身份、时间范围、命名空间和相似度进行筛选。长期记忆可结合关键词检索、向量检索和规则过滤;短期记忆则可使用摘要、裁剪等方式减少上下文压力。LangGraph 相关文档也提到,长对话可能超出模型上下文窗口,常见处理方式包括摘要和裁剪 [3]。
4. 记忆需要更新和遗忘
记忆不是一次写入、永久正确。用户偏好可能变化,项目状态可能更新,旧事实可能失效。因此记忆系统必须支持覆盖、版本、过期时间和删除。尤其在用户明确说“不要再记住这个”或“之前那个规则作废”时,系统需要能定位相关记忆并执行删除或失效处理。
一个成熟的记忆系统,不只是会记住,更要会判断什么该忘、什么已过期、什么需要再次确认。
四、推荐的工程架构
一个实用架构可以拆成五层:
- 采集层:接收用户输入、系统事件、工具调用结果和反馈。
- 抽取层:从原始内容中提取候选记忆,转换为结构化字段。
- 决策层:判断是否写入、更新、合并、忽略或请求确认。
- 存储层:分别保存短期状态、长期结构化记忆、向量索引和审计日志。
- 召回层:根据当前任务选择相关记忆,并注入到 Agent 上下文。
存储选型上,短期状态适合 Redis、PostgreSQL、MongoDB 或框架自带 checkpointer;长期结构化记忆适合关系型数据库或文档数据库;语义检索可使用向量索引。LangChain 长期记忆文档中的 namespace 与 key 组织方式,适合借鉴到多用户、多应用场景中 [2]。
五、实践中的关键细节
1. 给记忆加元数据
每条记忆应包含来源、创建时间、更新时间、置信度、适用范围、敏感级别和过期策略。这样 Agent 在召回时不仅知道“内容是什么”,还知道“是否可信、是否新鲜、是否适合使用”。
2. 避免记忆冲突
当新旧记忆冲突时,不要简单追加。例如旧记忆是“用户喜欢详细解释”,新记忆是“以后回答请简短”,系统应更新偏好,而不是同时保存两条互相矛盾的规则。可以设计 conflict_key,如 language_preference、answer_style、project_deadline,用于合并和覆盖。
3. 区分事实与推断
“用户说自己是产品经理”是事实陈述;“用户可能不懂技术”是模型推断。长期记忆应优先保存明确事实和用户授权的偏好,尽量避免保存未经确认的推断。这样可以降低偏见和误判。
4. 提供可见性和控制权
面向真实用户的 Agent,最好提供“查看我的记忆”“删除某条记忆”“关闭记忆”“本次对话不写入记忆”等能力。记忆越强,越需要透明和可控。用户信任往往来自可解释,而不是神秘感。
六、一个简单的落地流程
可以从最小可用版本开始:
- 先实现短期记忆,保证同一会话内上下文连续。
- 增加会话摘要,避免长对话超过上下文窗口。
- 定义 3 到 5 类长期记忆 Schema,例如偏好、项目、任务、反馈。
- 设置严格写入规则,只保存明确、稳定、可复用的信息。
- 为每条记忆增加元数据,支持更新、删除和过期。
- 建立召回评估集,观察记忆是否真正改善任务完成质量。
这个流程的优势是风险可控。团队不必一开始就构建复杂的“全知记忆库”,而是围绕真实业务场景逐步扩展。
总结
Agent 记忆系统的目标,不是让模型保存更多内容,而是让它在正确时间使用正确信息。短期记忆解决对话连续性,长期记忆解决跨会话个性化,工作记忆支撑复杂任务执行。真正可靠的设计,需要 Schema、写入门槛、召回策略、更新机制和用户控制权共同配合。
如果说工具调用决定 Agent “能做什么”,那么记忆系统决定 Agent “能否持续做得更好” 🚀。在实践中,从小范围、强约束、可审计的记忆开始,往往比追求庞大而模糊的记忆库更稳健,也更容易获得用户信任。