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

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

Give Your Coding Agents a Memory You Own

AI 摘要

Hugging Face 发布 funes,一个为 Claude Code、Codex、pi、Hermes 等编码智能体提供持久记忆的本地记忆层,单条命令即可接入。

正文 · 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。你不需要记住旧会话,也不需要把它的上下文粘贴到新会话中。

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 仓库。托管模型不会为索引处理你的会话;嵌入和重排序在你的机器上运行,而你的编码代理负责推理。

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

记忆是数据集,不是服务

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

funes add codex acme/funes-memory

绑定会把你的当前记忆发布到那里。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

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 的只读、单问题版本。它会回忆相关段落,将它们交给编码智能体,并返回一个标明来源的有依据的答案。它不会安装集成,也不会改变智能体的持久设置。

检索未命中不会被掩盖。如果这些段落不足以支持一个答案,智能体会如实说明。你可以重新表述问题,或者给智能体添加 funes,以便它在正常工作过程中迭代搜索记忆。

切换智能体而不丢失线索

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

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

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

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

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

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

摆脱长会话的最便宜方式

一项长时间的调查会让会话膨胀,直到每一轮携带上下文的成本都高于实际工作。通常的答案是让 agent 压缩后继续,或者写一份交接文档重新开始。Recall 是第三种方式,因此我们在handoff-vs-recall 基准测试上对它们进行了相互比较:两个任务,其答案在没有会话先前知识的情况下无法重建。

压缩是大多数 agent 默认采用的方式,也是三者中唯一结果分裂的:它在一个任务上成功,在另一个任务上从未成功。在它失败的地方,其摘要抹平了重要的发现。Recall 返回的是段落本身,因此发现不必在摘要化后幸存。

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

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

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

不再从零开始

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

你的 agent 已经写下了记录。funes 位于 github.com/huggingface/funes,只需一条命令,就能将那份记录变成下一个 agent 可以读取的记忆,无论你碰巧在哪台机器上。

构建于开源之上

funes 几乎没有发明这些。它依赖于足够好、可在本地运行的开源嵌入模型,依赖于 Lance 的仅追加数据集及其廉价的增量写入,以及 Hub 对数据集的缓存和内容去重。工作在于将它们整合成 agent 真正可用的记忆。

funes 也是开源的。提交 issue,无论是安装问题、遗漏的 recall,还是你希望支持的 agent。

来源:Hugging Face Blog · huggingface.co

00