首页 / 正文

Agent 长期记忆别急着堆:一套防止“越用越笨”的记忆治理方案

Mooko
发布于 2026-08-14 · 5分钟阅读
827 浏览
0 点赞 暴击点赞!

Agent 长期记忆别急着堆:一套防止“越用越笨”的记忆治理方案

很多人做 Agent,开局很兴奋:

  • 接上向量数据库
  • 给对话自动总结
  • 每轮都写入长期记忆
  • 再加一句“越用越懂你”

看起来很完整,对吧?

可真正跑几周,你可能会遇到一个很诡异的场景:Agent 记住了你三个月前随口说的一句话,还把它当成铁律。你明明已经改过需求,它依旧按旧方案输出。更糟的是,它会引用自己以前写错的结论,语气还特别自信。

这不是记忆能力强。

这是把错误塞进了大脑,还把大脑的橡皮擦扔了。😅

Agent Memory 的重点,从来不是“存得越多越好”。真正要解决的是四件事:

  1. 哪些信息值得写入
  2. 写入的信息可信度有多高
  3. 什么时候必须重新验证
  4. 发现记错后,怎么撤销和回滚

下面咱们直接拆一套可执行的方案。


一、为什么 Agent 会陷入“错误记忆闭环”

假设你在做一个客服 Agent。

某天,用户问:“会员能不能退款?”

模型没有查到最新规则,于是猜了一句:“购买 7 天内可以全额退款。”

如果系统把这句话直接写进长期记忆,后面就麻烦了:

  1. 下一位用户来问退款,Agent 检索到这条记忆。
  2. 它把旧答案当成历史经验,继续回答“7 天内可退”。
  3. 系统发现这句话被多次提及,又给它加上了更高权重。
  4. 错误答案从一次幻觉,升级成了“内部常识”。

这就是错误记忆闭环。

模型并不真的知道这条信息对不对。它只看到了:这段内容出现在记忆库里,而且和当前问题很相关。

很多团队踩坑,就踩在这里:把模型生成的内容,和经过验证的业务事实,放进了同一个记忆池。

这两类东西的待遇,绝对不能一样。


二、别把所有内容都存起来:给记忆分四层

一个好用的 Agent 记忆系统,不该像仓库。什么都往里堆,迟早找不到东西。

更像一个有纪律的档案室。不同资料,放不同柜子,权限和保质期都不同。

1. 用户偏好:可以长期保存

这类内容通常稳定,且能直接改善后续互动。

例如:

  • 用户喜欢中文回答
  • 用户希望答案简洁
  • 用户常用 Python 和 FastAPI
  • 用户习惯把输出整理成 Markdown
  • 用户不想收到邮件提醒,只接受企业微信通知

这类记忆可以直接进入长期库,不过仍要支持用户修改和删除。

建议保存格式:

{
  "type": "user_preference",
  "key": "response_style",
  "value": "简洁、给可执行步骤、使用 Markdown",
  "source": "user_explicit",
  "confidence": 0.98,
  "status": "active",
  "updated_at": "2025-03-08"
}

关键点在于 source

用户明确说过的话,和模型从对话里猜出来的话,可信度不是一个级别。


2. 任务上下文:短期保存,到期就扔

这类信息只服务于当前任务,不该永久占坑。

例如:

  • 用户正在写一份融资 BP
  • 当前项目使用 Next.js 14
  • 本次会议讨论的是 Q2 营销预算
  • 用户这次上传的 PDF 是产品需求文档 V3

任务结束后,这些内容大概率会过期。

给它们加 TTL(存活时间)。比如 24 小时、7 天或项目结束后自动失效。

{
  "type": "task_context",
  "content": "当前在修改官网改版 PRD V3",
  "expires_at": "2025-03-15T00:00:00Z",
  "status": "active"
}

别小看“过期”这个动作。

很多 Agent 之所以答非所问,不是模型不聪明,而是它还抱着半年前的上下文不撒手。


3. 业务事实:必须带来源和版本

价格、政策、库存、合同条款、产品功能、公司制度,这些内容不能靠模型“记得”。

它们必须有权威来源。

推荐保存这些字段:

{
  "type": "business_fact",
  "content": "企业版套餐支持 SSO 登录",
  "source_url": "https://docs.example.com/pricing",
  "source_title": "产品套餐说明",
  "source_version": "2025-03-01",
  "verified_at": "2025-03-08",
  "confidence": 1.0,
  "status": "active"
}

这里有个硬规则:

没有来源的业务事实,不进长期记忆库。

宁可 Agent 回答“我需要查一下最新规则”,也别让它编一个看似合理的答案。

客服场景里,一句错的退款政策,可能就是一张投诉工单。财务、医疗、法律场景更别提了,别拿线上事故给模型交学费。


4. 模型推断:默认可疑,单独放

模型很擅长归纳和猜测。

比如它会推断:

  • 用户可能偏好深色界面
  • 某客户可能对价格敏感
  • 这个项目大概会在月底上线
  • 用户提到“报错”,可能卡在环境配置

这些推断有价值,却不能当事实。

正确做法是把它们放进“候选记忆区”,并打上明显标签:

{
  "type": "model_inference",
  "content": "用户可能偏好深色模式",
  "evidence": [
    "用户两次提到夜间使用电脑",
    "用户曾询问深色主题配置"
  ],
  "confidence": 0.62,
  "status": "pending_verification"
}

候选记忆只能影响回答的语气或建议,不能直接驱动关键决策。

比如,Agent 可以问:“你要不要试试深色模式?”

它不能直接替用户把主题改掉。这个区别很重要。


三、给每条记忆加“身份证”:来源、置信度、时间、状态

一条只存文本的记忆,几乎等于埋雷。

你至少要让每条记忆带上这些元数据:

| 字段 | 用途 | | --- | --- | | memory_id | 唯一编号,方便追踪和删除 | | type | 用户偏好、任务上下文、业务事实、模型推断 | | source | 用户明确表达、知识库、工具返回、模型推断 | | confidence | 可信度分数,建议 0~1 | | created_at | 创建时间 | | verified_at | 最近一次验证时间 | | expires_at | 过期时间 | | status | active、pending、deprecated、revoked | | version | 版本号,用于回滚 |

一个简单的可信度规则,可以直接抄:

  • 用户明确表达:0.95 ~ 1.0
  • 官方知识库或数据库查询结果:0.95 ~ 1.0
  • 人工审核通过的总结:0.9
  • 多轮对话归纳:0.7 ~ 0.85
  • 模型单次猜测:不高于 0.6
  • 来源不明的历史文本:不高于 0.4

检索时也别只看语义相似度。

可以用一个简单公式做排序:

最终分数 = 语义相似度 × 可信度 × 新鲜度 × 来源权重

举个例子:

  • 一条 2023 年的旧价格表,语义匹配度很高,可信度却很低。
  • 一条今天从价格 API 查到的数据,语义匹配度略低,却是最新的。

该选谁?

当然选 API 数据。用户问的是价格,不是在考古。


四、关键问题别依赖记忆:用“检索 + 验证”双保险

长期记忆适合保存偏好、背景和线索。

涉及实时变化的信息,要回到权威系统验证。

常见的高风险内容包括:

  • 商品价格
  • 库存数量
  • 订单状态
  • 账户余额
  • 退款与售后政策
  • 合同条款
  • 医疗建议
  • 法律法规

给 Agent 定一条明确指令:

当用户询问价格、库存、订单、政策、账户、合同等高风险信息时,
不得仅依据历史记忆回答。
必须调用对应工具或检索权威知识源。
若无法验证,请明确说明信息未确认,不要猜测。

这条规则很朴素,却能挡住一大批事故。

一个典型工作流

用户问:

我的订单什么时候发货?

正确流程:

  1. 识别为订单状态查询。
  2. 不读取“历史订单状态记忆”作为最终依据。
  3. 调用订单系统 API。
  4. 拿到最新状态后再生成自然语言回复。
  5. 如有必要,只记录“用户经常查询某订单”这类低风险行为线索。

错误流程:

  1. 从记忆里翻出“三天前订单待发货”。
  2. 直接回复“还在待发货”。
  3. 实际上仓库两小时前已经出库。
  4. 用户打开物流页面一看:你这 Agent 在说啥?

五、记忆写入前,加一道“闸门”

别让每轮对话都自动写库。

一个实用的写入闸门,可以按下面四步走。

判断 1:这件事未来还会用到吗?

用户说“我今天心情不太好”,通常不该永久保存。

用户说“以后所有周报都按这个结构写”,值得保存。

判断 2:这是事实、偏好,还是模型猜测?

类型不清楚,就先别写。

尤其是模型自己总结出来的“用户画像”,很容易自作多情。

判断 3:有没有明确来源?

没有来源的业务信息,禁止写进事实库。

用户明确确认过的偏好,可以记录来源为 user_explicit

判断 4:用户是否可能介意被记住?

健康状况、财务信息、身份信息、私人关系、精确位置,这类内容要格外谨慎。

能不存就不存。

确实需要存,也要有告知、授权、加密和删除入口。

一个可直接使用的写入策略:

仅写入满足以下条件的信息:
- 对未来任务有稳定价值;
- 来源可追溯;
- 不属于敏感信息,或已获得用户授权;
- 信息类型明确;
- 能设置置信度、有效期和状态。

模型推断默认进入候选区,不得直接写入事实区。

六、做回滚,不要指望“覆盖写入”能救你

很多系统更新记忆时,喜欢直接把旧内容改掉。

这很省事,也很危险。

因为你一旦发现新内容错了,旧版本已经没了。

正确做法是:记忆不可直接覆盖,采用版本化更新。

比如用户原本说:

我常用邮箱是 a@example.com

后来又说:

邮箱换成 b@example.com 了。

别把旧值直接抹掉。可以这样记录:

[
  {
    "memory_id": "email_v1",
    "value": "a@example.com",
    "version": 1,
    "status": "superseded",
    "valid_to": "2025-03-08T10:30:00Z"
  },
  {
    "memory_id": "email_v2",
    "value": "b@example.com",
    "version": 2,
    "status": "active",
    "valid_from": "2025-03-08T10:30:00Z"
  }
]

这样做有三个好处:

  • 你能查到错误是从哪一版开始出现的
  • 你能一键回滚到上一版
  • 你能审计“谁在什么时候改了什么”

如果系统支持事件日志,可以再进一步。

把每次创建、验证、更新、废弃、撤销都记成事件:

2025-03-08 10:00 创建记忆:用户偏好简洁回答
2025-03-08 10:05 模型推断:用户偏好表格展示
2025-03-08 10:06 用户否认该推断
2025-03-08 10:06 撤销候选记忆:用户偏好表格展示

这就是 Agent 的“时间机器”。

出问题时,不用盯着向量库抓瞎。你能顺着日志,把错误链路一段段扒开。


七、让 Agent 学会怀疑自己:触发重新验证的条件

Agent 不需要时时刻刻自我怀疑,那会慢得像在泥里跑步。

可一旦碰到下面这些信号,就该重新验证:

  • 记忆超过有效期
  • 当前信息和旧记忆冲突
  • 用户明确纠正过 Agent
  • 记忆的置信度偏低
  • 回答涉及钱、权限、合规、健康等高风险内容
  • 同一问题出现多个互相矛盾的答案
  • 外部系统数据发生更新

可以给模型一份很明确的决策规则:

若检索到的记忆状态不是 active,禁止作为事实引用。
若记忆置信度低于 0.8,优先向用户确认或调用工具验证。
若用户提供的信息与历史记忆冲突,以用户当前明确表达为优先,并将旧记忆标记为待复核。
若涉及高风险业务字段,必须以实时工具结果为准。

注意一句:用户当前明确表达,通常比历史偏好更可信。

用户以前说“我喜欢简短回答”,今天说“这次展开讲,给我完整方案”,你还硬塞三行摘要,那不是贴心,是犟。


