funes:为编程智能体打造的本地记忆系统,基于 Lance 构建

0 阅读

funes 解决了什么问题

你有没有遇到过这种情况:一个编程智能体花了不少时间搞明白某个奇怪的测试失败原因,尝试了几个方案,最终找到了正确的修复方式。但会话一结束,这些经验就消失了。下周另一个智能体接手同一个项目,又得从头开始摸索,仿佛之前的努力从未发生过。

funes 就是为了解决这个“记忆断层”而生的。它把智能体过去的工作记录——比如来自 Claude Code、Codex、pi 或 Hermes 的会话轨迹(traces)——变成一种可被后续任务实际使用的记忆。关键在于,它不靠大模型去总结或提炼这些记录,而是直接保存原始文本片段,并建立高效的本地索引,让智能体在需要时能准确召回当初的推理过程。

如何使用 funes

安装非常简单,一条命令就能搞定:

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

装好后,把它接入你常用的智能体:

funes add codex    # 也可以是 claude、pi 或 hermes

这一步会自动解析已有的会话日志,生成第一个索引,并注册 recallget 工具。之后你继续正常使用智能体,新产生的对话轮次会被自动追加到记忆库中。

当任务需要参考历史决策时,智能体可以自行调用 recall 来获取相关信息。你也可以手动查询:

funes recall "为什么我们关掉了流式解析器"

这条命令会返回按相关性排序的真实会话片段,每个结果都标明了来源会话 ID,并附带一个 get 命令,方便你查看上下文:

funes get <session_id> --from 40 --to 60

如果你不想看原始记录,而是想要一个总结性答案,可以用 ask

funes ask claude "关于存储布局我们最后怎么决定的"

ask 会先在本地检索相关片段,再让指定的智能体基于这些内容生成回答。而 recall 则更适合需要亲自验证证据的场景。

隐私优先,本地默认

智能体会话中常常包含敏感信息:本地文件路径、堆栈跟踪、未发布的功能设计、客户专属的调试细节,甚至偶尔不小心粘贴的密钥。funes 对这类数据非常谨慎。

它的索引流程完全在本地完成,且不经过任何大语言模型:

  1. 解析会话转录文本
  2. 将内容切分成块(chunks)
  3. 使用本地嵌入模型生成向量
  4. 存储为 Lance 格式的数据集

整个过程中没有外部服务参与,也不会用 LLM 对你的工作记录做摘要。嵌入模型的版本会被记录在数据集中,如果后续查询时模型不匹配,funes 会直接拒绝操作,确保一致性。

当你确实需要共享记忆时,funes 还有第二道防线。如果系统中安装了 TruffleHog,它会在索引前自动扫描并遮蔽检测到的凭证。执行 funes push 时,还会进行一次强制性的安全检查——任何仍包含密钥的记录块都会被拦截,不会离开你的机器。

thumbnails (1280 x 640 px)

为什么选择 Lance

funes 的记忆本质上是一个不断增长的表格。每次智能体完成一轮对话,就会新增若干文本块。每个块都保留原始内容、精确来源(provenance)和对应的向量嵌入。回忆(recall)操作需要同时支持语义搜索和精确关键词匹配,而分享时最好只需导出一个单一的数据制品。

Lance 正好满足这些需求。一个 .lance 目录就能容纳全部内容:

chunks.lance/
  data/        # 存放文本、来源信息和向量
  _indices/    # 包含 BM25 和向量索引
  _versions/   # 记录每次提交的数据集版本

这意味着你不需要维护独立的文档库、向量数据库和全文搜索引擎,也不用担心它们之间的同步问题。新数据可以追加写入,无需重写整个数据集;每次提交都会生成可回滚的版本;BM25 和向量索引与数据本身绑定在一起。

Lance 还支持高效的随机访问,便于后续重排序(reranking),并且可以直接在进程内读取本地磁盘或对象存储中的数据。这让 funes 能以库的形式存在,而不是一个必须单独部署和长期运行的服务。

在实际检索时,funes 会同时执行向量搜索(捕捉语义)和 BM25 搜索(匹配精确的变量名、错误码、命令行参数等),然后对候选结果进行重排序,并加入时间权重——让近期的决策在排序中占据更高优先级。

由于每轮对话生成的块都有确定的 ID,重新索引的成本很低。funes 不会重复嵌入已经处理过的块。记忆本身是一个可重建的产物,而原始的会话日志始终是唯一的真实来源。

funes 的核心理念

funes 不是一个试图重构你工作历史的知识库。它只是一个忠实的本地回忆层,专门用来保存和复用你的编程智能体已经完成的工作。

安装它,接入你的智能体,然后试着问一句:

funes recall "我们在这里已经学到了什么?"

你得到的答案应该直接来自真实的记录——本地存储、可审计、并随时准备为下一个智能体所用。