跳到正文
北京时间
原文
Hugging Face:Blog(RSS)·· 26 天前精选AI 评分72

Hugging Face 发布开源工具 funes,为编码智能体提供可本地持有的记忆层

Give Your Coding Agents a Memory You Own

AI 导读

Hugging Face 发布开源工具 funes,为 Claude Code、Codex、pi、Hermes 等编码智能体提供本地记忆层,把已有会话记录索引成 Lance 数据集,一条 funes add 命令即可让 Agent 自主召回原始出处(Agent、时间戳、会话、轮次)。

推荐理由

原文给出本地记忆层的检索机制、跨 Agent 复用方式,以及召回比压缩和交接更省成本的基准数字,方法可直接复用。

正文 · AI 翻译

我在多台机器上工作,会根据任务切换不同的编码智能体。每一个智能体对我的项目而言都是陌生人。“上周二”的推理过程在会话结束时便消失了。每个新智能体,在每台新主机上,都是从零开始。今年早些时候,《软件会遗忘:智能体轨迹即记忆》一文论证了编码智能体其实已经在产生我们不断丢失的记录。当它们搜索代码库、尝试各种方法、遇到错误、阅读文档并改变方向时,它们留下的详细记录不仅说明了什么发生了变化,还记录了为什么会发生变化。

虽然诊断是正确的,但轨迹只是潜在的记忆。智能体的会话日志仍然只是一个存档。你无法通过grep来跨越一万轮对话回答“我们为什么放弃了流式解析器?”这个问题。要让智能体在工作时利用这些轨迹,它们需要索引、检索、排序和精确的来源追溯。

这正是funes所提供的。它是为你的智能体(Claude Code、Codex、pi 和 Hermes)打造的持久记忆层。它基于你机器上已有的会话构建。它在本地运行,只需一条命令即可成为智能体正常工作流程的一部分。当你需要时,它还可以迁移到你拥有的 Hugging Face 数据集上,默认设为私有。

为你已经在使用的智能体添加记忆

funes 是一个单一二进制文件。其默认推理后端不依赖任何 ML 运行时,嵌入向量和重排序都在你的机器上完成。安装它:

curl -fsSL https://huggingface.co/buckets/huggingface/funes/resolve/install.sh | sh

然后把它添加到一个智能体中:

funes add claude    # or: codex, pi, hermes

那一条 add 命令会构建首个索引,为智能体提供 recall 和 get 工具,并安装自动化流程,为每一轮完成的对话建立索引。索引是增量式的,新的运行只会新增新的对话轮次,而不是把整个历史重新嵌入一遍。更早、更深的内容可以在有界的步骤中回填。

从那里开始,你只需要正常干活。当某个任务涉及过去的决策、理由或发现时,智能体可以自行调用 recall。你不需要记住旧的会话,也不需要把它的上下文粘贴到新会话中。

加入 funes 之后,回忆发生在对话内部。智能体会自行调取记忆,并在给出答案时指出它来自哪个会话。

recall 返回的是原始文本,而不是摘要,并且会精确显示内容的来源(智能体、时间戳、会话和对话轮次)。每条结果都附带一个 get 命令,可打开完整的对话轮次及其上下文。

在底层,一条确定性的流水线会把所有受支持的 trace 解析成统一的“轮次—块”结构,对其进行分块,用固定的本地模型嵌入,并写入本地 Lance 数据集。查询时结合向量搜索和 BM25 搜索,融合两者的排序结果,用 cross-encoder 对候选重新排序,再按时间远近重新加权,并附上相邻的块。

这种设计赋予了 funes 三个重要特性:

  • 跨智能体的统一记忆: Claude Code、Codex、pi 和 Hermes 都写入相同的数据结构。recall 贯穿它们的历史记录,每条命中结果都会标明是由哪个智能体产生的。
  • 原始证据完整保留: 写入时不会将任何内容提炼成事实。每条结果都可以回溯到产生它的那一轮对话。
  • recall 默认本地运行: 无需账号或 Hub 仓库。托管模型不会处理你的会话用于索引;嵌入向量和重排序都在你的机器上运行,推理则由你的编程智能体完成。

“智能体即陌生人” 的问题在一台机器上已经解决。但当下一个智能体在别处运行时,记忆会变得更加有用。

记忆是数据集,不是服务

要让记忆跟随你的工作流转,在给智能体添加 funes 时绑定一个即可:

funes add codex acme/funes-memory

bind 命令会将你当前的记忆发布到那里。之后 funes 会持续保持其更新,在本地索引每一轮对话,并在会话边界时发布。智能体在整个过程中都从中进行回忆。在另一台机器上运行同样的命令,记忆就会跟随你到那里。

在底层,本地记忆是一个 Lance 数据集,而共享记忆则是一个归你所有的 Hugging Face 数据集(默认设为私有)。

