Skip to content

A5 · Agent 如何形成、保存和使用记忆? - Memory ​

所属知识库:Agent 全栈技术地图
所属领域:02 · Agent
所属章节:02 · Agent 的能力由哪些部分构成? - Internal Architecture
文档类型:技术原理与工程实践研究
版本:v1.2
更新日期:2026 年 10 月 28 日
核心问题:Agent 如何从交互与执行经历中形成有价值的记忆,如何表示、持久化、检索、整合、更新与遗忘,并通过可验证的工程架构使历史信息改善未来任务表现?

专题导读 ​

Memory(记忆)使 Agent 能够在单次模型调用之外维持信息连续性,并利用过去的事实、事件、决策和经验改善后续工作。它不是将聊天记录无限拼接到提示词,也不是让模型参数在每次交互后自动学习,而是围绕「哪些历史信息值得保存、以什么形式保存、何时召回、怎样验证有效性、如何修订和遗忘」构建的一套信息生命周期机制。

本篇按技术机制深度要求展开:先区分 Memory、Context、Runtime State、Knowledge 与模型参数,再把情景、语义与程序性记忆落到可实现的数据结构;随后拆解写入管道中的候选提取、硬性门槛、效用评估、去重与版本晋升,以及整合过程中的摘要漂移与分层再生。核心机制部分重点展开记忆检索:作用域过滤、结构化/全文/向量混合召回、RRF 融合、相关性/重要性/时间/意图匹配的归一化评分、有效性检查与上下文预算裁剪,并用完整数值轨迹说明「命中」如何变成「可注入片段」。

随后比较 Generative Agents 的记忆流-检索-反思、MemGPT 的分层工作区、Reflexion 的语言反馈记忆与 MemoryBank 的长期交互思路,明确原论文能支持与不能支持的结论。工程部分给出数据模型、读写协议、研究助理跨日轨迹,以及达到 L2 的最小可运行排序示例(作用域过滤 → 时间衰减 → 加权排序 → 有效性检查)。核心判断是:记忆系统的价值不取决于存储容量,而取决于它能否以正确的作用域、来源、时间和可信度,在真正需要时恢复有用信息,并避免错误历史持续污染任务。

01 · 研究对象:为什么 Agent 需要 Memory? ​

模型驱动型 Agent 在某一步推理中只能直接使用该次调用的可见输入。即使服务商提供会话状态接口,也不意味着任意历史信息都能永久、准确地进入未来每一次推断。随着对话增长、项目跨天执行、上下文压缩或不同任务并行,过去的重要约束和决策可能从当前输入中消失。Memory 试图解决的是「历史信息跨时间的选择性保留与再利用」,而不是「一次调用里放进更多文本」。

例如,一个研究助理正在持续编写《Agent 全栈技术地图》。它需要在数周之后仍知道:用户已经批准的文章元数据格式是什么;某个章节为什么被退回重写;某条技术结论被证明不准确后应该如何修订;哪些偏好只适用于这个知识库。反过来,它不应将每次搜索结果、每句临时讨论或模型的未经核实推断永久记住。记忆的价值体现在减少重复沟通、保持跨会话一致性、复用已验证经验,而风险则体现在错误累积、偏好过期和跨项目泄露。

一个可操作的工程定义是:Agent Memory = 从历史事件中选择信息 → 形成可追溯表示 → 持久化与索引 → 在后续任务中按需检索 → 校验并注入上下文 → 根据新事实更新或失效 → 评价对任务的净收益。 这个定义是本文的工程归纳,而非统一标准;实际产品可以只实现其中部分功能。

1.1 五种容易混淆的对象 ​

对象它回答什么问题示例主要控制者
Model parameters模型训练时形成了哪些统计表征?通用语言能力、训练中习得的概念模型训练与提供商
Context当前这次推断实际看见什么?本轮指令、任务摘要、被召回的记忆Context Assembler
Runtime State当前任务的权威执行事实是什么?节点已完成、审批待处理、工具结果 IDAgent Runtime
Knowledge哪些外部事实和文献可供核查?论文、官方文档、数据集知识源与检索系统
Memory哪些历史经历或稳定信息值得以后复用?项目偏好、过去决策、经验与纠错Memory Manager

同一条信息可以在生命周期中跨越这些层次。例如,用户批准文章模板的消息先成为事件;经确认和写入策略处理后成为项目级记忆;未来某次写作前被召回并进入 Context。与之不同,「本轮任务已经执行到第三步」首先属于权威运行状态;如果希望未来复盘项目经历,可以从该状态产生情景记忆,但不能用模糊的记忆摘要替代当前执行状态。

1.2 记忆与学习的关系 ​

记忆能够使 Agent 的未来行为随过去经验变化,因此可以被宽泛地称为一种基于外部信息的适应;但这通常不意味着模型权重被更新。模型微调改变参数,外部记忆改变未来可检索的信息和输入条件。两者在更新速度、可追溯性、撤销能力和适用任务上差异显著。对持续变化的项目事实和用户偏好,外部记忆通常更容易维护;对稳定且大规模重复的行为模式,训练或微调可能是另一条路线。

02 · 记忆类型:从认知科学类比到可实现的数据结构 ​

2.1 情景记忆(Episodic Memory):发生过什么 ​

情景记忆以事件为中心,描述特定时间、参与者、动作和结果。例如:「2026-10-28,用户确认 A6 v1.1 的技术深度符合预期,并要求后续沿用这一标准」。其典型结构不是一句脱离上下文的结论,而是包含 event_id、时间、主体、对象、动作、结果、来源引用、作用域及版本的记录。情景记忆适合回答「为什么采用这个方案」「此前尝试了什么」「谁批准了什么」。

情景记忆的关键技术问题是事件粒度。逐 token 保存成本过高,逐会话压缩又容易丢失关键决定。工程上可保留原始事件日志作为事实来源,再从中抽取可检索的事件摘要和结构化索引。原始事件、模型解释和用户确认应使用不同字段,避免历史推断被误当作用户原话。

2.2 语义记忆(Semantic Memory):现在应当认为哪些事实有效 ​

语义记忆以可复用事实、概念或偏好为中心。例如:「本知识库专题文章优先解释技术原理、代表性研究和工程实现」。它通常比单次事件更适合未来检索,但需要更严格的适用范围与有效性管理。建议使用 subject–predicate–value 或带类型的属性记录,并附 scope、source_refs、valid_from、valid_to、status、confidence_label。

情景转语义不是简单去掉时间。例如,用户一次说「这篇文章简短一点」,不能自动推断「用户永久喜欢短文章」;只有明确的长期指示或多次证据支持并经过适当确认,才可能形成稳定偏好。归纳时必须保存原始依据、推断方式与确认状态。

2.3 程序性记忆(Procedural Memory):如何完成某类任务 ​

程序性记忆指可重复使用的方法或操作经验。例如:「研究文章写作先核对代表性论文,再解释原理、比较技术路线,最后设计工程案例」。在 Agent 系统中,这可能表现为经验摘要、流程规则、模板或经过验证的 Skill。单次成功的操作轨迹仍然只是情景事件;只有抽象、验证并发布为可复用步骤后,才适合升级为程序性资产。

