跳转至

第27章 Memory 系统


Agent Memory 不能简单理解为“把历史对话塞回 Prompt”,也不能把企业知识库换一个名字后归到 Memory 名下。它要解决的是:一次 Run 如何恢复上下文,用户长期偏好如何安全复用,企业组织口径如何稳定注入,以及哪些信息应该进入 RAG、哪些应该进入 Memory。本章把 Memory 分成 Working、Episodic、Profile 和 Org Context 四类,说明它们的生命周期、权限边界、压缩策略和 mini-platform 中的实现现状。

第22章要求检查点能重建 Planner 可见上下文。否则进程重启后,Planner 可能忘记上一步 SQL 已经返回,重新选表、重复调用工具,甚至得到和重启前不同的答案。第25章又说明,Planner 每轮决策都依赖历史 Tool Call、错误和 Memory 片段。Memory 因此属于 Runtime 可恢复性的基础能力。一个 DataAgent 场景能说明问题。用户先问“上周华东区销售下滑的主要 SKU 是什么”,系统查出结果;接着用户追问“那华北呢”,Planner 必须记得上一轮的时间范围、指标口径和比较方式。下周同一用户回来,系统可能知道她偏好“表格 + 同比”。但“华东区包含哪些门店”属于企业组织上下文,不应和用户偏好混在一起。如果把这些信息全部塞进 Prompt,很快会碰到上下文长度和隐私问题。如果全部交给 RAG,又会把用户私有对话、组织主数据和文档知识混在同一个检索空间里。本章的目标,是把这些记忆分层。

Memory 的难点不在“记住”,而在“该记什么、记多久、谁能看、什么时候失效”。一个生产 Agent 如果永远记住用户说过的每一句话,看似聪明,实际会带来隐私、误用和过期风险。相反,如果每次都从零开始,长任务和多轮问答又会退化成一次性聊天。平台要在这两端之间建立可控的记忆层。一次完整问数会同时用到多层记忆。第一轮,用户指定“上周华东区”,Working 记录时间范围和区域条件;SQL 工具返回结果后,Working 保存结果摘要和 result_ref。第二轮,用户只说“华北呢”,Planner 从 Working 中恢复上一轮指标和时间范围,只替换区域条件。第三轮,用户确认“以后这类问题都用同比表格”,系统把这句话作为 Profile 候选,而非立即永久写入。几天后,组织主数据调整了区域定义,Org Context 的版本更新,旧的区域口径自动失效。这四步分别对应不同记忆层,不能混在一起。

Memory 容易被误解成“把更多历史塞进 Prompt”。企业 Agent 真正需要的记忆,是可恢复、可授权、可过期的上下文管理。一次 Run 的工作记忆、用户长期偏好、组织规则和知识库证据,生命周期和权限完全不同。混在一起会让模型看见不该看的信息,也会让错误上下文长期污染后续任务。DataAgent 的追问场景很典型。用户先问华东销售下滑,再追问华北,系统需要记住时间范围、指标口径和上一轮分析意图;用户下周再次打开系统时,不一定应该自动复用这段上下文。短期工作记忆可以进入检查点,长期用户偏好需要明确写入准入,企业制度则更适合放在 RAG 或组织上下文里。Memory 也会制造安全风险。用户一次性上传的客户名单不能被系统永久记住;某次人工修正的口径不能自动变成全公司规则;过期的组织政策也不能因为曾经写入记忆而继续影响回答。记忆系统越强,写入、读取、压缩和删除策略越重要。

27.1 Memory 的四层模型

27.1.1 四类记忆

Memory 至少要分成四类。Working Memory 服务当前 Run 或当前会话,保存最近用户输入、Planner 决策和工具结果。Episodic Memory 保存历史任务片段,例如某次分析的成功路径或用户曾确认过的口径。Profile 保存用户长期偏好。Org Context 保存企业组织、指标、权限和流程口径。

图27-1:Memory 生命周期与治理边界

图27-1:Memory 生命周期与治理边界。来源:本书自绘。Alt text:图中展示 Run 输入写入 Working、Episodic、Profile 和 Org Context 四类记忆,并通过来源、TTL、删除、权限、版本和审计进入治理动作,Planner 只按需读取最小上下文。

表27-1:四类 Memory 的边界。来源:本书整理。

类型 生命周期 典型内容 主要风险
Working Run 或会话级 最近消息、Tool 结果、Planner 可见上下文 过长、恢复不完整
Episodic 跨 Run 历史任务片段、成功路径、人工修正 跨用户污染、过期
Profile 跨会话 用户偏好、常用格式、语言风格 PII、删除请求
Org Context 组织级 区域定义、指标口径、审批规则 版本漂移、权限错配

这四类信息的读取顺序也不同。Org Context 通常先进入系统上下文,Working Memory 保证当前任务连续,Episodic 按需检索,Profile 只注入与当前任务相关的偏好。不能把它们合并成一个“记忆向量库”。四类记忆还对应不同的责任方。Working 主要由 Runtime 管,Episodic 和 Profile 需要用户、业务和合规共同决定晋升规则,Org Context 则应来自主数据、语义层或组织配置。把责任方分清,后续的删除、审计和版本更新才有落点。

27.1.2 Memory 与 Runtime 的关系

Runtime 写检查点时,至少要保存 Working Memory 快照。否则恢复后只知道 state=executing,却不知道 Planner 已看过哪些工具结果。对长任务和 HITL 来说,审批通过后的恢复尤其依赖这份快照。Memory 也不应直接执行工具或触发状态迁移。它给 Planner 组装上下文,给 Runtime 提供恢复材料,给审计提供当时注入了哪些上下文的证据。写入、读取、删除和晋升都应经过平台 API,不能让某个 Agent 私下维护一份本地记忆。

