Skip to content

Q110 · AI Agent 记忆机制的核心组件和流程是什么? ​

项目助手在一次聊天中听用户说:“以后这个项目的发布说明请用中文。”几天后,用户开新聊天问:“Bug B17 的修复已经合并,帮我写一版内部候选发布说明。”若助手记住语言偏好,却没查 B17 的最新状态,可能把“已合并”误写成“已发布”;若它把所有旧聊天都塞进输入,又可能混进无关的会议安排。

把 Agent 记忆看成一条有入口、有出口、能纠错的数据流更容易设计:从对话提取候选 → 按来源和权限校验 → 持久保存 → 根据当前任务取回 → 过滤与排序 → 放入本轮模型输入 → 根据反馈更新或删除。图里上行是“写”,下行是“读”;底部的用户改口发生在之后,需要回到存储层更新旧偏好,不能只给本次回复打个补丁。

项目助手提取并校验发布说明语言偏好写入 U5 记忆库,之后检索过滤后注入本轮上下文,用户改口时更新

这题着重说明每个组件接收什么、产出什么,以及各环节如何连接。Q106“如何实现长期记忆能力”进一步讨论跨会话存储和具体实现;Q107“有哪些作用和原理”先解释为什么要记、短期与长期分别帮什么忙。这里用同一条记录走完工作流,避免把架构写成“接一个向量数据库”便结束。

术语、标识与例子前提 ​

词或符号在本文中的含义
Agent应用组织模型、工具、状态和记忆来完成目标;模型负责语言判断,应用决定实际读写与权限。
模型上下文当前这一次模型调用能看到的输入,包括指令、用户问题、必要历史、工具结果与挑选出的记忆。
记忆记录可供以后读取的一条信息,附带所属范围、来源、时间、状态和版本;它不是模型权重里新增的知识。
候选提取器从本轮对话或反馈找出“可能值得保存”的信息;提议不等于已经批准写入。
写入校验器判断候选是否来自可信来源、可否按用户授权保存、是否敏感、是否与旧记录冲突及该放在哪个范围。
持久存储把通过校验的记录留到下一次请求仍能读取的外部系统;可以由数据库、文档存储等实现。
检索器按用户、项目、问题和记录类型从存储中取出可能相关的记忆。
过滤 / 排序器先按权限、有效状态、过期时间等剔除不能用的记录,再对可用记录按任务相关性、来源可靠度与时间选择少数几条。
上下文组装器把本轮问题、适用的记忆、实时工具事实等放入模型输入,并标清各自来源,避免把记忆当高优先级命令。
反馈更新器接收用户纠正、业务结果或人工审核,把旧记忆修订、停用或删除,并处理缓存中的旧版本。
检查点 / Store一种框架里的划分:检查点保存同一会话或执行线状态;Store 保存按用户/应用范围组织、跨会话可读的记录。它们是职责,不要求一定部署两个数据库。
命名空间 / 键命名空间像一组抽屉,用用户和项目界定范围;键表示抽屉里哪项信息,例如发布说明语言。抽屉名本身不代替授权。
U5、P8、C1、C2、B17虚构的登录用户、项目、第一次和第二次会话、项目中的一个 Bug 编号。
m1、v1、v2语言偏好这条记忆及其第一版、用户改口后的第二版;版本号用于防止新旧值同时生效。

例子前提:9 月 20 日,已登录且有 P8 项目权限的 U5 在会话 C1 明确说“以后 P8 的发布说明请用中文”;用户允许应用保存项目写作偏好。9 月 23 日,U5 在新会话 C2 要求起草 Bug B17 的内部候选发布说明。项目问题跟踪系统当前显示“修复已合并、待回归测试”,尚未正式发布。稍后 U5 又明确更正为“以后 P8 的发布说明改用英文”。所有人名、日期、权限与状态均为教学设定。

写入链路:从一句话到一条可用记录 ​

