Agent 记忆系统:从 7 种记忆到可落地架构
很多人第一次做 Agent 记忆系统,会很自然地从向量库开始:把对话切块,做 embedding,下次相似问题再检索回来。这个方案能解决一部分问题,但如果把它当成“记忆系统”的全部,很快就会撞墙。
因为 Agent 的记忆不是一种东西。
它既包括当前任务里的临时状态,也包括用户长期偏好;既包括过去发生过的事件,也包括未来答应要做的事;既包括文档库里的外部知识,也包括模型权重里已经内化的能力;更复杂的是,Agent 还需要记住“以后应该怎么做”,也就是做事流程、工具习惯和失败经验。
所以,真正的 Agent 记忆系统,不是一个数据库,而是一组不同生命周期、不同读写方式、不同风险边界的状态系统。
如果你是技术开发者,我建议先把“记忆”拆成七类:工作记忆、语义记忆、情节记忆、程序记忆、检索记忆、参数记忆、前瞻记忆。这个分类的价值,不在于多背几个名词,而在于它能帮你做系统设计:什么东西该放上下文,什么东西该进数据库,什么东西该进向量库,什么东西该写成 Skill,什么东西应该交给调度器,什么东西才值得微调进模型权重。
这篇文章就围绕这个问题展开:如果我们真的要实现一个可用、可演进、可验证的 Agent 记忆系统,七种记忆分别应该如何组织。
记忆不是长上下文,也不是向量库

大语言模型本身是无状态的。一次 API 调用结束以后,模型不会自动把这次经历写进某个长期存储。下一次调用时,它能“想起”什么,完全取决于系统把哪些内容重新放进了 prompt、工具结果、检索上下文或模型权重里。
长上下文解决的是“这一次能看多少材料”。它像工作台,能临时摊开很多文件,但工作台不是档案馆。一次任务结束以后,哪些材料应该归档、哪些应该丢弃、哪些应该下次优先拿出来,不是上下文窗口自己决定的。
向量库解决的是“相似内容怎么找回来”。它很重要,但它也不是完整记忆系统。向量库不知道某条记忆属于哪个用户,不知道事实什么时候过期,不知道一个用户三月偏好 Python、五月改成 Go 时应该如何处理冲突,也不知道“下周三提醒我复查这个 PR”应该如何在未来被唤醒。
所以,更准确的说法是:Agent 记忆是一条状态管理管线。
这条管线大致长这样:
观察输入和事件
-> 提取候选记忆
-> 判断是否值得保存
-> 写入对应记忆层
-> 去重、合并、冲突处理
-> 在下一次任务中检索
-> 过滤、排序、组装上下文
-> 注入 Agent
-> 使用后更新、删除、审计
这里最难的不是“怎么存”,而是两个门控。
一个是写入门控。用户说“这次临时用 Python 写个脚本,但正式项目以后都用 TypeScript”,系统应该知道“这次用 Python”是短期状态,“正式项目用 TypeScript”才是长期偏好。
另一个是读取门控。记忆库里可能有上千条历史信息,但当前任务只需要很少几条。如果把所有东西都塞进 prompt,Agent 不是更聪明,而是更容易被噪声带偏。
从这个角度看,记忆系统的核心能力不是保存,而是治理。它要知道什么该记、记到哪里、什么时候拿出来、什么时候更新、什么时候忘掉。
七种记忆的系统边界

七种记忆可以放在一张心智地图里理解。
工作记忆负责当前任务。它回答“现在正在发生什么”。
语义记忆负责长期事实。它回答“系统知道什么”。
情节记忆负责过去事件。它回答“以前发生过什么”。
程序记忆负责做事方法。它回答“以后应该怎么做”。
检索记忆负责外部资料。它回答“资料库里有什么”。
参数记忆负责模型内化能力。它回答“模型本身已经学会了什么”。
前瞻记忆负责未来承诺。它回答“之后还要做什么”。
这七类记忆之间有重叠,但工程边界很不一样。比如“用户喜欢简短回答”可以是一条语义记忆;“上次用户因为回答太长而要求重写”是一条情节记忆;“以后回答这个用户时先给结论再给解释”可能沉淀成程序记忆;如果这种风格对所有用户都稳定有效,才可能进入参数记忆。
这也是很多记忆系统变乱的原因:不同生命周期的状态被混进了同一个存储。临时任务状态被当成长期事实,用户偏好和企业知识混在一起,过去事件和未来待办都塞进向量库,最后 Agent 似乎什么都记得,但用起来越来越不可靠。
下面逐类拆开看。
工作记忆:当前任务如何保持连续

