尧图精选

Agent记忆系统实战:分层架构、存储选型与上下文工程

🕒 发布时间:2026/9/26 21:22:29 📁 来源:尧图网络
我不打算在这篇里写什么科普教程标题叫“探索”所以这篇文章就是我近期在 Agent 记忆这条线上从零到一地踩坑、试错、重构的真实记录。我需要先把一个概念说清楚Agent 记忆不是一个独立模块它是和模型能力、工具调用、上下文管理深度绑定的系统工程。你能调出一个带记忆的对话 Demo和能做一个稳定支撑业务的记忆系统中间隔着的距离可能比你想的要大得多。1. 为什么记忆这个方向突然成了 Agent 开发的核心矛盾1.1 Agent 火热背后的那层窗户纸上下文困境现在聊 Agent 的人很多但真正动手做过的朋友应该都有同感Agent 的智商下限由模型决定智商上限却由记忆决定。你给模型一个再聪明的脑子如果它每次对话都像失忆患者一样重新开始那它就永远只能做一个“单轮问答机器”而不是一个“能持续协作的伙伴”。我在项目里遇到的第一道坎就是上下文困境。现在的对话模型上下文窗口看着很大动辄几十万 token听起来好像什么都能塞进去。但实际用起来根本不是那么回事塞得越多模型在长上下文里的注意力就越分散检索关键信息的速度和准确率都会下降而且成本是线性往上跳的。更麻烦的是当你的 Agent 需要执行多步工具调用、中间穿插着多次环境反馈的时候整个对话历史的复杂度是爆炸式的远远不是“把聊天记录攒着然后一股脑塞进去”能解决的。我一开始的做法很天真就是把所有历史消息和中间过程全量塞给模型结果很快就撞上了两个问题一是钱烧得飞快二是模型开始“迷路”。它在长上下文里翻不到关键信息经常把早期某一步的旧数据当成最新状态来用。这个现象在 Agent 项目里很典型叫做上下文污染比单纯的超长截断更隐蔽因为模型不会告诉你它记混了它只会一本正经地用错误信息继续往下执行。1.2 记忆到底是什么它解决的问题不是“记住”而是“会用”那记忆系统到底在解决什么我从自己的实践里总结记忆至少要在三个层面起作用。第一层是任务内的过程记忆。比如 Agent 在执行一个“市场调研并输出报告”的任务时它访问了哪些页面、提取了哪些数据、生成了几个中间结论这些过程信息如果不清空会干扰后续判断如果全清空又会让它无法回溯之前引用的来源。第二层是会话间的短期记忆。用户上次聊到一半的话题、明确表达过的偏好比如“报告要简体中文”“数据口径用 2024 年 Q3”这些信息理应在下一次对话中依然生效。第三层是长期和永久记忆。比如用户的项目背景、公司组织架构、已经反复确认过的业务规则这些属于跨会话、跨任务的高价值知识必须被精准地写入和检索。所以我理解的 Agent 记忆本质上是一个“分层存储动态引用”的系统。它不追求什么都记而是追求在正确的时机、把正确的信息、用正确的方式重新注入到模型的上下文里。做到这一点的难点就不在“存”了而在“取”。怎么判断哪些信息当前任务必需怎么把长尾信息压缩成结构化摘要怎么处理遗忘和更新这些才是真正的技术含量所在。我在探索的这个项目就是顺着这条思路一点点展开的。下面把这套系统拆开讲每一层都是我实打实验证过的方案附上我踩过的坑和最后的选择逻辑。2. 记忆系统的整体设计分层架构与数据流2.1 设计取舍为什么不能把记忆做成一个大池子先说一个我最早踩的最大的坑。我刚开始设计的时候想着既然要记忆那就把所有信息统一存到一个向量数据库里反正支持语义检索问什么都能把相关内容捞出来。这个想法听起来很合理但实际跑起来之后问题非常明显。向量检索的召回质量严重依赖你查询语句和存储内容之间的语义相似度。用户并不会按照你想的方式提问Agent 内部生成的查询也有很大的随机性。结果就是经常捞回来一堆似是而非的内容看着相关实际上全是噪音。而且一个大池子完全没有时效性和优先级的概念。三个月前的旧信息和五分钟前刚确认的新信息权重是一样的甚至因为旧信息比较多检索结果里全被旧内容淹没了。这样导致的后果是灾难性的Agent 用过期信息答复用户用户纠正之后纠正的信息又混进池子里形成了事实冲突。我在测试里见过 Agent 自己和自己打架一会儿说“项目预算是 100 万”一会儿又改成“预算已经调整为 120 万”完全不知道应该以哪条记录为准。所以后来我彻底放弃了“一个大池子”的方案改为分层结构。我把记忆拆成了三层工作记忆Working Memory、短期记忆Short-term Memory、长期记忆Long-term Memory。工作记忆对应当前任务上下文短期记忆对应跨会话但短期有效的偏好和状态长期记忆则承载需要长期沉淀的用户画像、项目元数据这些稳定知识。三层各有独立的存储和读写策略互不干扰数据按生命周期在不同层级间流转。分层之后整个系统的行为一下子变得可控了。我可以在每一层用不同的策略去处理工作记忆只保留当前步骤的关键摘要短期记忆有一定的过期淘汰机制长期记忆有严格的写入校验和冲突处理。每一个环节都能被单独调优而不是像一个黑盒一样出了问题只能干瞪眼。2.2 数据流转信息如何在三层记忆之间移动三层结构不是三个孤立的数据桶它们之间有明确的数据流转关系。我项目里的流转规则是这样的当前任务执行过程中原始的对话交互和工具调用结果先进入工作记忆。工作记忆在任务执行中会比较“膨胀”如果全量保留很快就把模型的上下文窗口塞满了。所以我在项目里会设置一个压缩触发阈值当工作记忆中的 token 数超过预设值比如 3000 token就启动一次摘要压缩。把早期的原始对话摘要成几条关键信息比如“用户要求输出 Markdown 格式的报告数据以 2024 年财报为准”然后释放原始记录占用的空间。任务结束之后工作记忆里的内容会进行归档判定。那些只在当次任务内有效的过程信息比如中间查询了几次数据库直接丢弃那些有跨会话复用价值的偏好信息比如用户明确表达过的格式要求、语言偏好写入短期记忆而那些属于长期稳定事实的信息比如用户的身份背景、组织架构、项目的核心约束就进入长期记忆。归档这步是关键中的关键因为如果判定逻辑做得太宽长期记忆就会堆满垃圾做得太窄有价值的记忆就流失了。我最终采用的是“显式隐式”双通道判定这个后面细讲。读取的时候逻辑是反过来的。每次新会话启动先从长期记忆中检索与当前任务相关的稳定背景注入到模型的系统提示里然后在对话过程中根据当前的语义上下文从短期记忆中检索相关的偏好信息拼装成一小段“记忆片段”放在对话前缀里。工作记忆则在每一轮对话中动态更新保持对当前任务状态的追踪。这套数据流跑通之后Agent 的行为模式有了质的改变。最直观的感受是它开始“认得”用户了而且是在不牺牲性能和可控性的前提下做到的。下面我详细拆解每一层记忆的落地实现包括具体的数据结构、存储选型、读写策略以及我在实现过程中踩过的坑。3. 长短期记忆实现细节存储选型与读写策略3.1 短期记忆的落地Redis 与滑动窗口的配合短期记忆的特点是写入频繁、读取频繁、单条有效期短。这类需求最好的归宿就是 Redis我没有做任何犹豫就选了它。为什么不用数据库因为短期记忆不追求持久化保障它追求的是低延迟和高吞吐。Redis 的 TTL 机制能天然地实现信息过期淘汰内存存储能保证读写延迟在毫秒级别完全匹配短期记忆的使用场景。短期记忆在 Redis 里的数据结构我用的是 Hash。每个用户一个 key字段名是记忆的关键标识字段值是记忆的内容摘要。比如用户偏好可以这样组织# 短期记忆存储结构示例 user_pref:10001 { language: 简体中文, report_format: markdown, data_caliber: 2024_Q3, greeting_style: 简洁直接 }用 Hash 的好处是当需要注入短期记忆时我可以直接按字段名精准提取而不需要做向量检索。但这里有一个关键问题对话过程中Agent 怎么知道该提取哪些字段直接全量注入会给上下文带来噪音只注入最近更新的又会漏掉重要信息。我采用的做法是给每条短期记忆打上更新时间戳和“最后引用时间戳”。在注入时优先选择最近更新过、或者被引用次数较多的高频字段其余字段按需从 Redis 里 lazy 加载。这套机制运行下来效果不错既保证了核心偏好的即时性又避免了记忆注入过度。Redis 的 TTL 我给短期记忆设置的是 7 天。7 天这个数字是我根据项目用户的实际会话频率定的日活用户大约每一到两天回来一次7 天的有效期足够覆盖常见的使用间隔。如果用户在 7 天内没有再次交互那么这条记忆就视为过期自动淘汰。这个机制虽然简单但非常有效。实际运营中我观察到大概有 30% 左右的短期记忆会过期清理这其实是健康的状态如果一直不清短期记忆池会越积越臃肿影响提取效率。3.2 长期记忆的实现向量数据库与知识图谱的结合长期记忆的存储选型我花的时间最多。一开始想着用纯向量数据库比如 Chroma 或者 Milvus但在实际测试中发现了几个问题。第一个问题是语义检索的准确率有限。尤其在存储的是事实性知识时比如“客户公司内部汇报线是市场部向 COO 汇报”这类明确的关系描述用向量检索很容易召回一堆看似相关其实无关的内容。第二个问题是知识更新困难。向量数据库的更新本质上是在库里新增一条向量然后靠检索时的新旧排序来覆盖旧信息但这种方式不可控旧信息可能被检索出来和新信息打架我在前面说过这个坑。所以我的长期记忆最终采用了混合方案向量索引负责语义召回知识图谱负责结构化存储和关系维护。知识图谱的存储选型我用了 Neo4j向量索引用的是 Milvus。同一个知识点会同步写入两个存储Neo4j 里把实体和关系建好Milvus 里把实体描述文本向量化。检索时先向量召回候选实体再根据候选实体在知识图谱里的邻接关系做一次关系过滤过滤之后得到的信息再注入上下文。这个方案实际跑下来准确率比纯向量检索高了不止一个档次。因为知识图谱天然适合表达“实体-关系-实体”这种结构而 Agent 记忆里最核心的知识恰恰就是这种结构化关系。比如用户告诉 Agent“我在 A 公司担任产品经理负责数据平台方向”这句话里有三个实体用户、A 公司、数据平台关系分别是任职和负责。知识图谱能把这些关系管得清清楚楚检索时也能顺着关系链做关联查询比把一句话切成向量靠谱得多。长期记忆的写入也不是无脑全收。我设置了严格的写入校验只有同时满足“用户在当前会话中明确陈述”“信息具有跨会话稳定性”“和已有知识不冲突或冲突已解除”这三个条件信息才能写入长期记忆。其中“冲突检测”是重头戏当新知识和已有知识冲突时Agent 不会直接覆盖旧知识而是会向用户发起确认“之前您提到项目周期是 6 个月现在您说调整为 8 个月是需要更新记录吗”得到确认后再写入这个机制避免了记忆被错误信息污染也能保持人机交互的连贯性。3.3 永久记忆的边界什么该存、什么不该存永久记忆是这个系统里最敏感、也最需要谨慎设计的一层。它承载的是用户身份、账号体系、业务核心配置这类几乎不会变化的信息。在我的设计里永久记忆和长期记忆在存储上共享同一套知识图谱但在访问权限和写入权限上做了严格区分。永久记忆的写入只能通过显式的用户指令或者管理员后台操作绝不接受 Agent 在对话中自行推断写入。这是我从一次事故里吸取的教训。之前我的系统允许 Agent 根据用户的模糊表述自动沉淀永久记忆结果有一次用户随口说了一句“这个项目可能要黄了”Agent 直接把“项目状态-可能终止”写进了永久记忆。这个错误信息在后续所有会话中都被当作事实引用产生了非常坏的影响。自那之后永久记忆的写入权限被锁死只保留显式指令通道。永久记忆的读取优先级也最高。在每次会话启动时先从永久记忆中加载身份背景和全局配置注入到系统提示的最前端后面再追加长期记忆和短期记忆。这样做的好处是Agent 永远有一个稳定的“人设基线”不会被临时的上下文干扰。比如用户的姓名、公司名、项目代号这些信息在任何对话中都应该稳定正确而它们刚好是最适合放在永久记忆里的数据。4. 上下文工程记忆注入与压缩的实操细节4.1 每次对话到底注入多少信息最合适记忆系统做好了还得回答一个问题每次对话到底注入多少信息最合适注入太少Agent 的“记忆力”表现不出来注入太多模型被大量上下文干扰反而影响效果。我用一个很实际的类比来思考这个问题和一个真人协作你会在每次开会前把对方过去三个月的所有聊天记录都打印出来放到他桌上吗你不会。你只会把和本次议题最相关的背景摘要列出来顶多加一页注意事项。Agent 的上下文注入也是这个逻辑。我最终定的注入策略是“固定基线 动态扩展”。永久记忆的内容全部注入但永久记忆本身设计得就很精简一般不超过 800 token。长期记忆按当前任务的相关性检索取排名前 3 到 5 条实体及其关系链控制在 1200 token 以内。短期记忆看用户当前的交互意图命中关键偏好就注入对应字段一般控制在 400 token 以内。再加上工作记忆里的压缩摘要整体上下文基线控制在 2500 到 4000 token 之间。这个体量既能让 Agent 保有足够的背景知识又不会过度挤压模型的推理空间。我这个基线值是经过多轮对比测试得出的。测试方法也很直接给同一个 Agent 分别注入 0 字、1000 字、3000 字、6000 字、10000 字的记忆内容跑同一批任务观察任务完成质量和一致性的差异。结果线上任务里3000 字左右相比 10000 字完成质量显著更高尤其表现在工具调用正确率和最终输出的结构清晰度上而且响应延迟和 token 成本也大幅下降。现在记忆注入量的控制已经成了我项目中一个显式的调优参数每次迭代模型或者调整工具集之后我都会重新跑一遍对比确定当前模型下的最佳注入基线。4.2 摘要压缩的两种策略提取式与生成式工作记忆的压缩我在项目里轮流试过两种策略提取式压缩和生成式压缩。提取式压缩的思路是从已有的对话和工具结果里守住关键词、关键实体、关键数字然后拼接成一段结构化的要点。这种方式的优势在于精确不会引入幻觉缺点是太“碎”了有时会丢失逻辑关系。比如“用户要求报告包含近三年营收数据”提取式可能会提炼出“营收”“三年”“数据”这几个词但丢了“近三年”这个时间约束导致后续 Agent 拉错了数据区间。生成式压缩则是直接让模型读原文生成一段精炼的摘要。它能保留逻辑结构和上下文关联但存在幻觉风险模型可能悄悄补上原文没有的信息。我的最终方案是两者结合先用提取式把硬性事实抽出来比如数字、日期、名称、结论生成式模型在提取结果的基础上做语义整理把逻辑关系补全。实测下来结合方案的安全性和完整性都远高于单独使用任何一种策略。我做压缩的频率也很有讲究。不是每轮对话都压缩那样太耗 token。而是设定一个触发阈值只有当工作记忆区域累计的 token 数超过阈值时才启动压缩。举个例子初始工作记忆上限是 4000 token超过之后模型会先把最早进入的对话组压缩成 500 token 的摘要其余部分保留原样。这样既保证了近期对话的细节完整又控制了总体的 token 消耗。4.3 记忆检索的排序与过滤规则记忆检索是整个系统里最深的一个环节也是最难调的部分。向量召回之后光按相似度排序是不够的必须加入多重过滤条件。我项目里最终实现的排序逻辑是这样的候选记忆先按语义相似度筛出前 20 条然后按以下规则重排第一适度优先原则。距离当前时间越近的记忆权重越高。但这里有个细节如果一条记忆恰好是用户显式强调的“长期有效规则”它的时效权重会被拉满不受时间衰减影响。第二引用频率加成。如果某条记忆在当前会话里已经引用过一次它再次被选中的概率会提升因为这意味着它大概率是当前讨论的核心。第三冲突标记降权。和当前上下文明显冲突的记忆会被大幅降权这个过滤非常关键能避免 Agent 一会引用旧数据一会引用新数据的“精神分裂”表现。排序没问题之后还要对召回结果做一次冗余去除。因为知识图谱和向量库同步存储同一个实体可能同时被多个条件召回如果不做去重注入上下文的信息会大量重复白白浪费 token。去重的方式是以实体 ID 为唯一键同一条实体不论通过语义还是关系链进候选池只保留一条记录但会在保留的那条记录上叠加不同的引用来源方便追溯。5. 工具调用与记忆的集成让记忆反哺 Agent 行为5.1 记忆如何影响工具选择与参数生成记忆系统搭建的初衷不只是让 Agent 能“想起”用户更是要让记忆去影响 Agent 的决策和行为。实际操作中我在工具调用这一步尝到了最多的甜头。Agent 在完成任务时经常需要做工具选择比如用户说“帮我查一下订单”工具列表里可能有“查订单详情”“查退款单”“查物流”如果 Agent 没有记忆它只能根据当前这一句话去猜。但如果 Agent 的记忆里存了一条“该用户上次提到自己是售后客服主要处理退款问题”那么“查退款单”这个工具的选择优先级就会显著高于其他。这个能力就是记忆对工具选择的引导作用。我实现的方式是在工具调用的前置环节把记忆注入做成一个“提示增强器”。从记忆系统检索出来的信息会生成一个额外的“偏好提示段”放在正常的工具列表描述之前。偏好提示段的内容不是告诉模型“该用哪个工具”而是客观陈述用户的背景和相关历史让模型自己推理。比如提示段里写“该用户身份为售后客服最近一周的工作重心是退款纠纷处理”模型自己会更倾向于选择退款相关的工具。这种方式保持了模型决策的自主性又让记忆绕过了“规则硬编码”的限制适用性更好。参数生成环节记忆的作用更直接。用户在创建报告时说了“还是按之前那个格式来”如果没有记忆系统模型根本不知道“之前那个格式”是什么。当我给工作记忆注入一条上次报告的参数摘要“标题黑体二号正文宋体小四数据表格横排”模型就能准确地生成对应的格式化参数。这是最直观的“记忆让 Agent 连续工作”的体现。5.2 多轮任务中的状态跟踪与断点续跑多轮任务或者说长链路任务是 Agent 产品最容易翻车的地方。用户让 Agent 做一个调研报告Agent 需要先查询资料再整理提纲再撰写初稿最后输出成文件。整个链路中间如果任何一步被打断比如用户插了一句“等等昨天说的数据口径先不用了”Agent 就需要更新整个任务状态。如果没有状态跟踪它极有可能继续沿用旧口径直到最终输出时才发现问题。我在系统里用工作记忆专门维护一个“任务状态槽”本质是一个结构化的 JSON 对象实时记录当前主任务、当前子步骤、已完成步骤集合、待处理队列、当前生效的参数配置。每一轮 Agent 执行结束时都会更新这个状态槽。模型在下一轮开始时会先读取状态槽内容然后决策下一步动作。由于状态槽是结构化的Agent 的每一步调整都会在这里留下痕迹即使会话中断下次再进入也能从断点继续运行。这个机制在处理用户的“中途改变主意”时表现尤其好。比如用户说“第 3 步生成的提纲里把第二章和第四章合并”状态槽里的子步骤列表会立刻更新Agent 的下一步动作就是基于更新后的列表执行完全不会出现执行顺序混乱的情况。可以说没有这个状态槽多轮任务的可靠性就无从谈起。5.3 防止模型把记忆当作“圣旨”记忆的置信度设计记忆不是永远正确的这一点是很多初做记忆系统的人最容易忽略的。用户可能记错Agent 可能在过往对话里理解错数据本身也可能过期。为了应对这一点我在记忆系统里增加了置信度标签每条记忆都会被打上“确认/推断/过期”三类标签之一。“确认”类记忆指用户原话或用户行动明确验证过的信息置信度最高注入时权重拉满。“推断”类记忆指 Agent 从用户行为或上下文里间接推测出的偏好这类信息会注入但系统提示里会加上一句“该偏好是根据历史行为推断的如不适用请忽略”给模型留出纠错余地。“过期”类记忆指已经确定失效或长时间未被引用的信息这类内容默认不注入除非用户在当前会话中主动提起相关话题。设置置信度之后一个明显的改善是模型在面对不确定信息时更“谦虚”了。它不再一本正经地坚持一个可能已过时的偏好而是会主动询问“您之前偏好 A 方案本次仍然沿用吗”这种交互模式极大地提升了用户体验因为它更像真实的人类协作记得住但也愿意接受变更。6. 评测体系与常见问题排查一场自我拷问6.1 怎样验证记忆系统真的“记住了”做完了记忆系统我遇到的一个很现实的问题就是怎么跟别人证明这套系统真的有用直觉上一套记忆系统肯定比没有记忆强但具体强多少强在哪里不说清楚就没法服众也没法指导下一步优化。所以我搭了一套比较完整的记忆评测体系分三个维度。第一个维度是召回命中率。我在测试集里预埋了一批“记忆事实”比如用户的偏好、项目的参数、既定的规则然后模拟用户在不同场景下的提问检查 Agent 的输出里是否准确引用了这些事实。这个维度重点考察记忆系统的检索能力按实体类型分项统计召回率。第二个维度是记忆更新及时性。模拟信息变更场景比如用户先给了旧的项目周期后来明确改为新周期检验 Agent 在后续对话中是否及时采用了新信息并且不把旧信息当作有效内容。这个维度最容易暴露系统问题也是我前期丢分最多的维度。第三个维度是长对话稳定性。连续进行多轮、多任务的对话观察 Agent 是否会出现前后不一致、记忆混乱、引用错误等情况。这个指标反应的是整个记忆系统在长时间运行下的综合可靠性。评测跑下来之后我给自己定了一个及格线召回命中率不低于 85%更新及时性不低于 90%长对话稳定性中不出现明显事实冲突。这三项指标现在是每次迭代记忆系统时的必测项任何一项不过关都不允许进入生产环境。没有评测体系之前我调优基本靠感觉有了评测体系之后每一次改动都能明确看到数字的变化效率高了很多。6.2 高频问题实录检索不准、记忆冲突、权限泄漏实践过程中踩过的坑实在太多我把最有代表性的几个问题整理成了表格每个都附上了排查思路和最终解决方案方便遇到同类问题的朋友直接对照参考。常见问题现象描述排查思路最终解决方案记忆检索召回不准Agent 明明存了相关记忆但回答时就是没用到或者用到的内容偏题检查向量召回阈值是否过严、查询语句是否与存储表述差异过大增加“查询改写”环节把用户的自然语言查询改写成更贴近存储风格的检索语句并放宽初筛阈值靠重排精排兜底新旧记忆冲突Agent 同时引用了用户 3 个月前给的信息和昨天给的信息且两者矛盾检查冲突检测逻辑是否覆盖了长期记忆和短期记忆的交叉区域在所有记忆写入通道增加冲突校验冲突时暂停写入并向用户发起确认确认后再落库记忆注入导致上下文臃肿模型输出质量下降、响应延迟增加、成本明显上升检查注入的记忆是否有冗余、是否有过期信息仍被反复引用引入记忆去重与过期标记控制每次注入的总 token 量在设定基线内超过部分强制降载权限边界泄漏Agent 在一个用户的会话里引用了另一个用户的项目信息检查记忆检索时是否传入用户隔离标识向量库索引是否按用户级分片强化检索过滤条件向量库索引增加用户 ID 作为硬性过滤字段任何查询必须带隔离标识永久记忆被错误写入Agent 自行沉淀了不该沉淀的信息后续所有对话都被错误信息带偏检查永久记忆的写入通道是否没有做“显式指令”校验锁死永久记忆的自动写入能力只接受显式确认或管理员后台写入6.3 几个让我印象深刻的翻车案例很多问题都不是靠推理能发现的必须靠真实场景去撞。我举两个印象最深的翻车案例。第一个案例是记忆回流污染。当时我在做“从对话中自动沉淀长期记忆”的实验某次测试中用户提了一句“这个项目要是周六前完不成甲方就得换供应商了”。Agent 听到了“项目”“完不成”“换供应商”这几个关键词在任务归档时把这个信息经过摘要压缩沉淀成了长期记忆“甲方对项目进度存在不满可能启动更换供应商流程”。这条记忆在后续多轮对话里被反复引用甚至影响了 Agent 的措辞开始过度谨慎地规避谈论项目风险。实际用户只是随口抱怨本质是想推进项目进度并不是真的在评估更换供应商。这个案例让我深刻理解了记忆系统的核心不是“能记住多少”而是“记住的信息是不是用户真正想让它记住的”。第二个案例是记忆串台事故。有次我的测试账号同时跑两个业务场景我在检索时漏了业务线隔离字段导致场景 A 的项目预算和场景 B 的预算口径混在一起了。Agent 在场景 B 里引用了一条“总预算 250 万”的数据但这条数据实际是场景 A 的另一个项目的。那次事故之后我把隔离字段的校验写进了单元测试任何检索和写入的操作如果没有带业务线标识直接抛出异常。记忆系统的权限隔离从来不是一个锦上添花的功能而是必须最早考虑的底线。7. 选型复盘与后续迭代方向7.1 当前技术栈清单与选型理由把目前项目用到的技术栈做一个完整的梳理。我没有选择任何大而全的“记忆框架”而是用模块化的组件自己组装了一套相对轻量但灵活的系统原因在于记忆系统太依赖具体业务上下文了通用框架很难精准覆盖需求。组件选型选型理由短期记忆存储Redis低延迟、内置 TTL适合高频读写和自动过期淘汰长期记忆存储Neo4j Milvus知识图谱存结构关系向量库存语义索引各司其职移动端数据同步MongoDB用于保存完整的历史会话和记忆归档记录持久化能力强工作记忆摘要模型在线生成利用模型自身语义理解能力动态压缩当前任务状态编排层Python FastAPI轻量稳定便于快速迭代记忆检索与注入逻辑记忆评测自建脚本 标注测试集用可量化的指标驱动迭代不靠感觉调优Neo4j 和 Milvus 的双写模式是这套架构里最复杂的部分但它带来的收益也很明显。向量召回负责“找出可能相关的”图谱过滤负责“挑出关系上正确的”两条腿走路准确率远高于单靠任何一边。7.2 下一步计划从单机记忆到协作记忆当前这套记忆体系本质上还是一个“单用户-单 Agent”的记忆。用户和 Agent 之间一对一记忆服务于这一对关系。但我在实际运营中发现很多记忆其实是跨用户共享的或者说应该是共享的。比如公司项目背景属于团队知识任何一个团队成员和 Agent 协作时都应该访问到这份背景但团队成员个人的偏好又应该彼此隔离。这就引出了“协作记忆”的概念同一个 Agent 服务一个团队时如何区分团队级记忆和个人级记忆如何解决多人同时更新同一份记忆时的冲突这些都是下一阶段要啃的硬骨头。另一个要啃的方向是记忆的主动迁移。现在的记忆是被动检索用户问什么Agent 去找什么。但真正高级的记忆系统应该能主动发现“用户正在做的新任务和三个月前的旧任务高度相关”然后主动提醒用户“需要沿用旧任务里的一些配置吗”。这个需要记忆系统对用户的意图有更强的预测能力我会在下一阶段的评测指标里增加“主动记忆推荐准确率”这个方向作为实验目标来推进。7.3 给刚入坑的同学的几点实在建议分享几个我摸爬滚打总结出来的经验希望能帮你在 Agent 记忆这条路上少走点弯路。第一从工作记忆做起别一上来就搞长期记忆。先把单任务内的上下文管理和摘要压缩做扎实这是地基。地基不稳什么都白搭。第二不要过度依赖向量检索。向量检索是多选题不是精准查询的万金油。涉及事实、规则、参数这类确定性信息结构化存储比向量检索靠得住得多。第三把隔离字段和校验逻辑放在最前面设计不要等出了事故再补。很多问题是架构层面的后期加隔离比前期设计难十倍。第四评测体系必须早于功能上线建立。你得先知道“好”的标准是什么才能知道自己优化的方向对不对。第五多读多拆解别人的记忆框架思路但不要盲从。别人的方案再华丽不适合你的业务场景就是废铁。我在做这个项目的过程中最深的一个体会是Agent 的记忆系统本质上是在和“遗忘”做一场博弈。模型本身不记得任何东西我们做的所有机制都是在制造一种“伪记忆”的幻觉。但好的记忆系统能让这种幻觉稳定、可信、有用。现阶段我做的这些东西还远谈不上完美但至少已经走在一条能落地的路上了。后续这个方向的变化还会很快我也会持续把新踩的坑和新想到的方案整理出来希望这些记录对你自己的项目能有一点参考价值。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →