跳到正文
原文
Hugging Face Blog·· 2026-09-03精选AI 评分66

Hugging Face 发布 funes:为编码智能体提供可自有的长期记忆层

Give Your Coding Agents a Memory You Own

AI 导读

Hugging Face 发布 funes,一个为 Claude Code、Codex、pi 和 Hermes 等编码智能体提供持久记忆的开源单文件工具,默认在本地完成嵌入和重排,无需 ML 运行时依赖。

推荐理由

原文给出了一条命令接入、本地嵌入与按需发布到自有数据集的完整路径,可据此判断跨机器与跨智能体的记忆方案是否可迁移。

正文 · AI 翻译

我在多台机器上工作,会根据任务切换不同的编码代理。它们每一个都像陌生人一样接触我的项目。当会话结束时,“上周二”的推理就消失了。每个新代理,在每台新主机上,都从零开始。

今年早些时候,Software Forgets: Agent Traces Are the Memory 提出了一个观点:编码代理其实已经产生了我们一直在丢失的记录。当它们搜索代码库、尝试各种方法、遇到错误、阅读文档并改变方向时,它们留下的不仅是什么发生了改变,还有为什么改变的详尽记录。

虽然诊断是正确的,但痕迹只是潜在的记忆。代理的会话日志仍然只是一个档案。你无法通过 grep 在一万轮对话中直接找到“为什么我们放弃了流式解析器?”。要让代理在工作时利用这些痕迹,它们需要索引、检索、排序和精确的来源追溯。

这正是 funes 所提供的。它是为你代理(Claude Code、Codex、pi 和 Hermes)提供的持久记忆层。它由你机器上已有的会话构建而成。它在本地运行,只需一条命令就能成为你代理正常工作流程的一部分。当你需要时,它还可以传输到你自己拥有的 Hugging Face 数据集,默认私密。

为你已在使用的代理添加记忆

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

curl -fsSL https://hf-mirror.com/buckets/huggingface/funes/resolve/install.sh | sh

然后将其添加到代理:

funes add claude    # or: codex, pi, hermes

那一条 add 命令会构建第一个索引,为代理提供 recall 和 get 工具,并安装自动化流程来索引每个完成的轮次。索引是增量的,新的运行会添加新轮次,而不是再次嵌入整个历史。更旧、更深层的内容可以按有界步骤回填。

从此以后,你只需正常工作。当任务涉及过去的决策、理由或发现时,代理可以自行获取 recall。你不需要记住旧会话或将其上下文粘贴到新会话中。

A coding agent reaches for funes on its own, recalls an earlier decision, and grounds its answer in the retrieved session

添加 funes 后,回忆发生在对话内部。代理会自行获取其记忆,并指出其答案背后的会话。

recall 返回原始文本,而非摘要,并准确显示其来源(代理、时间戳、会话和轮次)。每个结果都包含一个 get 命令,用于打开完整轮次及其周围上下文。

在底层,一个确定性管道将每个支持的痕迹解析为相同的轮次和块结构,将其分块,使用固定的本地模型进行嵌入,并将其写入本地 Lance 数据集。查询结合了向量和 BM25 搜索,融合它们的排名,使用交叉编码器对候选进行重排序,按新近度重新加权,并附加相邻块。

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

  • 跨代理的统一记忆:Claude Code、Codex、pi 和 Hermes 都写入相同的结构。recall 跨越它们的历史,每个命中结果都会说明是哪个代理产生的。
  • 原始证据保持完整:写入时不会将任何内容提炼为事实。结果始终可以追溯到产生它的轮次。
  • recall 默认在本地:无需账户或 Hub 仓库。托管模型不会为索引处理你的会话;嵌入和重排序在你的机器上运行,而你的编码代理负责推理。

agent as a stranger 问题在一台机器上已经解决。但当下一个 agent 运行在别处时,记忆才会更有用。

记忆是数据集,不是服务

要让记忆跟随你的工作,在将 funes 添加到 agent 时绑定一个记忆:

funes add codex acme/funes-memory

绑定会将你当前的记忆发布到那里。随后 funes 会保持其最新,在本地为每一轮建立索引,并在会话边界发布。agent 自始至终从其中回忆。在另一台机器上运行同样的命令,记忆也会跟随你到那里。

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

在任何内容到达 Hub 之前,凭据已在索引过程中被脱敏。发布时还会再次扫描每个数据块,并扣留任何仍看起来像机密的内容。其背后的扫描器记录在 SECURITY.md 中,包括它涵盖和不涵盖的内容。

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

先提问,后接线

recall 是为 agent 设计的。当你想亲自向记忆提问时,使用 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

Asking the published funes memory why it is append-only; funes retrieves the relevant sessions and a coding agent answers from them

funes ask 是 funes add 的只读、单问题兄弟。它回忆相关段落,将它们交给编码 agent,并返回一个有依据、且标明来源的答案。它不会安装集成,也不会改变 agent 的持久设置。

检索未命中不会被掩盖。如果这些段落不足以支持某个答案,agent 会如实说明。你可以换一种方式提问,或者将 funes 添加到 agent,使其能在正常工作过程中迭代搜索该记忆。

切换 agent 而不丢失线索

共享记忆并不绑定到创建它的 agent 或模型。在 Claude Code 中开始一项任务,下周在 Codex 中继续,第二个 agent 可以回忆起第一个 agent 的推理过程。将 pi 与本地模型或通过 HF Mirror router 提供的模型一起使用,然后再回到 Claude。

Claude Code chooses an embedding model, then Codex recalls that decision in a separate session

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

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

  • 跨你的机器: 将每个 agent 绑定到一个记忆,并从你正在使用的任意主机回忆历史。
  • 跨团队: 新队友的 agent 在第一天就能检索数月的决策,包括从未进入 pull request 的死胡同和理由。
  • 与开源项目并行: 维护者可以发布某个版本背后的会话,并在推送时命名它们。可以把它看作一个可搜索的 CLAUDE.md,保存着项目为何如此的历史,而不是一个必须有人不断重写的页面。任何人都可以用 --memory 读取公开记忆。

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

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

长时间调查会让会话不断膨胀,直到每一轮承载上下文的成本都高于实际工作。通常的解决办法是让智能体压缩后继续,或者写一份交接文档然后重新开始。Recall 是第三种方式,因此我们在handoff-vs-recall 基准测试上将三者相互比较:两个任务,其答案若不借助会话先前的知识便无法重建。

压缩是大多数智能体的默认做法,而它是三者中唯一结果分裂的:它在一个任务上成功了,在另一个任务上则从未成功。在它失败的地方,其摘要抹平了重要的发现。Recall 返回的是段落本身,因此发现不必经受摘要的考验。

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

Weighted tokens per successful task for five channels across two tasks, with recall the shortest bar on both

每个柱状图中较浅的部分是准备通道(交接文档或压缩)的一次性开销,在提出第一个问题之前支付,只计一次。叉号表示某个通道从未成功,因此没有每次成功的成本。

别再从头开始

“思考就是遗忘差异,进行概括,做出抽象。” — 豪尔赫·路易斯·博尔赫斯,《记忆专家富内斯》

你的智能体早已写下了记录。funes 位于 github.com/huggingface/funes,只需一条命令,就能把那份记录变成下一个智能体可读的内存,无论你恰好在哪台机器上。

构建于开源之上

funes 几乎没有发明这些东西。它依赖足够好在本地运行的开源嵌入模型,依赖 Lance 的仅追加数据集及其廉价的增量写入,还依赖 Hub 对数据集的缓存和内容去重。真正的工作在于把它们整合成一个智能体实际可用的内存。

funes 也是开源的。提交一个 issue,无论是安装卡壳、某次召回遗漏,还是你希望支持的智能体。

来源:Hugging Face Blog · hf-mirror.com