← 返回信息流
AI 资讯Hacker News·1 天前

基于 Elasticsearch 构建持久化智能体记忆层,召回率达 0.89

原标题:We built a persistent agent memory layer on Elasticsearch with 0.89 recall

速览

本文介绍了如何在 Elasticsearch 之上构建持久化的智能体(Agent)记忆层。该方案旨在解决 AI 智能体在长期交互中记忆缺失的问题,通过优化数据存储与检索机制,实现了 0.89 的高召回率。这一成果对于提升大模型智能体的上下文理解能力和任务执行连贯性具有重要意义。

AI 深度解读

基于 Elasticsearch 构建持久化 Agent 记忆层:架构与 0.89 召回率实践

背景

在构建智能体(Agent)系统时,记忆机制是连接短期交互与长期知识的关键。然而,传统的上下文窗口(Context Window)方案存在显著局限。虽然大模型拥有百万级 Token 的上下文窗口,但这本质上只是短期记忆,用于单次推理的活跃思考空间,而非真正的记忆系统。

将历史上下文直接塞入上下文窗口面临三大痛点:

  1. 成本与延迟:随着对话延长,Token 消耗激增,推理延迟增加。
  2. “中间迷失”效应(Lost in the Middle):模型倾向于忽略位于提示词边缘之外的信息,导致中间部分的事实被忽视。
  3. 缺乏持久性:会话结束即记忆丢失,无法跨会话积累用户偏好、历史操作记录或设备状态。

以智能家居助手为例,用户 Sarah 的灯泡只显示白色,助手建议重置中枢。Sarah 曾在三月和上周分别重置过,但均未解决问题,且存在狗咬断传感器线缆的物理故障。传统 Agent 因缺乏长期记忆,不知道这些历史尝试和物理环境细节,导致重复无效建议。

为了解决这一问题,Elastic 团队基于 Elasticsearch 构建了一个持久化的 Agent 记忆层。该架构借鉴了认知科学中的记忆分类,通过混合检索、重排序、替代机制(Supersession)和动态本地搜索(DLS)隔离,在 168 个问题的 QA 评估中实现了 0.89 的 R@10 召回率,且零跨租户泄漏。

核心内容

1. 记忆存储的需求分析

一个健壮的 Agent 记忆存储需满足以下核心需求:

  • 多类型记忆统一处理:用户的历史事件、稳定事实、分步操作手册具有不同的写入频率和老化规则,存储系统需识别类型并差异化处理。
  • 严格的数据隔离:在多用户部署中,必须确保每个用户的记忆对其他用户完全不可见。
  • 数据生命周期管理:新鲜事件需快速积累并转化为持久事实,否则索引将变成“大海捞针”。
  • 版本控制与审计:当用户纠正或矛盾旧事实时,旧版本应被“替代”而非删除,以保留审计轨迹。
  • 排序逻辑:旧事实不应优于新事实,高频访问的事实不应因时间久远而沉底。
  • 标准化接口:记忆层应通过 MCP(Model Context Protocol)等标准协议对任何客户端开放,不绑定特定 Agent 运行时。

若将向量存储、关键词引擎、审计层和认证服务拆分,会导致系统脆弱性增加及每次检索的多轮往返开销。因此,该方案利用单一搜索引擎(Elasticsearch)满足所有需求。

2. 三种类型的 Agent 记忆

借鉴认知心理学中的记忆分类(COALA 框架),该架构将记忆分为三类,分别映射到三个独立的 Elasticsearch 索引:

  • 情景记忆(Episodic Memory)
    • 定义:带时间戳的事件记录,即用户每次交互的原始输入。
    • 特性:写入频率高,生命周期短。大部分内容短期有效,少数条目可能转化为持久事实的证据。
  • 语义记忆(Semantic Memory)
    • 定义:关于用户的提炼后、稳定的断言。例如:“Sarah 拥有 Lumio Hub v2”、“Sarah 使用 iOS 17.4”、“Sarah 的中枢在三月被重置”。
    • 特性:跨会话生存,是 Agent 进行推理的基础事实。需经过去重、提炼和替代处理。
  • 程序性记忆(Procedural Memory)
    • 定义:多步骤的操作手册或排错流程。例如:“如何排查 Zigbee 断连”。
    • 特性:包含 success_countfailure_count 计数器。当用户确认修复成功或失败时,计数器由整合(Consolidation)LLM 更新。这些计数器作为上下文反馈给 LLM,用于决定是否优化或替换操作手册。