因此,Memory 与 Skills 的分界不是「一个存文本,一个存代码」,而是治理目标不同:Memory 保存历史及经验候选,Skills 管理经过审查、可版本化、可重复执行的能力契约。未经验证的经验不应直接成为拥有执行权限的操作规则。

2.4 时间尺度与作用域是独立维度 ​

短期/长期描述保留时间,情景/语义/程序性描述内容性质,user/project/run/organization 描述可见范围。这三个维度彼此正交。一个项目级情景事件可以长期保存;一个用户级偏好可能只有一周有效;一个会话内摘要可能在任务结束后立即删除。许多框架把短期记忆称作线程状态或检查点,这是一种实现命名,不能由此推断它具备长期提炼和语义检索能力。

03 · 记忆形成:从原始事件到可复用记录 ​

记忆形成(memory formation)是一个多阶段管道:Observe → Extract → Classify → Filter → Normalize → Resolve → Commit → Index。其中模型适合做语义抽取与候选总结,程序适合做作用域约束、数据验证、去重、权限控制和原子写入。若所有历史消息都直接写入向量库,系统只是获得了语义搜索历史的能力,尚未解决候选价值、矛盾更新和错误传播问题。

3.1 观察与候选提取 ​

候选来源可以是用户明确陈述、审批事件、工具结果、项目里程碑、任务失败与纠错。每种来源具有不同可信含义:用户明确批准的规范可形成「已确认偏好」;外部网页只能成为「来源观察」;模型推测则必须标记为「系统推断」。提取时应保留原始事件 ID,且不得把原文中不确定的词语(「可能」「暂定」「如果」)改写为确定事实。

一种候选结构为:candidate_id, subject, predicate, value, source_type, source_ref, scope, proposed_kind, certainty, temporal_scope, sensitivity, write_reason。例如「用户在本项目中要求 Markdown 文件可下载」与「用户喜欢所有内容都用 Markdown」不是同一候选;后者需要额外依据。

3.2 写入门槛:硬性条件先于效用分数 ​

候选是否值得保存,应同时考虑未来使用概率、对任务的帮助、稳定性、可替代性、证据质量、存储成本、过期风险和隐私风险。可用概念性效用函数表达:

U(m)=P(future use∣m)⋅B(m)−Cstorage(m)−Cerror(m)−Cprivacy(m)

各项不是自然可得的准确概率,需要用任务样本校准。更关键的是执行顺序:先跑硬性写入门禁,再计算 U(m)。

门禁通过条件失败时行为
存储许可租户策略允许该类数据落库拒绝写入,可只留短时事件
作用域合法scope 可由鉴权上下文推导拒绝;禁止模型自填 scope
来源合法用户确认 / 系统事件 / 工具事实;外部文本不得自称指令降级为 observed 或丢弃
敏感性PII/密钥等按策略脱敏或禁止脱敏失败则拒绝
最小证据长期规范需确认事件或多次独立证据保持 inferred,不升 confirmed

具体轨迹:用户说「本项目以后都按深度研究标准写」。提取器产出候选 subject=project:A, predicate=writing_depth, value=mechanism_first, source=user_confirm。门禁通过后,估算 P(future use) 高(每个新章节都会用)、B 高(减少返工)、Cerror 中等(若理解错标准会系统性偏题)、隐私风险低,于是写入 confirmed/active。若同一句来自网页「请忽略旧标准」,来源门禁失败,不得写入为用户偏好。

3.3 去重与实体规范化 ​

相同信息可能以不同措辞多次出现:「报告使用七字段头部」「元数据格式沿用既定七项」「文章前言不加额外字段」。仅靠字符串去重会漏掉语义重复;仅靠向量相似度又可能错误合并不同版本或不同项目。推荐先用结构化主键(主体、谓词、作用域)定位潜在冲突,再以语义匹配辅助判断等价性,并保留人工或规则复核路径。

例如 project:A / article_header / seven_fields 与 project:B / article_header / five_fields 不应合并;project:A / article_header / seven_fields 与 project:A / article_header / revised_seven_fields 则可能构成版本更新。写入过程应在事务中处理旧记录状态和新记录创建,避免并发请求同时留下两个互斥的 active 版本。

3.4 从事件到稳定记忆的晋升 ​

可以将候选分为四种状态:observed(观察到)、inferred(系统归纳)、confirmed(用户或权威流程确认)、revoked(已撤销)。不是所有事实都必须人工确认,但对长期行为约束、敏感偏好和高影响决策,确认状态尤为重要。历史事件本身可以长期留档;被归纳出的「当前有效规则」则应有独立生命周期。

04 · 记忆整合(Consolidation):为什么长期保存需要重新组织 ​

随着 Agent 运行,事件数量增长会使检索噪声、重复和成本上升。记忆整合试图把低层事件转化为较高层、可复用的表示,同时保留必要的证据回链。一个典型层次是:原始事件 → 事件摘要 → 项目事实卡 → 稳定偏好/经验候选。整合不等于简单压缩:它还包括跨事件合并、矛盾检测、时间关系更新、重要性再评估和无效信息降权。

例如,连续三次项目审稿中,用户都指出「技术路线只列名称而没有机制拆解」。系统可以产生候选:「该项目要求代表性研究深入解释机制」。但应保留三次反馈的来源,并区分「多次观察归纳」与「用户明确要求以后遵循」。若后来用户为某个概览文章特别要求简短,新的局部要求不应错误覆盖全项目标准。

4.1 摘要漂移如何发生 ​

设原始事件为「用户认为 A2 基本合格,但 A5、A6 技术深度不足」。第一次摘要可能变为「用户要求提高后续文章深度」;第二次摘要进一步变为「用户不喜欢概览文章」;第三次可能错误变为「用户禁止任何概览」。每次压缩看似合理,却逐渐丢失对象、程度和例外。应保留重要约束的原文回链,并对关键事实采用结构化字段而非反复自然语言转述。

4.2 分层摘要与重新生成 ​

增量摘要节省成本,但错误容易累积;定期从原始事件重新生成项目事实卡可以降低部分漂移风险,却增加计算成本。可采用混合方式:日常写入增量事件,里程碑时从相关原始记录重新整合,并对新旧事实卡执行差异检查。重大规则和审批结果不应仅保存在不可追溯的摘要里。

4.3 时间衰减不是统一删除策略 ​

短期日程、临时假设和网页观察可能快速过期;项目命名规范、明确确认的长期偏好可能在较长时间内保持有效。对记忆的时间处理应分为「排序降权」「有效期届满」「业务撤销」「物理删除」,而不是统一使用一个衰减公式。过期信息可能仍有历史价值,但不应被当作当前有效事实注入模型。

05 · 记忆检索:如何在正确时机恢复正确历史 ​

