它要解决的问题不是「存不下」
编码智能体的会话轨迹里沉淀着真实资产:它做过什么、在哪一步失败、为什么中途换了方向、哪些假设被推翻。但这些内容通常只存在于那一次会话里。换一台机器、换一个工具、换一个会话窗口,智能体就重新变成一个陌生人。
Hugging Face 开源的 funes 针对的正是这一段:把已有的代理会话索引成可检索的记忆,而不是要求用户从头整理笔记。目前明确支持四类代理:Claude Code、Codex、pi 与 Hermes。
索引管线:一条确定性路径加一个本地数据集
它的流水线是一句话能说清的确定性管线:把所有受支持的轨迹解析成同一种「轮次与块」结构,切块,用固定的本地模型做嵌入,写进本地的 Lance 数据集。
几个设计点值得注意。存储格式是 Lance,写入是追加式,因此新会话只添加新的轮次,不需要重新嵌入整段历史;旧内容可以分批回填。嵌入与重排在本地执行,安装物是单个二进制文件,默认推理路径不依赖外部机器学习运行时。使用方式是两条命令:先用安装脚本装好,再执行一条 add 命令把记忆绑定到具体代理——Claude、Codex、pi、Hermes 各有一条。
检索:两路召回、一次重排、按新鲜度加权
查询时的动作顺序是:向量检索与 BM25 关键词检索各自出结果,融合两路排名,用 cross-encoder 对候选重排,再按近期性重新加权,最后附上相邻的块一起返回。
这套组合里的每一步都有明确理由。稀疏检索负责精确命中标识符与错误码这类词汇,稠密检索负责语义相近但用词不同的情况;重排负责把真正相关的片段提到前面;近期性加权反映一个经验事实——越近的决定越可能仍然有效。附带相邻块则是为了不把一个结论从上下文中割裂出来。
溯源是它比较少见的地方。召回结果返回的是原始文本而不是摘要,并且标注来源代理、时间戳、会话标识与轮次序号,同时给出一条命令可以打开完整轮次及其上下文。项目的表述是:写入时不把任何东西蒸馏成事实,因此一个结果总能被引回产生它的那一轮。跨代理命中时会标出是哪一个代理产生的记忆。
这个设计透露出对记忆的一个明确态度:记忆的价值不在「更聪明地总结」,而在「准确地回到原处」。把结论蒸馏成事实写进记忆,读起来干净,但一旦结论是错的,后续所有基于它的推理都会继承同一个错误,而且再也找不回来。保留原始轮次并附上出处,代价是检索结果更长、更占上下文,收益是任何一次引用都可被复查。
共享与安全:默认本地,可选上云
默认状态是完全本地。可选做法是把记忆绑定到自己拥有的 Hugging Face 数据集,默认私有,从而实现跨机器共享;远程记忆的文件会在本地缓存,热查询能回到本地速度。
安全上它做了两道处理:索引阶段先做凭据脱敏,发布之前再对每个块扫一遍,仍像密钥的内容不予发布。项目自带的 SECURITY.md 明确写了覆盖范围与不覆盖范围,也就是承认启发式扫描可能漏。这个诚实的声明本身是加分项——把「可能漏」写进文档,比在宣传里说「保证不泄露」更有工程价值。
官方基准:两个任务上比书面交接便宜数倍
官方给出的对比基准放在一个公开数据集里,比较三种处理长会话的方式:默认的上下文压缩、人工撰写的书面交接、以及 funes 的召回。
结论有三条。压缩在一个任务上成功、在另一个任务上失败,原因是摘要把关键发现抹平了。召回返回原文段落,因此不依赖摘要是否活下来。在两个任务上召回都是最便宜的方式,相对书面交接分别便宜约 8 倍与约 4 倍。
这个基准的设计意图很明确:它要证明的不是「检索更准」,而是「检索更省」。这个立场是站得住的——长会话的真正成本往往不在初次生成,而在反复把历史重新读回上下文。
社区复现:默认参数下的召回并不好看
问题在于,一份社区实测给出的画面与官方基准差别不小。测试者在 funes 1.3.0 上准备了一万九千余个真实会话,覆盖 Claude 与 Codex 的本地目录,用一百个问题做评测。
结果是这样的:在 M4 Pro 上完成全量索引耗时 2 小时 03 分,产出约 30.8 万个块,单次查询约 6.3 秒。默认参数下,命中率指标为 rank-1 命中 9 例、前五命中 39 例、前五十命中 71 例;把近期性半衰期参数置为 0 之后,变为 19、46、71。文档里所称的「大约一分钟」实际只索引了 218 个会话,一百个问题一个都没答对。此外,一个纯 BM25 的对照项目索引只用 29 秒、单次查询 24 毫秒,rank-1 命中数为 18。
这些数字来自社区,未经官方确认,样本与提问方式也可能不利于该工具。但它们至少说明两件事。其一,更复杂的检索栈不等于更准的召回:在这组测试里,默认配置下纯关键词方案的 rank-1 表现反而更好。其二,首轮全量索引的耗时会被严重低估,这个隐藏成本必须计入评估。
可以带走的三个结论
其一,记忆层的主要价值来自原文可回溯,而不是摘要更聪明。压缩路线丢掉的恰恰是最难重建的部分——为什么当初那样决定。任何做长会话工程的团队,都可以把「结论能否被引回原始轮次」作为一条验收标准。
其二,近期性加权是双刃。默认的三十天半衰期会把一个月前的有效历史从排名前列压下去,而在代码库里,一个两年前的架构决策可能比昨天的对话更重要。这个参数必须按领域调,不能沿用默认值。
其三,自建记忆的失败是静默的。召回不准不会报错,只会让代理悄悄换一条更差的路径。因此上线前必须准备一组带标准答案的提问集,而不是凭感觉判断好不好用。
从更大的角度看,这类工具代表了一条清晰的工程路线:与其不断把上下文窗口做大,不如把历史从提示词里搬出来,变成可以按需取用的外部结构。这条路线的收益与代价都在本次实测里显形了——省下来的是每轮的输入体量,付出的是索引时间与调参成本。目前官方及行业暂未披露更多细节,后续将持续跟进迭代动态。