此外,还包含第四种检索表面:世界数据(World Data),如目录和知识库。虽不属于认知意义上的记忆,但通过相同的混合检索管道访问,因此纳入同一架构视野。

3. 召回管道:混合检索与重排序

记忆召回采用两阶段混合搜索策略:首先基于 RRF(Reciprocal Rank Fusion,倒数排名融合)结合 BM25 和 Jina v5 稠密向量检索,随后使用 Cross-Encoder(交叉编码器)重排序器对合并后的候选集进行精排。

  • 双路索引策略

    • 文档写入时,原始文本进入 BM25 倒排索引。
    • 同时通过 copy_to 机制将相同值路由到 semantic_text 字段,自动生成 Jina v5 向量。
    • 优势:存储 footprint 平坦,单一写入产生两种检索能力。BM25 锚定字面匹配(如版本号、错误代码、专有名词 "Lumio Hub v2"),稠密向量捕捉语义相似性(应对用户 paraphrasing)。RRF 融合两者排名,无需校准 BM25 分数与余弦相似度。
  • 过采样(Over-fetch)

    • 重排序器只能对可见候选集进行重排,因此候选池需足够宽。
    • 混合检索器每路获取 80 个候选,RRF 融合时设置 rank_constant=30(比 ES 默认的 60 更紧,使高分项占据主导)。
  • 重排序(Reranker)

    • 使用 Jina v2 交叉编码器对合并后的候选集进行评分。
    • 与独立评分的 BM25 和双编码器不同,交叉编码器联合评估查询与文档,通过全注意力机制提供更强的相关性信号,尽管单对计算成本更高。
  • 关键子细节

    • 统一检索入口:Agent 工具包中的 recall_memory 工具在一次调用中并行扇出至三个记忆索引和目录。Agent 无需手动选择记忆类型,由检索器的排名和索引级衰减函数自动路由。
    • 预召回(Pre-recall)机制:由于 Agent 通常会重写用户消息以进行工具调用,这会导致字面关键词(版本号、错误码)丢失,影响 BM25 效果。因此,每次交互开始时,系统会对原始用户消息执行自动预召回,并将其注入对话历史,模拟 Agent 自行调用该工具的效果。

4. 写入与记忆整合

记忆从“刚刚发生”转化为“持久事实”涉及两个操作:

  • 写入(Write)

    • 每次用户交互写入一条情景记忆事件(ID、精确消息、时间戳等)。
    • ID 由 Elasticsearch 在写入时分配。
    • 使用 DLS(Dynamic Local Search)基于 API 密钥将文档范围限定在用户级别,确保后续检索的隔离性。
    • 时间戳用于时间衰减函数,对新事件进行排名加权。
    • 注意:Agent 的回复不存储,因为对话历史已将其带入下一次调用,且其长度会淹没用户简短但富含事实的信息。
  • 整合(Consolidation)

    • 将情景记忆转化为语义或程序性记忆的过程,涉及去重、提炼和计数器更新(原文此处截断,但逻辑上指将碎片化事件固化为结构化知识)。

关键要点

  • 架构统一性:摒弃分散的向量库+关键词引擎+审计服务的复杂架构,利用 Elasticsearch 单一引擎满足混合检索、隔离、版本控制和审计需求,降低系统复杂度和延迟。
  • 认知科学映射:严格区分情景、语义、程序性记忆,分别对应不同的索引、写入频率和老化规则,避免“大海捞针”式的低效检索。
  • 混合检索优势:结合 BM25(字面匹配)和稠密向量(语义匹配),通过 RRF 融合,解决用户 paraph
查看原文 →elastic.co