工作记忆是 Agent 的短期状态。它包括当前消息历史、当前计划、工具调用结果、临时 scratchpad、正在处理的文件、当前 graph state,以及任务中断后恢复所需的 checkpoint。
如果你在做一个简单聊天机器人,工作记忆可能就是 messages 数组。如果你在做一个工具型 Agent,工作记忆就不能只靠 messages 了。它还要保存当前步骤、工具调用结果、分支状态、用户确认点和失败恢复点。
可以把它抽象成这样的结构:
type WorkingMemory = {
threadId: string
runId: string
messages: Message[]
plan?: Step[]
toolResults: ToolResult[]
scratchpad?: string
checkpoint?: {
node: string
state: unknown
createdAt: string
}
}
工作记忆的存储通常不需要向量库。短任务可以放在进程内或 Redis;多轮会话可以放在数据库;复杂 Agent 流程可以用 LangGraph 这类框架的 checkpointer 保存 graph state。
关键是要区分“当前任务状态”和“长期用户事实”。比如用户在某次任务里说“这次先忽略测试”,这不应该被长期记成“用户不喜欢测试”。它只是当前任务约束,最多属于这次 thread 的工作记忆。
工作记忆常见的坑,是过早总结。很多系统为了节省 token,会把消息历史压缩成摘要。但摘要一旦丢失工具调用细节、用户确认语义或失败路径,后续恢复时 Agent 就可能做出错误判断。比较稳妥的做法,是原始事件和压缩摘要同时保存:摘要用于上下文,原始事件用于审计和回放。
语义记忆:长期事实如何不串、不脏、不过期

语义记忆保存稳定事实、偏好和画像。它不是“某次对话发生了什么”,而是“现在系统可以认为哪些事实成立”。
典型例子包括:用户默认使用 TypeScript;某团队发布窗口是周二下午;某客户在 Pro 版本;某项目使用 pnpm 而不是 npm;某个业务指标不能和另一个指标相加。
语义记忆可以设计成结构化事实:
type SemanticMemory = {
id: string
scope: {
userId?: string
orgId?: string
agentId?: string
}
subject: string
predicate: string
object: string
confidence: number
sourceEpisodeId?: string
validFrom?: string
validTo?: string
updatedAt: string
}
这里最重要的字段不是 embedding,而是 scope。任何用户级记忆都必须带 userId,任何组织级记忆都必须带 orgId。多租户产品里,记忆串用户不是回答质量问题,而是安全事故。
语义记忆的写入通常需要一个抽取步骤。系统从对话或事件里提取候选事实,再判断是否长期有效、是否已有重复、是否和旧事实冲突。比如“我现在改用 Go 了”可能要覆盖旧的“用户偏好 Python”;“这个临时脚本用 Python”则不应该覆盖长期偏好。
读取时,也不能只做向量相似度。更常见的组合是 scope 过滤、语义检索、关键词检索、时间过滤和置信度过滤。一个比较稳的读取链路是:先按 userId 或 orgId 做强过滤,再在过滤后的候选里做相似度搜索,最后用 reranker 或规则选出最相关的几条。
Mem0、LangMem、Cognee 都覆盖了一部分语义记忆能力。Mem0 更像通用记忆层,适合快速把 add/search/update/delete 这些能力接入产品。LangMem 更适合已经在 LangGraph 体系内的 Agent,用来抽取和管理长期记忆。Cognee 则更偏企业知识和图谱组织,适合把多源资料整理成可推理的知识层。
语义记忆最大的风险不是忘记,而是乱记。系统如果把临时状态写成长期事实,会让 Agent 逐渐形成错误画像。语义记忆必须提供可见、可编辑、可删除的管理入口。否则用户纠正不了,开发者也调不清。
情节记忆:过去事件如何成为可回放经验

