AI智能体记忆的8种策略:从短期到程序记忆,构建可靠的记忆层
上个月我调试一个客服Agent发现它最缺的不是智商而是“AI智能体记忆”。用户在第3轮改了一次预约时间第5轮再问优惠时系统居然把初始时间搬回来当最新信息当场翻车。排查到最后问题不在模型而在于我们根本没给Agent设计像样的记忆层每次对话开启它都像一个新员工上岗什么前情提要都没有。这个话题在圈内被讨论了好一阵子。有一支团队把智能体常用的记忆策略系统整理成8种被做Agent的人转得到处都是。我把它当成一份考题在几个真实项目里逐个试了一遍。这篇就是我的答卷8种策略各自的原理、实现难点、适用场景以及我在落地时踩过的坑。不管你是刚开始搭Agent原型的新手还是已经在维护生产环境多轮记忆的开发者这8种策略都值得收藏一份至少能帮你少走几个月的弯路。1. 为什么记忆是智能体的分水岭1.1 一次真实的“失忆”事故先说那个让我印象深刻的翻车细节。用户预定的是周三下午三点的服务中途发消息改成四点客服Agent回答“已为您修改”。过了两轮用户又问“如果改成周五原来四点的时间还算数吗”Agent居然回复“您当前的预约时间是周三下午三点”。那一刻我们意识到它每次调用模型都在重新读一遍对话历史但对话历史里明明写着修改记录为什么还是会读错因为上下文窗口不等于记忆窗口里堆的信息再多模型也可能抓不住关键变化尤其在连续多轮、信息互相覆盖的时候。这类事故在真实产品里非常普遍。换话题后忘记先前偏好、多轮工具调用后状态丢失、老用户完全得不到个性化回复本质都是同一个问题Agent只有“当前看得见的内容”没有“事后留得下的档案”。大模型权重本身也算一种记忆但它是对训练语料的统计压缩跟某个用户的预约时间、某个项目的命名规范毫无关系。想让Agent记住具体的、动态的、属于当前业务的信息必须额外构建一个记忆层。1.2 记忆的本质不是存储而是检索与决策很多人一上来就搞向量数据库以为把对话记录切成块、塞进向量库记忆就完成了。实际做下来会发现存储是最简单的部分难的是三件事该存什么、该召回什么、召回后信哪条。可以拿人脑做类比。工作记忆相当于你办公桌上正在处理的几张纸短期记忆是手边这个抽屉长期记忆是整面墙的文件柜。真正难的不是文件柜够不够大而是档案员能不能在你要用的时候三秒内抽出正确那一份并且知道哪一份已经过期。所以我把智能体记忆做一个工程化定义在任务生命周期内或跨生命周期完成信息的保留、更新、召回与遗忘的系统机制。这个定义里检索和遗忘比存储更关键。1.3 为什么一份“8种策略”清单值得收藏你可能想问记忆策略不就分短期和长期吗为什么非要拆成8种因为单一维度根本覆盖不了真实业务。有些信息要精确匹配比如用户ID有些信息要语义相似比如“喜欢安静环境”和“怕吵”有些信息是连续状态比如正在执行的步骤有些信息是事件记录比如上次怎么把问题解决掉的。8种策略本质是8个抽屉对应8种不同的存取需求。后文的阅读顺序建议这样走先看全景表建立框架再按生命周期、存储形态、场景经验三个角度逐类展开最后看混合架构和避坑清单。想快速落地的话可以直接跳到第6章的代码和第八章的选型对照表。2. 8种策略全景表先搞清楚各自分工2.1 一张表看懂8种记忆策略在展开细讲前我先给一张全景速查表。后续所有章节都是围绕这张表展开的你可以把它当成索引来用。记忆策略存储载体读取方式生命周期典型场景短期记忆上下文窗口、内存队列滑窗读取、最近N轮单次会话内多轮对话不丢前文长期记忆向量库、摘要库语义相似检索跨会话数天到数月记住用户偏好、项目背景工作记忆推理时的scratchpadAgent主动读写单次任务周期多步推理、工具调用中间状态结构化记忆数据库表、图数据库精确查询长期用户画像、实体关系、配置信息文件记忆JSON、文档、日志目录索引全文检索长期知识库、原始记录、审计日志语义记忆模型权重隐式推理激活训练后固化通用常识、领域术语情景记忆事件表、向量库相似任务触发跨任务可复用记录一次成功解决问题的过程程序记忆工具注册表、工作流模板模式匹配、函数调用长期把常用操作沉淀成技能2.2 三类维度生命周期、存储形态、触发时机这8种策略可以从三个维度去理解理解了维度你就能在面对新需求时自己判断该往哪个方向补位。第一是生命周期。短期记忆活在一次会话里长期记忆活在跨会话里工作记忆则介于两者之间它随任务开始而创建、随任务结束而销毁或整理。第二是存储形态。有的存在内存队列里有的存在向量库里有的存在数据库表里有的干脆存在模型权重里。形态决定了你能用什么方式去查它精确SQL、模糊向量、关键词全文还是什么都不查直接靠模型生成。第三是触发时机。短期记忆每次请求都跟着上下文自动注入属于被动型长期记忆是等用户提问后再去检索属于主动型程序记忆则是在某个动作被判定为“该用工具”时才触发属于条件型。2.3 8种策略不是并列关系而是拼图关系实际项目里这8种策略通常是一层一层叠上去的不是让你从里面挑一个“最好的”。一个线上Agent的典型组合是上下文滑窗管短期对话用户画像表管结构化事实向量库管跨会话偏好事件记录管历史操作工具注册表管技能调用。少一块系统也能跑但会表现出某种特定症状少短期记忆会前言不搭后语少结构化记忆会记不清用户是谁少程序记忆会每个任务都从零开始摸索。我自己给客户的建议是优先级从上到下先把短期、结构化、程序三件套做扎实再逐步加长期向量和情景记忆。第八章会给出具体的选型组合这里先记住一个结论8种策略不是让你全上而是让你知道缺哪种病该吃哪种药。3. 生命周期派短期、长期、工作记忆怎么配合3.1 短期记忆别只知道往上加窗口短期记忆最常见的实现就是“把最近几轮对话全部拼进上下文”。这种方案在会话轮次少的时候没问题但对话一长就会暴露两个毛病一是Token成本线性上涨二是窗口塞满后模型会把注意力平均分配反而忽略最关键的最近几轮。我现在更推荐“最近N轮原文更早内容摘要”的组合方式。它的思路是滑动窗口只保留最近几轮原始消息保证当前话题的细节不丢更早的内容压缩成一段摘要保留发生过什么事但不保留逐字原文。伪代码大概是这样的def build_context_with_summary(history, recent_n10, max_summary_tokens500): # history: 按时间排列的对话记录 recent history[-recent_n:] # 最近N轮保留原文 older history[:-recent_n] # 更早的内容做摘要 if older: summary summarize_blocks(older, max_tokensmax_summary_tokens) return f[历史摘要] {summary}\n format_messages(recent) return format_messages(history)这个方案的代价是摘要会有信息损失所以摘要生成时要有意识地保留“实体、偏好、承诺过的待办事项”而不是简单概括聊天主题。我踩过的坑是初始摘要写得过于简洁结果用户问“我上次说的预算上限是多少”摘要里根本没提后来强制摘要模板里必须包含数字、日期、决策结果才好转。3.2 长期记忆向量库是常被高看的方案长期记忆是跨会话记忆的主力市面上九成教程都会让你上向量库。向量检索确实强大但它不是万能的。最典型的翻车情况是用户说“我不太喜欢太吵的餐厅”你把它embedding进向量库几天后用户问“帮我订个安静的包间”向量相似度能检索到这条记忆吗很多时候能但同义改写的表达一变召回排名就掉得厉害。我并不是否定向量库只是建议不要只靠向量。工程化做法是给每条记忆片段额外挂上标签、关键词、时间戳和重要性分。检索时做混合召回向量相似度、关键词命中、时间新鲜度、事实类型各占一定权重。下面是我常用的评分骨架def score_memory(memory, query_vec, query_text): score cosine_similarity(query_vec, memory.vector) # 语义分 if memory.mtype structured: score 0.3 # 精确事实加分 keywords memory.tags memory.keywords # 关键词对齐 if any(k in query_text for k in keywords): score 0.2 freshness 1.0 / (1.0 hours_since(memory.updated_at)) # 新鲜度 score freshness * memory.importance return score长期记忆的更新比插入更关键。用户偏好是会变的昨天说喜欢喝美式今天说“最近戒咖啡了”向量库里那条“喜欢美式”如果不能被降权或标记过期系统就会一直给错误推荐。所以长期记忆每条都要带updated_at和置信度检索时按时间衰减更新时做覆盖或废弃标记。3.3 工作记忆让Agent边想边记的“草稿纸”工作记忆是很多人忽略的一类但凡是做过多步推理Agent的人一定会碰到这个问题。模型在单次请求内如果中间步骤特别多很容易出现前后矛盾第一次工具调用返回的结果第二次推理时它忘了导致重复查询或者给出错误结论。这时候就需要一个scratchpad也就是工作记忆区让模型在推理过程中把关键中间结果写下来。如果你用过ReAct模式的Agent应该见过那个“Thought / Action / Observation”循环。工作记忆就是循环里逐步追加的记录区模型把每一步的推理、调用结果、对下一步的判断写进去下一次LLM调用时这段记录作为上下文的一部分继续传入。这样多步操作之间就有了连贯的状态。我建议工作记忆单独维护不要和短期记忆混在一起。任务结束后工作记忆里的内容要做一次分流需要跨会话保留的整理后写入长期记忆或情景记忆只对本次任务有意义的直接丢弃。否则每次任务遗留下的中间思考过程会成为长期记忆里最脏的一批垃圾数据。4. 存储形态派向量、结构化、文件、语义四种仓库4.1 向量记忆给记忆打标签而不是抄笔记先聊向量记忆的工程细节。我见过不少项目把整段对话直接embedding塞进向量库检索效果很差因为一条记忆里混杂了用户问、Agent答、工具返回等多种角色信息语义是糊的。正确做法是先把对话整理成“一记忆一主题”的片段比如“用户在周三下午三点预约了服务”“用户希望收到短信提醒”然后只对事实本身做向量化同时给片段打标签。分块方面我的经验是按文档标题自然切段再把长段切成不超过512 token的块相邻块之间重叠20%左右避免语义被拦腰切断。中文场景还要注意embedding模型对中文的支持效果最好用一批业务问句做离线召回测试而不是只看公开榜分数。召回时不要一次检索就结束建议先取Top50再做一轮重排。重排可以用简单的规则叠加来源类型、时间新鲜度、关键词覆盖、实体命中。这样能把向量相似但实际无用的结果压下去把业务场景真正需要的记忆顶上来。4.2 结构化记忆用图谱和实体表存客观事实结构化记忆是精确信息的家。用户ID、注册时间、套餐类型、预约状态这类数据你用向量检索是自找麻烦一条SQL就能搞定的东西不要绕一大圈。我项目的用户画像表一般长这样user_id、属性名、属性值、置信度、来源、更新时间。更新时不是简单insert而是走upsert新值来了直接覆盖旧值同时更新来源和置信度。INSERT INTO user_memory (user_id, mkey, mvalue, confidence, source, updated_at) VALUES (:user_id, :mkey, :mvalue, :confidence, :source, NOW()) ON CONFLICT (user_id, mkey) DO UPDATE SET mvalue EXCLUDED.mvalue, confidence EXCLUDED.confidence, source EXCLUDED.source, updated_at NOW();如果知识之间是强关联关系比如“这个项目依赖A服务A服务又依赖B库”用图数据库存实体关系会更自然。但图数据库有额外运维成本小项目别急着上一张关系表也能凑合。判断标准只有一个你需不需要做多跳关系查询不需要就用普通数据库表简单就是稳定。结构化记忆也有冲突问题。比如用户之前说“我住上海”今天说“搬到杭州了”如果两个值都存在系统就会人格分裂。我的做法是写一个简单的冲突覆盖策略同一来源的新信息直接覆盖旧信息不同来源的信息冲突时按“用户主动说 行为推断 第三方输入”的优先级决定并且把被覆盖的旧值存到历史表方便回溯。4.3 文件记忆最便宜也最容易失控的落盘方案文件记忆听起来很原始但它是知识库类Agent的地基。文档、日志、原始JSON记录这些不需要向量化也能被全文检索和目录索引找到的信息都算文件记忆。我在项目里会专门给Agent维护一份JSONL记忆日志每条记录包含时间、记忆类型、内容、来源会话、元数据。这既方便排障也能在后续做记忆评估时作为数据集。目录结构按天和会话分夹文件名带上时间和session id检索时先按目录缩小范围再做内容匹配。文件记忆容易失控主要有两个原因一是写入随意什么记录都往里写几个月后文件巨大且充满噪声二是格式版本不统一老记录和新记录字段对不上。我建议从一开始就定好统一schema并且禁止跨版本直接覆盖老文件只读新版本另起目录。文件记忆虽然便宜但如果脏数据积累得太多后续任何一层记忆都会受到影响。4.4 语义记忆藏在模型权重里的“隐形知识”语义记忆是独角兽平时你感觉不到它存在但它决定了Agent的基础智能水平。模型在预训练阶段从海量语料里学到了常识、语法、逻辑范式这些知识被压缩进权重推理时被隐式激活。它跟外部记忆最本质的区别是外部记忆是可检索的语义记忆是召不出来的只能靠模型“想”起来。工程上要特别注意一点动态的用户信息不要指望模型权重来记因为权重无法为单个用户更新。领域知识如果频繁变化也优先用RAG外挂知识库而不是微调。只有那种长期稳定、构成领域基础的术语和规则才值得考虑微调进参数里。我把语义记忆看作所有记忆策略的底色。向量记忆负责提供证据结构化记忆负责提供事实文件记忆负责提供原文最后模型用自己的语义记忆把这些材料综合成回答。没有语义记忆其他记忆都是死数据但如果只有语义记忆Agent就是一本百科全书背完就忘。5. 情境与技能情景记忆和程序记忆这两种容易被低估的策略5.1 情景记忆记住“上次怎么成功”的情景记忆在Agent领域是很有价值但很容易被忽略的一块。它的核心是保存一条完整的经验片段遇到什么目标、执行了哪些动作、中间踩了什么坑、最终怎么成功。下次遇到类似目标时直接把这段经验抽取出来作为提示词里的few-shot示例引导Agent复用成功路径。我通常用JSON结构存一条episode{ episode_id: ep_20250101_001, goal: 用户想取消订单并要求退款, context: 订单已发货退款需先申请退货单, actions: [ {step: 1, tool: check_order, result: shipped}, {step: 2, tool: create_return, result: return_id10086}, {step: 3, tool: issue_refund, result: success} ], outcome: success, lesson: 已发货订单必须先走退货流程不能直接退款 }检索情景记忆的方式跟长期记忆类似用目标描述做向量召回。但要注意不要只存成功案例也要存一些带“教训”的失败案例比如“直接退款被系统拦截”因为这类信息能避免Agent重复犯错。我更建议把成功路径和失败原因分开存失败案例里必须写明原因分析不然一条失败记录本身就会污染未来的判断。5.2 程序记忆让技能变成肌肉记忆程序记忆是让Agent从“每次现想怎么做”变成“这次直接这么做”的关键。举个例子如果Agent经常需要把用户输入的表格数据转成CSV与其每次让大模型重新生成转换代码不如沉淀一个名为convert_to_csv的工具函数注册到Agent的工具列表里。这样既省Token又稳定可控。程序记忆的载体可以是可调用工具、业务模板、校验规则、工作流定义。判断一个技能该不该固化成程序记忆我一般看三个条件重复出现频率高、步骤相对固定、出错代价可接受。满足三条就值得沉淀否则过早固化反而会把流程卡死。这里有个反面教训某次我把一个旧版本的退款流程固化成了工具结果业务规则调整后忘了更新Agent连续两周用老规则指导用户操作差点出事故。所以程序记忆必须带版本号业务变更时同步更新工具描述和参数校验规则必要时在Agent调用前加一层提醒。6. 混合记忆实战一个可跑通的记忆管理器原型6.1 架构一条数据流串起8种策略理论讲得再多不落地就是空中楼阁。我建议把记忆层设计成一条清晰的数据流大致是这样用户输入到来后先识别内容中值得记录的信息类型能进结构化的就进结构化能提炼成经验的就进情景记忆其余上下文留在短期记忆区。任务开始时系统从各记忆仓库里召回与当前问题相关的信息注入提示词。模型在推理过程中使用工作记忆记录阶段性结果。任务结束后对工作记忆做一次整理值得长期保留的进入长期记忆或情景记忆过时的信息标记淘汰旧的短期记忆滚动丢弃。这套流程不需要复杂的框架一个MemoryManager类就能把主要逻辑串起来。下面我给一个简化但可扩展的实现骨架工程上你可以在这些方法内部替换成真实的向量库和数据库调用。6.2 Python实现简化版MemoryManagerimport time def now(): return int(time.time()) class MemoryManager: def __init__(self): self.short_term [] # 短期记忆最多保留最近20条 self.long_term [] # 长期记忆工程上换成向量库 self.profile {} # 结构化画像按 key 存储 self.episodes [] # 情景记忆 def remember(self, content, mtypeshort_term, metadataNone): item { content: content, mtype: mtype, metadata: metadata or {}, created_at: now(), updated_at: now(), hits: 0, } if mtype short_term: self.short_term.append(item) self.short_term self.short_term[-20:] elif mtype long_term: self.long_term.append(item) # 工程中这里应该同步写入向量索引 elif mtype profile: key metadata.get(key) if key: self.profile[key] item elif mtype episode: self.episodes.append(item) def recall(self, query, top_k3): # 简化版召回真实项目中请替换为 向量检索 关键词 SQL candidates [] for m in self.short_term[-10:]: if query in m[content]: candidates.append(m) for m in self.long_term: if any(tag in query for tag in m[metadata].get(tags, [])): candidates.append(m) for key, val in self.profile.items(): if key in query: candidates.append(val) for ep in self.episodes: if ep[goal][:10] in query: candidates.append(ep) candidates.sort(keylambda x: x[updated_at], reverseTrue) return candidates[:top_k] def consolidate(self): # 工作记忆整理短期转长期、长期压缩摘要等 pass def forget(self, condition): # 按条件清理记忆例如清除超过30天的低置信度记录 pass这段代码是教学用的简化版跑通概念没问题。我把它贴出来是想说明一点记忆管理器的核心其实不是embedding多强、数据库多高级而是你有没有把“写入、读取、整理、遗忘”四个动作都放在统一入口。真实的工程实现里你只需要把remember里的long_term分支换成调用向量库把recall换成混合检索评分把profile换成数据库upsert这就是一个可以上生产的最小架构。6.3 检索融合一次查询怎么同时命中三类记忆真正上线时最常被问的问题是一次查询来了我到底去哪一类记忆里找答案是都找再按评分排序合并。一次查询往往会同时触发短期记忆的最近上下文、长期记忆的跨会话偏好、结构化记忆的精确事实它们不是互斥关系。我常用的评分公式是总分 语义相似度权重 关键词命中权重 新鲜度权重 记忆类型加成。权重不是拍脑袋定的最好在离线阶段用一批真实的问答对做标注然后调参让排名结果跟人工预期一致。这里有一个简化实现def hybrid_recall(memory_list, query_emb, query_text, weights): scored [] for m in memory_list: semantic cosine_sim(m[embedding], query_emb) exact keyword_overlap(m[content], query_text) fresh math.exp(-0.01 * hours_since(m[updated_at])) score ( weights[semantic] * semantic weights[exact] * exact weights[fresh] * fresh weights[type] * m[metadata].get(type_bonus, 0) ) scored.append((score, m)) scored.sort(keylambda x: x[0], reverseTrue) return scored[:10]我用这个方案替换“只依赖向量检索”的旧版本后记忆召回准确率提升明显尤其对“用户改过口、说过好几次”这类场景帮助最大。因为它不只看语义相似还会照顾到关键事实和时间新鲜度。7. 避坑实录记忆实现中最常见的5个翻车现场7.1 记忆污染旧倾向覆盖新事实记忆污染是我见过最隐蔽的坑。用户昨天说不喝咖啡今天改口说“帮我找家咖啡店”向量库里如果还存着昨天那条“不喝咖啡”检索出来的记忆就会跟当前需求相反Agent不但没帮上忙还显得很蠢。解法分两层。第一写入时每条记忆带时间戳和来源检索时对时间新鲜度做衰减。第二检测到明确冲突时例如用户当前的表述和旧记忆中含有相反的关键信息要以当前表述为准并把旧记忆标记为“已更正”后续不再召回。我甚至会额外维护一张修正记录表记录“旧值→新值→变更时间”用来排查模型为什么突然改了回答风格。7.2 检索召回失败不是embedding差是分块糟有一次我们做文档问答用户问“项目延期的主要原因”系统死活召回不到正确答案。排查后发现源文档被切成50字的小片原句“因为客户需求变更过于频繁导致开发排期一再延期”被拦腰切成两片任何一片单独看都不够完整检索自然匹配不上。从那之后我改用父子分块方案大块负责向量检索小块负责具体内容提取。先通过大块定位到相关章节再在章节内部做精细匹配必要时用模型对候选块做一次重排。同时不要只用向量检索可以叠加关键词检索也就是hybrid search。向量负责语义相近但字面不同的表达关键词负责实体名和专用术语的精确命中两者互补。7.3 记忆膨胀Token成本失控长对话Agent上线跑一个月之后最常收到的账单预警来自Token消耗因为记忆库越滚越大每次请求注入的内容越来越多。我之前一个实验项目上下文里塞了累计摘要、长期偏好、近一周情景记录结果单轮对话的输入Token翻了4倍回答质量反而下降。解决思路是给记忆设预算。我的经验是给每类记忆分配上下文预算比例并且强制按优先级淘汰。比如短期记忆只留最近5轮长期记忆只取Top3且压缩成每条不超过100字结构化记忆只注入与当前实体相关的属性程序记忆只加载当前任务需要的工具描述。超过预算的内容宁可不注入也不能让模型在无关信息里挣扎。7.4 安全和隐私别把什么细节都塞进记忆库记忆系统最容易出台的事故是把不该记的信息记录下来并且在需要的时候原样输出。用户不经意透露的联系方式、证件号、支付信息一旦进入长期记忆库就成了埋在系统里的雷。我的习惯是写入前先做一次分类检查可以记录偏好和上下文事实但敏感字段在写入前脱敏或者干脆不落库。同时提供“忘记我”的功能让用户能一键清除自己的记忆数据。记忆系统不是越全越好克制和可删除才是长期可运营的前提。7.5 多轮一致性检索回来的记忆和当前上下文打架记忆召回和当前对话上下文冲突的情况也很常见。比如系统记忆里存着用户偏好“住快捷酒店”但用户当前正在咨询一家高端酒店上下文很明显已经变了。如果Agent不加判断地把旧偏好搬出来就会给用户推荐完全相反的东西。我处理这类冲突的方法是给所有记忆加一个“上下文优先级”规则当前对话中用户明确说的话 工作记忆中刚产生的中间状态 结构化档案 长期向量记忆。遇到冲突时不是直接删掉旧记忆而是把当前事实写入并把旧记忆的置信度降低让它自然沉底。8. 选型指南你的Agent到底需要哪几种记忆8.1 按业务场景快速配比不同业务对记忆的需求重点完全不同以下配比是我在项目里验证过的高性价比组合你可以直接作为起点。业务场景优先采用的记忆组合尽量避免智能客服短期记忆 结构化记忆 情景记忆只靠向量库不维护用户画像个人助理结构化记忆 长期向量 程序记忆把所有内容无脑塞进上下文代码生成Agent工作记忆 文件记忆 程序记忆不做scratchpad直接多步调用工具知识库问答文件记忆 长期向量 语义记忆只做向量检索不做父子分块陪伴向NPC长期向量 情景记忆 短期记忆频繁修改结构化画像导致人格不稳8.2 最少够用组合短期结构化程序如果你只打算做一个MVP验证记忆模块不要贪多。我强烈建议先用“短期记忆滑窗 结构化画像表 程序工具注册”这三件套起步。理由很简单短期记忆保证对话连贯结构化画像保证用户信息准确程序记忆保证关键操作稳定。三个仓库的实现逻辑都清晰排障成本低踩坑概率小。等这个基础架构跑顺了再逐步加入长期向量库和情景记忆。原因是向量库和情景记忆都需要持续的数据积累和调参没有基础架构的数据来源它们很容易变成脏数据仓库。先有输入再谈检索顺序不能反。8.3 记忆系统的持续运营遗忘、校准与评估最后聊一个很容易被忽略的运营问题记忆是需要持续运营的上线不是终点。我在项目里会维护一小批“记忆评估题”都是真实对话中摘出来的场景比如“用户说想换时间系统能不能记住旧时间和新时间”“用户两个星期前提过偏好这次还能不能正确召回”。每次改动记忆模块就用这批题跑一遍回归准确率下降就说明改动有问题。记忆库本身也要定期review我一般每两周导出一份记忆样本人工扫一遍看有没有交叉矛盾、过期信息和噪声。记忆系统的价值不是存得多而是存得准、记得对、忘得掉。错误记忆被反复召回危害比没有记忆更大。最后说点实际操作中的体会。我第一次搭记忆系统时把8种策略当成必须到齐的KPI结果上线第一周就翻车长期记忆里塞满了没整理的对话原文情景记忆里全是没写原因分析的经验碎片整个Agent回答问题时像喝醉了酒什么记忆都往外搬。后来砍到“短期结构化程序”三件套系统立刻稳定多了。记忆系统最难的不是写入而是摘除和纠正。给每条记忆加时间戳、来源、置信度比用哪个向量库重要得多。这套思路后面还能继续扩展记忆评估集、遗忘算法和跨会话迁移但先把基础打扎实再谈花活不迟。