八、一个能落地的最小架构

如果你正在做 Demo,别一上来就搞复杂的记忆图谱、十几个 Agent、全自动反思链路。

先把下面这套最小架构跑稳:

用户输入
   ↓
记忆检索(按类型、可信度、新鲜度过滤)
   ↓
风险判断
   ├─ 低风险:使用长期记忆辅助回答
   └─ 高风险:调用 API / 检索权威知识库验证
   ↓
生成回答
   ↓
记忆写入闸门
   ├─ 可保存:写入对应记忆层,附带元数据
   ├─ 待确认:进入候选区
   └─ 不该保存:直接丢弃
   ↓
版本日志与可回滚记录

技术选型不必死磕:

  • 向量检索:pgvector、Milvus、Qdrant、Pinecone
  • 结构化记忆:PostgreSQL、MySQL、Redis
  • 文档知识库:Elasticsearch、OpenSearch、Notion / 飞书知识库同步
  • 版本与审计:数据库事件表、Append-only 日志、Git 风格快照
  • 任务编排:LangGraph、Dify、Coze、LlamaIndex,或者自己写状态机

向量数据库负责“找得到相似内容”。

结构化数据库负责“知道这条内容从哪来、还能不能用、该不该信”。

别把所有问题都甩给向量库。它擅长语义召回,不擅长替你管理真相。


九、常见坑:这些做法看着省事,后面都很疼

坑 1:把每轮聊天都自动总结后写入长期记忆

后果:垃圾信息越来越多,旧上下文开始污染新任务。

处理方式:只保存稳定偏好、明确事实、长期项目背景。其他内容设置短期 TTL。

坑 2:模型说过的话默认当事实

后果:幻觉变成“历史经验”,错误会反复出现。

处理方式:模型输出必须标记来源。没有权威来源的业务结论,只能作为候选信息。

坑 3:检索到什么就相信什么

后果:旧政策、旧价格、旧项目状态被重新拿出来回答。

处理方式:检索阶段过滤 statusexpires_atverified_atconfidence

坑 4:发现错误后直接删数据

后果:你失去了追踪问题的线索,也无法恢复误删内容。

处理方式:优先标记 revokeddeprecated,保留版本和审计记录。

坑 5:没有给用户记忆管理入口

后果:用户不知道 Agent 记住了什么,也没法纠正,信任会掉得很快。

处理方式:提供“查看我的记忆”“删除这条记忆”“忘记我刚才说的内容”等入口。


十、上线前检查清单 ✅

把这份清单过一遍,再去谈“越用越懂你”。

  • [ ] 用户偏好、任务上下文、业务事实、模型推断是否分开存储?
  • [ ] 每条记忆是否记录了来源、时间、置信度和状态?
  • [ ] 高风险问题是否强制调用实时工具或权威知识库?
  • [ ] 过期记忆是否会自动降权或失效?
  • [ ] 模型推断是否进入候选区,而不是直接进入事实库?
  • [ ] 用户纠正 Agent 后,旧记忆是否会被标记待复核?
  • [ ] 是否支持版本记录、撤销和回滚?
  • [ ] 用户能否查看、修改、删除自己的长期记忆?
  • [ ] 敏感信息是否默认不存,或经过明确授权后再存?
  • [ ] 你是否能回答:“这条记忆从哪里来的,为什么还能被使用?”

如果有几项答不上来,先别急着给产品挂“长期记忆”标签。

真正靠谱的 Agent,不是记住一切。

它知道哪些内容只是聊天里的烟雾,哪些内容是可靠事实;知道什么时候该信任历史,什么时候该重新查;也知道自己记错时,得老老实实撤回。

会遗忘、会验证、能回滚,才是长期记忆该有的样子。

OpenClaw
木瓜AI - 中转平台
木瓜AI - 大模型中转平台上线啦
注册即送免费tokens
聚合 全球顶尖大语言模型,支持 GPT, Claude, Gemini 等。
立即领取tokens