一次正常运行中,Memory 的路径应该很清楚:用户输入进入 Working,Planner 读取 Working 和必要的 Org Context,工具结果由 Runtime 写回 Working,检查点保存 Working 快照。任务结束后,系统可以从 Working 中提取候选 Episodic,但是否晋升要由策略决定。这样短期连续性和长期学习不会混在同一个写入动作里。这条路径还有一个好处:审计可以还原“模型当时知道什么”。当用户质疑某个回答时,平台要拿出 SQL 和文档引用,也要说明当次 Run 注入了哪些 Working 条目、哪些用户偏好、哪个组织口径版本。如果 Memory 是散落在各 Agent 代码里的私有变量,这种还原几乎做不到。

27.1.3 Memory 分层对职责混用的约束

第一类误用是把 Memory 当成聊天历史。聊天历史只是 Working Memory 的一种输入,不能承担用户画像、组织口径和长期任务经验。第二类误用是把 Memory 当成 RAG。RAG 通常处理企业文档和知识库,强调引用来源;Memory 处理用户和任务上下文,强调权限、删除和恢复。两者可以协作,但不应混用索引和权限模型。第三类误用是让模型自己决定永久记住什么。长期记忆晋升必须经过 PII、权限和用户确认策略。模型可以建议,但平台要决定是否写入。第四类误用是只做“加记忆”,不做“删记忆”。用户离职、租户下线、组织调整、合规删除请求都会要求系统清理部分记忆。如果 Memory API 没有删除和导出能力,越早上线长期记忆,后续迁移成本越高。


27.2 Working Memory 与检查点

27.2.1 保存当前 Run 的可见上下文

Working Memory 保存当前 Run 或会话的短期上下文。它不需要永久保存所有内容,但要保证 Planner 能继续工作。典型字段包括角色、内容、时间戳、来源、工具调用 ID 和摘要。

from core.memory import MemoryMessage, MessageRole, MemoryStore

store = MemoryStore()
wm = store.get_working("run-demo")
wm.append(MemoryMessage(
    role=MessageRole.USER,
    content="华东 SKU 下滑?",
    metadata={"source": "user_input"},
))
wm.append(MemoryMessage(
    role=MessageRole.TOOL,
    content='{"rows":[{"sku":"A001","delta":-0.12}]}',
    metadata={"source": "tool_result", "tool_call_id": "tc-1"},
))

snapshot = wm.snapshot()
restored = store.get_working("run-demo-restored")
restored.restore(snapshot)

mini-platform 当前实现的是最小 Working Memory:appendsnapshotrestore 和按消息条数截断。生产系统还需要 token 级窗口、摘要、结果引用和按来源过滤。

27.2.2 检查点必须包含 Working Memory

只保存状态机不够。假设经营分析 Run 已经执行 SQL,工具返回了某个 SKU 的销售下降结果,Pod 在报告生成前重启。如果检查点没有 working_snapshot,恢复后的 Planner 可能重新查数,甚至因为新数据到达而得到不同结果。用户看到的是同一个 Run,系统内部却换了一条事实链。因此,检查点 payload 至少应包含:

checkpoint_payload = {
    "run_id": run_ctx.run_id,
    "state": sm.state.value,
    "step_index": run_ctx.step_index,
    "tool_calls": [...],
    "working_snapshot": wm.snapshot(),
}

Working Memory 不应存大型工具结果。10 万行 CSV、长 PDF、完整日志应放对象存储或结果表,Working 只保存 sample、摘要、schema、行数、hash 和 result_ref。Planner 仍能恢复上下文,模型窗口也不会被中间结果撑爆。Working 的内容还要区分“给模型看”和“给审计看”。模型只需要当前任务相关的摘要、样例和错误;审计可能需要原始工具结果引用、hash 和执行时间。两者都可以从同一检查点关联,但不应该全部注入 Prompt。


27.3 长期记忆、用户画像与组织上下文

27.3.1 Episodic 与 Profile

Episodic Memory 保存“某次任务发生过什么”,Profile 保存“某个用户长期偏好什么”。二者容易混淆。用户上次确认“华东区按门店所属大区统计”是一次任务事实,可能进入 Episodic;用户经常要求“输出表格并加同比”是偏好,可能进入 Profile。长期记忆不能直接从对话自动写入。更可靠的流程是:候选提取、去重合并、敏感信息检查、用户确认或策略批准、版本化写入。拒绝、修改和删除都要有记录。否则 Memory 会越积越脏,模型还会把临时判断当成长期事实。例如用户说“以后都给我表格”,可以作为候选 Profile;用户说“这次临时用上月口径”,不应晋升为长期偏好;用户在一次错误分析中纠正了指标定义,可能应进入 Episodic,但只有在确认它不是一次性例外后才长期保存。Memory 晋升要按治理流程处理,不能交给文本抽取直接落库。

27.3.2 Org Context

Org Context 属于企业上下文,不属于个人记忆。区域定义、指标口径、审批链、主数据版本、权限域都应按组织和版本管理。它的更新频率和权限边界与用户 Profile 完全不同。例如“华东区包含哪些门店”应来自组织主数据或语义层版本,而非某个用户的历史提问。Planner 组装上下文时,应先注入组织口径,再拼 Working 窗口,然后按需检索 Episodic。这样能避免用户私有记忆污染企业定义。Org Context 还需要失效机制。组织调整、指标重命名、区域合并后,旧记忆不能继续默认生效。Memory API 应返回版本和有效期,让 Trace 能记录当次回答使用的组织口径。Org Context 与语义层关系很近,但关注点不同。语义层定义指标、维度和 SQL 生成口径;Org Context 负责把当前组织、权限、审批链和业务术语注入 Planner。DataAgent 生成 SQL 时应以语义层为准,生成解释和审批路径时则会同时用到 Org Context。


