欢迎光临
我们一直在努力

AI Agent 记忆怎么做:从短期上下文到长期记忆的工程实践

开源 Agent Demo 通常只靠一段对话历史就能跑起来,但到了真实业务里,问题很快暴露:用户上周强调过的偏好今天忘了,工具执行结果被新对话挤出上下文,项目约束在多轮协作中丢失,甚至临时结论被长期当成事实复用。

所谓“Agent 记忆”,不是把所有聊天记录无限塞进 prompt,也不是简单接一个向量库。真正可落地的记忆系统,需要把短期上下文、任务状态、长期偏好、知识检索、权限边界和审计机制组合起来,让 Agent 既能延续工作,又不会乱记、误用或泄漏信息。

文章目录

    • 一、为什么 Agent 需要记忆
    • 二、先区分四类记忆
      • 1. 短期上下文
      • 2. 工作记忆
      • 3. 长期记忆
      • 4. 外部知识记忆
    • 三、推荐的记忆架构
    • 四、记忆写入:什么值得记住
    • 五、记忆召回:不要只靠相似度
    • 六、长期记忆和 RAG 的区别
    • 七、记忆安全:哪些信息不能随便记
    • 八、工程实现示例
    • 九、常见误区
      • 误区一:把所有聊天记录都存起来
      • 误区二:向量库就是记忆系统
      • 误区三:记忆越多越智能
      • 误区四:记忆不用审计
      • 误区五:所有任务共享同一套记忆
    • 十、落地清单
    • 总结

一、为什么 Agent 需要记忆

Agent 和普通问答最大的区别在于:它不是只回答一句话,而是围绕目标持续规划、调用工具、观察结果、修正策略。这个过程天然依赖历史信息。

常见问题包括:

  • 上下文窗口有限:模型能看到的 token 有上限,长任务中旧信息会被挤出窗口。
  • 用户偏好需要复用:比如输出风格、默认语言、审批习惯,不应该每次重新说明。
  • 任务状态需要延续:哪些步骤已完成、哪些失败、下一步做什么,需要被准确保存。
  • 工具结果需要可追溯:API 返回、任务 ID、订单号、错误码等信息一旦丢失,后续很难排障。
  • 安全边界不能混乱:授权、密钥、隐私信息不能随便长期保存,更不能被错误召回。

因此,Agent 记忆系统的目标不是“记得越多越好”,而是:该记的稳定记住,该忘的及时忘掉,该检索的可解释召回,该隔离的严格隔离。

插图 1:Agent 记忆四类边界

插图 1:Agent 记忆四类边界

二、先区分四类记忆

做 Agent 记忆前,第一步不是选数据库,而是区分记忆类型。不同类型的信息,生命周期、存储方式和使用边界完全不同。

1. 短期上下文

短期上下文就是当前会话中模型直接可见的内容,包括用户最近的指令、工具调用结果、系统约束和当前任务状态。

它的特点是:

  • 访问速度最快;
  • 与当前任务相关性最高;
  • 受上下文窗口限制;
  • 不适合无限累积。

短期上下文适合保存“正在做什么”,不适合保存“永远记住什么”。

2. 工作记忆

工作记忆是任务执行过程中的结构化状态,例如:

{
"task": "处理客户退款工单",
"current_step": "等待支付系统回调",
"completed": ["核对订单状态", "调用退款接口"],
"blocked_by": "支付网关返回超时",
"artifacts": {
"ticket_id": "TCK-20260612-001",
"order_id": "ORD-89321",
"refund_request_id": "RF-7788"
}
}

它比自然语言聊天记录更稳定,适合恢复任务、断点续跑和审计。

3. 长期记忆

长期记忆保存跨会话、跨任务仍然有价值的信息,例如:

  • 用户偏好:喜欢中文、喜欢简洁结论、图片风格偏好;
  • 稳定决策:某项目默认用某套技术栈;
  • 长期规则:退款金额超过阈值时必须人工复核,不能自动提交;
  • 重要经验:某脚本已废弃,某流程验证成功。