情节记忆保存过去发生过的事情。它带时间、场景、过程和结果。和语义记忆相比,情节记忆更像事件日志;和普通日志相比,它又经过整理,可以被 Agent 检索和理解。
比如用户说“上次那个 Docker 问题又出现了”,Agent 需要找回的不只是一条事实,而是一段历史:上次是什么报错,读了哪些日志,尝试过哪些修复,哪个方案有效,哪个方案失败,最后结果是什么。
情节记忆可以这样组织:
type EpisodeMemory = {
episodeId: string
scope: {
userId?: string
orgId?: string
}
startedAt: string
endedAt?: string
summary: string
entities: string[]
actions: ToolCall[]
outcome: 「succeeded」 | 「failed」 | 「cancelled」
failureReason?: string
artifacts: string[]
}
生产里,我更建议情节记忆分两层保存。
底层保存完整 trace,包括用户输入、工具调用、模型输出、文件变更、错误信息和最终结果。它不一定每次都进入 prompt,但必须可审计、可回放。
上层保存 episode summary,包括任务摘要、实体、结论、失败原因、可复用经验。它更适合检索和注入上下文。
Graphiti 这类 temporal knowledge graph 很适合处理情节记忆,因为它不仅保存实体关系,还强调时间变化。Letta 也适合构建有状态 Agent,因为它把对话历史、记忆块和 Agent 状态放进运行时模型里。你也可以自建 event store,用 Postgres 或对象存储保存原始轨迹,再异步生成摘要和实体索引。
情节记忆的常见坑,是只保存最后摘要。摘要读起来干净,但一旦 Agent 基于错误摘要做了判断,你就很难追溯它为什么会这样想。一个成熟系统应该同时保存压缩后的可检索记忆和原始可回放证据。
程序记忆:做事方法如何沉淀为能力

程序记忆是最容易被低估的一类。它保存的不是“用户是谁”,也不是“过去发生了什么”,而是“以后应该怎么做”。
对开发者来说,程序记忆非常熟悉。项目里的 README、runbook、CI 配置、代码规范、Skill、prompt template、排障流程,其实都是程序记忆。它们告诉 Agent 遇到某类任务时应该走什么路径、先读什么文件、调用什么工具、做完以后如何验证。
程序记忆可以这样组织:
type ProceduralMemory = {
id: string
name: string
trigger: string
instruction: string
examples: string[]
version: string
sourceEpisodes: string[]
evalCases: string[]
}
和语义记忆不同,程序记忆不能随便自动写入。因为它会影响未来一类任务,而不是影响某一次回答。一个失败案例可以生成候选规则,但这条规则能不能进入程序记忆,应该经过评测。
比如一个 Coding Agent 某次忘了跑测试,你可以让它反思出“修改代码后要运行相关测试”。但如果这条规则写得太硬,它可能在文档修改、注释修改、配置无法运行的情况下也盲目跑全量测试,浪费时间甚至打断流程。更好的做法是把经验写成具体触发条件:当修改运行时代码或行为逻辑时,优先运行受影响测试;如果测试环境不可用,要说明原因和替代验证。
程序记忆最好版本化。用 Git 管理 Skill、runbook 和 prompt,比把它们塞进向量库更可靠。因为你需要 review、diff、回滚、评测和发布。
LangMem 提供了从交互中优化 Agent 行为的思路。Voyager、Reflexion、ExpeL、ReMe 这类研究项目也展示了如何把经验反思沉淀成可复用策略。生产系统不一定直接复现它们,但可以借鉴一个原则:反思只是提出候选,评测才决定是否合入。
检索记忆:外部知识如何被 Agent 使用

