背景问题: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 必须支持遗忘。原因很直接:用户会改变偏好,项目会改版,事实会过期,错误记忆会污染后续回答,敏感数据需要删除。
遗忘不只是删除一条向量记录,它通常包括:
- 从结构化存储中删除或标记过期
- 从向量库中删除相关 chunk
- 从摘要型记忆中重新生成摘要
- 从缓存、索引和评估样例中清理引用
- 保留必要审计日志,但不再用于模型上下文
MemoryAgentBench 把 selective forgetting 列为记忆型 Agent 的核心能力之一。很多系统只评估”能否找回旧信息”,却不评估”能否忘掉不该继续使用的信息”。对真实产品来说,后者往往更关键。
5. Evaluate:记忆能力要用跨会话测试,而不是单轮问答测试
长记忆系统不能只靠人工体验判断。一个可用的评估集至少要覆盖四类问题:
| 评估维度 | 含义 | 示例问题 |
|---|---|---|
| 准确召回 | 之前确认过的事实,现在能否正确取回? | “上个月我设定的输出语言是什么?“ |
| 测试时学习 | Agent 是否能把一次任务经验用于后续相似任务? | 首次修复某 bug 后,同类问题是否自动使用相同方案? |
| 长程理解 | 跨多个会话积累的信息是否能被组合使用? | 综合三个项目的约束给出架构建议 |
| 选择性遗忘 | 被撤销、过期或冲突的信息是否不再影响回答? | 更新偏好后旧偏好是否不再出现? |
MemoryAgentBench 正是围绕这些能力设计增量多轮交互评估。2026 年的 agent memory survey 也把记忆建模为与感知和行动紧密耦合的 write-manage-read loop,并指出工程上需要关注写入过滤、冲突处理、延迟预算和隐私治理。
工程落地:一套可复用的 Agent Memory 架构
推荐架构:六大模块
可以把 Agent Memory 拆成六个模块:
- Memory Router:判断当前交互是否需要写入、读取或遗忘
- Write Filter:过滤临时信息、低价值信息、敏感信息和模型推测
- Memory Store:存储结构化事实、历史片段、摘要、规则和经验
- Consolidator:定期合并、去重、压缩和冲突处理
- Retriever:按任务意图、namespace、权限和相关性召回
- 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_id、source、updated_at、confidence、ttl,方便排查为什么模型采用了某条记忆。
适用场景
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 才能从一次性助手变成长期可用的工程组件。
主要参考资料
- LangMem Core Concepts
- LangChain Blog: LangMem SDK for agent long-term memory
- LlamaIndex Documentation: Memory in LlamaIndex
- OpenAI Agents SDK Memory Reference
- MemGPT: Towards LLMs as Operating Systems
- Generative Agents: Interactive Simulacra of Human Behavior
- Evaluating Memory in LLM Agents via Incremental Multi-Turn Interactions
- Memory for Autonomous LLM Agents: Mechanisms, Evaluation, and Emerging Frontiers