分身聊了十次同一个客户,前九次得出的结论各不相同,第十次才定下来。但检索时,这十条结论被一视同仁地喂给大模型——旧的「死记忆」照样和新结论抢召回。v0.5.2 给 RAG 记忆装上了「时效」和「作废」两个概念,让它能像人一样:最新的话优先听、过期的自己主动忘。
四个治理点
- 检索时效加权:记忆召回和知识库检索都引入了时间维度。最新的结论优先、过期信息自然沉底——不再只看相似度把新旧结论打平。
- 写入即作废旧版:同一主题写出新结论时,自动把旧版标记为
superseded,召回只返回最新那一条。这顺手修掉了之前一个反直觉的 bug——新结论曾被「语义去重」拦在门外,反而把旧结论留下了。 - 知识库重投 supersede:同一文档重投时改成「原地替换分块 + 版本号 +1」,不再新建重复文档、也不再残留互相对打的僵尸分块(之前标题稍一微调就会生成副本)。
- 智能过期 GC:清理逻辑从「按年龄硬删」改成「先删已作废、再删超龄」,自动忘记真正过期的信息,而不会误删仍然相关的内容。
顺带清理与加固
会话详情页和仪表盘里,钉钉 / 飞书的媒体占位符噪声(如 [视频消息](mediaId=...))被剥离,只留真实文字;app 类消息的裸 JSON 也做了拆壳提取。依赖层面把 nanoid、vitest 各升一档,修掉两个 CVE。
升级注意
无破坏性变更,无新增必填配置。记忆检索更智能了,但对外接口与配置项完全不变——你什么都不用改就能直接受益。
完整变更见 CHANGELOG;这套记忆治理是怎么从根因改起的,有一篇工程长文 《让 RAG 记忆学会忘掉过期的自己》 讲得很细。代码在 GitHub。