Traces • 已更新 • 41 • 506
[
](https://huggingface.co#give-your-coding-agents-a-memory-you-own)
给你的编程智能体一份你自己拥有的记忆
今年早些时候,[软件会遗忘:智能体轨迹就是
记忆](https://huggingface.co/blog/huggingface/agent-traces-as-memory) 一文提出,编程智能体其实早已在产出我们不断丢失的记录。当它们搜索
代码库、尝试各种方法、遇到错误、阅读文档、改变方向时,它们
留下的是一份详尽的记述,记录的不仅是
什么发生了改变,还有
为什么。
虽然这一诊断是正确的,但轨迹只是潜在的记忆。智能体的
会话日志仍然只是一份存档。你无法通过 grep
在一万轮对话中找出 *“我们为什么放弃了
流式解析器?”*。要让智能体在工作时利用这些轨迹,它们需要索引、检索、排序和精确的来源追溯。
这正是 funes 所提供的。它是一个持久的
记忆层,服务于你的智能体(Claude Code、Codex、pi 和 Hermes)。它由你机器上
已有的会话构建而成。它在本地运行,只需一条命令就能成为你智能体
正常工作流程的一部分。当你需要时,它还可以传输到你拥有的 Hugging
Face 数据集,默认私密。
[
](https://huggingface.co#add-memory-to-the-agent-you-already-use)
为你已经在使用的智能体添加记忆
funes 是一个单一二进制文件。其默认推理后端没有 ML 运行时依赖,嵌入和重排序都在你的机器上进行。安装它:
curl -fsSL https://huggingface.co/buckets/huggingface/funes/resolve/install.sh | sh
然后将其添加到智能体:
funes add claude # 或:codex、pi、hermes
那一条 add
命令会构建第一个索引,为 agent 提供 recall
和 get
工具,并安装自动化机制,为每个已完成的轮次建立索引。索引是
增量的,新的运行会添加新的轮次,而不是把整个历史记录重新嵌入
一遍。更旧、更深层的内容可以有界地回填。
从那里开始,你只需照常工作。当某个任务涉及过去的决策、理由或发现时,agent 可以自行调用 recall
。你不需要记住旧的会话,也不需要
把它的上下文粘贴到新的会话中。
加入 funes 后,回忆发生在对话内部。agent 会自行调用它的记忆,并说出其答案背后的会话。
recall
返回原始文本,而不是摘要,并准确显示它来自哪里
(agent、时间戳、会话和轮次)。每个结果都包含一条 get
命令,用于打开完整的轮次及其周围的上下文。
在底层,一条确定性的流水线将每个受支持的 trace 解析为相同的
轮次与块结构,对其进行分块,用固定的本地模型进行嵌入,并将其写入
本地 Lance 数据集。查询会结合向量搜索和 BM25 搜索,融合它们的
排名,用交叉编码器对候选结果重新排序,按新近程度对它们重新加权,并
附加相邻的块。
这种设计赋予 funes 三个重要特性:
跨 agent 的单一记忆:Claude Code、Codex、pi 和 Hermes 都写入相同的结构。recall
横跨它们的历史记录,每个命中结果都会说明是哪个 agent 产生的。原始证据保持完整:写入时不会把任何内容提炼成事实。结果总能回溯到产生它的那个轮次。不需要账户或 Hub 仓库。托管模型不会为建立索引而处理你的会话;嵌入和重新排序在你的机器上运行,而你的编码 agent 负责推理。recall
默认是本地运行的:
agent 如同陌生人的问题在一台机器上已经解决。但当下一个 agent 运行在
别处时,记忆会变得更有用。
[
](https://huggingface.co#a-memory-is-a-dataset-not-a-service)
记忆是数据集,而不是服务
要让记忆跟随你的工作,在把 funes 添加到 agent 时绑定一个记忆:
funes add codex acme/funes-memory
该绑定会将你当前的内存发布到那里。随后 funes 会保持其最新状态,在本地为每一轮建立索引,并在会话边界处发布。智能体在整个过程中都从它那里进行回忆。在另一台机器上运行相同的命令,内存就会跟随你到那里。
在底层,本地内存是一个 Lance 数据集,而共享内存是一个你拥有的 Hugging Face 数据集(默认私有)。
在任何内容到达 Hub 之前,凭据已经在
索引期间被脱敏。发布时随后会再次扫描每一个数据块,并扣留任何仍然
看起来像机密的内容。其背后的扫描器记录在
SECURITY.md 中,包括
它涵盖和不涵盖的内容。
当智能体读取远程内存时,funes 会将数据集文件缓存在本地,因此热查询会恢复到本地速度。Hub 提供了它已经为其他数据集提供的所有权、访问控制、版本管理和分发能力。你的内存不会变成某个独立内存服务中的账户,你也不会通过 API 将其租回。
[
](https://huggingface.co#ask-first-wire-later)
先询问,后接入
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 添加到代理中,使其能够在正常工作过程中迭代搜索记忆。
[
](https://huggingface.co#switching-agents-without-losing-the-thread)
在不丢失线索的情况下切换代理
共享记忆不绑定于创建它的代理或模型。在 Claude Code 中开始一项任务,下周在 Codex 中继续,第二个代理可以召回第一个代理的推理过程。使用 pi 搭配本地模型或通过 Hugging Face 路由器提供的模型,然后再回到 Claude。
Claude 做出决定;一个钩子将其索引;Codex 在另一个会话中召回它。演示中较早的命中是同一实验的早期记录:一个仅追加的记忆也记住了那些排练。
这在几个不同的范围内都很重要:
跨你的多台机器:将每个代理绑定到一个记忆,并从你正在使用的任何主机召回历史记录。跨团队:新队友的代理可以在第一天就检索到数月以来的决策,包括那些从未进入拉取请求的死胡同和理由。与开源项目并行:维护者可以发布某个版本背后的会话,并在推送时为其命名。可以把它看作一个可搜索的 CLAUDE.md,它保存着项目为何如此的历史,而不是一个必须有人不断重写的页面。任何人都可以用 --memory 读取公开记忆。
已发布的记忆带有数据集卡片和 funes 标签,使其可被识别,并可在 Hub 上被发现。Hub 已经托管开放权重和数据集。funes 增加了开放工作记忆。它保存项目背后的决策、失败的方法和理由,可由另一个代理查询,并可追溯到产生它们的会话。
[
](https://huggingface.co#the-cheapest-way-out-of-a-long-session)
摆脱长会话的最廉价方式
一项漫长的调查会使会话膨胀,直到每一轮携带上下文的成本都高于实际工作。通常的答案是让代理压缩并继续,或者写一份交接文档并重新开始。召回是第三种方式,因此我们在交接对比召回基准上对它们进行了相互比较:两个任务,其答案在没有会话先前知识的情况下无法重建。
压缩是大多数代理默认采用的方式,也是三者中唯一结果出现分化的:它在一个任务上成功,在另一个任务上从未成功。在失败之处,它的摘要抹平了重要的发现。召回返回的是段落本身,因此一项发现不必在摘要化后幸存下来。
召回在两个任务上都是三者中最廉价的,在一个任务上比书面交接便宜 8 倍,在另一个任务上便宜 4 倍。
每个条形中较浅的部分是准备通道(交接或压缩)的一次性费用,在提出第一个问题之前支付,且只计算一次。叉号表示从未成功的通道,因此没有每次成功的成本。
[
](https://huggingface.co#stop-starting-from-zero)
停止从零开始
“思考就是遗忘差异,进行概括,做出抽象。”——豪尔赫·路易斯·博尔赫斯,《记忆的芬尼斯》
你的智能体已经写下了记录。funes 就在
github.com/huggingface/funes,只需一条命令
就能把那份记录变成下一个智能体可以读取的记忆,无论你
碰巧在哪台机器上。
[
](https://huggingface.co#built-on-open-source)
构建于开源之上
funes 几乎没有发明这些东西。它依赖于足够好、可以在本地运行的
开源嵌入模型,依赖于 Lance 的仅追加数据集
及其廉价的增量写入,还依赖于 Hub 对数据集的缓存和内容去重。
真正的工作在于把它们整合成智能体真正能用的记忆。
funes 也是开源的。提交 issue
无论是安装遇到问题、某次召回遗漏,还是你希望
支持的智能体,都可以。
