这道题其实问的是,当[[Agent]]需要记住很久以前的对话或事件时,怎么让它在海量记忆里快速找到最相关的那一条,同时不让垃圾信息污染结果。核心就两个东西:怎么把记忆存成机器好检索的形式,以及怎么从里面捞出最需要的信息。
先说[[Embedding]]表示。我肯定不会只用一句话的语义向量,那样太糙了。我会把记忆编码成一个多维度的混合向量。具体来说,语义部分用预训练模型把文本转成稠密向量,这没啥说的。但我会额外加三个维度:时间戳、重要性分数和实体关联。时间戳我不仅存绝对时间,还存相对时间,比如“3天前”,这样检索时就能做时效性衰减。重要性分数可以用LLM自动打,或者用户显式反馈,比如收藏、编辑,这个分数会作为后续排序的加权。实体关联就是抽取出人名、地名、任务ID这些,做成稀疏索引,方便快速过滤。最终把这些拼成一个向量存到[[Vector Database]]里。
检索策略上,我倾向用混合排序。先走粗排,用实体标签或关键词的倒排索引快速筛出候选集,这一步很快。然后精排,算向量相似度,但这里要加一个时间衰减函数,近期的记忆权重高,远期的低。最后[[重排]],用访问频率加权,再跑一下MMR算法去重,避免返回一堆意思差不多的结果。你可以这么理解:粗排是拉网,精排是挑鱼,重排是让鱼不打架。
噪声过滤是落地时最容易被忽视的坑。比如用户说了句“好的谢谢”,这种低价值信息存进去就是噪声。我会在前端加一个轻量分类器,判断信息密度,低于阈值直接丢弃。重复记录也得去重,如果新记忆和已有的相似度超过某个值,就合并或者更新,而不是新增。还有一个关键点是记忆膨胀,长期运行下来记忆库会越来越大。我会上线一个定期任务,用LLM做记忆反思,把一堆琐碎记忆总结成一条高层级的洞察,比如“用户偏好用优惠券”这样的抽象知识。检索时设置相似度阈值,低于阈值就触发“我不确定,需要确认”,而不是硬给答案。
这里有个坑:存储成本和检索精度之间的平衡。原始对话日志我会存到廉价的存储里,记忆库只存摘要和关键片段。高频交互走缓存,也就是工作记忆,深度检索才走向量库。另外,个性化记忆和通用知识要分开,用户专属记忆单独分区,通用知识走基座模型。
说到时效性,其实有个更细的问题:有些记忆虽然时间久但重要性极高,比如用户的生日,这时候时间衰减反而会把它压下去。所以我会把重要性分数和时间衰减做联合调整,甚至允许用户手动固定某些长期记忆。
所以整体上,我更倾向于把长期记忆看成是一个分层缓存系统,而不是一个无差别的大池子。落地时我会特别关注一点:如果记忆库质量本身很差,再好的检索算法也救不回来。所以上线前会先跑一轮数据清洗,并且持续监控召回率,低于阈值就触发告警。