27.4 Memory 与 RAG 的分工

RAG 和 Memory 都会把外部信息放进上下文,但它们不是同一件事。RAG 面向文档、知识库、表结构和政策,强调引用来源和可追溯事实。Memory 面向用户、任务和运行上下文,强调连续性、恢复、偏好和组织口径。

表27-2:Memory 与 RAG 的区别。来源:本书整理。

维度 Memory RAG
主要对象 用户、Run、任务经验、组织口径 文档、知识库、表结构、政策
权限边界 用户、租户、组织、Run 文档权限、知识域、密级
引用要求 需要记录注入来源,不一定展示 citation 通常要求 citation
删除要求 用户删除、租户清理、过期失效 文档下架、索引更新
典型风险 跨用户污染、长期记忆错误 检索噪声、权限错配

两者应协作。例如 DataAgent 先从 Org Context 得到指标口径,再用 RAG 检索指标说明文档,然后用 Working Memory 保留本轮 SQL 结果。回答时,文档依据来自 RAG,当前任务连续性来自 Memory。不要让 RAG 索引用户私人对话,也不要让 Memory 承担文档检索的职责。边界一旦模糊,常见事故是“私有记忆被公开引用”。例如某个用户在对话里上传了未发布的经营数据,如果这段对话被当成 RAG 文档索引,另一个用户可能通过相似问题检索到它。Memory 必须先按用户、租户和 Run 做隔离,再考虑向量召回。


27.5 上下文超长治理

Memory 最常见的工程问题是上下文膨胀。多轮对话、工具结果、检索片段、用户偏好和组织口径叠在一起,很快超过模型窗口。单纯把历史交给模型总结并不可靠,因为摘要可能改写数字、丢失证据或混淆版本。更可靠的做法是分层裁剪。Working 保留最近用户意图、最后成功工具结果、关键错误和当前计划;大型工具结果改存引用;Episodic 检索设置 top-k 和租户过滤;Profile 只注入和任务相关的偏好;Org Context 只注入当前任务需要的口径。关键数值、SQL、审批意见和 artifact hash 不应由 LLM 摘要改写。

mem0 强调从对话中抽取、合并并检索长期记忆 (Chhikara et al. 2025)。Letta 继承 MemGPT 的主存和外存分页思路,把模型上下文内外的存储显式区分 (Packer et al. 2023)。这些思路对平台有启发,但企业落地时仍要把供应商 SDK 包在 adapter 后面。删除、导出、租户隔离和审计不能由黑盒长期记忆决定。上下文治理也要纳入评测。测试集除了最终答案,还要检查是否使用了过期记忆、是否把 Profile 当成事实、是否把 RAG 文档当成用户偏好、是否在删除后仍召回旧片段。Memory 相关 bug 往往不是语法错误,问题通常出在“用了不该用的信息”。评测样本也应覆盖多轮过程,而非只给单轮问答打分。比如第一轮用户要求按华东区统计,第二轮只说“换成华北”,第三轮删除了个人偏好,第四轮组织口径版本升级。这样的样本能检查 Working、Profile 和 Org Context 是否各自按规则生效。单轮样本很容易让 Memory 看起来可用,却暴露不了跨轮污染和过期口径问题。


27.6 Memory 与 Runtime 的读写接口

27.6.1 Working Memory 的实现入口

当前 core/memory/ 实现的是最小 Working Memory。实战项目 Run 链中,RunContext.working_memory 会在 Tool Call 后追加消息,RunLoop._save_checkpoint 会写入 working_snapshot。Episodic、Profile、Org、promotion 和 token 级滑窗仍属于生产扩展目标。

mini-platform/core/memory/
├── __init__.py
├── working.py
└── store.py

core/runtime/
├── run_models.py
└── run_loop.py

27.6.2 Memory 运行验证

如果想看这一章在代码里的最小落点,可以直接在 mini-platform 根目录运行实战项目,再去查看检查点。这样能更直观地理解 Memory 在运行时到底落到了哪些对象上。

cd mini-platform
python3 projects/multi-agent-workflow/run.py start

检查点位于 projects/multi-agent-workflow/.checkpoints/<run_id>.json,其中 working_snapshot 包含用户消息和工具消息。生产版应扩展为 token 级窗口、结果引用、删除 API、晋升 API 和组织上下文版本记录。

27.6.3 Memory 接入 Runtime 前的设计问题

Memory 接入 Runtime 前至少要回答五个问题,这些问题决定它是运行时能力,还是只是在 Prompt 里追加一段历史。表 27-4 将这些问题拆成写入、读取、删除、隔离和评测五类,便于接入评审逐项确认。

表27-3:Memory 接入 Runtime 前验证项。来源:本书整理。

验收项 检查问题
恢复 检查点是否包含足以重建 Planner 上下文的 Working Snapshot
隔离 Episodic 和 Profile 是否按用户、租户、组织过滤
删除 用户删除和租户清理是否能覆盖长期记忆
过期 Org Context 是否有版本和失效机制
上下文预算 是否限制 Tool 结果、RAG 片段和 Memory 片段的总量

早期可以先把 Working Memory 和检查点做扎实。长期记忆和用户画像如果没有删除、确认和审计能力,宁可先不上线,也不要让系统悄悄“永久记住”用户对话。实战验收可以设计两个场景:一个是 Pod 重启后继续生成报告,验证 working_snapshot 能恢复 Planner 上下文;另一个是用户删除偏好后再次提问,验证 Profile 不再被注入。前者证明 Memory 支撑运行时恢复,后者证明长期记忆受治理约束。

