文章

Agent Memory 工程实战:让 LLM Agent 可靠记住该记住的事

从短期会话到长期记忆,系统拆解 LLM Agent 的写入、整理、读取、遗忘与评估机制,帮助团队避免把记忆层做成不可控的向量库堆料,打造可生产落地的 Agent 记忆系统。

背景问题:Agent 真正缺的不是”更长上下文”,而是可治理的记忆层

很多团队第一次做 LLM Agent 时,会把”记忆”简单理解为两件事:第一,把最近几轮对话放进 prompt;第二,把历史消息切块后存进向量数据库。这个做法能解决一部分连续对话问题,但很快会暴露工程缺陷——用户偏好被重复写入,旧事实覆盖新事实,失败经验无法沉淀,敏感信息被无差别召回,模型还会把一次性上下文误当成长期事实。

Agent Memory 不是”无限聊天记录”,而是一套围绕 写入、整理、读取、遗忘、评估 的状态管理系统。 LangMem 的概念文档把长期记忆描述为从对话中抽取有意义信息、存储并用于后续交互的机制,并把核心流程概括为:接收当前对话和记忆状态 → 让模型决定如何扩展或整合记忆 → 返回更新后的记忆状态。LlamaIndex 的 Memory 模块也区分了短期记忆和长期记忆:短期记忆通常是会话队列,超过 token 阈值后会把旧消息归档,并可进一步 flush 到长期 Memory Block 中。

这揭示了一个关键点:记忆层不是模型上下文窗口的被动延长,而是 Agent 状态的主动治理层。


核心原理:把记忆拆成五个动作

1. Write:先决定什么值得被记住

写入是 Agent Memory 最容易被低估的环节。生产系统不应该把每一句用户输入都写入长期记忆,而要先判断它是否具备长期价值。

常见可写入内容:

类别示例
用户稳定偏好输出语言、格式偏好、常用技术栈
长期事实项目名称、系统约束、团队规范
任务经验某类代码生成失败的原因、某个 API 的可用参数
流程规则发布前必须跑哪些测试、哪些操作需要人工确认
反例与边界用户明确拒绝的方案、历史踩坑

不应默认写入的内容: 临时指令、一次性数据、未经确认的推测、敏感身份信息、可能过期的状态、模型自己生成但未被验证的结论。

一个可落地的写入策略可以用四类标签标注:

memory_write_policy:
  write:
    - stable_user_preference
    - confirmed_project_constraint
    - reusable_solution_pattern
    - verified_failure_lesson
  ignore:
    - temporary_instruction
    - unverified_model_guess
    - sensitive_raw_content
    - one_time_context
  require_review:
    - identity_related_information
    - legal_or_financial_preference
    - cross_user_shared_memory
    - memory_conflict_resolution

2. Manage:记忆需要合并、降噪和版本化

长期记忆最常见的问题不是”记不住”,而是**“记太多、记错、记乱”**。

MemGPT 提出的虚拟上下文管理思路,把 LLM 的有限上下文类比为操作系统中的内存层级:高频、当前相关的信息留在主上下文,低频但可能有用的信息转移到外部存储,并由系统决定何时取回。这个思想对工程实践很有启发——长期记忆不应该只是追加日志,而应该像状态数据库一样维护。

管理层通常需要处理:

  • 合并:同一偏好被多次表达时,合并成一条更稳定的事实
  • 冲突:新记忆和旧记忆矛盾时,记录时间、来源和置信度
  • 压缩:把长对话转成结构化摘要,而不是无限保存原文
  • 分层:区分 profile、project、task、session、tool-result 等 namespace
  • 权限:不同用户、项目、Agent、工具之间不能无差别共享记忆
  • 过期:对价格、版本、排期、法规、账号状态等信息设置 TTL

LangChain/LangMem 将记忆类型拆成 semantic memory、episodic memory、procedural memory,对应事实知识、过去经验和行为规则。这个分类适合直接转成工程 schema:

记忆类型含义工程落地
Semantic Memory事实知识进入 profile 或知识三元组
Episodic Memory过去经验进入案例库或 few-shot 集合
Procedural Memory行为规则进入系统提示词、策略库或 guardrail 配置

3. Read:召回不是越多越好,而是越准越好

读取阶段的核心问题是:当前请求到底需要哪些记忆?

如果每次都把用户所有偏好、历史项目、旧错误和工具记录塞进 prompt,系统会出现三类问题:成本上升、延迟增加、上下文污染。更严重的是,模型可能把不相关记忆当成当前任务约束。

较稳妥的读取策略是分层召回:

type MemoryQuery = {
  userId: string;
  projectId?: string;
  taskType: "coding" | "writing" | "planning" | "support";
  currentIntent: string;
  riskLevel: "low" | "medium" | "high";
};

