从0到1:企业级AI项目迭代日记 Vol.61|记忆不是越多越好,装一道门比装满更重要

给 AI 装记忆,比不装更危险——如果你没给它设一道门。

我们在 Vol.44 接通了跨会话长期记忆,从那以后 Agent 终于能在下一次对话里记住你是谁、你偏好什么。但过了一段时间我们发现,它记的东西越来越杂:临时的任务状态被写进去了,用户某次说的口误被写进去了,一次性的操作指令也被写进去了。

记忆库不是越多越好。它更像一个人的工作记事本——如果每句话都往上记,最后什么都找不到,比空白还糟。

这一批改动,核心就是在做一件事:给记忆写入装上门。

一、什么值得被记住:给记忆加一道“价值门”

我们加了一个判断层,在任何内容被写入跨会话记忆之前,先做一次筛选:

该写入的:用户稳定的偏好(如总是用简体中文、不喜欢被反问)、长期成立的事实(如用户的角色、项目背景)、用户主动确认过的习惯。

不该写入的:当次任务的临时状态、某次对话的一次性指令、模糊的或推断出来的结论。

通过这道门之前,每条写入请求还要经过事实仲裁器,明确标记操作类型:新增、更新、删除,还是不动。旧的记忆不会被新记忆悄悄覆盖,而是通过替换链显式更新——你能追溯“这条记忆是什么时候、因为什么被更新的”。

召回也加了衰减机制。同一条记忆被反复调用,权重会逐渐上升;长期没被验证为有效的记忆,优先级会自然降低。这不是在删数据,而是在防止旧观念长期污染当前判断。

另外用户可以直接问“我的记忆里有什么”,也可以主动删除某条不想保留的内容。记忆对用户不再是黑盒。

二、摘要中间件不再“吃掉”你刚说的话

这是一个比记忆更低层、但影响更直接的问题。

长会话触发自动摘要时,系统会把历史消息压缩成摘要,腾出上下文空间。这本是合理的设计——但我们发现,在某些情况下,用户刚刚发出的那条消息也被摘要进去了。

结果是:模型看到的最后一条内容是一段占位摘要,而不是用户的真实提问。它只好对着摘要作答,答非所问,用户完全不知道发生了什么。

修复分两层:当前最后一条真实用户消息绝不进入摘要区,无论会话多长;摘要裁剪后如果为空,不直接注入占位符,而是做降级材料拼装,给模型一个最小可用的上下文。

顺带清理了摘要链路里的孤儿调用,统一了摘要触发和保留的量纲,还修了一个大小写不敏感判断的bug——之前系统会把自己生成的摘要误判为真实用户消息,触发二次摘要,形成循环。

三、RAG找到了内容,却说“没找到”

第三个问题是用户最容易感知到的,也是最莫名其妙的一个。

用户问了一个问题,知识库里明明有相关内容,检索也确实找到了——但模型的回答是:“根据提供的资料,无法回答该问题。”

原因在于数据管道的一个字段读取错误。检索结果在传递过程中被悄悄丢掉,模型实际上拿到的是空内容。

修复之后,我们还顺手做了一件以前一直欠着的事:把检索结果的输出格式从结构化数据改成干净的文本。之前模型拿到的是数据对象,需要自己解析和组织;现在直接收到可读文本,减少了一层理解负担,也减少了它“看到内容但不知道怎么用”的概率。

同时区分了两种情况的文案:“检索失败”和“确实没有相关资料”。之前两种情况对模型说的是同一句话,模型无法区分是系统问题还是内容缺失,经常给出误导性的回答。

四、默认模型的优先级,终于对了

顺带修了一个新建对话时默认模型不生效的问题。

平台有一个全局默认模型,每个智能体也可以配置自己的默认模型。之前新建对话时,智能体配置的模型会被平台默认模型覆盖,用户看不到任何报错,只是“怎么用的不是我设置的那个模型”。

现在的优先级是:当前智能体的配置模型 > 平台默认模型。切换智能体时,模型选择跟着智能体走;用户手动选择过的仍然保留。

第二轮评测把召回率、误写入、误召回这几类问题重新校正了一轮。评测驱动改进,而不是靠感觉改进,这是这批改动里最重要的工作方法。

这一轮修复的不是系统功能,是在修用户对这套系统的信任。

这,是第六十一天。

《从0到1:企业级AI项目迭代日记》记录一个企业级 AI 项目从创意、架构到落地的真实过程。不讲神话,只记录进化。


如果你也在做企业 AI 落地,欢迎留言来聊。或者,把这篇转发给一个正在踩同样坑的朋友。