生产版接口可以按四组能力演进。第一组是 Working API,提供 append、window、snapshot、restore。第二组是长期记忆 API,提供 propose、approve、merge、delete。第三组是组织上下文 API,提供 get_org_context、version、invalidate。第四组是审计 API,提供本次 Run 注入了哪些记忆、来自哪个版本、是否被用户删除过。接口分组清楚,后续接 mem0、Letta 或自研向量库都更容易。Memory 还要有配额。一个用户长期使用 Agent 后,Profile、Episodic 和 Working 快照都会增长;没有配额,系统会把历史噪声越积越多。配额可以按用户、租户、记忆类型和有效期设置。超过配额时,系统应优先淘汰过期、低置信度、无引用来源的条目,而非简单删除最近记录。

配额之外,还要给记忆条目保留来源和置信度。来自用户确认的偏好、来自组织配置的口径、来自模型抽取的候选项,可信等级不同,删除和覆盖规则也不同。一个常见做法是让 Profile 条目带 source=confirmed_by_usersource=model_suggested,让 Org Context 带 source=semantic_layer 和版本号。Planner 读取时可以优先使用高置信条目;审计回放时也能解释某条记忆为什么被注入,而非只看到一段看似合理的上下文。

Memory 的变更也应进入发布流程。新增一种记忆类型、改变 Profile 晋升策略、调整 Org Context 失效时间,都会影响模型可见上下文。比较稳的做法是把策略版本写入 Trace,并用回归集检查旧问题是否因为新策略而改变答案。Memory 不是静态配置,它会持续影响 Agent 行为,因此需要像 Prompt、工具 schema 和语义层一样纳入版本管理。Memory 的用户体验也要克制。系统不需要向用户展示所有记忆,但应在关键场景说明“我根据你之前确认的口径继续分析”,并提供查看和删除入口。这样用户知道系统为什么记得,也知道如何纠正它。不可见、不可删、不可解释的长期记忆,很难进入企业生产环境。

早期还应避免把长期记忆做成默认开启。可以先只在内部用户或低风险场景启用 Profile 候选,要求用户确认后才写入;Episodic 只保存成功任务的摘要和证据引用,不保存原始敏感文本;Org Context 只从受控配置读取。这样 Memory 能先服务连续性和恢复,再逐步扩展到个性化和组织学习。这不是保守,主要是减少返工。长期记忆一旦写入大量错误偏好、过期口径或敏感片段,后续清理会比补功能更难。先把 Working、检查点、删除和导出做稳定,再开放自动晋升,才符合企业系统的演进顺序。


27.6.4 Memory 的污染控制与评测证据

Memory 上线后最难处理的问题,是错误记忆长期生效。一次错误偏好、过期组织规则或被提示注入污染的事实,如果写入长期记忆,后续 Run 会反复继承这个错误。企业平台必须把 Memory 写入视为受治理动作,而非普通上下文拼接。写入前要判断来源、置信度、过期时间、租户边界和删除责任;写入后要能通过 trace 找到这条记忆来自哪次 Run。不同记忆的审批强度应不同。Working Memory 属于当前 Run 的执行状态,可以随检查点保存;Episodic Memory 记录某次任务经验,应带时间戳和来源;Profile Memory 影响用户偏好,最好由用户或管理员确认;Org Context 涉及组织制度和业务口径,不能由单次对话直接写入。把这几类记忆混在一个向量库里,会让删除、纠错和权限隔离都变得困难。

Memory 的评测也不能只看命中率。平台要同时观察三类指标:该记住的信息是否被正确使用,不该记住的信息是否被过滤,过期或撤销的信息是否停止生效。对 DataAgent 来说,指标口径、用户筛选习惯、历史报告偏好都可能进入记忆,但它们必须服从第33章语义层和第50章权限策略。用户上次看过华东区域,不代表这次可以绕过权限继续查看华东明细。删除能力要在早期就设计。企业用户会要求清除个人偏好,管理员会要求撤销错误组织上下文,合规团队会要求删除特定数据主体相关记录。若 Memory 只支持追加,不支持定位、失效和删除,它迟早会成为审计风险。最小可用实现也应保留 memory_id、来源 Run、写入时间、作用域和过期策略,后续才能接入更完整的治理流程。

27.7 Memory 写入准入与生命周期

Memory 的写入不能由模型自由决定。模型可以提出“这条信息值得记住”的候选,但平台必须通过准入规则判断是否落库。准入规则至少要看信息来源、用户授权、敏感等级、可验证性和有效期。用户临时说“这次先按华东区看”,不等于平台可以把“用户只关注华东区”写成长期画像;审批人临时允许一次越权查看,也不等于后续 Run 可以复用这条权限上下文。长期记忆需要明确生命周期。偏好类信息可以设置较长有效期,但也要允许用户查看和删除;任务经验类信息应当绑定场景和版本,避免旧流程污染新流程;组织上下文要跟随制度、权限和数据域变化而更新。过期策略不能只按时间删除,还要按依赖关系失效。比如语义层指标下线后,引用该指标的历史问答经验就不能继续指导新任务。

删除同样重要。用户撤回授权、组织权限调整、合规要求清理数据时,Memory 系统必须能定位相关记录并停止检索。只在数据库里删除文本还不够,向量索引、缓存、摘要、评测样本和 Trace 可见范围都要同步处理。对于已进入审计记录的内容,平台可以保留不可变证据,但需要限制后续使用。Memory 的生产价值来自可控复用,而非无差别积累。

27.8 Memory 污染的检测与修复