async function retrieveMemory(query: MemoryQuery) {
  const profile = await loadPinnedProfile(query.userId);
  const projectRules = query.projectId
    ? await loadProjectRules(query.projectId)
    : [];
  const episodic = await semanticSearchPastEpisodes({
    userId: query.userId,
    intent: query.currentIntent,
    topK: 5,
    minScore: 0.72,
  });
  return rankAndFilter({
    profile,
    projectRules,
    episodic,
    taskType: query.taskType,
    riskLevel: query.riskLevel,
  });
}

实际落地时,读取可以分为三层:

层级名称内容召回方式
第一层Pinned Memory用户明确要求长期保留的偏好优先级最高,数量必须少
第二层Structured Memory项目配置、流程规则、已验证事实按 namespace 和 key 精确读取
第三层Retrieved Memory过往对话片段、历史任务经验、失败案例向量检索 + 关键词检索 + reranker 过滤

4. Forget:遗忘是记忆系统的必要能力

生产级 Agent Memory 必须支持遗忘。原因很直接:用户会改变偏好,项目会改版,事实会过期,错误记忆会污染后续回答,敏感数据需要删除。

遗忘不只是删除一条向量记录,它通常包括:

  1. 从结构化存储中删除或标记过期
  2. 从向量库中删除相关 chunk
  3. 从摘要型记忆中重新生成摘要
  4. 从缓存、索引和评估样例中清理引用
  5. 保留必要审计日志,但不再用于模型上下文

MemoryAgentBench 把 selective forgetting 列为记忆型 Agent 的核心能力之一。很多系统只评估”能否找回旧信息”,却不评估”能否忘掉不该继续使用的信息”。对真实产品来说,后者往往更关键。

5. Evaluate:记忆能力要用跨会话测试,而不是单轮问答测试

长记忆系统不能只靠人工体验判断。一个可用的评估集至少要覆盖四类问题:

评估维度含义示例问题
准确召回之前确认过的事实,现在能否正确取回?“上个月我设定的输出语言是什么?“
测试时学习Agent 是否能把一次任务经验用于后续相似任务?首次修复某 bug 后,同类问题是否自动使用相同方案?
长程理解跨多个会话积累的信息是否能被组合使用?综合三个项目的约束给出架构建议
选择性遗忘被撤销、过期或冲突的信息是否不再影响回答?更新偏好后旧偏好是否不再出现?

MemoryAgentBench 正是围绕这些能力设计增量多轮交互评估。2026 年的 agent memory survey 也把记忆建模为与感知和行动紧密耦合的 write-manage-read loop,并指出工程上需要关注写入过滤、冲突处理、延迟预算和隐私治理。


工程落地:一套可复用的 Agent Memory 架构

推荐架构:六大模块

可以把 Agent Memory 拆成六个模块:

  1. Memory Router:判断当前交互是否需要写入、读取或遗忘
  2. Write Filter:过滤临时信息、低价值信息、敏感信息和模型推测
  3. Memory Store:存储结构化事实、历史片段、摘要、规则和经验
  4. Consolidator:定期合并、去重、压缩和冲突处理
  5. Retriever:按任务意图、namespace、权限和相关性召回
  6. Evaluator:用固定回归集测试记忆写入、召回、更新和遗忘

存储设计:不要把所有记忆放在一个 collection 里

namespaces:
  user_profile:
    content: "稳定用户偏好、语言、格式、长期约束"
    retrieval: "精确读取 + 少量固定注入"
  project_memory:
    content: "项目背景、架构约束、技术栈、已确认决策"
    retrieval: "按 project_id 精确读取"
  episodic_cases:
    content: "历史任务、失败案例、可复用经验"
    retrieval: "向量检索 + rerank"
  procedural_rules:
    content: "流程规范、输出规范、工具使用规则"
    retrieval: "按 task_type 和 risk_level 读取"
  volatile_state:
    content: "短期任务状态、待办、最近上下文"
    retrieval: "会话内读取,带 TTL"

写入时机:不必全部同步完成

写入可以按风险和实时性拆分:

  • 会话中同步写入:用户明确要求”记住”的信息、当前任务状态
  • 会话后异步整理:长对话摘要、经验抽取、失败案例归档
  • 定期批处理:重复记忆合并、冲突检测、过期清理
  • 人工审核写入:敏感、跨用户、影响高风险动作的记忆

召回插入位置:记忆不一定都放进 system prompt

插入位置适用内容特点
system message少量稳定规则和不可违反约束优先级最高,影响全局行为
developer/context message项目背景、任务规范、工具限制按项目或会话注入
user-adjacent context与当前请求直接相关的历史片段与用户消息并列,关联性强
tool result检索型记忆作为可审计工具结果返回可追溯,适合高风险系统

对高风险系统,建议把长期记忆作为 tool result 注入,并保留 memory_idsourceupdated_atconfidencettl,方便排查为什么模型采用了某条记忆。

适用场景