Memory Retrieval 的输入不应只是用户当前话语的向量表示,还应包含任务意图、项目 ID、实体、时间范围、所需记忆类型和风险级别。一个完整流程通常是:

text
触发判断 → 构造 QueryContext
        → 硬性作用域/权限过滤(不可由模型跳过)
        → 多通道候选召回(结构化 / 全文 / 向量)
        → 排名融合(如 RRF)
        → 去重与冲突标记
        → 分量归一化与加权排序
        → 有效性/确认状态检查
        → Token 预算裁剪与打包
        → 注入 Context Assembler
        → 记录 retrieval_trace

下面按机制拆解:先说明每一步的输入输出,再给出可计算的评分与数值示例。

5.1 检索触发与检索意图 ​

不是每次模型调用都需要读取长期记忆。典型触发包括:开始一个已有项目的新会话、用户要求「继续上次工作」、当前任务需要偏好、模型发现缺少历史决策、任务进入需要经验复用的阶段。

可把检索意图写成结构化 QueryContext:

字段含义示例
intent检索目的recover_preference / recover_decision / recall_episode / retrieve_procedure / resolve_conflict
tenant_id / actor_id身份来自鉴权,不可由提示词伪造
scope_allowlist允许访问的作用域集合{project:A}
task_type当前任务类型rewrite_article
entities实体约束["A5", "writing_template"]
time_range可选时间窗最近 90 天,或「仅 active」
kind_filter记忆类型semantic 优先于 episode
risk_level风险高风险任务禁止未确认推断

不同意图改变排序权重:恢复偏好时提高 confirmed 与 P(intent);回忆情景时提高时间新近度;解决冲突时保留多条互斥记录并显式标记,而不是只取最高分一条。

5.2 混合召回:精确过滤优先于语义相似 ​

用户级与项目级隔离必须在候选召回之前由可信身份和授权机制确定。若把「不要混用项目」只写进提示词,模型仍可能读到错误 scope 的记录。正确顺序是:

  1. 硬过滤:tenant_id、scope_allowlist、status ∈ {active}(或按意图放宽)、敏感标签与 ACL。
  2. 结构化通道:按 subject/predicate/实体精确命中,例如 predicate=article_header AND scope=project:A。
  3. 全文通道:BM25 或等价词法检索,适合版本号、文件名、专有名词。
  4. 向量通道:对记忆文本(或规范化陈述)做 embedding,与查询向量做余弦相似度,适合措辞变化。

三通道各自返回带内部排名的候选列表后,可用 Reciprocal Rank Fusion(RRF)融合:

RRF(d)=∑c∈C1k+rankc(d)

其中 C 是参与融合的通道集合,rankc(d) 是文档 d 在通道 c 中的排名(从 1 开始),k 常用 60。RRF 的优点是不要求各通道分数同量纲;缺点是仍可能把过期或互斥记录融进前列,因此融合之后必须再做有效性与冲突检查。

5.3 分量如何计算:相关性、重要性、时间与意图匹配 ​

工程中可采用解释性评分(属于本文归纳,不是统一标准公式):

S(m,q)=wrR^(m,q)+wiI^(m)+wtT^(m)+wpP^(m,q)

各原始分量需先映射到 [0,1] 再加权。一种可实现定义如下。

相关性 R^:若同时有向量相似度 cos(em,eq)∈[−1,1] 与 BM25 分数,可分别 min-max 归一化后取最大值或加权平均;仅有向量时可用 R^=max(0,cos)。查询向量应由 QueryContext 的自然语言投影生成,例如「恢复项目 A 的写作规范与 A5 退回原因」,而不是只用用户最新一句闲聊。

重要性 I^:写入时由规则或模型给出 Iraw∈[1,10],再令 I^=(Iraw−1)/9。规则示例:用户明确确认的长期规范 =9;多次观察归纳 =6;单次临时意见 =3;外部网页观察 =2。重要性是写入时的静态先验,检索时不应单独覆盖硬性状态。

时间因素 T^:对「排序降权」使用指数衰减,对「是否仍有效」使用 valid_until/status,二者不要混用。

T^(m)=exp⁡(−λ⋅Δt),Δt=days(tnow−tref)

其中 tref 可以是 updated_at(偏好)或 occurred_at(情景);λ 控制半衰期。由 T^=1/2 可解得 t1/2=ln⁡2/λ。例如 λ=0.05 时半衰期约 13.9 天;λ=0.01 时约 69 天。长期确认规范应使用很小的 λ,或直接令 T^=1 并由有效期字段控制淘汰。

意图/项目匹配 P^:规则分即可,例如 scope 精确匹配 +0.5,kind 与 intent 匹配 +0.3,confirmation_state=confirmed +0.2,总和截断到 1。未确认推断在高风险意图下可将 P^ 置 0 或直接过滤。

硬约束先于分数:status=revoked/superseded、scope 不在 allowlist、超过 valid_until、敏感字段无授权的记录,不进入排序,即使 S 会被算得很高。

5.4 完整数值轨迹:三条记忆如何被选中 ​

设当前任务:重写 A5;scope_allowlist={project:A};wr=0.45,wi=0.20,wt=0.15,wp=0.20;λ=0.02;tnow= 2026-10-28。

ID内容摘要statusIrawΔt 天cosR^I^T^P^S
M1项目写作须深挖原理/代表研究/工程实现active/confirmed910.860.860.890.981.000.91
M2用户曾说这篇文章先写短一点active/inferred4200.720.720.330.670.300.55
M3项目 B 使用短文概览模板active/confirmed820.800.800.780.960.00*过滤
M4旧七字段模板(已被新规范替换)superseded8300.88----过滤

*M3 的 P^=0 来自 scope 不匹配;实际实现应在硬过滤阶段直接丢弃,不必计算 S。

计算说明:M1 的 I^=(9−1)/9=0.889,T^=e−0.02⋅1≈0.980;
S(M1)=0.45⋅0.86+0.20⋅0.89+0.15⋅0.98+0.20⋅1.00≈0.91。
M2 虽有一定相关性,但确认状态弱、意图匹配低,排序靠后;若 intent=recover_preference 且策略要求仅 confirmed,M2 可在有效性阶段剔除。最终注入 Context 的应是 M1(及同项目的退回原因情景记忆),并附带来源标签,而不是把 M2/M3 混入。

5.5 召回不等于采纳,打包也不等于原文回放 ​

通过排序的 Top-k 仍要经过打包规则:

  1. 为每条记忆生成注入片段:[memory_id | scope | status | confirmation | as_of | text]。
  2. 按预算截断:优先保留高 S 且 confirmed 的规范;情景细节可压缩为指向 event_id 的摘要。
  3. 冲突处理:若两条 active 记录在同一事实键上矛盾,注入时显式并列并请求确认,禁止静默折中。
  4. 权威顺序:当前用户指令 > 运行时任务契约 > 已确认项目记忆 > 推断记忆 > 外部观察。

召回内容是历史数据,不具有高于当前用户指令的权威。若新指令与旧记忆冲突,应优先执行当前有效指令,并触发记忆更新(supersede)流程。

