← 返回实验室

代码图在什么情况下划算:大仓库、小模型

benchmarkmcpcoding-agentsevals

我上一次的基准测试得出的结论是,代码图没有让我的编程智能体更省钱。那次测试规模太小,只能说到这一步:24 个问题,没有一个仓库超过 25k 图节点,也没有 Opus。所以我换到一个答案有可能改变的规模重新跑了一遍,并且先把计划写了下来。假设、仓库、预算和分析方法都在 PLAN-v2.md 里,在任何一次运行之前就已提交。

简单地说:当模型不用图就得一直搜下去时,图才划算。Haiku 在 kubernetes 和 vscode 上就是这种情况。Sonnet 在那里能省一点,opus 什么也省不下;而在小仓库上,sonnet 用图比用普通 grep 还要贵。

设置

智能体用的是 GitHub Copilot CLI 1.0.90,以无头模式运行,每个会话一个问题,分两种方案:

四个公开仓库,每个都固定在一个提交上:

仓库语言图节点数
full-stack-fastapi-templatePython、TypeScript1,601
dubTypeScript25,023
kubernetesGo146,421
vscodeTypeScript218,883

每个仓库有 16 个问题。八个是结构性的:谁调用了某个函数,它又调用了什么,从一条 CLI 命令或一个 HTTP 处理函数一直到某个指定函数的调用路径,以及改动某个签名会让哪些函数出错。另外八个是精确性的:一个配置值,某个环境变量在哪里被读取,某个错误在哪一行抛出,某个类型在哪一行定义。每条标准答案我都在固定的提交上亲手核对过,而且其中每一项只按整词匹配,所以 init_db 不能算作 init。

Haiku 4.5 在每种方案下把全部 64 个问题各回答了三次,sonnet 5 各回答了两次。在 Copilot 里,Opus 5.5 每个提示词要消耗 15 次高级请求,所以它把来自 kubernetes 和 vscode 的十二个结构性问题各回答了一次。总计 664 次运行,约 744 次高级请求。

和第一篇笔记一样,成本用 tokenEquiv 衡量:未缓存的输入,加 1.25 × 缓存写入,加 0.1 × 缓存读取,再对一次运行中的所有模型调用求和。

结果

图的成本占 grep 成本的比例:对每个问题,用图方案在各次重复上的中位数除以 grep 方案的中位数,再对所有问题取中位数,并给出 95% bootstrap 置信区间。低于 1 表示图更便宜。

模型仓库规模结构性精确性
haiku 4.5小型(1.6k 节点)0.88 (0.65–1.29)0.92 (0.72–1.15)
haiku 4.5中型(25k)0.61 (0.11–1.50)0.96 (0.75–1.37)
haiku 4.5大型(146k、219k)0.29 (0.11–0.70)1.01 (0.94–1.28)
sonnet 5小型1.51 (1.45–1.70)1.42 (1.20–1.71)
sonnet 5中型0.94 (0.57–2.00)1.14 (1.05–1.30)
sonnet 5大型0.74 (0.62–0.92)1.13 (1.01–1.29)
opus 5.5大型0.97 (0.72–1.10)–

结构性问题的正确答案数,图对 grep:

模型小型中型大型
haiku 4.513/24 对 19/2420/24 对 22/2438/47 对 33/48
sonnet 513/16 对 15/1616/16 对 16/1632/32 对 28/32
opus 5.5––12/12 对 12/12

把成本和准确率合在一起看,即结构性问题上每个正确答案的 tokenEquiv:

结构性问题上每个正确答案的 token 数:使用代码图与只用 grep 的对比,分别在 FastAPI 模板以及 kubernetes 和 vscode 上

站得住的结果:

为什么小模型获益最多

数一数模型调用的次数。用 grep 时,haiku 每回答一个结构性问题,所需调用次数的中位数在 kubernetes 上是 22 次,在 vscode 上是 20 次,有一个影响分析问题用了 114 次。用图时分别是 5 次和 4 次。每次调用都要把整段对话重新发送一遍,所以长搜索的成本远比它的调用次数看上去要高:haiku 用 grep 时最贵的一个答案达到了 471k tokenEquiv。

Sonnet 用 grep 时的搜索要短一些,8 次调用,用图时是 4 次。Opus 无论用哪种方式都是 4 或 5 次调用,所以图没有什么可削减的,而它的固定开销把省下的那一点点也吃掉了。

我的猜测(没有直接检验过):图替代的是搜索回合,所以当模型本来要走很多回合时,图才划算,也就是较弱的模型遇上较大的仓库。强模型用 grep 本来就搜得很高效,而在小仓库上,谁都用不着很多回合。

Copilot 按提示词收取高级请求,不管调用了多少次,所以在 Copilot 里用图省不了钱。它省的是时间:haiku 在大仓库上回答结构性问题,用图的耗时中位数是 71 秒,用 grep 是 157 秒。在小仓库上,图方案更慢。

每种方案错在哪里

与第一篇笔记相比有什么变化

第一篇笔记说,在节点数不超过 25k 的仓库上配合 Claude 模型使用图,不要指望能省 token。在这样的规模上,这一点依然成立。它没有看到超过这个规模之后的情况:在 kubernetes 和 vscode 上,较小的模型会获益,而且模型越小,获益越多。

我会对正在把图接入智能体的团队说什么

局限

复现

所有东西都在 code-graph-vs-grep 里:运行之前写好的计划、附有每条标准答案依据的问题、驱动程序、全部 664 次运行及其答案,以及分析。

node bench/run-copilot.mjs --model claude-haiku-4.5 --reps 3 --out results/v2/claude-haiku-4.5.json
python3 bench/stats-v2.py results/v2/*.json