Memory 污染通常表现为逐步积累的偏差,而不一定会立刻造成明显故障。模型把一次性上下文写成长久偏好,把错误回答摘要成经验,把未验证假设写入用户画像,或者把其他租户的相似问题误检索进当前任务,都会改变后续决策。污染发生后,系统可能仍然给出流畅回答,因此仅靠用户投诉很难及时发现。检测 Memory 污染需要结合 Trace 和评测。平台可以抽样检查记忆命中后的回答变化:同一问题在不使用 Memory、使用候选 Memory、使用生产 Memory 三种条件下有什么差异。若 Memory 让回答偏离权限、口径或用户意图,就应标记为污染候选。对于高价值任务,还可以要求模型在使用长期记忆时输出 MemoryRef,说明引用了哪条记忆以及它影响了哪一步决策。

修复污染要分层进行。错误文本可以删除或降权,错误摘要需要重新生成,错误画像需要用户或管理员确认,错误检索规则需要调整召回和过滤策略。修复后还要回放受影响样本,确认问题没有以另一种形式出现。Memory 系统如果没有这套治理,只会让 Agent 看起来更“懂用户”,却把错误经验长期固化在平台里。

27.9 Memory 与用户控制面

Memory 系统如果只在后台运行,用户很难建立信任。用户应当能看到系统记住了哪些长期偏好、哪些内容来自历史任务、哪些组织上下文由管理员维护。并非所有记忆都要完整展示,但至少要提供可解释入口,让用户能够纠正、删除或限制使用。否则当 Agent 给出“过于了解我”的回答时,用户无法判断这是合理复用还是越界推断。用户控制面还要区分个人记忆和组织记忆。个人偏好可以由用户修改,组织上下文应由数据或业务负责人维护,任务经验则可能需要平台团队审核后再沉淀。三类记忆若混在一起,用户删除个人偏好时可能误删共享规则,管理员更新组织规则时也可能覆盖个人设置。Memory 章节需要把这些治理边界提前讲清楚。在早期产品中,可以先提供简单的记忆查看和关闭能力:哪些 Run 使用了 Memory,引用了哪类 Memory,用户能否对某条记忆标记“不再使用”。这个入口不一定复杂,但它能把 Memory 从黑盒能力变成可治理能力。

用户控制面也能降低误用成本。用户发现记忆错误后,如果只能重新解释一遍,系统可能继续从旧记忆中召回错误信息;如果用户能直接标记错误记忆,平台就能把它从检索、摘要和评测样本中排除。Memory 的可控性越强,用户越愿意允许系统复用历史上下文。这类控制面不需要在早期做得复杂。只要能展示记忆来源、使用记录和停用入口,就能降低黑盒感,并为后续更细粒度的记忆治理留下接口。Memory 的评审要看四个问题:谁写入,谁能读,保存多久,如何纠错。没有写入准入,噪声会积累;没有读取权限,敏感信息会扩散;没有过期策略,旧上下文会误导模型;没有纠错流程,错误记忆会反复出现。

上下文压缩也要保留可追溯性。把多轮对话压成摘要可以节省 token,但摘要本身会丢信息或引入解释。重要任务需要保存原始事件和摘要版本,出问题时能回到源记录。Memory 与 RAG 的分工越清楚,系统越稳定。RAG 管企业知识和证据,Memory 管任务上下文、偏好和组织使用习惯。两者互相补充,但不能互相替代。Working Memory 应和 Run 生命周期绑定。任务结束后,哪些内容只用于审计,哪些可以作为用户偏好候选,哪些必须立即丢弃,需要明确规则。若所有上下文都默认长期保存,系统会积累大量敏感和过期信息。

长期记忆的写入最好采用“建议-确认”模式。模型可以发现用户常用地区、指标或报告格式,但写入前应说明来源和用途,必要时由用户确认。自动写入看似智能,实际会把偶然行为固化成偏好,后续回答也难以解释。组织上下文要由组织维护,而非从个人对话中自然生长。公司指标口径、审批规则、品牌语气和安全策略应来自正式资产库。个人在一次对话中纠正模型,最多生成反馈样本,不能直接覆盖组织规则。Memory 污染需要检测信号。用户频繁纠正同一偏好、某类任务突然引用旧信息、不同用户看到相互矛盾的组织规则,都可能说明记忆写入或读取出了问题。平台应提供查看、删除和纠正入口,让用户能管理影响自己的记忆。

在高风险场景中,Memory 应宁可少用。合同审阅、财务分析、权限判断和合规建议更依赖当前证据和正式规则,不能让历史偏好改变结论。Memory 可以帮助体验连续,但不应替代证据和策略。Memory 读取也要有解释能力。系统使用了哪些偏好、哪些历史任务、哪些组织上下文,应该能在调试视图里看到。用户未必需要每次都看到这些细节,但当回答受历史影响时,平台要能说明来源。否则用户会觉得系统“莫名其妙地记住了什么”。压缩策略要分层。短期任务摘要可以保留问题、已执行工具、关键结果和未完成事项;长期偏好摘要只保存稳定选择;组织上下文则应引用正式规则。把所有内容压成一段自然语言摘要,会丢失权限、时间和证据边界。结构化压缩比一段漂亮摘要更适合生产系统。

