Agent 写之前先查同行代码:XERJ 把 503 行改成 4 行,同一份账单从 21.9 美元掉到 3.38

Agent 写之前先查同行代码:XERJ 把 503 行改成 4 行,同一份账单从 21.9 美元掉到 3.38

Agent 写之前先查同行代码:XERJ 把 503 行改成 4 行,同一份账单从 21.9 美元掉到 3.38 封面

同一个任务,503 行没过,4 行过了

官方给过一个 Java 任务的两种写法。第一种让模型裸写,写了 503 行,烧掉大约 36,000 个输出 token,测试还是没过。第二种先给它一份参考实现,最后只写了 4 行、103 个 token,直接通过。

差别不在模型变聪明了,在于它第二次知道了一条编译器永远不会泄露的运行时契约:replay 之前必须先 seal。这类东西背不出来,试也试不出来,只能查出来。

Agent 写代码最贵的那一步其实不是生成,是瞎猜。遇到没背过的 API,它先写一个大概,跑一次报错,改一轮再跑,每一轮都在烧最贵的 output token,而且烧得毫无信息量。XERJ 的办法很朴素:把同行解决过同类问题的仓库拉下来做成索引,让它在动手之前先查一次真实实现。官方给这个方法起了个名字,叫 reference coding。

更难得的是,官方页面把自己输的那一栏也原样贴出来了。在模型早就背过的公开库上,纯记忆 1.49 美元解出 6/6,上了 XERJ 反而 4.40 美元只解出 5/6。愿意贴出这一栏,比喊 40 倍更值得信。

XERJ 是个啥:一句命令把文件夹变成能查的索引

XERJ 是用 Rust 写的本地 AI 搜索引擎,仓库在 xerj-org/xerj,Apache-2.0,单个静态二进制,没有 JVM 也没有依赖,Linux、macOS、Windows 的 x86-64 和 arm64 都有预编译包,默认跑在 localhost:9200。GitHub 上现在 7,056 星、358 个 fork、86 个 open issue,建库时间是 2026 年 6 月 30 日,最近一次 push 在 10 月 16 日,官网在 xerj.org。

它跟普通全文检索的分岔口在入口端。CSV、JSON、JSONL、XML、YAML、SQLite、PDF、DOCX、PPTX 按页切、XLSX 一个 sheet 一个数据集、EPUB 一章一条、Jupyter 一个标题段一条,再加上 man page、HTML、邮件(.eml 和 mbox,含 Google Takeout 导出)和常见日志格式,都能直接吞进去。

源码那部分走 tree-sitter 做 AST 感知解析,覆盖 13 种语言,带符号和行号,不是当纯文本切块硬塞。Lucene 那个 6,113 文件、51MB 的检出,单线程进程内提取大约每秒 1,500 个文件(13 MB/s),其中 tree-sitter 解析占掉约 72%。带符号和行号这件事很关键,后面 xerj def 能做到 go-to-definition 全靠它。

装起来,几条命令就够了

安装就一行命令,起服务、接 IDE、建索引、查、看收益各一行。Windows PowerShell 换成 irm https://xerj.org/get.ps1 | iex 就行,xerj init 会把 MCP 和 skill 一起接进 Claude Code 与 Cursor。

curl -fsSL https://xerj.org/get | sh
xerj --insecure --data-dir ./data &
xerj init
xerj autoindex ~/my-project
xerj search "how do we rotate the WAL segment"
xerj def "euler_to_rotationmatrix"
xerj gain

autoindex 的真实输出长这样:

phase A: 593 datasets inferred, 1955 junk/skipped files
phase B: indexing 25329 files with 8 workers
done in 158.1s, 593 datasets, 83103 records live, 790 junk records

索引就落在你自己指定的 data 目录里,不是某个托管服务。重跑是增量的,内容字节没变的文件直接跳过解析,通常九成以上没变。xerj search 返回的是带 file:line 的排序片段,xerj def 直接给符号签名和位置,xerj gain 告诉你它到底替你做了什么,是数出来的,不是估出来的。

reference coding 三步:克隆,索引,检索

官方原文就是 Clone、Index、Retrieve 三个词。

第一步,git clone --depth 1 把参考仓库拉下来,按问题域分组,不要按语言分。你要解决的是流式任务的优雅退出,那堆在一起的就是 tokio、某个 RPC 框架和公司内部的调度器,它们凑巧都是 Rust 而已。按语言分没意义,你要找的是谁解决过这个协议问题,不是谁用的语法跟你一样。顺手记下每个仓库的 licence,GPL 和 AGPL 的只读设计不抄代码。

第二步,xerj autoindex ref/tokio,官方说 10 万条记录的树大约 10 秒。

第三步,写之前先查:

curl -sXPOST 'localhost:9200/ax-*/_search' -H 'content-type: application/json' \
  -d '{"size":3,"query":{"multi_match":{"query":"graceful shutdown with a broadcast channel","fields":["defs^3","body","title"]}}}'

ax-* 会匹配节点上所有数据集,查完记得 GET /_cat/indices 收窄范围。defs、symbols、body、title、language 是 autoindex 给源码写的字段。搜索接口就是 Elasticsearch API,Kibana 和官方 ES 客户端直连不用改一行代码,一致性套件 1366/1369 通过。