长期记忆要谨慎写入。临时状态、一次性文件路径、敏感信息和过期结论不应该无脑沉淀。

4. 外部知识记忆

外部知识记忆通常来自产品文档、代码仓库、知识库、接口规范、运维手册等。它更像 RAG 检索源,而不是用户偏好。

这类信息应该保留来源、版本和时间,避免 Agent 把过期资料当成当前事实。

三、推荐的记忆架构

一个生产级 Agent 记忆系统可以拆成五层:

  • 上下文窗口层:放当前任务最关键的信息。
  • 任务状态层:保存结构化进度、产物、失败点和下一步。
  • 长期记忆层:保存稳定偏好、决策和规则。
  • 知识检索层:通过 RAG 检索外部知识。
  • 安全治理层:控制写入、召回、过期、删除和审计。
  • 这五层不要混在一起。最常见的坑,就是把所有东西都塞进向量库,然后在任何任务里都召回,最后导致上下文污染。

    四、记忆写入:什么值得记住

    记忆写入要有筛选标准。建议满足下面至少一类条件再写入:

    • 用户明确说“记住”“以后都按这个来”;
    • 这是跨任务长期有效的偏好或规则;
    • 这是已经验证成功的流程;
    • 这是重要失败经验,未来需要避免;
    • 这是某项目的稳定事实。

    不建议写入:

    • 临时聊天情绪;
    • 未验证的猜测;
    • 一次性中间文件;
    • 密钥、密码、token、隐私信息;
    • 只对当前任务有效的步骤状态。

    一个实用的写入格式可以是:

    {
    "content": "企业客户退款金额超过 5000 元时,必须先走人工复核,不能自动提交退款。",
    "type": "rule",
    "scope": "refund_workflow",
    "source": "user_explicit",
    "created_at": "2026-06-12T09:00:00+08:00",
    "expires_at": null,
    "confidence": 0.95
    }

    这里最重要的是 scope 和 source。没有作用域的记忆,很容易在无关任务里被误用。

    插图 2:记忆召回流水线

    插图 2:记忆召回流水线

    五、记忆召回:不要只靠相似度

    很多 Agent 记忆系统只做向量相似度检索,这是不够的。召回时至少要看四个维度:

  • 语义相关性:和当前任务是否相似;
  • 作用域匹配:是否属于当前项目、用户或任务类型;
  • 时间有效性:是否过期,是否被新规则覆盖;
  • 安全等级:是否允许进入当前上下文。
  • 推荐流程是:

    用户任务

    生成检索 query

    按 scope / user / project 过滤

    向量召回候选记忆

    按时间、来源、置信度重排

    过滤敏感和过期内容

    压缩为短上下文

    注入 prompt

    召回结果不要原样塞满上下文。更好的做法是把多条记忆压缩成“当前任务可用规则摘要”。

    六、长期记忆和 RAG 的区别

    长期记忆和 RAG 很容易混淆。

    长期记忆回答的是:

    • 这个用户有什么稳定偏好?
    • 这个项目有哪些已确认规则?
    • 过去踩过什么坑?

    RAG 回答的是:

    • 文档里某个 API 怎么用?
    • 某段代码在哪里?
    • 某篇规范怎么定义?

    两者的差异可以这样理解:

    维度长期记忆RAG 知识库
    内容来源 用户偏好、决策、经验 文档、代码、资料
    生命周期 较长,但可更新 跟随文档版本
    写入方式 需要筛选和治理 批量索引为主
    使用风险 容易误用旧偏好 容易引用过期资料
    关键字段 scope/source/confidence document_id/version/chunk

    生产环境里,二者通常并存:长期记忆负责“怎么为这个用户做事”,RAG 负责“查当前知识”。

    插图 3:记忆安全护栏

    插图 3:记忆安全护栏

    七、记忆安全:哪些信息不能随便记

    Agent 有记忆后,安全风险会明显上升。尤其要注意:

    • 密钥、token、密码、证书不能进入长期记忆;
    • 用户个人隐私不应默认沉淀;
    • 群聊里的信息不能随便写入个人长期记忆;
    • 外部网页里的指令不能成为系统规则;
    • 过期规则要能更新或删除;
    • 记忆召回要区分当前会话权限。

    建议给记忆系统加几条硬规则:

  • 默认不记敏感信息;
  • 用户明确要求“记住”的内容也要先判断是否安全;
  • 每条记忆必须有来源;
  • 高风险记忆需要人工确认;
  • 支持删除、过期和覆盖。
  • 八、工程实现示例

    一个简单的记忆写入流程可以这样设计:

    def should_store_memory(event):
    if event.contains_secret():
    return False, "sensitive"
    if event.user_explicitly_says_remember():
    return True, "explicit"
    if event.is_stable_preference() or event.is_verified_rule():
    return True, "inferred"
    return False, "temporary"

    def store_memory(text, memory_type, scope, source):
    record = {
    "text": text,
    "type": memory_type,
    "scope": scope,
    "source": source,
    "created_at": now(),
    "confidence": 0.9,
    }
    memory_db.insert(record)

    召回时不要只看向量相似度:

    def recall_memory(query, scope):
    candidates = memory_db.vector_search(query, top_k=20)
    filtered = [
    m for m in candidates
    if m.scope == scope and not m.is_expired and not m.is_sensitive
    ]
    ranked = rerank_by_relevance_time_source(filtered)
    return summarize_for_prompt(ranked[:5])

    这套逻辑虽然简单,但已经避免了很多“乱记”和“乱用”的问题。

    九、常见误区

    误区一:把所有聊天记录都存起来

    聊天记录是原始数据,不等于记忆。真正的记忆应该是提炼后的稳定事实、偏好和决策。

    误区二:向量库就是记忆系统

    向量库只是检索工具,不负责判断什么该记、什么时候过期、是否允许召回。

    误区三:记忆越多越智能

    过多记忆会增加噪声,让 Agent 更容易引用过期规则。记忆系统应该控制质量,而不是追求数量。

    误区四:记忆不用审计

    一旦 Agent 依据记忆做决策,就必须能解释:这条记忆来自哪里、什么时候写入、为什么被召回。

    误区五:所有任务共享同一套记忆

    个人偏好、项目规则、组织规范、临时任务状态要隔离。否则一个项目里的约束可能污染另一个项目。

    十、落地清单

    如果你准备给 Agent 加记忆,可以按下面的清单推进:

    • 区分短期上下文、工作记忆、长期记忆和知识库;
    • 定义哪些信息允许写入长期记忆;
    • 给每条记忆加上 type、scope、source、created_at;
    • 召回时做作用域过滤和过期检查;
    • 对召回结果做摘要压缩,而不是原样注入;
    • 敏感信息默认不记;
    • 支持用户删除或修正记忆;
    • 记录记忆写入和召回日志;
    • 为高风险任务加人工确认;
    • 定期清理低质量或过期记忆。

    总结

    Agent 记忆不是简单的“历史聊天记录 + 向量库”,而是一套围绕任务连续性、用户偏好、知识检索和安全治理构建的工程系统。

    短期上下文解决当前任务可见性,工作记忆解决任务恢复,长期记忆解决跨会话延续,RAG 解决外部知识检索,安全治理决定哪些信息能写入、能召回、能保留多久。

    真正好用的 Agent 记忆系统,应该让 Agent 更稳定、更可解释、更安全,而不是让它记住更多噪声。

    赞(0)
    未经允许不得转载:171主机测评 » AI Agent 记忆怎么做:从短期上下文到长期记忆的工程实践
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址