Agent Memory 适合以下场景:

  • 个人助理:记住长期偏好、常用联系人、工作方式
  • 编程 Agent:记住项目架构、代码规范、历史修复方式
  • 客服 Agent:记住用户历史问题和处理进度(必须有权限与脱敏)
  • 企业知识助手:记住项目决策、术语表、团队流程
  • 多 Agent 协作:共享项目级记忆,但隔离个人级记忆
  • 教育与训练系统:跟踪学习进度、薄弱点和反馈历史

不适合直接上长期记忆的场景:强监管决策、不可解释高风险自动操作、事实频繁变化但无过期机制的场景,以及缺少删除能力的系统。


常见误区

误区一:长上下文可以替代记忆

长上下文能容纳更多信息,但不能自动解决写入、合并、冲突、权限、遗忘和评估问题。上下文窗口越长,噪声越多,模型越需要明确的记忆组织。

误区二:向量库等于长期记忆

向量库只是存储和召回机制。长期记忆还需要 schema、写入策略、更新策略、访问控制、过期机制和评估集。

误区三:所有记忆都应该自动写入

自动写入会把临时偏好、误解、模型幻觉、敏感信息混在一起。更好的方式是:低风险事实自动写入,高风险事实人工确认,模型推测默认不写入。

误区四:召回越多,回答越个性化

召回过多会污染上下文。个性化不是把所有历史都塞给模型,而是只提供当前任务真正需要的少量高质量记忆。

误区五:只测试记住,不测试忘记

不能遗忘的记忆系统不适合生产。偏好更新、项目变更、用户撤回、敏感数据删除都要求系统具备可验证的遗忘能力。


上线检查清单

写入侧

  • 是否定义了哪些内容允许写入、禁止写入、需要审核?
  • 是否区分用户确认事实、模型推测和工具返回结果?
  • 是否记录 source、timestamp、confidence、namespace、ttl?
  • 是否支持冲突检测和人工覆盖?

存储侧

  • 是否按 user、project、session、task_type 做隔离?
  • 是否有结构化存储,而不是只有向量库?
  • 是否支持删除、重建索引和摘要再生成?
  • 是否对敏感字段加密或脱敏?

读取侧

  • 是否有 topK、score threshold、rerank、权限过滤?
  • 是否能解释某条记忆为什么被召回?
  • 是否避免把旧项目记忆注入新项目?
  • 是否为高风险操作增加确认步骤?

评估侧

  • 是否有跨会话测试集?
  • 是否覆盖准确召回、测试时学习、长程理解、选择性遗忘?
  • 是否把错误召回作为独立指标?
  • 是否在 memory schema 或 prompt 更新后跑回归测试?

FAQ

Agent Memory 应该优先做短期还是长期?

优先做好短期会话管理,再引入长期记忆。短期记忆解决当前任务连续性,长期记忆解决跨会话复用。没有短期管理,长期记忆会被用来弥补会话状态混乱,系统会更难调试。

长期记忆是否一定需要向量数据库?

不一定。用户偏好、项目约束、流程规则更适合结构化存储;历史案例和相似任务经验才更适合向量检索。很多系统应该采用结构化存储 + 向量检索的混合方式。

如何处理错误记忆?

错误记忆应支持软删除、版本回退、来源追踪和摘要重建。更重要的是,写入前要降低错误进入长期存储的概率,例如要求用户确认关键事实、禁止保存模型未经验证的推测。

Agent Memory 会不会带来隐私风险?

会。记忆层天然保存跨会话信息,因此必须做权限隔离、最小化写入、敏感字段脱敏、删除能力和审计日志。尤其是多用户、多项目、多 Agent 系统,不能把个人级记忆默认提升为团队级记忆。


结论

Agent Memory 的价值不在于”让模型记住更多”,而在于**“让系统稳定地记住该记住的、忘掉该忘掉的、在需要时准确取回”**。

一个可生产落地的记忆系统,至少要具备五个闭环:写入过滤、记忆整理、分层读取、选择性遗忘、跨会话评估。只有把记忆当成状态系统而不是聊天记录堆栈,Agent 才能从一次性助手变成长期可用的工程组件。


主要参考资料

常见问题

Agent Memory 和普通 RAG 有什么区别?
普通 RAG 通常围绕外部知识检索,Agent Memory 更强调跨会话的用户事实、任务经验、偏好、流程规则和失败教训,并且需要写入、更新、合并、遗忘和权限治理。
是否只要把所有历史对话存进向量库就算长期记忆?
不算。长期记忆需要写入过滤、结构化整理、冲突处理、召回策略、过期机制和评估闭环;直接存全量历史会带来噪声、隐私、成本和错误召回问题。
Agent Memory 上线前最关键的检查是什么?
应优先检查记忆写入是否可控、召回是否可解释、敏感信息是否受权限约束、错误记忆是否可删除,以及是否有跨会话回归测试集。