MCP 这边更简单,xerj mcp 本身就是一个 stdio server,装好的这个二进制就是服务端,不用再下载任何东西,一共暴露 13 个工具,xerj_search、xerj_semantic_search、xerj_vector_search、xerj_hybrid_search、xerj_memory_store、xerj_memory_recall 都在里面。配置块记得写绝对路径,从桌面图标启动的 MCP 主机不继承 shell 的 PATH。

一条命令,把整个文件夹吸进索引塔
一条命令,把整个文件夹吸进索引塔

数据对账:省在哪,也输在哪

先看赢的那组。8 个任务,Python、JS、C、Java 各来一遍,每臂 16 次,数的是真实 claude -p 的输出 token。

方式输出 token成本解出
纯记忆(关掉工具)260,916$11.1811/16
原生 Claude Code(grep)26,477$3.2716/16
XERJ(检索注入)9,982$1.5816/16

比 grep 少 2.7 倍输出 token,比纯记忆少 26 倍,成本便宜 2.1 倍,单个 Java 任务最多差到 278 倍。另一组更极端:13 个为本研究现写的库、5 种语言,把工具全关只靠记忆的话花 21.90 美元却只解出 1 个,原生 Claude Code 靠 grep 是 4.26 美元解出 21 个,XERJ 3.38 美元同样解出 21 个。这批库是专门为本研究现写的,模型脑子里没有,测出来的才是纯检索能力。

再看输的那组。换成模型早就背过的公开库 valkey 和 memcached,跑 6 次:纯记忆 1.49 美元解 6/6,最便宜;原生 9.14 美元解 6/6;XERJ 4.40 美元,只解出 5/6。

官方原话是:价值被记忆门槛卡着,它在私有、内部、小众或者超出训练截止的代码上赢,在模型早就背熟的热门公开库上是中性甚至有害的。

13 个库里的 quill(varint)和 garner(trie)就是故意放进去的送分题,检索在这两题上一分钱不省,官方说这就是把它们放进去的原因。它买的只是信息差那一段,模型已经知道的东西,你再检索一遍只是多付一次钱。

三个数字三种口径,别混着看

  • 40x:仓库简介写的是比 grep 少 40 倍 token,README 的实测徽标写的是 2.7 倍。这两个数不是一回事,看实测那个。
  • 5x:日常开发约 5 倍这个数来自用户田野反馈文件,项目自己标了那是 testimony,不是受控运行。
  • ES 8.13.4:55 胜 26 平 4 负,入库吞吐 1.72 倍,磁盘占用小 1.61 倍。4 场败绩全是同一处,高写入压力下的读 p99,根因是锁,写在仓库里没删。

顺带一个体感数字:WordPress 核心的 PHP 大约 520 万 token,等于 26 个满上下文窗口;官方给的安全审计案例是跨 1,492 个 PHP 文件只花了约 26,000 token。

高的是死记硬背,矮的是先查再写,旁边那簇红的才是重点
高的是死记硬背,矮的是先查再写,旁边那簇红的才是重点

上之前先知道这几个坑

  • --insecure 是信任边界不是形式。它同时关掉 TLS 和 API-key 鉴权,凡是能连到这个端口的调用者都是超级用户,能读能删所有索引,包括每个 /_memory 命名空间。官方设定是一台开发机一个人用,新节点默认只绑 127.0.0.1,明文绑其他网卡会拒绝启动。
  • 不加 --insecure 就是鉴权开着,key 在 <data-dir>/admin.key。注意 autoindex 不会自己从 xerj.toml 里捡 key,得传 --api-key 或设 XERJ_API_KEY,否则全部 401。
  • 版本还挂着 rc,现在是 v1.0.0-rc.96,2026 年 10 月 16 日发布,没到 1.0 稳定版。生产要用就 pin 版本,先读一遍发行历史。
  • 小仓库不值得上。几百个文件的规模,grep 更快,而且没有索引要维护。
  • rerank 会把命中文本发到 TypeSafe AI 的服务器,默认关。开了之后在公开 FiQA 上 nDCG@10 从 0.24 升到 0.36,648 次搜索大约 0.64 美元,分数不是校准过的概率。默认 embedder 也是词表重叠的 lexical feature-hashing,不是神经语义理解,神经模式要另外下载约 90MB 模型。
  • ES 兼容有边:scroll 是有界快照不是游标,总命中数超窗口直接返回 400 而不是静默截断,大结果集改用 search_after。

什么时候值得上,什么时候别碰

值得上的情况很清楚:代码是内部的、私有的、小众的,或者模型训练截止之后才出现的。在这些地方它省的是真金白银,因为猜错一次的代价本来就高。

别上的情况同样清楚:代码全是热门公开库,模型本来就背得下来,检索只是多绕一圈,还可能像 valkey 那组一样把原本能过的题绕丢。一句判据:先问自己这个库模型背过没有,背过就别绕。

跟 Pi 1.0 把工具藏起来省上下文 比,这是同一个方向的两种做法,一个省的是工具定义的常驻开销,一个省的是猜错之后的返工。挑来源这件事上,Jevcrawl 把 8 万 token 砍到 1873 的思路也一致,别让模型自己选。做代码审查的可以顺手看一眼 Greptile 用图谱索引做代码审查,那边是另一套索引思路。

关注圈圈,持续带你玩转 AI 工具。

© 版权声明
THE END
喜欢就支持一下吧
点赞94 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容