做 Agent 开发的人,迟早会撞上同一个墙:模型上下文窗口就那么大,聊着聊着,前面说过的事情全忘了。早期我踩过不少坑,也天真地把所有对话历史一股脑塞进 prompt,结果 token 费用翻倍,响应还越来越迟钝。后来我花了很长一段时间,专门去拆解开源社区里各个主流 Agent 项目的记忆实现,才发现“长期记忆”这件事根本没有标准答案——大家都是各自沿着一条路走到了今天,有的把上下文当内存做分页,有的把记忆写进状态机,有的直接就丢给向量数据库了。
这篇东西,我会拿我实际读过源码、也跑过 Demo 的六个项目出来做横向拆解:MemGPT(也就是现在的 Letta)、LangChain 的 Memory 体系、LangGraph 的持久化设计、CrewAI 的多 Agent 记忆系统、AutoGPT 的文件记忆方案,以及 Mem0 这种把记忆做成服务的思路。不聊虚的,我会把每个项目的设计初衷、核心机制、适用场景讲清楚,最后再给一份可以参考的选型建议和落地经验。适合正在做 Agent 开发、或者想把“记忆能力”加到现有 AI 应用里的朋友读。
1. 先搞清楚:Agent 的“长期记忆”到底在解决什么问题
1.1 为什么 Agent 一聊就“失忆”
几乎所有 Agent 产品都会遇到同一个尴尬:用户在第二次会话里问“我上次让你分析的报表,结论是什么?”Agent 一脸茫然。本质原因很简单——大多数 Agent 应用是大模型 API 的无状态调用,每次请求都是全新的上下文,模型只活在当前这个 prompt 里。
你可能会想:那我把历史消息都带上不就行了。确实,短期对话场景下,把最近几轮消息拼进 prompt 就能解决大部分问题。但一旦会话拉长、信息量增大,这条路立刻走到尽头。上下文窗口是硬上限,token 成本是经济上限,模型在超长上下文里的注意力衰减是效果上限。你不可能让一个每天处理上百个用户请求的客服 Agent 把所有历史全部背在脑子里。
所以“长期记忆”不是一个锦上添花的功能,而是 Agent 从“玩具”走向“工具”的必经之路。它要解决的核心命题是:怎么让 Agent 在跨会话、跨任务、甚至跨团队协作时,仍然能调用到过去沉淀下来的信息,并且不把模型撑爆。
1.2 记忆的分层:从会话窗口到持久化存储
我去看各个项目源码时,有个很深的感受:大家嘴上都在说“长期记忆”,但实际做的东西差别极大。为了对比方便,我习惯把 Agent 记忆分成四层:
- 工作记忆(Working Memory):当前任务执行期间的临时状态,比如正在迭代的一个代码文件、用户刚提的一个需求,通常存在于上下文窗口或会话状态里。
- 情景记忆(Episodic Memory):用户和 Agent 之间发生过的事情,比如“昨天用户要求调整配色”“上周用户问过 API 限流问题”。
- 语义记忆(Semantic Memory):抽象出来的事实和知识,比如“用户偏好简洁风格”“这个项目的部署方式是 Docker Compose”,这些是从具体事件里提炼出来的规律。
- 程序记忆(Procedural Memory):Agent 学会的做事流程,比如“遇到数据库错误时先看慢查询日志”,类似于技能库。
大部分项目其实只是在做情景记忆和语义记忆这两层,少数项目把程序记忆也纳入系统。你在对比方案时需要先搞清楚自己要的是哪一层——把“长期记忆”泛泛地当成一个功能去做,十有八九会做出一坨四不像。
1.3 好记忆的标准:三个基本能力
拆了那么多项目之后,我总结出一个好用的记忆系统至少要满足三点:
第一是写入能力。系统得能判断哪些信息值得存,并且在合适的时机触发存储动作。不是所有对话内容都值得进长期记忆,存太多垃圾反而会污染后续检索。第二是读取能力。需要在合适的时机把最相关的记忆拉出来,重新放回上下文窗口里。这一步的难点是相关性判断和召回质量。第三是遗忘与更新能力。记忆会过时,用户的偏好会变,系统得有机制去覆盖、修正、甚至删除旧记忆。很多项目只做前两步,结果就是记忆越积越多,最后全是噪声。
我对所有方案的评价,基本都围绕这三个能力展开。后面的六个项目,我们挨个看。
2. 六个主流项目,各自押注了哪条路
2.1 选型依据:为什么是这六个
先说清楚我为什么选这六个项目,免得有人说我随便凑数。挑选逻辑其实只有一句话:每个项目都代表了一种有辨识度的记忆实现路径,且在过去一年里对社区影响足够大。
MemGPT/Letta 代表的是“操作系统式”的上下文管理,它把大模型上下文当成虚拟内存来做;LangChain Memory 是框架插件式的路子,提供一堆现成 Memory 类让你拼装;LangGraph 走的是状态机持久化,把记忆写进图的 Checkpoint;CrewAI 是站在多 Agent 协作场景做记忆组织,更强调角色分工;AutoGPT 是大而全的自主 Agent 范式,记忆直接落到文件和向量库;Mem0 则是把记忆抽象成独立服务,主打一个“API 接入”和“自学习”。
这六个项目涵盖了从单 Agent 到多 Agent、从框架内嵌到外部服务的几乎所有思路。你只需要对照自己的项目形态,就能找到近似的参考。
2.2 大致分类:管理型 vs 存储型 vs 服务型
如果非要用一句话归类,我会把六者分成三类。
MemGPT、LangGraph 属于管理型:核心思路是“我不关心记忆存在哪,但我关心什么时候把什么内容放进上下文”。它们的核心组件是动态上下文管理器和状态持久化。
LangChain Memory、AutoGPT 属于存储型:重点是“怎么把信息抽出来,存到哪里去”,例如摘要存内存、细节存向量库,使用时再做检索。它们对“什么时候存”这件事大多比较朴素。
CrewAI 和 Mem0 介于两者之间,但各有侧重。CrewAI 偏组织型,处理的是多个 Agent 之间的记忆共享与隔离;Mem0 偏服务型,把记忆能力做成独立模块,通过 API 接入任何 Agent。
我在实际项目中往往需要组合使用:底层用存储型方案保存数据,上层用管理型思路控制读写节奏。但这是后话,先把每个项目的设计思路讲明白。
3. 六个项目逐个拆解:设计思路与核心技术点
3.1 MemGPT / Letta:让上下文像内存一样分页
MemGPT 是我最早认真读源码的记忆项目之一,后来它改名成了 Letta。它的核心隐喻是计算机操作系统:模型有一个固定大小的上下文窗口,相当于物理内存;外部存储相当于磁盘。系统里跑着一个“操作系统”,负责决定哪些数据驻留在“内存”里,哪些数据换出到“磁盘”。
这个设计的巧妙之处在于,它把上下文管理从人的手工拼 prompt 变成了一个自动化的调度问题。MemGPT 内部维护了一个分层的消息队列,包含主上下文(一直保留的核心指令和最近消息)、外部上下文(从存储里召回的历史信息)。当运行过程中主上下文快满时,系统会触发“换页”:把不重要的旧消息归档到外部存储,把需要的记忆加载进来。整个过程对上层 Agent 完全透明。
在实际操作中,我体验最好的一点是它提供了“自我编辑”机制。系统会在对话过程中判断哪些信息值得存档,比如用户透露的个人偏好、项目关键约束,它会主动写入记忆库,而不是像很多方案那样要开发者手动设计抽取逻辑。这其实就是我前面说的“写入能力”的自动化解法。代价是这套机制本身要消耗额外的 token,而且调度策略调起来比较玄学,换个大模型可能表现就变了。
适用场景上,MemGPT/Letta 非常适合做“高上下文连续对话”的个人助理类应用,比如长期陪聊的 AI 伙伴、跨多日的项目协作者。它的设计哲学是“我替你管理该记住什么”,开发者介入成本低。但如果你需要完全掌控记忆的存取逻辑,这套黑盒式的自动调度反而会让你觉得束手束脚。
3.2 LangChain Memory:插件式的对话缓冲与摘要
LangChain 是很多人的 Agent 启蒙框架,它的 Memory 模块也是社区里被用得最多、也最被吐槽的设计。它的思路非常“框架化”:不同场景给你不同的内存组件,你自己选、自己装。
它的经典组件有 ConversationBufferMemory(记录完整对话历史)、ConversationBufferWindowMemory(只保留最近 N 轮)、ConversationSummaryMemory(对历史生成摘要)、VectorStoreRetrieverMemory(把对话存入向量库按相似度召回)。这套设计的价值在于起步极快——你要做带记忆的聊天机器人,三行代码就能接上 BufferMemory;你要做知识库问答,换个 VectorStore 就行。
但它也踩了很多坑。我实际用下来最大的感受是:这些 Memory 组件彼此是孤立的,你很难在一个 Agent 里同时用好短时缓冲和长期摘要。很多人最后的做法是自定义一个混合 Memory 类,自己管理摘要触发时机、还有向量检索后的排序问题。LangChain 自己的文档也把 Memory 定位成“实验性模块”,版本更新里 Breaking Change 相当频繁,我升级一次框架就要重构一次记忆代码。
另外,LangChain 的 Memory 主要是围绕“对话历史”设计的,它记住的是“聊过什么”,而不是“学到了什么”。你要让它记住用户的偏好并主动改变行为,基本做不到。所以我把 LangChain Memory 定位成“记忆入门方案”——适合快速验证和原型开发,距离生产级长期记忆还有距离。
3.3 LangGraph:把记忆变成状态机里的持久化字段
LangGraph 是 LangChain 团队后来的“亲儿子”,它换了一条完全不同的路子:把 Agent 定义成一个图结构,每个节点是一步操作,记忆直接被设计成图的持久化状态。你不再需要额外引入一个 Memory 模块,因为状态本身就是记忆。
它最核心的机制是 Checkpointer。每次图执行到一个节点,系统会把当前的状态打一个快照,存到 SQLite、Postgres 或 Redis 这类外部存储里。下次用户再来,直接让图从上次的 Checkpoint 恢复继续跑,完美解决“跨会话续聊”的需求。这比 LangChain 的插件式 Memory 高了一个维度,因为恢复的不仅仅是几段文本,而是整个执行状态——包括运行到哪个步骤、中间变量是什么、已经收集了哪些信息。
还有一个我很喜欢的机制叫 Store,它专门用来存跨会话的长期记忆数据。与 Checkpoint 的“会话级状态”不同,Store 是“用户级”或“全局级”的键值存储,可以在不同会话之间共享信息。实操中我经常把用户画像、业务实体数据写进 Store,把对话状态写进 Checkpoint,两者配合非常顺手。
LangGraph 的设计思路给我的启发是:记忆不应该是一个附加功能,而应该是应用的基础设施。把记忆做进状态的读写生命周期里,开发体验和稳定性都会好很多。但它也有门槛——要求开发者具备“图 + 状态机”的思维方式,对状态 Schema 的设计要求很高。你如果一开始没有规划好状态结构,后面加记忆字段会非常痛苦。
3.4 CrewAI:给多 Agent 团队配一套记忆组织
CrewAI 社区里以“多 Agent 协作”闻名,很多人在用它搭建“老板 + 分析师 + 写手”式的虚拟团队。它的记忆系统也是围绕这种多人协作场景设计的,这也是它和其他项目区别最大的一点。
CrewAI 的记忆分四种:短期记忆(当前任务执行期间的上下文)、长期记忆(跨任务保留的用户偏好和业务知识)、实体记忆(关于具体人、事、组织的结构化信息)、情景记忆(过去任务的执行过程和结果)。这种分法几乎就是我前面说的记忆分层理论的工程化落地。每个 Agent 都能配置自己的记忆组件,而且 Crew 级别有一个共享记忆池,让不同角色的 Agent 可以读取彼此的沉淀。
我实际跑下来的感受是,它的长期记忆默认还是存在 SQLite 里的,向量检索看场景很有限。实体记忆那一块做得很取巧——本质上就是一堆结构化表的读写。对于多 Agent 任务来说,这个设计很实用:比如“研究员”Agent 搜到一份行业报告,写好摘要存入共享记忆,“销售”Agent 在和用户对话时可以直接引用这份摘要,不用重新搜索。
不过也要泼一盆冷水:这些记忆功能听着很全,但生产级稳定性一般。我同事在跑长任务时遇到多个 Agent 并发写同一个记忆表导致锁冲突,排查了半天。性能调优的空间也有限,真要支撑大规模多 Agent 应用,得自己换存储后端。CrewAI 的定位更像是“开箱即用的多 Agent 记忆方案”,适合快速搭建团队式应用,复杂场景还是得自己做底层。
3.5 AutoGPT:用文件和向量库做记忆仓库
AutoGPT 在 2023 年火过一阵,虽然现在的热度不如当年,它那一套“让 AI 自己规划、自己执行、自己记忆”的思路影响了很多后来的项目。AutoGPT 的长期记忆方案也很“直男”:直接把记忆序列化和持久化到文件,同时用向量数据库做语义检索。
它早期版本的记忆实现相当朴素:Agent 在执行过程中把重要信息保存为文本文件,放在工作目录里,需要时再读取。后来引入了向量数据库(比如 Chroma、Pinecone),把记忆内容切块、向量化、存入库中,任务开始时先做一次相似度检索,把命中的历史记忆带进上下文。整套链路简单直接,适合理解“文件系统 + 向量库”这种最朴素的长期记忆模型。
但我用它做实际任务时,发现 AutoGPT 的记忆系统有个致命伤:缺乏结构。它记住的是“一段文本”,但这段文本属于哪个任务、是什么类型的信息、效力到什么时候,统统没有元数据管理。结果就是,当任务数量一多,检索出来的东西经常风马牛不相及。你需要自己维护一套记忆目录结构,否则 Agent 的记忆库很快就会沦为一堆无法区分的文本垃圾场。
尽管如此,AutoGPT 的意义在于昭示了一个重要事实:Agent 的长期记忆不需要什么黑科技,最基本的文件存储+向量检索就能跑通。如果你只是在做原型验证、或者任务类型比较固定,沿着 AutoGPT 的路线搭一个最小记忆系统,一天之内就能见到效果。
3.6 Mem0:把记忆做成 API 和“自我反思”过程
最后聊 Mem0,它是我最近用得越来越多的一个项目。它的理念很激进:把“长期记忆”从 Agent 框架里彻底抽离,做成一个独立的能力层,你只需要调 API——传一句用户消息,它自动决定记什么、存哪里、怎么更新。官方给它的定位是“给 LLM 应用加记忆的智能层”,我实际体验下来,它确实最接近我对“好记忆系统”的三个标准。
Mem0 的底层有多模态 embedding、向量存储、图数据库,但普通用户根本不需要关心这些。它的核心价值在两个设计:一是抽取-更新-删除的自学习机制,每次接收新消息,它会判断和已有记忆有没有冲突,有就更新旧记忆,没有就新增;二是 API 形态,意味着它能和任何 Agent 框架插拔组合,你在 LangGraph、CrewAI 甚至自研框架里都能用。
我在一个客服 Agent 项目里试过用 Mem0 替换掉自己手写的 SQLite 记忆表。接入过程很顺,它自动帮我把“用户喜欢邮件沟通”“上次反馈退款失败”这类信息抽取成可查询的记忆条目,并且每次召回时返回相关度评分,直接塞进 prompt。最让我意外的是,当用户说“我已经改用电话联系了”时,Mem0 会主动把原来“偏好邮件沟通”的记忆更新掉,而不是像多数方案那样在库里堆两条矛盾记录。
当然 Mem0 也有代价。首先是它的资源开销明显更大,因为每轮对话都跑一次抽取判断和向量检索,延迟和成本都会上升。其次是记忆抽取过程对模型能力有依赖,换个弱模型效果会明显下降。最后是它的“黑盒”属性——你把它当外部服务用,出了问题很难自己排查。如果你能接受这套服务化管理,Mem0 是当前社区里最省心的长期记忆方案。
4. 横向对比:六种设计思路的取舍与选型建议
4.1 一张表看清六种方案
网络上的资料各说各话,这里我根据自己的实操做一个总结性对照表,方便你快速定位:
| 项目 | 记忆形态 | 核心存储 | 写入方式 | 读取方式 | 典型优势 | 主要短板 |
|---|---|---|---|---|---|---|
| MemGPT/Letta | 上下文分页调度 | 外部存储 + 主上下文 | 自动归档/加载 | 系统换页 | 无需手动管理,跨会话连续性好 | 调度机制复杂,token 消耗高 |
| LangChain Memory | 对话缓冲/摘要 | 内存/向量库 | 开发者手动链入 | 规则/相似度检索 | 接入快,适合原型 | 组件割裂,难做生产级 |
| LangGraph | 状态快照 + 键值存储 | SQLite/Postgres/Redis | 节点状态自动写入 | 状态恢复/键值读取 | 记忆即基础设施,稳定 | 状态 Schema 设计要求高 |
| CrewAI | 团队级共享记忆池 | SQLite/向量库 | Agent 执行中写入 | 共享池检索 | 多 Agent 协作体验好 | 并发写锁问题,性能一般 |
| AutoGPT | 文件 + 向量库 | 文件系统/Chroma 等 | 任务执行中保存 | 向量相似度召回 | 思路直观,最小可行方案 | 缺乏结构化,易变垃圾场 |
| Mem0 | 外部服务 API | 向量库 + 图存储 | 自动抽取/更新/删除 | 语义检索 + 相关性评分 | 最省心,自动更新 | 黑盒,资源开销大 |
4.2 不同场景下怎么选
如果你问我“哪个最好”,我没法给一个放之四海而皆准的答案,但你只需要回答几个问题就能确定方向。
第一个问题是:你是单 Agent 应用还是多 Agent 系统?单 Agent 的话,LangGraph 的 Checkpointer + Store 组合是我最推荐的,因为它把记忆融进了执行生命周期,状态恢复能力极强。多 Agent 的话,CrewAI 的共享记忆池是最贴合的,可以省掉很多 Agent 之间传话的 prompt 设计。
第二个问题是:你的记忆信息是非结构化对话还是结构化业务数据?前者优先考虑 Mem0 这类自动抽取语义记忆的方案,后者直接用 SQLite/Postgres 维护实体关系表更靠谱。我见过太多人把本来结构化很强的用户订单数据硬塞进向量库,最后检索效率不如一张索引表。
第三个问题是:你对记忆链路有没有控制欲和排查能力?如果你们团队有专门的 AI 工程师,LangGraph 和自研方案让你有完全掌控力;如果团队小、人力紧张,Mem0 的 API 化方案能让你十天上线一个带记忆的 Agent 产品。选择之前一定想清楚你愿意为记忆系统付出多少运维精力。
5. 实操落地:从方案到能跑的记忆系统
5.1 落地记忆系统的通用步骤
选型只是第一步,真正把它落地到自己应用里,我总结出一套通用步骤,每个都踩过坑。
第一步是定义记忆范围。花一个下午想清楚:你的 Agent 到底需要记住什么?用户偏好、业务实体、历史操作、知识文档?列表越具体越好。我见过太多人一上来就“全都记”,最后检索结果一团糟。
第二步是设计写入触发点。记忆不是流水账,什么时候写、写多少,必须有策略。我的经验是分三种触发点:用户明确给出的关键信息(比如“我预算上限是五万”)、Agent 完成的重大结论(比如“确认了服务器迁移方案”)、以及从历史中推断出的稳定偏好(比如“用户习惯晚八点后沟通”)。写入触发点设计得好,记忆库的噪声会小一个量级。
第三步是设计召回策略。每轮对话都检索是最容易做也最容易出问题的方案。你需要设计的是“什么时候检索、检索多少条、检索结果怎么排序”。我常用的是组合策略:核心固定信息始终放在系统提示词中,长尾记忆按问题相关性实时召回,时间敏感的旧记忆直接降权。
第四步是实现遗忘和修正机制。很多人忽略这一步。最简单的做法是给每条记忆打时间戳和信任分,定期清理超期的、加上人工修正接口。Mem0 的自动更新是一个好参考,但你完全可以基于 LangGraph 自己实现一版,原理并不难。
5.2 记忆回写与检索的链路设计
记忆系统的核心链路其实只有两条:写链路和读链路。把它们设计清楚,系统就立住了一半。
写链路我建议做成异步的。用户和 Agent 的对话是实时交互,你绝不能让用户等记忆抽取完成再回话。正确做法是:对话完成一轮后,把对话内容投递到后台队列,由抽取向导模型决定是否写入记忆库。我最初的实现是同步的,结果每次对话都要多等两三秒,后来改成异步任务后才解决。
读链路要分“主动召回”和“被动注入”。主动召回是当用户提出的问题明显涉及历史信息时,触发一次向量检索,把 top-k 结果附加到 prompt。被动注入是把用户核心画像、关键偏好这些高频有价值的信息,每次对话都固定放在 prompt 底部,确保 Agent 不会忘记。两者结合能兼顾效果和成本。
这里有一个很关键的细节:召回结果不要全部塞给模型。我见过很多新手把检索到的所有候选都放进去,导致上下文再一次爆炸。我的建议是加入一个重排步骤,用规则或小模型先过滤一遍,只保留和当前问题明显相关的 2-3 条。这一条能直接改善回答质量。
5.3 成本与性能的平衡点
长期记忆系统是有真实成本的。每一轮对话都要做向量化,这意味着 embedding 的 API 调用费用是线性上升的。我算过一个账单:一个每天 1000 次对话的客服 Agent,只看 embedding 费用,一个月就要多花两三千块,这还没算记忆抽取模型的 token 成本。
省钱的经验有三条。第一条是缓存 embedding:相同或相似的文本不要重复向量化,文本归一化后再做向量化能省很多重复计算。第二条是分层存储:把真正高频访问的记忆放在 Redis 这类快速存储里,低频的沉到向量库或者冷存储。第三条是控制抽取频率:不是每一轮对话都需要触发记忆抽取,可以设置一个概率阈值或者关键词触发,例如只有当用户明显表达了偏好、纠正、或者下结论时才抽取。
性能方面,最大的坑是记忆库膨胀之后检索变慢。如果用的是向量库,按时建索引、做分区是必须的。如果用的是关系库,也要定期清理历史快照。我的经验是:没有遗忘机制的记忆系统,最后都会变成性能灾难。
6. 常见问题与排查技巧实录
6.1 记忆失效:明明存了,Agent 却还是“不知道”
这是我被问得最多的一个问题。排查思路其实很清晰:先看写链路有没有成功,再看读链路有没有召回。
写链路排查:在记忆库里直接查,用户那句关键信息到底有没有落库。如果没落库,多半是抽取逻辑没有触发——可能是触发条件设计得太严格,也可能是异步任务出了问题没执行。读链路排查:如果落库了但 Agent 依然不知道,就要看召回结果有没有进入 prompt。很多框架的召回结果默认只进了内部变量,没有真正拼进发送给模型的消息列表,这个问题非常隐蔽。
我自己实践时还有一个心得:写链路必须加观测日志。每条记忆的写入理由、原始文本、抽取结果都要留痕。否则等你在生产环境排障时,对着一个黑盒连问题出在哪一层都不知道。
6.2 记忆污染:检索出来的内容跟当前话题无关
这也是常见问题,通常有两种原因。一是向量库的 embedding 模型效果不佳,语义相近但实际无关的内容被召回;二是写入阶段的抽取策略过于宽松,把太多噪声存了进去。
针对第一种,除了换更强的 embedding 模型,更有效的办法是加一道“相关性过滤网关”:在召回结果里用规则或者模型对每条记忆打分,低于阈值就直接丢弃,宁少勿滥。针对第二种,我建议周期性检查记忆库的质量,写一个脚本定期把入库记录跑一遍,标记无效条目并清理。
还有一个容易被忽略的污染源是记忆冲突。用户先说了“我平时用 Python”,后来又说“我最近换到 Go 了”,如果系统只负责累积不负责更新,两条记录就会同时存在。这类问题最好在写入层解决,检测到已有同主题记忆时,直接做覆盖而不是新增。
6.3 多会话记忆串号:用户 A 看到了用户 B 的信息
这个问题的根源几乎全部指向同一个地方:记忆的隔离维度设计错了。很多初学者按“会话”维度存记忆,但同一用户在不同会话里的记忆必须共享;按“用户”维度存又容易忽略多租户场景。
正确做法是建立分级的记忆隔离体系:底层按租户(应用或者企业)隔离,中层按用户隔离,上层按会话隔离。每一条记忆在写入时都带上完整的归属标签,读取时必须按照当前请求的租户和用户双重过滤。
我在排查这类问题时的经验是:先在存储层检查归属字段,再检查检索逻辑有没有把归属过滤条件漏掉。很多框架的向量检索只支持单一过滤条件,你需要确认多个条件能否用组合过滤结构传入,否则就要在结果集里做二次过滤。
6.4 成本爆炸:加了记忆之后 token 开销翻倍
最后说一个让很多团队头疼的事:明明只加了一个记忆功能,账单却起飞了。原因主要在于三块重叠的开销:原始对话要抽取向导模型生成记忆,向量化要调 embedding 接口,每次又从库里召回几条塞进 prompt。
我的建议是按这个顺序优化:先压抽取频率,能用规则判断的就不调模型;再压召回数量,从五条减到两条往往效果几乎不变;最后再考虑模型层面的优化,比如用便宜的模型做抽取。不要一上来就换贵的向量库或者分布式架构,大多数项目的问题都出在策略设计上,不是基础设施上。
我把账单优化的经验总结成一句话:长期记忆的终极目标是精准地忘掉更多,而不是贪婪地记住一切。你存得越多,维护成本越高,检索噪声也越大。好的记忆系统应该像一个精明的助手,只记真正重要的笔记,还能定期更新旧内容。
最后再分享一个我的观察:记忆这件事,永远不存在一步到位的银弹。我最初迷信过某个框架,觉得接上它就能一劳永逸,但生产环境跑起来之后,该掉的坑一个都没少。现在我的建议是,先用 LangGraph 或自研的最小状态持久化把“跨会话继续聊”这件事跑通,接着用向量库与异步抽取把“语义记忆”加进去,最后再考虑引入 Mem0 这种自动更新机制来提升记忆质量。按这个节奏逐步演进,大概率比一步到位要稳得多,也省钱得多。