Memory 删除要真正生效。用户要求删除偏好或敏感信息时,平台要清理主存储、索引、缓存和下游副本,并记录删除结果。若 Memory 已进入训练数据或评测样本,还要有额外处理流程。企业用户会关心删除是否可证明,而非界面上是否不再显示。跨设备和跨渠道使用 Memory 时,身份一致性很重要。同一个用户在网页、即时通讯、移动端和 API 中使用 Agent,平台要判断哪些记忆可共享,哪些只属于某个渠道或组织空间。身份合并错误会导致偏好串号,严重时会造成数据泄露。Memory 评测要覆盖污染场景。给系统注入错误偏好、过期规则、恶意上下文或冲突记忆,观察它是否会盲目使用。只有经过这些测试,团队才知道 Memory 是否会在长期运行中放大错误。没有污染测试,记忆系统越用越久,风险越难发现。

把 Memory 做好后,用户会感到系统更连续,但平台仍要保持克制。每次使用记忆都应有明确理由,能不用时就不用,能用当前证据解决时就不要依赖历史。连续体验和业务可信之间,需要以后者为先。Memory 的 schema 要稳定。偏好、任务摘要、组织规则引用、用户画像和历史 artifact 不能都存成一段文本。结构化字段能让平台做权限、过期和纠错;纯文本记忆只能靠模型理解,难以治理。早期可以字段少,但类型要清楚。长期记忆还要支持冲突处理。用户偏好可能变化,组织规则可能更新,不同来源的记忆也可能互相矛盾。平台应按来源可信度、更新时间和适用范围选择,而非把所有记忆拼进上下文。冲突无法自动解决时,应请求用户确认或引用正式规则。

Memory 与评测集之间要隔离。评测时如果模型读取了历史答案或用户偏好,分数会失真。评测环境应使用受控 Memory,或者明确记录哪些记忆参与了评测。这样不同版本结果才可比较。运营上,Memory 应有可视化管理。用户能查看和删除个人偏好,管理员能查看组织上下文版本,平台团队能看到写入量、读取量和命中后的影响。没有管理界面,记忆系统会变成难以解释的黑盒。Memory 还要区分显式和隐式记忆。用户主动保存的偏好可信度较高,系统从行为中推断的偏好可信度较低。读取时应优先使用显式记忆,隐式记忆只作为提示,并在影响重要结果前请求确认。这样既保留连续体验,也避免系统把偶然行为当作长期规则。记忆命中后的效果要可评估。平台可以比较使用记忆和不使用记忆的任务完成率、用户修正次数和投诉情况。若某类记忆经常导致用户纠正,就应降低权重或改变写入规则。Memory 不是越多越好,真正有帮助的记忆才应留下。

27.10 Memory 发布台账与污染复盘

Memory 需要像 Prompt、工具 schema 和语义层一样进入发布台账。台账应记录记忆类型、读写策略版本、默认作用域、过期规则、删除能力、评测集、灰度租户和负责人。新增一种 Profile 条目、调整 Episodic 检索 top-k、改变 Org Context 失效规则,都会改变模型能看到的上下文。若这些变更没有版本记录,线上回答变化时团队很难判断是模型升级、检索变化、用户偏好变化,还是组织口径变化。

发布前的验收样本要同时覆盖“该记住”和“该忘记”。该记住的样本检查多轮任务恢复、用户确认偏好和组织默认口径是否被正确使用;该忘记的样本检查用户删除、租户清理、权限收回、指标下线和过期组织规则是否停止生效。Memory 的质量不能只看命中率,因为命中错误信息比没有命中更危险。验收报告应记录哪些记忆被注入、来源 Run、作用域和有效期,便于第38章 Trace 和第39章 Eval 复用。

污染复盘要追溯写入来源。错误记忆可能来自模型抽取、用户临时表达、错误摘要、跨租户检索、RAG 与 Memory 边界混淆,也可能来自管理员手工配置。复盘时应先定位 memory_id、写入 Run、写入策略版本和最近读取记录,再决定删除、降权、重新摘要、请求用户确认,还是修改检索过滤。只修改 Prompt 往往解决不了污染,因为错误条目仍会在后续任务中被召回。

Memory 与评测环境也要隔离。回归测试如果读取生产用户偏好,分数会随着历史使用而变化,无法比较不同版本。更稳的做法是为评测准备受控 Memory 快照,并在结果中记录参与评测的记忆集合。对 DataAgent 来说,还要确保 Memory 不能覆盖语义层和权限策略。用户历史上常看某个区域,不代表本次任务有权读取该区域明细;用户偏好某种报告格式,也不能改变财务指标口径。

早期可以从三类运行数据开始观察:写入量、读取后影响和用户纠错。写入量过高,说明候选晋升太宽;读取后用户频繁修改,说明记忆质量或作用域有问题;删除后仍被召回,说明索引、缓存或摘要副本没有同步清理。平台应把这些信号纳入每周复盘,逐步调整写入准入、过期策略和控制面。Memory 的价值来自受控复用,只有台账、删除、隔离和污染修复都能运转,长期记忆才适合进入企业生产。

27.11 Memory 污染诊断与删除证据

Memory 的生产风险常出现在写入之后。用户一次临时偏好、模型一次误判、工具一次错误摘要,都可能被写成长期记忆,后续不断影响 Planner、检索和回答。Memory 污染不一定表现为明显错误,它更常表现为系统持续偏向某个客户、某个指标口径、某个过期项目或某个错误事实。平台需要把 Memory 写入当成可审计动作,而不是普通上下文缓存。

污染诊断要保存写入来源、写入理由、使用次数、命中任务、用户反馈和删除记录。若某条 Memory 来自人工确认,可信度和保留时间可以更高;若来自模型自动摘要,就应有更短过期时间和更严格使用边界。用户纠正、审批退回、评测失败、权限变化都可能触发 Memory 复审。删除也要留下证据:谁删除、为什么删除、影响哪些后续任务、是否需要重跑相关评测。