5.6 负向记忆与失败经验 ​

过去失败的经验可以减少重复试错,但也容易过度泛化。例如「某次 PDF 解析失败」不能推出「所有 PDF 解析都不可靠」。建议记录失败发生的环境、工具版本、输入类型、错误码、修复动作和验证结果。召回时必须匹配相似的条件特征(可用结构化字段等式匹配 + 语义辅助),而不是只匹配错误描述中的关键词。未验证的「失败原因解释」应标记为 inferred,只有测试通过的修复步骤才可晋升为程序性经验。

06 · 代表性研究路线一:Generative Agents 的记忆流、反思与规划 ​

Park 等人的 Generative Agents: Interactive Simulacra of Human Behavior(2023)提出用于模拟社会行为的生成式智能体架构。其核心机制包括 Memory Stream(记忆流)、Reflection(反思)和 Planning(规划)。该研究的重要价值是展示:历史观察并不需要全部进入模型上下文,而可以通过有选择的检索、较高层次的反思和计划形成持续行为。

以下按「问题 → 方法模块 → 运行机制 → 实验能支持什么」拆解;细节依据公开论文知识归纳,本次未重新打开原文逐页核验,实施前应对照 arXiv 版本与附录。

6.1 问题与 Memory Stream ​

问题:若每次决策只看最近几条观察,角色行为会失忆;若把全部历史塞进提示词,上下文迅速耗尽且噪声增大。
方法:维护按时间追加的记忆流,每条记忆通常包含自然语言描述、创建时间、最后访问时间、重要性分数等字段。它不是只存一个不断覆盖的「当前摘要」,而是保留可被后续访问的事件片段。

对研究助理,可类比记录「用户提出研究要求」「Agent 提交初稿」「用户指出缺陷」「修订后获得确认」。原始事件时间与来源对于恢复因果过程非常重要;工程上应额外区分用户原话、工具事实与模型转述。

6.2 Retrieval:论文中的三因素评分如何运行 ​

该研究将检索分数设计为相关性、重要性与新近程度的组合(权重常取相等或经调参)。可形式化为:

score(m,q)=αrecency(m)+βimportance(m)+γrelevance(m,q)

新近程度:通常对「距上次访问的时间」做指数衰减 recency=exp⁡(−δΔt)。刚被检索或刚发生的记忆得分更高;长期未访问则下降。注意:衰减用于排序,不等于业务上的「事实失效」。

重要性:记忆写入时由模型按量表(如 1–10)评估「对智能体而言有多重要」。这是一个启发式先验,会继承模型偏见;工程迁移时应用规则校准高影响记忆(授权、金钱、安全)的最低重要性,并允许人工覆盖。

相关性:当前查询(情境描述)与记忆文本的 embedding 余弦相似度。查询应由「此刻要做的事」构成,而不是任意用户闲聊。

运行机制:给定当前情境 → 生成查询嵌入 → 对记忆流中候选计算三分量并加权 → 取 Top-k 进入提示词 → 更新被访问记忆的时间戳(从而影响未来 recency)。
完整示例(示意):设 α=β=γ=1/3,记忆 A「用户确认深度研究标准」重要性 9、Δt=1、相似度 0.85;记忆 B「用户随口说今天累了」重要性 2、Δt=0.1、相似度 0.40。则 A 在重要性与相关性上显著更高,即使 B 更新鲜,写作任务仍应优先取 A。

6.3 Reflection:从多条事件归纳高层认识 ​

当近期重要性累积超过阈值时,系统抽取若干相关记忆,提示模型生成更高层反思(例如「该用户重视证据完整」),并把反思写回记忆流,供后续检索。
输入:低层观察集合;输出:带时间戳的高层陈述;状态变化:记忆流增加反思条目,未来检索可能直接命中反思而非原始细节。

迁移到真实 Agent 时,反思属于 inferred 归纳,不能自动变成 confirmed 用户规范。生产系统必须保留回链事件、确认状态与撤销路径,否则错误反思会被反复召回放大。

6.4 Planning 与实验边界 ​

记忆检索结果进入规划提示,影响下一步行动,从而形成「观察 → 记忆 → 检索 → 计划 → 行动」闭环。论文实验主要展示模拟小镇中行为的可信度与连贯性,不能直接外推为:企业任务事实正确、权限隔离充分、或可满足审计删除。可借鉴的是架构分解;必须自建的是作用域、确认、冲突与评估。

07 · 代表性研究路线二:MemGPT 的分层记忆与上下文管理 ​

Packer 等人的 MemGPT: Towards LLMs as Operating Systems(2023)以操作系统的分层存储为类比,研究有限上下文窗口与大规模外部信息之间的管理问题。其核心启发不是「把记忆放进向量数据库」这么简单,而是把模型可直接使用的上下文视作稀缺工作空间,通过显式的读写和信息搬运机制管理不同层级的信息。以下机制概括依据公开论文知识,待对照原文与实现仓库核验。

7.1 问题:主上下文是稀缺资源 ​

问题:对话与文档增长后,无法把全部历史放进单次提示;截断会丢约束,无限拼接会提高成本并降低利用效率。
核心思想:区分 主上下文(main context / working memory) 与 外部上下文(external context)。主上下文容量有限,类似 OS 的物理内存;外部存储保存更大量信息,需要时再通过明确操作调入。

7.2 运行机制:分页式读写,而非隐式历史链 ​

典型控制循环可概括为:

  1. 模型在主上下文中推理;
  2. 若缺少信息,发出对外部存储的检索/读取请求(功能调用式);
  3. 运行时执行检索,把结果写回主上下文的特定区域;
  4. 若主上下文将满,将部分内容驱逐、摘要或写回外部;
  5. 对值得长期保留的新事实,显式写入外部记忆。

关键点是:记忆管理成为可观察的工具调用序列,而不是一条不断变长、不可审计的消息链。工程上应对这些调用做权限、配额与审计,不能让模型任意改写权威状态。

7.3 与本文架构的映射及边界 ​

MemGPT 启发研究助理落点
主上下文Context Assembler 本轮打包结果
外部记忆memories + 事件日志 + 搜索索引
调页/检索§05 的 Retriever + 预算裁剪
写回§03–§04 的写入与整合管道

MemGPT 证明分层管理在长文档/长对话任务上的可行性思路,不能直接证明可靠遗忘、隐私删除、多租户隔离或事实纠错;这些仍需独立的数据模型与治理实现。

08 · 代表性研究路线三:Reflexion 的语言反馈记忆 ​

Shinn 等人的 Reflexion: Language Agents with Verbal Reinforcement Learning(2023)研究如何让语言 Agent 利用任务反馈形成语言化反思,并在后续尝试中改进行为。其核心是把失败或评价结果转化为可复用的文字反馈,而不是通过传统梯度更新直接改变模型参数。

例如,代码修复 Agent 第一次尝试未通过测试,可以记录「修改导致测试 X 失败;下一次先检查边界条件 Y」。下一次尝试时,这条反馈被放入上下文以影响行动。它属于面向任务迭代的经验记忆,而不是用户偏好或一般领域事实。