检索记忆就是通常说的 RAG 层。它保存文档、代码、知识库、网页、论文、客服手册、API 文档等外部资料。它解决的问题是:Agent 不可能把所有环境知识都放进模型权重,也不应该靠模型记住不断变化的资料。
检索记忆通常按 chunk 组织:
type RetrievalChunk = {
chunkId: string
documentId: string
text: string
embedding?: number[]
metadata: {
source: string
section?: string
updatedAt: string
acl?: string[]
}
}
一条典型管线是:文档接入,清洗,切块,生成 embedding,写入 metadata,构建向量索引和关键词索引,查询时做 hybrid search,最后 rerank 并注入 prompt。
这里有几个工程细节非常重要。
切块不是越小越好。太小会丢上下文,太大又会降低召回精度。代码、文档、FAQ、论文的切块策略应该不同。代码适合按函数、类、文件结构切;文档适合按标题层级切;FAQ 适合按问答对切。
metadata 不是附属字段。权限、来源、更新时间、版本号、业务线、文档类型,都应该进入 metadata。没有 ACL 的 RAG 很容易把不该看的资料检索出来。
向量检索也不是唯一答案。很多技术文档查询包含精确符号、函数名、错误码、接口名,这时 BM25、关键词索引和结构化过滤往往比纯 embedding 更可靠。成熟系统通常会做混合检索。
Qdrant、Chroma、Milvus、LanceDB 都可以作为检索记忆底座。Qdrant 适合带 payload filter 的生产向量检索;Chroma 上手快;Milvus 偏大规模;LanceDB 适合本地和多模态场景。Cognee 和 Graphiti 则适合在检索之外增加图谱结构。
但要记住,RAG 不是个人记忆。文档库告诉 Agent “资料里写了什么”,语义记忆和情节记忆告诉 Agent “这个用户、这个组织、这次任务发生过什么”。这几类不能混为一谈。
参数记忆:什么时候应该微调

参数记忆是模型权重里的能力。它来自预训练、指令微调、偏好优化、LoRA adapter 等方式。和其他记忆不同,参数记忆不是运行时可查询、可删除、可审计的记录。
它适合保存稳定、高频、跨用户通用的能力。比如某个领域术语、固定输出风格、代码生成习惯、特定格式转换能力。如果一类知识对所有用户都成立,更新频率不高,而且运行时检索成本很高,那么它可能适合进入参数记忆。
但用户个人偏好、客户状态、项目临时事实、合规敏感信息,不应该写进参数记忆。原因很简单:难删除、难更新、难解释。用户说“忘掉我之前的偏好”,如果偏好已经进了模型权重,工程上几乎无法给出可靠承诺。
参数记忆的工程流程更像模型训练:
收集样本
-> 清洗和去敏
-> 构造训练集
-> SFT / LoRA / DPO
-> 离线评测
-> 回归测试
-> 发布 adapter 或模型版本
PEFT、Axolotl、LLaMA-Factory、Unsloth 都是常见开源工具。它们解决的是模型适配问题,不是运行时记忆管理问题。
我的建议是,把参数记忆放在最后考虑。先用工作记忆、检索记忆、语义记忆和程序记忆解决大部分问题。只有当某类能力稳定、通用、频繁使用,并且通过评测证明微调比检索或提示更合适时,再考虑写进权重。
前瞻记忆:未来承诺如何真正执行

前瞻记忆保存未来要做的事。比如明天提醒我、下周复查这个 PR、CI 失败后半小时再试、等客户回复后继续生成方案。
这类记忆很容易被忽略,因为模型可以很自然地说“好的,我明天提醒你”。但如果系统没有调度器、任务表或 durable workflow,这句话只是语言,不是能力。
前瞻记忆可以这样组织:
type ProspectiveMemory = {
taskId: string
ownerId: string
intent: string
triggerAt?: string
triggerEvent?: string
requiredContext: string[]
status: 「scheduled」 | 「waiting」 | 「running」 | 「done」 | 「cancelled」
}
前瞻记忆的核心不是检索,而是唤醒。系统必须在未来某个时间或某个事件发生时,把任务重新交给 Agent,并带上必要上下文。它还要支持取消、重试、超时、权限检查和审计。
实现上,可以用 Temporal 这类 durable workflow,也可以用数据库任务表、队列和 cron worker。LangGraph 的持久化和长期运行能力也可以参与这类设计,但真正的未来任务仍然需要外部调度系统。
前瞻记忆和情节记忆经常配合使用。前瞻记忆负责“未来要醒来做什么”,情节记忆负责“醒来以后知道之前发生过什么”。如果只有调度器,没有历史上下文,Agent 到点醒来以后仍然不知道任务为什么存在。
七种记忆如何组成一套架构

