ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AI Agent记忆系统实战:从短期记忆到用户画像的完整构建指南

AI Agent记忆系统实战:从短期记忆到用户画像的完整构建指南 1. 从“金鱼脑”到“记事本”Agent记忆问题的本质如果你用过几款AI Agent应用大概率遇到过这种场景你让Agent帮你查资料、写周报、订行程聊了二十分钟它突然把你的名字搞错了或者把五分钟前刚确认过的会议时间给忘了。更离谱的版本是——你上周明明告诉过它“我对花生过敏”这周它又往推荐菜里加了一份花生酱。这个问题的根源要从大模型的工作方式说起。模型本身是“无状态”的它每次回答问题时只看到你当前输入的这段文字外加系统提示词里写死的内容。它没有硬盘没有笔记本所有信息只能靠对话上下文里临时携带。换句话说这一轮对话结束后它对你的记忆就归零了。我经常拿金鱼来比喻其实金鱼的记忆还没这么差模型是真正的“一轮一清空”。所以“让Agent记住你”这个词本质上是在做一件事给模型外挂一个记忆系统。这个记忆系统要解决三个问题记什么、怎么存、怎么取。“记什么”是记忆的范围和结构“怎么存”是记忆的物理载体和组织方式“怎么取”是检索算法和召回策略。先说结论没有一套放之四海而皆准的方案记忆设计本质上是产品决策。不同的Agent定位决定了它需要什么样的记忆机制。一个写代码的Agent和一个人体健康顾问Agent它们的记忆需求完全不同。前者需要记住项目的技术栈、代码风格、此前修过的bug后者需要记住你的体检指标、过往病史、用药反馈。前者偏“项目记忆”后者偏“用户画像记忆”。这篇我重点拆两条线一条线是怎么做会话内记忆和会话间记忆这是所有Agent都要跨过的坎另一条线是怎么把记忆做成可被检索的长期存储让Agent真正做到“越用越懂你”。两条线都涉及工程细节、选型取舍和性能权衡我会把实际踩过的坑一并写出来。2. “记住你”的三层境界短期、长期、画像2.1 短期记忆把上下文窗口用明白短期记忆是最容易理解也最容易实现的一层。它的作用域在单次会话内目标只有一个让Agent在对话过程中不“失忆”。实现方式有几种按复杂程度排序第一种是原始拼接。直接把历史对话记录拼接到下一轮请求里。这种方式实现成本最低但很快会遇到上下文窗口的天花板。GPT-4级别的模型窗口可按百万tokens计但拼接所有历史不仅浪费成本还会让模型“淹没”在海量信息里注意力被稀释关键信息反而抓不住。第二种是滑动窗口。只保留最近N轮对话更早的内容被截断或丢弃。这是一种简单粗暴但非常实用的策略。N的取值要看具体场景——做一个客服问答Agent10到20轮足够了做一个长文档分析Agent可能需要保留更多。第三种是摘要压缩。当对话超出窗口上限时把更早的历史交给模型做摘要再用摘要替换原始内容。这样既保留了关键信息又控制了token总量。很多框架内置了这种机制但默认参数通常比较保守需要根据业务场景调。我在实际项目里比较常用的做法是“滑动窗口摘要压缩”组合近10轮对话原样保留更早的对话每5轮做一轮摘要摘要再叠加进上下文。这样兼顾了短期精确性和长期连贯性。2.2 长期记忆摆脱单次会话的束缚如果说短期记忆决定了Agent在“这次对话”里聪不聪明那么长期记忆决定了Agent在“下一次对话”里还认不认识你。长期记忆的核心诉求是跨会话持久化。用户昨天聊的内容今天新开会话时还能被Agent记得用户上周定下的偏好下周还能被遵循。工程上最朴素的实现方法是把关键信息提取出来存到数据库里新会话启动时再把这些信息加载进上下文。你完全可以自己写一套定义信息Schema用模型做信息抽取存到PostgreSQL或MongoDB下一次会话时查出来注入系统提示词。但这套方案用起来很快就会遇到一个痛点信息的组织方式。如果你把用户信息存成一张结构化的表字段是相对固定的——姓名、偏好、过敏源、常用地址。但Agent遇到的记忆需求往往是发散的、非结构化的。用户可能随口说一句“我最近在准备考研时间很紧”也可能说“我家猫叫年糕特别怕生”。这种信息很难用固定的表结构去建模强行建模会让信息丢失大量语义。所以长期记忆的工程实现通常走上向量化的路线。信息不再是死板的记录而是被embedding成向量存进向量数据库等需要的时候通过相似度检索召回。这样“我家猫叫年糕特别怕生”和“给猫起名年糕”之间就能建立语义关联。2.3 用户画像从记忆到“懂你”的跃迁如果说短期记忆是“记对话”长期记忆是“记事实”那用户画像就是“记偏好、记风格、记习惯”。它是长期记忆的上层抽象目标是把碎片化的记忆归纳成结构化的用户理解。举个例子。一个用户在和健康顾问Agent聊天时多次提到自己“睡眠质量差”“晚上容易醒”“白天困”。单条记录都是独立的事实但如果Agent要做推荐不能每次都从头推理一遍最好能直接存一条画像“该用户存在睡眠质量问题表现为夜间易醒白天精力不足推荐方案应优先考虑睡眠改善类内容。”画像的构建方式通常是在长期记忆的基础上做一层定期的归纳和推理。可以用一条独立的Agent任务定期扫描用户的长期记忆库总结出稳定的偏好、习惯、特征写入画像存储。也可以做成实时的——每次写入长期记忆时同步触发一次画像更新。这里要特别提醒画像是动态的不是建好就完事了。用户的偏好会随时间变化今天喜欢重口味下个月可能开始吃清淡。所以画像一定要带时间戳和置信度并且在检索使用时让模型结合最近的行为数据综合判断。不要迷信历史画像要允许它被新的信息覆盖。3. 从零到一搭建一套可用的Agent记忆模块3.1 记忆该存什么信息抽取与结构化设计动手写代码之前先想清楚一个问题哪些信息值得从对话里抽出来记住我的经验是三个标准有长期价值、影响后续交互、用户明确表达或可合理推断。“我今天中午吃了碗牛肉面”这种信息既没有长期价值也不影响后续交互不值得记。“我对乳糖不耐受”值得记因为它影响所有后续餐饮推荐。“我不太喜欢太辣的菜”值得记因为它是稳定的口味偏好。“我今天心情不好”要谨慎这类情绪类信息时效性强可能需要单独标注失效时间。确定要记哪些信息之后下一步是定义信息Schema。我推荐的做法是定义一套轻量的事件结构而不是事无巨细的强Schemaclass MemoryEvent(BaseModel): user_id: str event_type: str # preference / fact / behavior / state content: str importance: float # 0~1 timestamp: datetime source_session_id: str metadata: dict {}event_type决定信息的归类content是原始语义信息需要被向量化importance是重要程度评分可以由抽取模型给出用于后续的优先级排序和剪枝metadata预留扩展位。这套结构帮我处理过很多复杂场景尤其是在后面的记忆检索和更新环节。抽取环节推荐让模型以JSON格式输出候选记忆。关键是给一个足够约束性的提示词同时又要留出自由发挥的空间。我常用的系统提示词要点如下你是记忆抽取系统。请从用户的对话中提取有长期价值的信息包括但不限于 1. 用户明确表达的偏好、习惯、立场 2. 用户的身份、职业、家庭、健康状况等稳定属性 3. 可能影响未来交互的背景事实 对于每个候选记忆给出 event_type、content、importance0~1三个字段。 不要抽取时效性强的闲聊内容。宁可少抽不要乱抽。实操中有一个重要原则抽取宁可保守。多抽取一条无关信息带来的危害是记忆库噪声增加、检索命中率下降少抽取一条信息带来的危害是有时候Agent“记忆力不足”。两害相权噪声的危害更大。因为噪声会污染检索结果让Agent在错误时机回忆起错误信息这在体验上是致命的。3.2 怎么存文本型与向量型的双写策略记忆信息存哪里我的推荐方案是**“结构化向量”双写**。结构化存储解决的是精确查询问题按用户ID查全部记忆、按时间段查记忆、按类型筛选记忆。向量存储解决的是语义检索问题给定一段查询文本找到语义上最相关的记忆片段。生产级实现结构化端我建议用PostgreSQL表结构沿用上面的event schema。向量端可以考虑FAISS、Milvus、Qdrant、pgvector等。选型逻辑我放在下一节细讲这里先把双写流程说清楚。写入路径模型抽取记忆 → 生成embedding → 同时写入结构化表和向量库。写了结构化表再写向量库两条链路都是异步的避免阻塞对话主流程。这里有个工程细节向量库写入失败不能影响主流程毕竟对话返回结果给用户优先级永远高于后台记忆的持久化。所以通常会加一个重试队列写入失败就进队列重试最多重试三次。读取路径用户发送新的消息 → 触发记忆检索 → 向量库按相似度召回TopK条相关记忆 → 结构化表按条件精确查询最新记录 → 两路结果合并、去重、排序 → 注入上下文。双写策略有一个额外的好处它天然支持了记忆的分级管理。向量端负责“语义召回”结构化端负责“规则过滤”。比如在金融合规场景下你可以要求所有涉及用户资产操作的记忆必须能溯源这就是结构化数据的优势。3.3 怎么取检索、注入与更新取记忆比存记忆更考验工程水平。原因很简单取多了上下文被噪声淹没模型表现反而下降取少了关键信息缺失Agent照样“失忆”。我的实践参数供参考短期记忆和长期记忆的比例大约控制在7比3。如果上下文窗口有8k tokens我会给短期记忆预留5.5k左右长期记忆预留2.5k左右。这里的核心思路是近期对话里的准确信息优先级最高长期记忆负责补充“背景知识”不要喧宾夺主。检索的具体做法我推荐多路召回重排。第一路用用户最新的消息query去向量库做相似度搜索取Top5第二路用会话标题或当前对话的主题摘要做检索取Top3第三路从结构化库里捞最近N天内的重要记忆。三路召回结果合并后用一个轻量级重排模型或规则如时间衰减、重要程度加权选出最终Top5注入上下文。注入位置也有讲究。长期记忆适合放在系统提示词里作为Agent的“背景设定”的一部分。短期记忆放在对话历史里作为上下文的一部分。两类记忆不要混在一起否则模型分不清哪些是背景设定、哪些是即时上下文容易混乱。更新策略上我踩过最大的坑是“旧信息覆盖新信息”。一个用户曾经说过“我不吃辣”三个月后又说了句“最近在尝试吃辣感觉还不错”。如果Agent只按时间戳取最新它就忘了用户之前是一个完全不吃辣的人如果Agent两个都取信息又互相矛盾。后来我采用的方案是给每类信息建“演化链”所有关于“吃辣偏好”的记忆共享同一个topic_id写入新记忆时旧记忆不删除但标记为“superseded”。检索时优先返回最新状态同时附带历史演化轨迹。模型看到的是“用户过去不吃辣最近开始尝试吃辣”它能自行推断出行为边界而不是收到一条“吃辣状态开启”这类干巴巴的更新。3.4 选型参考向量数据库的对比向量数据库选型是个绕不开的话题这里给一份我实测下来的横向对比。注意结论基于我自己的场景不代表绝对正确。方案优势劣势适合场景pgvector与PostgreSQL统一运维支持事务数据一致性天然有保障单表数据量过大时检索性能下降中小规模项目不想额外引入组件FAISS轻量性能极好纯Python库落地快不是完整数据库需要自己做持久化和集群管理单机原型、研究项目、快速验证Milvus分布式能力好支持云原生部署功能全面运维成本高组件多对小型团队偏重大规模生产环境海量向量检索QdrantRust编写性能强API设计现代支持过滤生态相对Milvus小对性能和开发体验都有要求的团队我个人的建议是如果是起步阶段直接用pgvector省钱省事。当单表数据量真的大到pgvector扛不住了再迁移到Milvus。绝大多数Agent产品根本走不到那一步。选型的一个隐形考量是团队的技术栈熟悉程度工程上先把系统跑起来比什么都重要。4. 记忆系统的“保质期”遗忘、纠错与隐私4.1 遗忘机制不是可选项是必选项记忆系统的难点不在于怎么记而在于怎么忘。我先说一个反直觉的结论如果只做加法不做减法记忆系统会在三个月内变得不可用。原因在于随着记忆量的增长检索的噪声越来越大召回的精度越来越低。你存了一万条记忆其中三千条是过时的、没用的、甚至是自相矛盾的。当用户问“我平时喜欢吃什么”向量检索能召回十条“跟吃相关的记忆”但里面可能有三条是过时的偏好记录、两条是用户帮朋友问的、只有三条真正反映了用户当前的口味。所以遗忘机制的本质是为了保持记忆库的“信噪比”。遗忘策略可以分三个层面硬性过期。给每类记忆定义一个有效期。偏好类半年身份类一年临时状态类一天。到期后自动淘汰出活跃区只留在冷存储里做审计用。这个策略解决的是“信息自动失效”问题。重要度衰减。每条记忆都有一个importance字段每次被成功召回并用于回答后分值小幅上升长时间未被召回的分值周期性下降。低于阈值就进入淘汰候补名单。这模仿了人类记忆的“用进废退”机制。矛盾淘汰。用户明确说“我之前说过的XX不算了”这条指令触发的不光是对新信息的存储还包括对旧信息的标记失效。这种策略解决的是信息冲突问题。遗忘机制还有一个隐藏价值它让记忆系统有了“容错能力”。抽取模型偶尔会抽错信息如果抽错的信息永远留在记忆库里那Agent就永远被错误信息污染。有了遗忘机制错误信息的危害随时间衰减系统天然具备自愈能力。4.2 用户有权说“忘了它”从交互到落库的完整链路在真实的对话场景里用户会经常表达类似“把刚才说的删了”“别记这个”“我之前说过的话你忘掉吧”这类指令。做好这个功能不只是产品体验问题还涉及数据合规底线。完整链路是四步第一步意图识别。在对话管道的记忆抽取环节除了抽取记忆信息还要判断是否存在“删除记忆请求”。可以设计一个独立的分类任务也可以让抽取模型多输出一个字段delete_request。第二步确认与授权。删除类操作要谨慎。高价值的记忆删除前应该让用户明确确认。“你确定要删除这条记录吗”不是多余的交互而是对用户数据负责的底线。第三步执行删除。找到所有引用该信息的记录包括结构化数据、向量数据、以及已注入到缓存中的任何副本。这里有个容易被忽视的点如果Agent在上一个会话里已经把某些记忆加载到了长期上下文缓存里删除操作必须同步刷新缓存否则用户说了“删掉”下一次会话里Agent还能“想起来”这就是重大事故了。第四步善后。删除完成后向用户反馈一句“已删掉这条记录”。同时如果该信息曾经被用于画像归纳还要触发画像重算避免“底层记忆删了画像里还残留着衍生结论”的情况。注意删除是硬删除不是标记删除。用户说删了在账期结束前不留任何备份。这也是合规审计里最常被挑刺的环节别在这里省事。4.3 数据隐私记忆系统的合规底线记忆系统的本质是收集用户数据所以隐私和安全不是锦上添花而是生死线。第一层要求是告知与授权。用户首次使用Agent时应该明确告知哪些信息会被记录、用于什么目的、如何申请删除。这个告知不是藏在设置页角落里的链接而是在首个会话窗口里一次性弹窗说清楚。第二层要求是数据最小化。只存业务必要的最小信息集。一个订餐Agent不需要知道用户的身份证号一个健身Agent不需要知道用户的工作单位。获取信息前先问自己这条信息对服务用户有帮助吗如果答案模糊那就别取。第三层要求是传输与存储加密。传输层必须走TLS存储层至少做到数据库磁盘加密API层做好访问鉴权。这些在大多数云厂商的托管数据库里都是基础能力别为了省几块钱关掉。第四层要求是审计追踪。所有记忆的写入、读取、更新、删除都要有可查的日志记录。这既是为了满足监管要求也是帮助你排查线上问题时能够定位数据流。我在做故障排查时不知道多少次靠审计日志还原了路径。5. 一个真实案例多轮对话里的上下文整合纸上谈兵太多来一个我从零搭过的实际案例。背景一个面向个人用户的AI营养师Agent核心功能是记录每日饮食、推荐配餐方案、跟踪健康指标。这个Agent的记忆需求非常典型——既要有短期的每日饮食记录又要有长期的健康指标和口味偏好画像。5.1 对话流程里的记忆联动用户的典型对话长这样用户中午吃了半碗米饭一份清炒西兰花还有一块煎三文鱼。 Agent好的午餐营养不错蛋白质和三文鱼鱼油都很棒。今天的水喝够了吗 用户差不多1000毫升不算太多。 Agent好的已记录。结合你之前提到的“夏天不爱喝白水”要不要提醒你下午再补点柠檬水这轮对话里发生了三件事第一Agent从第一条消息里抽取了三组记忆事件食物内容、进食时间、份量信息。这些被结构化为一次“饮食记录”事件写入结构化表同时向量化存入记忆库。第二Agent从第二条消息中抽取了一个新的短期状态——“今日饮水量约1000ml”。这个事件的重要性评分不高但时效性很强关联到当天的健康追踪目标。第三Agent在生成回复时检索到了用户此前的长期偏好“夏天不爱喝白水”并基于这个偏好生成了“要不要加柠檬水”的建议。这条记忆来自三天前的一次对话靠向量检索被召回成功让用户体验到了“被记住”的连续性。5.2 实现中的数据流背后的实现细节值得展开用户第一条消息进来后我把它丢给一个“记忆抽取器”这个抽取器单独走一次模型调用。抽取器输出的JSON如下{ memories: [ { event_type: behavior, content: 用户午餐记录米饭半碗清炒西兰花一份煎三文鱼一块, importance: 0.4, topic_id: meal_log_20250115_lunch }, { event_type: behavior, content: 用户今日饮水量约1000毫升, importance: 0.3, topic_id: water_intake_20250115 } ], retrieval_queries: [ 用户的长期饮食偏好, 用户的健康目标和禁忌 ] }注意抽取器的输出里不仅有“要记什么”还有“要去查什么”。这两者共享同一个模型调用能省一次推理成本。retrieval_queries参数会被用于向量检索找出相关长期记忆供生成阶段使用。得到抽取结果后主对话生成流程并行做两件事第一条路径是等待抽取结果存储完成第二条路径是以retrieval_queries检索长期记忆。两条路径汇合后生成回复。整个流程里最需要注意的性能瓶颈在记忆抽取器上它一次额外的LLM调用会带来几百毫秒到一两秒的延迟。为了缓解这个问题我做了两条优化记忆抽取与主回复生成并行执行只在最终注入阶段等待抽取结果设计一个低成本的抽取模型用vLLM部署量化版把抽取延迟压到300ms以内。5.3 这个案例带来的两点启发第一记忆系统和对话系统的解耦是值得的。记忆抽取、存储、检索、注入每一步都可以独立开发和测试。出问题时可以快速定位是“没记下来”还是“记了没取到”还是“取到了没注入”而不是在一团乱麻的代码里找原因。第二记忆的价值不在于“存了多少”而在于“在合适的时机被想起”。上面例子里能让用户说出“哎你还记得我喜欢喝柠檬水啊”的关键不是记忆库有多大而是那条“夏天不爱喝白水”的记忆在恰当的语义关联下被召回了。这是“让Agent记住你”最核心的产品体验。6. 序列化的记忆调研成本、延迟与体验的权衡记忆虽然是Agent能力的放大器但它不是免费的。每个环节都有成本设计时必须精打细算。6.1 成本到底花在哪里记忆系统的成本大头有三块。第一块是抽取成本。每次对话都要额外调用一次模型做记忆抽取。如果按每轮对话抽取消耗500tokens估算一个日活1000人、每人每天平均聊20轮的Agent光抽取环节每天就是1000万tokens。折成Gemini系列或DeepSeek这类模型的成本月支出有好几千。这个数字并不算夸张但对于个人开发者来说是不可忽视的负担。为了压缩成本我建议采用按需抽取的策略默认情况下只做简单的模式匹配只有当对话中出现了可记忆的高价值内容时才显式调用模型做抽取。简单的启发式规则就能过滤掉很大比例的无价值对话——比如“哈哈哈”“好的”“嗯嗯”这类话没必要送去给大模型做抽取。第二块是存储成本。向量化之后的每条记忆embedding按768维数组存储再加上结构化表的字段开销一条记忆的综合存储成本在几百字节到几KB之间。单条成本不高但增长是线性的需要做容量规划。我的经验是把用户规模乘以平均每日新增记忆数量再乘以平均记忆大小就是未来三个月的存储预算模型。第三块是检索成本。每次对话都要做向量检索和结构化查询。向量检索本身很快但在高并发场景下QPS压力也是实打实的。Milvus的集群节点数量规划就是按你的业务峰值QPS倒推的。这里有一个成本优化的常用手段给向量建索引。FAISS里的IVF或HNSW索引可以把检索耗时从几十毫秒压到几毫秒同时大幅降低CPU/GPU占用。6.2 延迟感知当记忆让用户等太久了我实测过一个版本的记忆系统每轮用户消息进来后先做抽取再等抽取完成再启动检索最后才带着全部记忆信息去调主模型生成回复。逻辑上没问题但线上P95延迟高达4.8秒。用户明显感觉“卡”流失率上升。后来改造为前文提到的并行结构同时优化了抽取模型选型P95降到1.6秒体感好了很多。这里顺便提一个优化取巧的思路用缓存兜底。同一个用户在未来几小时内大概率还会继续聊那么第一次会话时构建好的“记忆包”即检索到的记忆集合可以缓存一段时间。当用户短时间内再次发起对话直接读取缓存跳过抽取和检索两步。只有当缓存过期或检测到关键信息变化时才重新构建。这个方法牺牲了一点实时性换来了大块的延迟和成本优化。6.3 记忆的“颗粒度”悖论记太细和记太粗都不行最后聊一个很有趣的课题记忆的颗粒度。记太细比如“周一下午3点14分用户说他想喝奶茶”这种精确但几乎无用的记录浪费存储空间检索时还会带来噪声。记太粗比如“用户喜欢喝饮品”又丢失了太多信息Agent根本没法从这个抽象里生成个性化的推荐。我的经验是记忆颗粒度要和它的预期使用场景对齐。在抽取阶段明确告诉模型“这条记忆未来要被用来做XXX请用一句完整自然的话记录”。这样模型会自发地以合适的抽象级别来写记忆内容。例如针对饮食推荐场景“用户喜欢喝饮品”太粗“用户周一下午喝了一杯焦糖奶茶”太细“用户偏好含糖但不过分甜的奶茶类饮品”就是比较合适的颗粒度。这个思路不只适用于记忆抽取也同样适用于用户画像构建。画像不是把所有记忆简单聚合而是要在合适层级上做归纳。好的记忆系统会让人感觉这个Agent“有常识、有分寸感”差的记忆系统要么像复读机要么像偷窥狂中间的体验差距全部来自标注决策的精细程度。7. 避坑指南我踩过的七个记忆系统大坑做记忆系统这一年多踩过的坑可以开个专题展了。挑七个最有代表性的给后来者做路标。7.1 上下文被记忆污染最早期我把“所有检索到的记忆”一股脑全部注入到上下文里。用户聊旅游我把“用户有一只猫叫年糕”也注入了。模型倒是没有表现出什么问题但生成的回复里总有一股“过度套近乎”的别扭感。后来加上了记忆和当前query的相关性阈值过滤相关度低于0.3的记忆一律不注入。这个改动让Agent的输出自然了很多。7.2 重复记忆导致信息冗余用户三次提起自己睡眠不好三次都被抽取为独立记忆。检索时三条一起召回模型被同一个信息覆盖了三遍回答质量反而下降。解决办法是显式的去重机制写入新记忆前先用相似度搜索找有没有高度相似的历史记忆。如果相似度高于0.85则判定为重复用新记录更新旧记录的timestamp不新增条目。这个机制后来也天然支持了用户偏好的更新。7.3 对话早期和晚期记忆的权重冲突同一用户早期的“我不太喜欢人多的地方”和后期的“最近在考虑参加线下活动”同时被召回。如果没有时间维度模型会困惑。后来我在所有记忆检索结果上增加了一个时间衰减权重三个月以上未更新的记忆权重乘0.6一个月以上未更新的乘0.8。近期的记忆天然获得更高的召回序位。7.4 用户纠正信息后旧记忆还在用户一开始说“我喜欢喝美式咖啡”后来纠正“其实我更喜欢拿铁”。旧信息如果没有被正确处理下一次会话里Agent还是可能以“用户喜欢美式”为前提推荐。这个问题靠“topic_id”和“superseded”标记解决的这也是我前文强调的演化链设计。7.5 记忆系统挂了导致主流程崩溃早期我把记忆写入做成了同步调用。向量库一旦抖动用户整轮对话都会卡住。上线后第一次大流量就把我教训了。后来所有的存储操作都走消息队列异步化对话主流程只依赖本地缓存和同步的短期记忆长期记忆的读写全部解耦出去。这是记忆系统上线前必须做好的架构改造。7.6 忘记做敏感信息过滤记忆系统记录“用户的公司名称”业务上可能是合理的。但记录“用户的身份证号”就完全是另一回事了。我的上线检查清单里有一条硬性要求抽取模型必须带敏感信息过滤输出层检测到身份证号、银行卡号、详细住址等敏感信息时拒绝入库。过滤规则宁可严格不可松懈。7.7 用户画像重算跑不完最后一个坑是画像重算。刚开始我设计的是“用户每次新增记忆时全量重算画像”后来发现当记忆量上万条时一次重算要消耗几十万tokens而且频繁触发。后来改成离线批量任务每天凌晨对当天有新增记忆的用户跑一次增量重算对超过30天没活跃的用户跑一次全量清理。这样不仅节省了成本画像的稳定性也提升了不会被单条即时信息频繁扰动。8. 让记忆成为Agent成长的阶梯回到开头那句话让Agent记住你本质上是在给Agent装一个成长系统。没有记忆的Agent像是一个每隔十分钟失忆的聪明人虽然每次对话质量都很高但永远无法累积知识、无法形成对用户的理解、无法变得越来越好用。而有了记忆Agent可以从一次对话的“聪明”进化为长期陪伴的“懂你”。从工程实现的角度看记忆系统本身并不神秘抽取、存储、检索、注入、遗忘五个环节每一环都有成熟的技术方案可以落地。真正拉开产品差距的是这些环节之间的组织逻辑——你选择记住什么、遗忘什么、优先调用什么这些决策背后的价值观最终定义了Agent和用户之间关系的质量。最后分享一个个人心得做记忆系统的过程也是重新理解“记忆”本身的过程。人类为什么能记住对朋友说过的一句话却记不住一周前午餐吃了什么因为我们的记忆是有选择性的只保留对关系有长期价值的信息。好的Agent记忆系统模仿的正是这种有选择性的能力。它不是要把所有数据都囤起来而是要像一个细心的朋友那样记住对你重要的事忘掉那些无关紧要的细节。如果你正在搭建自己的Agent我的建议很简单先跑通“短期记忆长期记忆”的最小闭环再一步步加上画像、遗忘、隐私保护这些进阶能力。别一开始就想建一个庞大的记忆系统否则你会在工程复杂度里失去方向。从“记住名字”开始到“记住偏好”再到“记住你这个人”每一步的跨越都会让Agent离“真正懂你”更近一点。
返回列表