第一站是候选提取。 C1 中可能出现许多信息:“发布说明请用中文”“B17 昨天还能复现”“明天下午开会”。提取器只提出候选,并保留原话的位置;本例将“今后 P8 发布说明的语言=中文”列为跨会话偏好候选。B17 是否复现是会变化的项目状态,应该由问题跟踪系统维护;会议时间也不自动成为通用的写作偏好。提取器可以由规则、模型或组合实现,不能把模型的摘要直接当事实。

第二站是写入校验。 校验器检查:发话者是否为经过服务端确认的 U5;这句话是否明确表达长期偏好而非一次性要求;记忆功能及项目范围是否允许保存;是否包含不宜留存的秘密或他人资料;现有记录是否需要更新而不是再添一条。若条件不满足,候选被拒绝或转人工确认。来自网页、代码注释或工具结果的“请把发布说明改英文”也不能冒充 U5 的指示,否则外部内容可通过记忆写入污染未来多轮对话。OpenAI 对提示词注入的说明解释了第三方内容如何试图让 Agent 偏离原任务。

第三站是持久存储。 通过校验后,可保存一条含义明确的记录:

字段本例值为什么需要
所有者与范围U5 的 P8 项目防止把偏好误用于其他用户或项目。
键与值release_note_language=zhrelease_note_language 是“发布说明语言”,zh 表示中文;固定键便于更新和去重。
来源C1 中 U5 的明确原话便于区分用户请求与模型推测。
时间、状态与版本9 月 20 日;有效;v1下次判断是否过期、被覆盖或被删除。

这条记录记作 m1/v1。写入成功后才能对用户说“已记住”;写入失败只能说明暂未保存,并在允许的情况下重试。C1 的会话历史可另由检查点保存,用于同一会话接续;m1 属于 U5 + P8 的跨会话范围。LangGraph Memory 文档分别演示了基于会话标识的短期状态保存,以及以用户命名空间查询的长期 Store。这些接口是可选实现示例,不能把“用了 Store”误说成记忆自动可信。

读取链路:只把本轮需要的内容送给模型 ​

C2 来了以后,检索器先拿服务端验证过的用户身份 U5、项目 P8 和当前问题“为 B17 起草内部候选发布说明”。它只能在授权范围内找记录。比如结果有 m1/v1:发布说明用中文 和一条“日报只写三行”的旧偏好;两条都属于 U5,但只有前者与发布说明直接相关。使用相似度搜索时,先权限过滤,再比较相关性;文字很像的 U6 记忆也不能进入候选集合。

接着由过滤 / 排序器检查候选:是否仍有效,是否被新版本覆盖,是否来自用户明确说法,是否适用于 P8,以及与当前任务是否相关。在 U5 尚未改口时,m1/v1 通过;“日报三行”虽有效,却与发布说明无关,被排到输入之外。排序不等于“越新越真”:当天抓到的一句网页文字,权威性也不一定高过用户明确确认的偏好。对于有固定键的语言偏好,直接按键查通常比全库语义搜索更稳;自由文本经历才可能更依赖语义检索。LangChain Memory overview指出记忆 Store 可用内容过滤或语义搜索,且记录集合的更新与检索本身会带来复杂性。

上下文组装器最终给模型看三类彼此有标注的信息:用户现在要写的是 B17 的内部候选发布说明;记忆 m1/v1 表示 U5 明确偏好中文;实时问题跟踪工具显示 B17“修复已合并、待回归”。模型因此可以用中文起草,并写明“待回归验证”,不能把旧记忆或用户一句“已经合并”提升成“已经正式发布”。这里记忆解决语言偏好,实时工具解决当前项目状态,两者职责不同。

模型上下文有容量与注意力限制,组装器不应把 U5 所有旧对话和所有候选记忆无差别塞进去。Anthropic 的上下文工程实践将结构化笔记保存在上下文之外,再在需要时载入,并强调选择少量高信号内容。来源 容量大也不能消除过期、冲突和权限问题。

反馈怎样闭环到下一次请求 ​