如果把七种记忆合成一套工程架构,可以分成四层。
最上面是 Agent Runtime。它负责执行任务,维护当前 messages、工具调用、graph state 和 checkpoint。这里主要承载工作记忆。
中间是 Memory Service。它负责从输入和事件中提取记忆,判断记忆类型,决定写入位置,做去重、冲突处理、权限过滤、检索和 prompt 组装。它不应该只是一个 thin wrapper,而应该是记忆系统的治理层。
下面是 Storage Layer。不同记忆进入不同存储:Redis 或 Postgres 保存短期状态;Postgres 保存结构化语义事实和任务;向量库保存检索 chunk 和语义索引;图数据库或 temporal graph 保存实体关系和时间变化;对象存储保存 trace 和 artifact;Git 保存程序记忆;调度器保存前瞻任务。
最后是 Eval and Governance。它负责测试记忆是否写对、取对、用对,也负责删除、审计、权限隔离和回归测试。没有这一层,记忆系统迟早会变成一堆不可控的历史残留。
可以用一个简化结构理解:
Agent Runtime
- messages
- tool state
- checkpoint
Memory Service
- extract
- classify
- scope filter
- dedupe
- conflict resolve
- retrieve
- rerank
- prompt assembly
Storage Layer
- Redis / Postgres
- Vector DB
- Graph DB
- Object Storage
- Git
- Scheduler
Eval and Governance
- memory write eval
- retrieval eval
- usage eval
- isolation test
- deletion audit
- procedural regression
这个架构里最重要的原则是:不要让一种存储承担所有记忆。
向量库适合相似检索,不适合未来调度;Git 适合程序记忆版本化,不适合毫秒级用户偏好查询;模型权重适合通用能力,不适合用户可删除的个人事实;事件日志适合审计,不适合每次直接注入 prompt。
存储选型要跟记忆生命周期匹配。
开源方案应该如何看

如果你是开发者,不建议一上来就问“哪个框架最好”。更好的问题是:我现在要先实现哪类记忆。
如果你要快速给产品加长期用户记忆,可以看 Mem0。它更像通用记忆层,提供添加、检索、更新、删除等 API,适合个性化助手、客服和 SaaS copilot。
如果你已经使用 LangGraph,可以优先看 LangGraph persistence 和 LangMem。前者负责工作记忆、checkpoint 和跨会话状态;后者更偏长期记忆抽取、搜索和行为优化。
如果你要做有状态 Agent,而不是给无状态模型外挂一个记忆库,可以看 Letta。它的思路更接近 Agent runtime,把 memory blocks、对话历史、工具和 Agent 状态组织在一起。
如果你的事实随时间变化,或者需要把事件、实体、关系和时间一起建模,可以看 Graphiti。它适合情节记忆和语义记忆之间的交叉地带。
如果你要做企业知识层,可以看 Cognee。它更偏把多源数据组织成知识图谱和可检索知识库。
如果你只是先做 RAG,Qdrant、Chroma、Milvus、LanceDB 就够用。不要为了一个简单文档问答系统引入完整 Agent memory framework。
如果你要做前瞻记忆,不要找向量库,去看 Temporal、任务队列、数据库任务表和 durable workflow。
如果你想把能力写进模型权重,再看 PEFT、Axolotl、LLaMA-Factory、Unsloth。它们属于训练工具,不属于运行时记忆服务。
从 MVP 到生产,应该怎么落地