Memory 还要支持局部遗忘。删除某条偏好不应清空用户所有历史;权限变更时,应移除受影响的数据引用,而保留无敏感性的任务习惯;项目结束后,应归档项目相关 Memory,而不是继续影响新项目。早期平台可以先实现最小治理:写入需带来源,读取需带理由,高风险 Memory 需人工确认,删除需记录审计。这样 Memory 才能帮助 Agent 延续上下文,而不会成为不可解释的隐性状态。

27.12 Memory 策略的用户告知与复核

Memory 会改变用户对系统的信任感,因此策略要可告知、可复核。用户需要知道系统会记住哪些内容、记多久、用于哪些任务、是否跨会话使用、能否删除。企业场景还要说明组织记忆和个人记忆的区别:个人偏好可以帮助界面和表达,组织事实必须来自受治理系统,不能因为某个用户说过一句话就变成全局规则。

复核机制应覆盖写入和读取。写入时,平台判断这条信息是否稳定、是否有权限、是否含敏感内容、是否需要用户确认。读取时,平台判断当前任务是否允许使用这段记忆,是否需要向用户提示,是否会和最新系统记录冲突。若记忆影响了工具调用、报告结论或推荐动作,Trace 应记录 memory id 和使用原因。这样用户质疑结果时,团队能判断问题来自旧记忆、错误写入还是业务系统更新。

早期 Memory 可以从高价值、低风险的内容开始,例如用户偏好的报告格式、常用筛选条件、工作语言和任务模板。涉及权限、事实和长期决策的内容,应先停在候选记忆或人工确认状态。Memory 的成熟度不在于记得越多越好,而在于每一次记忆写入和读取都能解释用途、范围和退出方式。

27.13 Memory 命中后的用户解释

Memory 命中后,用户需要适度解释。系统不必每次都弹出详细提示,但当记忆影响推荐、工具参数、报告格式或风险判断时,应说明使用了哪类记忆。比如“沿用你上次选择的华东区口径”比静默修改过滤条件更稳妥。用户知道来源后,才能纠正错误记忆。

解释还要保护隐私。界面可以展示记忆类别和用途,不必暴露完整原文;审计视图保存 memory id、写入来源、读取原因和删除状态。这样用户体验、隐私和复盘可以同时成立。

27.14 Memory 回放评测与策略降级

Memory 上线后的评测要能回放。平台可以为代表任务准备两组输入:一组启用 Memory,一组禁用 Memory,只比较任务结果、工具参数、用户修正次数和风险事件。若启用 Memory 后结果更贴合用户习惯,同时没有改变权限、指标口径和证据来源,说明这类记忆可以保留;若启用 Memory 后工具参数偏移、报告事实混入旧偏好、用户频繁纠正,就要降低该类记忆权重或暂停写入。Memory 的价值不应只用命中率证明,命中后的行为影响更重要。

策略降级要可执行。某类 Memory 被证明风险较高时,平台可以从自动注入改为候选提示,从候选提示改为用户确认,从长期保存改为短期 Working Memory,从跨任务复用改为只在当前项目使用。降级后,Trace 仍要记录记忆曾被命中但未使用的原因,这样评测团队能看见策略变化带来的影响。对高风险任务,默认禁用个人偏好或只允许读取组织正式上下文,是更稳妥的起点。

Memory 回放还要连接删除验证。用户删除某条偏好后,平台应能用历史任务样本确认它不再影响 Planner、RAG 过滤、报告模板和前端默认值。若删除后仍有影响,问题可能来自索引副本、摘要缓存、评测样本或下游 artifact。把删除验证纳入回放评测,能让 Memory 控制面从界面操作变成可证明的治理能力。

27.15 Memory 命中争议的复盘流程

Memory 命中后,用户不一定会立即指出问题。有时用户只是觉得结果“沿用了旧习惯”,或者发现系统自动带入了过期地区、旧客户、旧项目和旧格式。争议往往发生在报告复核、审批退回或后续行动失败之后。平台需要把这类争议和具体 memory id 关联起来,而不是只记录为一次回答质量问题。

复盘流程应先判断记忆是否应被读取。当前任务是否属于同一项目、用户是否仍有权限、记忆是否过期、组织规则是否已有新版本、用户是否曾删除或禁用该类记忆,这些问题决定 Memory 命中是否合法。若读取本身不合规,应修改读取策略或作用域;若读取合规但内容错误,应修订、降权或删除记忆;若内容正确但用户无法理解,应改进命中解释和用户控制面。

Memory 争议还要进入评测。平台可以把同一个任务分别在启用和禁用相关记忆的条件下回放,比较工具参数、报告结论、用户修正和权限判断。若禁用 Memory 后结果更符合当前证据,说明该类记忆不应自动注入;若启用 Memory 明显减少重复输入,且没有改变证据边界,可以保留。这样的评测比单纯统计命中率更接近生产质量。

早期可以把 Memory 争议分成三类:错误写入、错误读取和解释不足。错误写入进入删除和样本修订,错误读取进入策略和权限修订,解释不足进入产品提示和审计视图改进。分类简单,但能帮助团队把 Memory 问题定位到写入、检索、权限、解释四个环节,而不是把所有问题都归因于模型记忆能力。

27.16 Memory 变更的用户撤回权

Memory 系统进入生产后,用户需要撤回权。用户可能发现系统记住了错误偏好、过期项目、敏感身份、临时上下文或不应跨会话保留的内容。若 Memory 只能由后台团队删除,用户会失去控制感,也会增加隐私和合规风险。企业 Agent 平台应让用户能够查看、纠正、删除和限制 Memory 的使用范围。

