← 返回实验室

代码图没有让我的编程智能体更省钱

benchmarkmcpcoding-agentsevals

两个数字让我回到了这个基准测试。codebase-memory-mcp 是一个基于 tree-sitter、通过 MCP 提供的代码图,它的 README 承诺能少用 99% 的 token。我自己之前的一次运行显示,我给它写的一层薄包装 cbm-lean,让编程智能体在 haiku 上比普通 grep 便宜 26%,在 sonnet 上便宜 18%。第一个数字我始终没能复现,第二个则来自我实验设置里的一个缺陷。这是在公开仓库上、修正了那个缺陷之后的重新运行。

设置

每个问题都在三种方案下运行:

每个仓库有十二个问题。六个是结构性的:谁调用了某个函数,它又调用了什么,从一个 HTTP 端点到数据库写入的调用链,模块布局。另外六个是精确性的:一个配置值,某个环境变量在哪里被读取,一条错误信息,某个类定义在哪一行。每个问题都列出了正确答案必须包含的子串,每一条我都亲手对照代码核对过。

仓库包括三个小仓库(FastAPI 全栈模板、ltx-2-mlx 和 avoid-ai-writing,图节点数 1.6k 到 5k),以及 dub,一个有 25k 节点的 Next.js monorepo。Haiku 4.5 在所有仓库上运行,sonnet 5 在 dub 上运行:共 252 次运行,按 API 价格计 $14.69。

成本以 tokenEquiv 衡量:输入 token,加 1.25 × 缓存写入,加 0.1 × 缓存读取。一旦开启提示词缓存,原始的计费输入就会误导人,因为碰巧在热缓存上运行的方案,会因为与方案本身无关的原因显得便宜。

结果

每次运行的 tokenEquiv 中位数,括号里是正确答案数:

场景运行次数cbm-lean原始图grep
小仓库,haiku 4.510830,321 (28/36)43,846 (32/36)31,159 (33/36)
dub,haiku 4.57218,791 (22/24)20,687 (22/24)14,955 (20/24)
dub,sonnet 57217,227 (22/24)23,085 (22/24)13,348 (22/24)

有三个结果站得住:

p 值来自对每个问题中位数做的 Wilcoxon 符号秩检验。

每种方案错在哪里

挂载了图,不等于用上了图

最有用的结果来自试点,而不是正式运行。Claude Code 2.1.283 默认把 MCP 工具的 schema 延后到一个 ToolSearch 步骤之后:模型能看到工具名,但必须先获取 schema 才能调用任何东西。无头模式下的 haiku 没有这么做。在六次试点运行中,无论有没有路由规则,图一次都没有被调用。在那十二个小仓库问题上:

配置调用了图正确tokenEquiv 中位数
默认加载,有规则12 个中 2 个12 个中 11 个41,008
已加载 schema,无规则12 个中 4 个12 个中 9 个62,008
已加载 schema,有规则36 个中 22 个36 个中 28 个30,321

加载了 schema 之后(ENABLE_TOOL_SEARCH=false),同一个关于调用方的问题在三轮中经历了两次图调用。挂载了图却没有规则,是所有配置里最贵的:每个会话都要为 schema 付费,而模型大多让它们闲着。

如果你发布了一个 MCP 服务器,并且用默认设置测试它,先确认模型到底会不会调用它。

为什么之前的数字是错的

第一次基准测试是在我的项目文件夹里跑的。那里的 CLAUDE.md 告诉智能体结构性问题要用图,而 Claude Code 会加载上级目录里的 CLAUDE.md 文件,所以这条指令传到了每一种方案,包括没有图的那一种。对照组拿到了实验组的指令,也就是说,这个比较测到的规则和工具一样多。

重新运行时,仓库被放在任何上方有 CLAUDE.md 的目录树之外,跳过用户设置和钩子(--setting-sources project),并且只把规则给有图的方案。其余每一项对照措施,都各自纠正过之前某一轮里的一个错误结论。Bash 和 Agent 在所有方案中都被禁用,因为限定范围的 Bash 授权匹配不上管道命令,而子智能体会隐藏回合,同时照样消耗 token。方案的顺序在每轮重复之间轮换,所以没有哪个方案总是在热缓存上运行。调用了不属于自己方案的工具的运行会被丢弃。答案也要评分,因为在错误答案上省下的 token 不算节省。

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

局限

两个模型,四个节点数不超过 25k 的仓库,两到三次重复,每个仓库十二个问题。没有 Opus,没有长时间的交互式会话,没有超过 25k 节点的仓库。之所以报告中位数,是因为同一问题的重复运行结果差异很大。

复现

所有东西都在 code-graph-vs-grep 里:带固定提交的问题、基准测试驱动程序、包含每个答案的原始运行记录,以及 cbm-lean 本身。

bash bench/setup.sh
node bench/run.mjs --reps 3
python3 bench/stats.py results/*.json
代码图没有让我的编程智能体更省钱 · AllKeep