比较现实的路线,是分阶段建设。
先做工作记忆和检索记忆。让 Agent 能稳定完成当前任务,能读文档、读代码、调用工具,并且能从中断处恢复。这个阶段不需要复杂长期记忆,重点是上下文管理和工具状态可靠。
再做语义记忆。先只保存少量高价值事实,比如用户偏好、项目技术栈、组织规则。所有记忆都必须有 scope、来源和更新时间。不要一开始就自动保存所有聊天摘要。
接着做情节记忆。保存任务轨迹、工具调用、结果和失败原因。这个阶段的价值很大,因为它不仅服务 Agent,也服务开发者调试和产品复盘。
然后做程序记忆。把反复出现的成功路径和失败经验沉淀成 Skill、runbook 或 prompt template。这里要引入评测,不要让 Agent 自己随意改未来行为规则。
再做前瞻记忆。把未来任务放进调度系统,让 Agent 真正能在未来被唤醒。这个阶段会碰到权限、取消、重试、幂等和状态恢复问题,要按后端任务系统的标准做。
最后考虑参数记忆。只有当某类能力稳定、高频、跨用户通用,并且通过评测证明微调更划算时,再把它写进模型权重。
这条路线的好处是不会过早复杂化。很多产品根本不需要一开始就做图谱和微调。一个强约束的工作记忆、一个可靠的 RAG、一个干净的用户偏好表,已经能解决大量真实问题。
如何评估记忆系统

记忆系统不能只靠感觉评估。用户说“它好像记住了我”,不等于系统可靠。一个严肃的记忆系统至少要测几类能力。
**写入是否正确。**给一组对话样本,系统能不能把长期偏好、稳定事实、关键事件提取出来,同时过滤掉临时请求和噪声。
**检索是否相关。**面对一个新任务,系统能不能找回应该使用的记忆,而不是找回语义上相似但事实上无关的内容。
**使用是否有效。**模型拿到记忆后,是否真的改善了任务结果。很多系统只是把记忆放进 prompt,但模型没有用,或者用错了。
**作用域是否安全。**不同用户、不同组织、测试环境和生产环境之间,记忆是否彻底隔离。这个必须做自动化测试。
**更新是否可靠。**当用户偏好变化、事实过期、旧记忆被纠正时,系统能不能覆盖或失效旧记忆。
**删除是否真实。**用户要求删除后,记忆是否从主存储、索引、缓存和衍生摘要里都消失。仅仅从界面隐藏不算删除。
**程序记忆是否回归。**修改 Skill 或 runbook 后,旧任务有没有退化。程序记忆一旦影响执行流程,就必须像代码一样测。
一个最小评测集可以从真实案例开始。准备几十个样本,覆盖用户偏好、历史事件、文档检索、冲突更新、删除隔离和未来任务。不要一开始让模型合成一堆漂亮题目。真实失败比合成题更能暴露系统问题。
最后:记忆系统的本质是状态工程

Agent 记忆听起来像一个很拟人的能力,但工程上它更接近状态管理。
工作记忆是当前状态,语义记忆是长期事实,情节记忆是历史事件,程序记忆是行为策略,检索记忆是外部知识,参数记忆是模型内化能力,前瞻记忆是未来任务。
把这些状态混在一起,系统会越来越难调;把它们拆清楚,Agent 才能变得可靠。
所以,开发者学习 Agent 记忆,不应该只学习某个框架怎么调用,也不应该只学习向量库怎么检索。真正要掌握的是:每种记忆的生命周期是什么,应该存在哪里,什么时候写入,怎么检索,如何更新,如何删除,如何验证它真的让 Agent 变好了。
当这套状态系统建立起来以后,Agent 才不只是一次性回答问题的模型,而是一个能跨时间、跨任务、跨工具持续工作的工程系统。
学AI大模型的正确顺序,千万不要搞错了
🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!
有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!
就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇
学习路线:
✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经
以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!
我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

更多推荐


所有评论(0)