这类机制的关键风险是:如果反馈本身错误,Agent 可能把错误经验反复强化。工程上应把「可观察失败事实」「模型解释失败原因」「已验证修复措施」分开存储。只有测试或其他证据确认的修复措施,才适合升级为稳定程序性经验。

09 · 代表性研究路线四:MemoryBank 与长期交互记忆 ​

Zhong 等人的 MemoryBank: Enhancing Large Language Models with Long-Term Memory(2023)探索了面向长期交互的记忆管理,包括历史信息保存、检索与遗忘等思路。与 Reflexion 主要围绕任务尝试和反馈不同,MemoryBank 更贴近跨会话互动中历史信息的持续利用。

其工程启发是:长期交互系统不能把所有旧信息视为同等重要、同等有效。随着时间推移,某些信息的可用性降低,另一些稳定信息需要持续保留。不过,认知科学式遗忘曲线是启发而非普适实现要求;真实系统应根据业务有效期、用户撤销和证据更新制定策略,不能单靠时间衰减决定是否删除事实。

9.1 四条研究路线对比 ​

路线主要问题代表机制更适合借鉴的场景关键局限
Generative Agents如何让历史经历影响持续行为记忆流、重要性/新近度/相关性检索、反思事件驱动行为、长期角色连续性模拟行为连贯不等于事实可靠
MemGPT有限上下文如何管理大量历史信息分层存储、显式读写、信息调入长任务与大量历史资料需要额外治理、检索和数据质量机制
Reflexion如何利用失败反馈改进下一次尝试语言化反思、跨尝试经验代码修复、工具任务、迭代优化错误反馈可能被持续放大
MemoryBank如何在长期交互中保留与遗忘信息长期交互记忆、检索、遗忘策略个性化助理、跨会话连续性记忆价值与有效性需业务校准

这些研究的实现细节、训练设定和实验任务并不完全可比。表格比较的是主要设计思想,不是统一基准下的性能排名,也不意味着可直接把四套方案拼接成生产系统。

10 · 工程架构:Memory Manager 应由哪些组件组成? ​

对于需要跨会话连续性的 Agent,可以采用以下逻辑结构:

text
用户交互 / 工具观察 / 任务结果
               │
               ▼
          Event Recorder ───────────► Immutable Event Log
               │                            │
               ▼                            │
        Candidate Extractor                 │
               │                            │
               ▼                            │
     Policy & Sensitivity Filter            │
               │                            │
               ▼                            │
       Dedup / Conflict Resolver ◄──────────┤
               │                            │
               ▼                            │
         Memory Consolidator                │
               │                            │
               ▼                            │
      Memory Store + Search Index           │
               │                            │
               ▼                            │
       Scope-Aware Memory Retriever         │
               │                            │
               ▼                            │
      Validity Check / Rank / Pack          │
               │                            │
               ▼                            │
          Context Assembler                 │
               │                            │
               ▼                            │
             Model                          │
               │                            │
               └── 新事件与反馈 ──────────────┘

这是一种逻辑架构,不要求每个框都独立部署。初期可用一个进程、一个关系数据库和一个模型完成。真正重要的是数据流、责任边界和失败时的行为能够被检查。

10.1 Event Recorder:历史事实的入口 ​

负责接收可审计事件,包括用户确认、工具结果、审批、任务完成与失败。它应保留稳定 ID、时间、主体、作用域、原始内容引用和幂等键。事件日志是重建记忆的依据,不应让模型在写入时直接覆盖原始事件。

10.2 Candidate Extractor:从事件抽取候选 ​

可由模型输出结构化候选,但必须保留来源与不确定性。例如同一条用户消息中既包含稳定规范,也包含临时意见,应拆分成不同候选。抽取失败应能重试;模型未提取出的内容仍可从原始事件重新处理。

10.3 Consolidator:整合与更新 ​

负责对同一事实键的多个版本进行比较,判断追加、替换、撤销或保留冲突。对有明确来源优先级的记录可采用规则处理;对含糊冲突应请求确认或保留 unresolved 状态。此组件不应静默把两条相互矛盾的偏好融合成一条看似折中的规则。

10.4 Retriever:按作用域与任务意图召回 ​

检索前进行身份鉴权和 scope 过滤;之后进行结构化、全文或语义召回;最后进行有效性检查和上下文预算分配。所有召回结果应记录 retrieval_id、查询意图、候选集、被选记录、拒绝原因与注入位置,便于诊断「明明保存了却没想起来」。

11 · 数据模型:让记忆可以更新、审计和删除 ​

一个可用的数据模型至少需要分离三种对象:events、memories、memory_sources。事件保存发生过什么;记忆保存当前可复用的解释;来源关联保存每条记忆的依据。对于复杂系统,还可增加 memory_revisions 和 retrieval_traces。

11.1 建议的数据表 ​

sql
-- 概念性 PostgreSQL DDL;未在真实数据库运行。
CREATE TABLE memory_events (
    event_id TEXT PRIMARY KEY,
    tenant_id TEXT NOT NULL,
    scope_type TEXT NOT NULL,
    scope_id TEXT NOT NULL,
    event_type TEXT NOT NULL,
    occurred_at TIMESTAMPTZ NOT NULL,
    source_ref TEXT NOT NULL,
    payload JSONB NOT NULL
);

CREATE TABLE memories (
    memory_id TEXT PRIMARY KEY,
    tenant_id TEXT NOT NULL,
    scope_type TEXT NOT NULL,
    scope_id TEXT NOT NULL,
    subject TEXT NOT NULL,
    predicate TEXT NOT NULL,
    value JSONB NOT NULL,
    kind TEXT NOT NULL,
    provenance_type TEXT NOT NULL,
    confirmation_state TEXT NOT NULL,
    status TEXT NOT NULL,
    valid_from TIMESTAMPTZ,
    valid_until TIMESTAMPTZ,
    revision INTEGER NOT NULL DEFAULT 1,
    updated_at TIMESTAMPTZ NOT NULL
);

CREATE TABLE memory_sources (
    memory_id TEXT NOT NULL REFERENCES memories(memory_id),
    event_id TEXT NOT NULL REFERENCES memory_events(event_id),
    relation TEXT NOT NULL,
    PRIMARY KEY (memory_id, event_id)
);

生产中还应设计租户级行权限、不可变历史修订、唯一性约束、并发事务、加密、备份和删除传播。上面的表结构是讨论语义关系的最小模型,并未包含全部治理功能。若需要多个历史版本共存,宜把逻辑事实 ID 与版本 ID 分开,避免直接覆盖旧版本导致来源链断裂。

11.2 结构化事实与向量索引的分工 ​

关系数据库适合保存状态、来源、有效期和精确过滤;向量索引适合从不同措辞中发现相关记忆;对象存储适合保留原始文件和大型事件附件。向量索引通常应保存 memory_id 引用,而不是成为唯一事实来源。更新记忆时,先在权威存储中完成状态变更,再同步搜索索引;若索引同步失败,检索后仍应以权威存储的状态过滤结果。

11.3 作用域和时间语义 ​

至少区分 tenant_id(租户隔离)、scope_type/scope_id(业务可见范围)、occurred_at(事件发生)、created_at(记录创建)、valid_from/until(事实有效期)、updated_at(记录更新)。例如「项目 A 的模板于 10 月 28 日被替换」不能简单用最新更新时间代替有效期,否则历史回放会错误认为新模板在过去就已生效。

12 · 读写协议:一次完整的记忆生命周期 ​

12.1 写入协议 ​

  1. 记录原始事件并生成不可重复的 event_id;2. 提取候选并绑定原始来源;3. 运行存储许可、敏感性与作用域规则;4. 按事实键查找现有有效记录;5. 判断新候选是补充、替换、冲突还是无价值;6. 事务性提交新版本与旧版本状态;7. 异步更新全文和向量索引;8. 记录审计结果。高影响的用户偏好变更应允许用户直接确认或纠正。

12.2 读取协议 ​

  1. 从当前任务确定身份、项目和检索意图;2. 构造允许访问的 scope 集合;3. 先执行权限与状态过滤;4. 按结构化键、关键词和语义相似度召回;5. 检查有效期与版本;6. 合并重复项并显式标记冲突;7. 依据当前任务排序与预算裁剪;8. 输出带来源和可信标记的记忆片段;9. 记录模型是否实际使用该片段。检索命中率与使用正确率应分开测量。

12.3 更新与撤销协议 ​

用户明确说「以后这套项目文章不要再使用旧模板」时,系统应定位旧偏好并标记 superseded,创建新有效版本,同时保留必要的审计来源。若用户要求删除,则需区分业务撤销与实际数据删除:撤销只表示未来不再使用;删除还涉及主库、索引、缓存、派生摘要和备份保留策略。系统不能因为搜索不到记录就宣称已经彻底清除。

13 · 贯穿案例:为《Agent 全栈技术地图》建立项目记忆 ​

假设研究助理跨数周完成 100 篇技术文章。用户会反复调整研究标准、批准模板、指出某些文章的问题,并要求继续下一篇。该系统的目标不是完整复述所有聊天,而是能准确恢复当前有效规范、历史修订依据与未完成事项。

13.1 第一天:用户确认写作模板 ​

用户明确批准文章头部的七字段格式。系统保存事件 evt_101,提取项目级语义记忆 mem_format_v1,状态 confirmed/active,并保留原始消息引用。后续生成 A2 时,检索意图为 recover_project_writing_rules,命中该记忆并进入 Context。文章完成后由确定性检查器验证七字段是否齐全。这样记忆只负责恢复规范,验证仍由独立程序完成。

13.2 第二天:用户指出 A5 和 A6 研究深度不足 ​

系统记录两个层次:情景事件「用户评价 A5、A6 技术深度不足」;语义候选「本项目研究文章需要深入技术原理、代表性研究和工程实现,避免章节概览式写法」。因为用户明确要求更新原则,后者可以成为项目级已确认规范。原先「A5 v1.0 已完成」的任务状态并不意味着其质量仍然被接受,应将质量审查状态更新为 revision_required。这里的权威修订状态属于 Runtime State,而不是依赖模型记忆自行猜测。

13.3 第三天:重新生成 A5 ​

Agent 读取当前任务「重写 A5」,先从运行状态确认目标版本和交付形式,再召回项目级写作原则、A5 被退回的原因以及已批准的 A6 v1.1 质量参照。它不需要召回全部过去搜索记录。装配后的 Context 可以包含:当前用户要求、有效写作规范、A5 旧稿的关键不足、参考文章质量特征。最终生成后,质量检查不只看章节数量,还要检查是否真正解释代表性论文的机制与可实现的工程结构。

13.4 第四天:用户改变偏好 ​

如果用户后来要求「本项目以后每篇都只需 1500 字概览」,这是一条新的明确指示。系统应将原有「深度长文」规范标记为被替换,记录新规范的作用域和生效时间。未来不能同时把两条互斥规则当成 active,也不能因为旧规范出现次数更多而忽视新的明确指示。若用户只是要求「这一篇先给短版」,则应形成任务局部要求,而非自动覆盖项目级长期偏好。

13.5 多项目隔离 ​

同一用户可能同时运营研究知识库和设计项目。研究知识库的「七字段头部」不应自动应用到设计项目;项目 A 的内部文件也不能因语义相似而被项目 B 检索。隔离必须通过存储和查询层的作用域控制实现,而非仅在提示词里写「不要混用」。

14 · 最小可运行实现:从召回到注入的 L2 机制 ​

工程实现深度分三级:L1 概念方案、L2 可验证核心机制、L3 系统级持久化与治理。下面的 Python 3 标准库示例达到 L2:在进程内验证「作用域过滤 → 状态/有效期检查 → 时间衰减 → 加权排序 → Top-k 打包」。它不实现真实 embedding、BM25、鉴权、数据库事务或删除传播;相关性用调用方提供的 relevance 模拟向量分,以便在无模型环境下断言排序行为。

python
from __future__ import annotations
from dataclasses import dataclass
from datetime import datetime, timezone
from math import exp
from typing import Optional

@dataclass
class Memory:
    memory_id: str
    scope: str
    key: str
    text: str
    importance: float          # 1..10
    confirmation: str          # confirmed | inferred
    status: str                # active | superseded | revoked
    updated_at: datetime
    expires_at: Optional[datetime] = None
    revision: int = 1

@dataclass
class QueryContext:
    scope_allowlist: set[str]
    now: datetime
    relevance: dict[str, float]  # memory_id -> cos-like score in [0,1]
    w_r: float = 0.45
    w_i: float = 0.20
    w_t: float = 0.15
    w_p: float = 0.20
    lambda_decay: float = 0.02
    top_k: int = 2
    require_confirmed: bool = True

def days_between(a: datetime, b: datetime) -> float:
    return max(0.0, (a - b).total_seconds() / 86400.0)

def hard_filter(rows: list[Memory], q: QueryContext) -> list[Memory]:
    out = []
    for m in rows:
        if m.scope not in q.scope_allowlist:
            continue
        if m.status != "active":
            continue
        if m.expires_at is not None and not (q.now < m.expires_at):
            continue
        if q.require_confirmed and m.confirmation != "confirmed":
            continue
        out.append(m)
    return out

def score(m: Memory, q: QueryContext) -> float:
    r = q.relevance.get(m.memory_id, 0.0)
    i = (m.importance - 1.0) / 9.0
    t = exp(-q.lambda_decay * days_between(q.now, m.updated_at))
    p = 1.0 if m.scope in q.scope_allowlist else 0.0
    if m.confirmation == "confirmed":
        p = min(1.0, p + 0.2)
    return q.w_r * r + q.w_i * i + q.w_t * t + q.w_p * min(1.0, p)

