这道题其实问的是agent怎么在对话里记住有用信息,同时不把系统拖垮。长期记忆的存储形式,说白了就是分层混合:工作记忆搁上下文窗口或Redis,短期记忆用[[向量数据库]]比如Milvus,长期记忆得把原始日志扔对象存储,语义向量放索引库,关键实体关系抽成[[知识图谱]]。真正落地的时候,很少只用一种,都是混着上。
先说一下存储形式。对象存储便宜,存原始对话;向量库做语义检索;知识图谱用来做复杂推理,比如用户说了‘我上次买奶粉送了个玩具’,你光靠向量可能找不准,但图谱里实体关系一查就出来了。但这里有个前提:你得有稳定的[[NER]]和[[关系抽取]],否则图谱质量不行,反而拖慢检索。
再来说大规模记忆的优化。我重点讲两个策略。第一个是分层索引。按时间分区,近期数据优先检索,冷数据下沉到低成本存储。多粒度索引也挺实用,对话级粗筛,句子级细筛,实体级精准定位,逐层过滤,能省不少计算。第二个是摘要压缩。增量摘要很有效,每N轮对话生成一个运行摘要,替代原始记录。层次摘要更好,日摘要、周摘要、主题摘要,形成树状结构,检索时从上往下找。我偏向用增量摘要加关键信息提取,把用户偏好、决策结论、待办事项抽成结构化字段存起来。
检索优化上,我常用两阶段检索:先用[[HNSW]]做近似召回Top-K,再用[[Cross-Encoder]][[重排序]],最后截断上下文。查询扩展也很有用,把当前Query扩展成‘近期主题+用户偏好+时间约束’的复合查询,召回率能提不少。写入优化不能忘,异步批处理走消息队列,避免阻塞主链路;增量[[Embedding]]只对新内容编码,别全量重建。
落地的时候有几个权衡点。延迟和召回率是经典矛盾,实时场景用近似检索,离线分析用精确检索。存储成本上,原始对话压缩存OSS,成本不到1%;向量索引控制维度,比如从768降到256,召回率降得不多但成本省一半。一致性也很关键,用户禁忌这类关键记忆得强一致性存储,普通对话可以最终一致。
这里有个延伸点:当历史记录规模极大时,比如千万级对话,分层索引的冷热数据迁移策略其实很讲究,迁移太频繁影响性能,太慢又浪费资源。我一般用时间衰减加访问频率双维度打分,动态调整冷热阈值,再配合预加载热数据到内存,效果比较稳。
所以我会把长期记忆看成缓存加持久化的混合体,核心是平衡成本、延迟和召回率。我更倾向用分层摘要加向量检索混合的方案,配合异步写入和冷热迁移,这样既保证响应速度,又控制成本。