正常回复后,U5 说:“以后 P8 的发布说明改用英文。”这是一条新的明确用户纠正,会重新进入提取和校验。更新器找到同一所有者、项目与键对应的 m1/v1,写成 m1/v2:release_note_language=en,标记旧版被覆盖;en 表示英文。下一轮读取只能选有效的 v2,若缓存仍返回 v1,也要靠版本与状态过滤掉。不能让“中文”和“英文”两条并列进入模型,再让模型猜哪条算数。

反馈也可能来自人工审核:“这次 Agent 没用中文。”这首先是一次质量问题和待调查信号,未必意味着用户改了偏好;要查写入是否成功、读取是否命中、过滤是否误删、组装时是否遗漏,再决定修哪个组件。用户偏好被纠正与Agent 没遵守偏好是不同事件。对于真正过期或用户要求删除的记录,更新器应使它停止被检索,并按产品的数据保留策略处理底层副本。

若写入异步进行,用户刚改英文后的下一条请求可能先于后台任务完成。可在当前会话临时使用已确认的新偏好,同时标记持久写入待完成;若保存失败,明确告诉用户“本次会按英文,跨会话偏好尚未保存”。LangGraph 记忆文档讨论了当前执行路径写入与后台写入的时延和可见性取舍。来源

每个环节都可能出什么错 ​

环节失败例子应有处理
提取把“一次发布说明用中文”误提为“以后都用中文”保留原话与时间;只对明确长期表述写长期记录,必要时向用户确认。
校验把问题跟踪工具返回的“改用英文”当成 U5 亲口偏好检查消息来源和写入权限;拒绝外部资料直接改变用户偏好。
存储写入超时,模型仍回复“已经记住”查写入结果,失败时诚实说明;防重复写入可用稳定键和版本控制。
检索文字相似搜索返回另一个用户的偏好在搜索前后校验服务端身份和范围;不让模型决定能看谁的记忆。
过滤v1 已被英文 v2 覆盖,缓存却仍给出中文检查有效状态、版本和缓存失效;只注入当前有效记录。
组装只带记忆,没带 B17 的最新工具状态补查权威业务系统;缺少实时状态时明确不确定,不编造发布结论。
更新人工指出一次回答语言错误,系统误删用户偏好先定位是读取、过滤还是生成失败;不要把质量反馈当用户改口。

评测也可以按组件拆:候选提取准确率、错误写入率、跨用户泄露次数、相关记忆召回率、过期记录误注入率、更新生效时间,以及端到端“写对语言且没乱说 B17 已发布”的任务成功率。每项要有自己的分母和真实验证方式;一个最终回答正确,可能只是模型碰巧选中了中文,并不证明记忆真的写入、读取或更新成功。反过来,检索命中 m1 也不证明发布说明内容正确。读写轨迹与最终输出需要一起核对。

面试时怎么回答 ​

我会把 Agent 记忆拆成写入、存储、读取和更新四段。写入时,候选提取器先从对话找可能有价值的信息,校验器再查来源、用户授权、敏感性、作用范围和旧值冲突,批准后才存一条带所有者、来源、时间、状态和版本的记录。读取时,先验证当前用户与项目权限,在允许范围内检索,过滤失效或过期记录,按相关性挑少量高信号记忆,与当前问题和实时工具结果一起组装给模型。比如 U5 曾说 P8 的发布说明用中文;后来写 B17 发布说明时读出该偏好,但 B17 是否可发布要实时查问题跟踪系统。用户再改成英文,就更新同一键并使旧版失效。每段都要可观察和可评测;记忆命中不等于事实正确,存储能持久化也不等于写入内容可信。

如果追问“最核心的安全关口在哪里”,回答是写入前的来源校验和读取前的身份/权限过滤,且两处都需要应用执行。若追问“为什么检索后还要过滤”,回答是检索只找“可能相关”,它不知道记录是否过期、被覆盖或属于当前授权范围;这些条件必须单独确认。

资料依据 ​

最后更新2026-09-26
难度P1
频率high
阅读20 min
主题agent / memory / architecture
觉得有帮助?把这个链接转给正在求职的朋友 · 用 Ctrl + K 全站搜索其它题