返回

文章详情

我们在Elasticsearch上构建了一个具有0.89召回率的持久代理记忆层

Hacker News2026年6月18日 11:20

在Elasticsearch上构建代理记忆,三个索引,混合召回加重排,覆盖,衰减和DLS。构建代理的持久记忆层的架构和背后的数字。Sarah的智能灯泡只显示白色。她的智能家居助手建议重置集线器。她在三月份和上周都这样做了,但没有一次重置解决任何问题。代理不知道这一点,也不知道狗把她的传感器电缆咬断了。重要的历史,什么有效,什么无效,以及Sarah是谁,在每次会话结束时都被抹去。标准的解决方法是将以前的上下文填入上下文窗口。这在成本、延迟和已知的“在中间丢失”效应上都破裂,其中模型忽略了放置在提示边缘远处的事实。一个1M标记的上下文窗口是一个草稿纸。它不是一个记忆系统。上下文窗口是短期记忆:单个推理的活动推理空间。缺失的是长期记忆:一个持久存储,在会话结束后仍然存在,可扩展至多年的交互,并允许根据内容、时间和用户检索事实。本文是关于一个真实的代理记忆系统的架构,建于Elasticsearch之上,并围绕来自认知科学的三类进行结构化,一个混合召回查询与RRF和交叉编码重排器,矛盾的覆盖和每个用户的DLS隔离。在对168个问题的QA风格评估中,R@10平均值为0.89,没有跨租户泄漏。完整实现可在GitHub上找到;这篇文章是关于它为何以这种方式构造的。代理记忆存储需要做什么用户问“我们上次尝试了什么修复?”,这是一个带有精确匹配约束的时间查询。或者“为什么我的智能灯泡只显示白色?”这需要结合个人记忆与共享目录。记忆本身并不是均匀的:用户经历的事件、有关他们的稳定事实和逐步操作手册的写入速度和衰减规则都不同,因此存储必须识别类型并相应处理。在任何多用户部署中,每个用户的记忆必须对其他用户不可见。新事件积累得足够快,以至于必须将它们合并到持久类型中,否则索引就会变成干草堆。当用户与回忆的事实相矛盾时,旧版本必须被覆盖而不是删除,以保持审计踪迹。较旧的事实不应高于新事实,而用户经常接触的事实也不应消失。整个记忆层应可由任何支持MCP的客户端访问,而不是绑定于一个代理运行时。将这些拆分到一个向量存储、一个关键词引擎、一个审计层和一个独立的认证服务意味着可能会出现四个故障点,并且在每次召回时都会增加额外的往返。需求描述了一个搜索引擎,因此此实现使用了一个。本文的其余部分将详细介绍每一个方面。三种类型的代理记忆:情节记忆、语义记忆、程序性记忆第一个设计决策是到底存储哪些记忆类别。仅仅保存所有内容会构建一个没有信号的干草堆。认知心理学在情节记忆、语义记忆和程序性记忆之间的划分,在COALA框架中应用于LLM代理,已经具有正确的类别,并且它们可以干净地映射到三个Elasticsearch索引。情节记忆。带时间戳的事件:每个用户的交互,发生时的记录,而不是任何提取或解释。大多数信息是短期的:并不总是值得保留。一些条目会成为后来的持久事实的证据。语义记忆。关于用户的精炼、稳定声明。Sarah拥有Lumio Hub v2。Sarah正在使用iOS 17.4。Sarah的集线器在三月份被重置。这些信息能在会话间存活,并是代理所依赖的。程序性记忆。多步骤操作手册。如何解决Zigbee断开连接。过程,而不是事实。每个过程都有success_count和failure_count,当用户确认某个修复有效或无效时,这些计数会通过合并进行增加。当考虑是否要细化或替换操作手册时,这些计数会作为上下文呈现给合并的LLM。每个类别有不同的生命周期。情节记忆是不断写入并衰减的。语义记忆是不断修整、去重,并随着用户的变化而被覆盖。程序性记忆累积结果反馈(success_count、failure_count),以供合并使用。一个存储桶无法建模这一点。三个索引,每个记忆类型一个,让每个类型遵循其自己的写入速率、衰减规则和更新规则,而不耦合它们。除这三者之外,还存在第四个检索表面:已经在Elasticsearch中的世界数据(目录、知识库)。这不是认知意义上的“记忆”,但代理通过相同的混合检索管道读取它(在下一节中涵盖),因此归属于同一画面。召回管道:使用RRF和重排器的混合检索记忆通过两阶段混合搜索被召回:RRF在BM25 + Jina v5稠密上,然后对合并候选者应用交叉编码器重排器。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