在内容到达 Hub 之前,凭据已在索引阶段被脱敏处理。发布时系统会再次扫描每一个分块,并扣留任何仍像机密的内容。这一扫描器的实现细节记录在 SECURITY.md 中,包括其覆盖范围与不覆盖的内容。

当智能体读取远程记忆时,funes 会在本地缓存数据集文件,因此热查询可恢复到本地速度。Hub 提供它已为其他数据集提供的所有权、访问控制、版本管理和分发能力。你的记忆不会成为某个独立记忆服务中的账户,你也不需要经由 API 再把它租回来。

先提问,后接线

recall 是为智能体而设计的。当你想亲自向记忆提问时,可以使用 ask。它默认读取你的本地记忆:

funes ask claude "what did we decide about the streaming parser"

或者让它指向一个共享记忆。我们发布了一份 funes 开发过程的记忆,这样你无需创建自己的记忆,就能询问 funes 为何以这种方式运作:

funes ask claude "why is funes append-only" --memory huggingface/funes-memory

funes ask 是 funes add 的只读、单次提问版本。它会检索相关段落,交给编码智能体,并返回一个注明来源的、有依据的答案。它不会安装集成,也不会改变智能体的持久化配置。

检索未命中不会被掩盖。如果段落不足以支撑某个答案,智能体会如实说明。你可以重新表述问题,或将 funes 加入智能体,使其在日常工作中能够迭代式地搜索记忆。

切换智能体而不丢失上下文线索

共享记忆并不绑定于创建它的智能体或模型。在 Claude Code 中启动一个任务,下周在 Codex 中继续它,第二个智能体可以回忆起第一个智能体的推理过程。使用 pi 搭配本地模型或通过 Hugging Face 路由器提供的模型,然后再回到 Claude。

Claude 做出决定;一个 hook 将其索引;Codex 在另一个会话中回忆起它。演示中较早的片段是同一实验的早期录制:一个仅追加的记忆也记住了这些预演。

这在几个不同的范围内都很重要:

  • 跨你的多台机器: 将每个智能体绑定到一个记忆,并从你正在使用的任何主机上回忆历史记录。
  • 跨团队: 新队友的智能体可以在第一天就检索到数月的决策记录,包括那些从未进入 pull request 的死胡同和理由。
  • 伴随开源项目: 维护者可以发布某个版本背后的会话,并在推送时为其命名。可以把它想象成一个可搜索的 CLAUDE.md,它保存着项目为何成为如今这般模样的历史,而不是一个需要有人不断重写的页面。任何人都可以通过 --memory 读取公共记忆。

已发布的记忆带有数据集卡片和 funes 标签,使其在 Hub 上易于识别和被发现。Hub 上已经托管了开放权重和数据集。funes 则增加了开放的工作记忆。它保存了项目背后的决策、失败的方法和理由,可供另一个智能体查询,并可追溯到产生这些内容的会话。

摆脱冗长会话的最廉价方式

长时间的调查会让会话变得臃肿,直到每一轮携带上下文的成本超过实际完成工作的成本。通常的解决办法是让智能体压缩上下文后继续,或者写一份交接文档然后重新开始。Recall 是第三种方式,因此我们在handoff-vs-recall 基准上对它们进行了对比测试:这两个任务如果没有会话的先前知识,就无法重建出答案。

压缩是大多数智能体的默认做法,也是三种方式中唯一结果出现分歧的:它在一个任务上成功到达,在另一个任务上却始终未能到达。在失败的地方,它的摘要抹平了那些关键发现。Recall 返回的是原文段落本身,因此发现不必经受摘要的考验。

Recall 在两个任务上都是三种方式中最廉价的,在一个任务上比书面交接便宜 8 倍,在另一个任务上便宜 4 倍。

每个条形图中较浅的部分是为准备该通道(交接或压缩)而支付的一次性费用,在提出第一个问题之前支付,且只计一次。叉号标记表示该通道从未成功到达,因此没有每次成功的成本。

别再从头开始了

“思考就是忘却差异、进行概括、做出抽象。” —— 豪尔赫·路易斯·博尔赫斯,《博闻强记的富内斯》

你的智能体已经写下了记录。funes 就在 github.com/huggingface/funes,只需一条命令,就能把这份记录变成下一个智能体可以读取的记忆——无论你此刻身处哪台机器。

基于开源构建

funes 几乎没有发明什么新东西。它依托于足以在本地运行的优质开源嵌入向量模型,依托于 Lance 的追加式数据集及其廉价的增量写入能力,也依托于 Hub 对数据集提供的缓存与内容去重能力。真正的工作在于把这些能力整合成智能体真正可用的记忆。

funes 同样是开源的。无论是安装问题、记忆召回遗漏,还是你希望支持的智能体类型,都可以提交 issue。

来源:Hugging Face:Blog(RSS) · huggingface.co