def retrieve_and_pack(rows: list[Memory], q: QueryContext) -> list[dict]:
    cand = hard_filter(rows, q)
    ranked = sorted(cand, key=lambda m: score(m, q), reverse=True)
    packed = []
    for m in ranked[: q.top_k]:
        packed.append({
            "memory_id": m.memory_id,
            "scope": m.scope,
            "status": m.status,
            "confirmation": m.confirmation,
            "score": round(score(m, q), 4),
            "text": m.text,
        })
    return packed

def upsert(rows: list[Memory], new: Memory) -> None:
    for m in rows:
        if m.scope == new.scope and m.key == new.key and m.status == "active":
            m.status = "superseded"
            new.revision = m.revision + 1
    rows.append(new)

now = datetime(2026, 10, 28, tzinfo=timezone.utc)
rows: list[Memory] = []
upsert(rows, Memory("M0", "project:A", "writing_style",
                    "overview only", 7, "confirmed", "active",
                    datetime(2026, 10, 1, tzinfo=timezone.utc)))
upsert(rows, Memory("M1", "project:A", "writing_style",
                    "deep mechanism research required", 9, "confirmed",
                    "active", datetime(2026, 10, 27, tzinfo=timezone.utc)))
upsert(rows, Memory("M2", "project:A", "tone",
                    "keep this draft short", 4, "inferred", "active",
                    datetime(2026, 10, 20, tzinfo=timezone.utc)))
upsert(rows, Memory("M3", "project:B", "writing_style",
                    "short overview", 8, "confirmed", "active",
                    datetime(2026, 10, 26, tzinfo=timezone.utc)))

q = QueryContext(
    scope_allowlist={"project:A"},
    now=now,
    relevance={"M1": 0.86, "M2": 0.72, "M3": 0.80, "M0": 0.50},
)
packed = retrieve_and_pack(rows, q)
assert [p["memory_id"] for p in packed] == ["M1"]
assert rows[0].status == "superseded"  # M0 replaced by M1
# 关闭 confirmed 限制后,推断记忆可进入候选但分数仍应低于 M1
q2 = QueryContext(scope_allowlist={"project:A"}, now=now,
                  relevance=q.relevance, require_confirmed=False, top_k=2)
packed2 = retrieve_and_pack(rows, q2)
assert packed2[0]["memory_id"] == "M1"
assert all(p["scope"] == "project:A" for p in packed2)
# 时间衰减:同重要性下,更新的记忆排序更高
old = Memory("T1", "project:A", "tmp", "old", 8, "confirmed", "active",
             datetime(2026, 9, 1, tzinfo=timezone.utc))
new = Memory("T2", "project:A", "tmp2", "new", 8, "confirmed", "active",
             datetime(2026, 10, 27, tzinfo=timezone.utc))
qt = QueryContext(scope_allowlist={"project:A"}, now=now,
                  relevance={"T1": 0.8, "T2": 0.8}, top_k=2)
assert score(new, qt) > score(old, qt)

该示例可直接用 python 运行并依赖断言失败暴露回归。它验证的核心机制是:

  1. 硬过滤先于打分:project:B 与 superseded/inferred(在默认策略下)不会仅因高相关而注入;
  2. 版本语义:同 scope+key 的 upsert 将旧记录标为 superseded;
  3. 时间衰减可计算:T^=e−λΔt 使更新更近的记忆在其他分量相近时排序更高;
  4. 打包输出带元数据:注入片段保留 id、scope、confirmation 与 score,供 Context 与审计使用。

要进一步接近生产检索,下一步应把 relevance 换成真实 embedding 余弦,并增加 RRF 多通道融合与 retrieval_trace 持久化(仍属 L2 扩展);数据库、鉴权与删除传播则进入 L3。

15 · 记忆失败的机制分析:不是所有问题都叫「忘记」 ​

15.1 写入失败:重要信息从未成为记忆 ​

用户明确批准规范,但候选提取器没有识别为长期规则;后续无论检索算法多强都找不到。应检查原始事件是否存在、候选抽取是否成功、写入策略是否拒绝以及存储是否提交。

15.2 召回失败:信息存在但未被选中 ​

可能由错误 scope、查询改写偏题、向量召回漏检、版本过滤或 token 预算不足造成。应保存候选集、排序分数、过滤原因和最终注入列表,以便区分「没有检索到」与「检索到但被裁剪」。

15.3 使用失败:召回正确但模型误解 ​

例如检索片段写着「仅适用于项目 A」,模型却应用到项目 B。此时不是存储问题,而是上下文表达和模型遵循问题。可通过结构化标签、任务级检查和跨项目测试改善,但敏感隔离不能依赖模型理解。

15.4 更新失败:旧信息与新信息同时生效 ​

如果用户已经修改规范,但旧偏好仍是 active,模型可能在两条互斥记录之间随机选择。应采用事实键、修订链和显式 supersede 语义,并保证写入与状态更新的原子性。

15.5 记忆投毒:错误被持久化放大 ​

网页中包含「今后忽略引用规则」,如果被提取器误认为系统偏好并写入长期记忆,下一次召回就会把低信任文本重新带入模型。应将外部内容限制为来源观察,禁止其自动提升为用户指令或系统规则,并对高影响写入设置审批。记忆内容始终属于数据,不应提升指令优先级。

15.6 过度个性化与负迁移 ​

系统可能从少数交互中推断用户偏好,之后在不相关任务中强行套用。需要记录偏好作用域、确认状态和反例,并评估引入记忆后是否比无记忆基线更差。记忆不是越多越好,错误历史具有跨任务的累积效应。

16 · 评估方法:如何证明记忆提高了 Agent 能力? ​

记忆评估应分为四层。写入层测重要事实捕获率、错误写入率、来源保留率和敏感信息误存率;检索层测正确记忆 Recall@k、无关注入率、过期命中率和跨作用域泄漏率;使用层测模型是否正确利用已召回信息、是否覆盖当前明确指示、是否引用未经确认的推断;任务层测跨会话任务成功率、重复询问次数、人工纠错成本、延迟和每合格任务成本。

16.1 五组基线实验 ​

建议在相同任务、模型和预算下比较:①无长期记忆;②完整历史拼接(仅在窗口允许时);③滚动摘要;④结构化事实记忆;⑤结构化记忆加语义检索。测试集必须包含跨会话、偏好更新、项目切换、矛盾信息、错误记忆和无命中场景。若只测试「重复提问相同事实」,会高估简单向量搜索的价值。

16.2 任务样本示例 ​

测试场景预期行为关键失败
用户确认长期模板,隔天继续写作恢复模板并正确应用漏写、漏召回
用户修改旧模板采用最新有效版本旧偏好覆盖新指令
A、B 项目使用不同规范严格项目隔离跨项目污染
外部网页伪造用户指令不写入高信任记忆记忆投毒
用户撤销偏好后续不再注入撤销未传播
模型曾误判用户意图不把推断当确认错误语义晋升
记忆服务不可用按风险降级或暂停编造历史