撤回权要和运行证据连接。用户删除一条 Memory 后,平台应记录删除对象、删除时间、影响范围和后续策略;正在运行的 Run 是否继续使用旧 Memory,也要有明确规则。若某个报告或决策已经引用被删除 Memory,系统不一定能改写历史 artifact,但应能说明当时使用过该 Memory,并在后续任务中停止使用。这样用户控制不会破坏审计证据。

撤回还要支持分级。用户可以删除单条偏好,也可以关闭某类 Memory,例如个人偏好、项目上下文、组织规则或历史任务摘要;管理员可以按租户或数据域冻结某类 Memory 写入。不同级别的撤回应进入 Trace 和 Memory 台账,让 Planner 知道哪些上下文已经不可用,避免继续围绕旧偏好规划。

早期可以先实现“查看、删除、限制使用”三类能力。查看让用户知道系统记住了什么,删除处理错误或敏感记录,限制使用控制 Memory 是否进入高风险任务。Memory 的价值来自长期上下文,但长期上下文只有在用户可控时才适合进入企业场景。

27.17 Memory 删除权与用户解释

Memory 上线后,用户必须知道哪些内容会被记住、为什么被记住、怎样删除。企业场景里的 Memory 可能包含偏好、项目上下文、常用指标、审批习惯、客户信息和历史任务。若平台只在后台做写入和过期,用户会把 Memory 视为不可见的判断来源;一旦回答出现偏差,用户无法判断是当前输入、历史记忆还是模型推断造成的。

删除权要落到具体对象。用户可以删除某条记忆、某个项目上下文、某类偏好,或者要求某个租户下的 Memory 不再参与回答。删除后,平台要处理派生产物:缓存、评测样本、摘要、向量索引和报告 artifact 是否仍然引用该记忆。并不是所有审计记录都要物理删除,但用户可见和模型可用的记忆必须按策略移除。

解释也要有粒度。Agent 可以说明“本次回答使用了项目 X 的上下文”和“没有使用个人偏好”,而不必展示全部内部存储。对于高风险任务,Memory 使用记录应进入 Trace;对于用户反馈,平台应允许用户标记“这条记忆不适用”。早期可以在 Memory 面板中展示记忆来源、适用范围、最后使用时间和删除入口。这样 Memory 能提升连续性,也不会变成不可审计的隐性上下文。

27.18 Memory 使用后的申诉处理

Memory进入生产后,新增能力不能只看功能是否可用,还要看运行证据能否被不同角色复用。平台需要把命中内容、来源、写入时间、使用原因、用户撤回和删除回执记录成稳定字段,并和发布单、Trace、评测样本以及事故记录关联起来。这样一次线上问题发生后,团队可以沿着同一组事实判断影响范围、责任归属和修复顺序,而不是在模型日志、业务日志和人工说明之间来回拼接。

这类证据还要服务相邻章节的能力。它和第20章 RAG、第30章 HITL 和第52章合规相连:上游能力提供输入假设,下游能力使用执行结果,治理能力负责保存证据和复审结论。若这些材料没有统一编号和版本,章节里讨论的工程能力在生产中会被拆散。业务 owner 只能看到用户投诉,平台 owner 只能看到系统错误,安全或合规团队只能看到事后说明,最后很难判断问题到底来自数据、模型、工具、流程还是组织责任。

生产环境中常见的风险包括用户不同意画像、过期偏好影响答案、删除后仍被缓存命中。这些问题在演示阶段不明显,因为演示通常只覆盖成功路径;上线后,用户会带来边界问题、重复请求、权限变化和长时间运行状态。平台团队应把失败样本纳入发布节奏,记录哪些样本需要阻断发布,哪些样本可以通过降级处理,哪些样本需要业务 owner 接受剩余风险。

Memory 应提供可解释和可申诉路径,避免长期上下文变成不可见的决策依据。这份记录不需要复杂,但要包含时间、版本、owner、样本、处置动作和下次复查条件。没有这些字段,复盘会停留在口头经验;有了这些字段,平台才能把一次问题转成后续发布、评测和培训材料。

早期平台可以从少量高风险场景开始。先选择调用量高、业务影响大或涉及敏感数据的路径,要求每次变更都留下证据包,再逐步推广到普通场景。这样章节里的能力不会停留在概念层,而会成为可运行、可解释、可退回的工程系统。

本章小结

Memory 是平台子系统,不等于聊天历史,也不等于 RAG。Working Memory 必须进入检查点,否则 Runtime 恢复后 Planner 会丢失任务上下文。Episodic、Profile 和 Org Context 的作用域、权限和更新频率不同,不能混存在同一类存储里。RAG 负责文档和知识引用,Memory 负责任务连续性、用户偏好和组织口径。长期记忆上线前,应先解决删除、隔离、版本和审计,再考虑自动晋升。否则记忆越丰富,越容易把过期偏好、越权信息或错误经验带入新的 Run。

参考文献

Wang, L., Ma, C., Feng, X., et al. (2024). A survey on large language model based autonomous agents. Frontiers of Computer Science, 18(6), 186345. https://doi.org/10.1007/s11704-024-40231-1

Chhikara, P., Khant, P., Yadav, P., et al. (2025). mem0: Building production-ready AI agents with scalable long-term memory. https://arxiv.org/abs/2504.19437

Packer, C., Wooders, S., Lin, K., et al. (2023). MemGPT: Towards LLMs as operating systems. https://arxiv.org/abs/2310.08560

Letta. (n.d.). Letta documentation. https://docs.letta.com/

Zhang, Z., Wang, Y., Fang, C., et al. (2024). A survey on the memory mechanism of large language model-based agents. https://arxiv.org/abs/2404.13501

LangChain. (n.d.). Persistence. LangGraph. https://docs.langchain.com/oss/python/langgraph/persistence