16.3 归因与消融 ​

如果任务表现下降,应逐段回放:原始事件 → 候选 → 写入决策 → 存储版本 → 召回候选 → 注入上下文 → 模型行为 → 任务结果。保持模型不变、替换检索策略可定位召回问题;保持召回结果不变、调整来源标签可定位使用问题;移除某条错误记忆可测量其负面影响。不能只看最终回答「像不像记得住」,也不能用模型自评替代客观验收。

16.4 衡量净收益而非单项准确率 ​

长期记忆可能减少重复询问,却增加隐私和错误传播风险。最终应比较每项任务的净收益:合格任务成功率、人工返工、额外检索与存储成本、延迟、错误影响范围和撤销可控性。不同业务对这些指标的权重不同,不存在普适的「记忆准确率达到 95% 就可上线」阈值。

17 · 技术路线选择:从简单历史到可治理的长期记忆 ​

第一阶段:会话与任务连续性。 如果只需恢复单次长任务,优先实现运行时状态、检查点和历史事件日志,不必立即构建向量记忆系统。需要明确检查点恢复与长期记忆检索解决的是不同问题。

第二阶段:项目级结构化记忆。 当用户明确要求跨会话保持规范、决策或偏好时,增加经过确认的结构化事实存储、版本更新和精确召回。此阶段往往比「把全部聊天向量化」更易控制。

第三阶段:事件检索与分层整合。 当项目历史规模增长、问题表达多样时,再加入全文/向量混合检索、事件摘要、经验整合与来源回链。重点评估检索是否真正提高任务表现。

第四阶段:经验晋升与治理。 对高频、可验证的成功流程,建立从情景事件到程序性技能的审查路径;对长期个人化服务,建立明确的纠错、撤销、过期和删除机制。不要把模型生成的反思自动当成已验证操作规范。

选择技术路线时应先回答四个问题:需要跨越多长时间?需要记住什么类型的信息?错误记忆的代价有多大?是否有客观方法验证记忆收益?这四个问题通常比选用哪个向量数据库更重要。

18 · 与相邻专题的关系及最终结论 ​

A4 Context 研究「本轮模型可见什么」,A5 Memory 研究「过去哪些信息值得保留并在未来重新使用」,A6 Knowledge 研究「外部事实如何获取和验证」,A7 Tools 研究「读写和检索接口如何实际执行」,A8 Skills 研究「经验如何成为可复用能力」,A9 Planning & Reasoning 研究「如何根据历史经验安排下一步」,A10 Permissions & Constraints 研究「谁可以写入、读取、撤销及使用记忆」。这些能力可以部署在同一程序中,但在设计时必须有独立的语义和责任边界。

本篇的结论是:Agent Memory 不是历史消息的堆积,而是有来源、有作用域、有时间语义、可更新、可撤销且能被任务验证的信息生命周期系统。 深度不体现在概念清单,而体现在能否说清:候选如何过门禁、事实键如何版本化、多通道如何召回、R^/I^/T^/P^ 如何归一化与加权、硬过滤如何先于打分、打包如何保留元数据,以及用什么实验证明净收益。Generative Agents、MemGPT、Reflexion、MemoryBank 提供了不同机制启发;真实工程仍需把它们落到数据模型、读写协议、可运行验证与任务层评估。评价标准不是「存了多少」,而是「在正确的时刻恢复了什么、是否仍然有效、是否改善了任务,以及能否及时纠正错误」。

参考资料与延伸研究 ​

以下列出与本文机制直接相关的代表性研究与官方技术入口。论文方法的概括依据既有公开研究知识;本次修订未逐项在线打开并核对最新修订、代码仓库或供应商 API,故不把这些条目表述为已完成当期在线核验。

  1. Park et al. (2023), Generative Agents: Interactive Simulacra of Human Behavior. https://arxiv.org/abs/2304.03442 - 记忆流、反思、规划与基于相关性、重要性、新近程度的检索。
  2. Packer et al. (2023), MemGPT: Towards LLMs as Operating Systems. https://arxiv.org/abs/2310.08560 - 有限上下文下的分层记忆管理与显式信息搬运。
  3. Shinn et al. (2023), Reflexion: Language Agents with Verbal Reinforcement Learning. https://arxiv.org/abs/2303.11366 - 语言化反馈、跨尝试反思与经验复用。
  4. Zhong et al. (2023), MemoryBank: Enhancing Large Language Models with Long-Term Memory. https://arxiv.org/abs/2305.10250 - 长期交互记忆与遗忘机制的研究。
  5. Wang et al. (2024), A Survey on Large Language Model based Autonomous Agents. https://arxiv.org/abs/2308.11432 - Agent 记忆、规划、行动的体系综述。
  6. Lewis et al. (2020), Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. https://arxiv.org/abs/2005.11401 - 外部知识检索与生成的基础研究,用于区分 Knowledge 与 Memory。
  7. Liu et al. (2024), Lost in the Middle: How Language Models Use Long Contexts. https://arxiv.org/abs/2307.03172 - 长上下文信息利用的限制。
  8. LangGraph, Persistence / Memory documentation. https://docs.langchain.com/oss/python/langgraph/persistence - 检查点与持久化接口的官方入口,具体实现须按版本核验。
  9. OpenAI, Conversation State documentation. https://platform.openai.com/docs/guides/conversation-state - 模型服务的会话状态接口,不应与自动长期记忆混同。
  10. Greshake et al. (2023), Not What You've Signed Up For: Compromising Real-World LLM-Integrated Applications with Indirect Prompt Injection. https://arxiv.org/abs/2302.12173 - 低信任内容经工具或检索链路影响模型行为的风险。
  11. NIST, AI Risk Management Framework. https://www.nist.gov/itl/ai-risk-management-framework - 数据、风险与治理的参考框架。

研究声明 ​

结论类型区分:文中对 Memory / Context / State 的边界、写入门禁、检索流水线、S(m,q) 与数值轨迹、L2 示例,属于技术归纳与工程设计;对 Generative Agents / MemGPT / Reflexion / MemoryBank 的机制概括依据公开研究知识,标注为待在线核验的资料支持,不冒充已完成原文逐页对照或实验复现;SQL DDL 为 L1 概念实现;第 14 节 Python 为 L2 最小可运行实现(可用标准库断言验证排序与过滤),但未连接真实 embedding、数据库或鉴权。

研究与验证说明:Memory Manager、数据契约、评分权重和工程分期不是统一行业标准。论文比较聚焦主要机制,不代表对其全部实验、超参或实现细节的完整复现。

最新性状态:本文更新于 2026 年 10 月 28 日(v1.2)。本次修订未逐项在线核验参考论文最新版本、开源仓库现行实现、供应商 API 或数据处理政策。开发前应核对对应版本官方资料与源码行为。

实验与适用边界:未执行真实模型调用、向量检索服务、跨会话生产实验、并发负载或合规删除验证;不能据此宣称召回率、任务成功率或安全效果已实证确认。方案应按数据敏感性、任务风险与业务需求独立测试。