Graft:开源上下文层将 Claude Code Token 使用量降低 42% 并提升 SWE‑bench 准确率
TL;DR
Graft 构建了一个持久的、基于 Markdown 的代码图谱,代理可以对其进行查询,而无需反复对仓库进行 grep;这使得 Claude Code 的 Token 使用量减少了 42%,工具调用减少了 46%,运行速度提高了 60%,并将 SWE‑bench 的正确率从 54% 提升至 66%。
Graft 的主张
- 效率提升 – 在一个受控的 162 次运行基准测试中,与每次任务都重新探索仓库的“冷” Claude Code 会话相比,Graft 节省了 42% 的 Token、46% 的工具调用和 60% 的延迟。
- 正确性改进 – 在行业标准的 SWE‑bench Verified 套件(50 个真实的 GitHub issue)上,Graft 解决了 33 个案例,而基准测试为 27 个,提升了 12 个百分点。
- 成本降低 – 同一基准测试显示,墙上时钟时间(wall-clock time)减少了 32%,货币成本降低了 19%。
- 语言支持 – 对 TypeScript/JavaScript、Python、Go、Java 进行高保真解析;通过 tree-sitter 为另外 20 种语言提供更广泛的支持;为 Rust、C/C++ 等提供可选的基于 LSP 的边(edges)。
- 零运行时开销 – 结构化图谱 (
graft build) 在本地运行,无需 API 密钥;只有可选的 LLM 摘要功能 (--deep) 会联系供应商。
Graft 的工作原理
两阶段图谱构建
- 文件摘要 – 每个源文件都会传递给 LLM(可选)以生成一段简短的英文描述。
- 节点聚合 – 摘要被分组到一组精选的 Markdown 节点中(子系统、关键文件、概念),并带有类型的 wikilinks (
[[node]])。
生成的 graft/ 目录是一个纯文件缓存,与代码并存,可以提交到 Git。
节点内容
| 部分 | 描述 |
|---|---|
| Summary | 由 LLM 生成并缓存的关于代码用途的一句英文解释。 |
| Crux | 实现核心逻辑的最少源文件行,原样存储。 |
| Sources | 支持该节点的路径和内容哈希,实现精确的陈旧检查检测。 |
| Links | 以 [[wikilinks]] 形式表达的类型化关系 (depends_on, part_of, uses 等)。 |
| Notes | 用户编写的自由文本,在重新生成时得以保留。 |
增量刷新
- 图谱重建通过内容哈希进行缓存;只有发生变化的文件才会触发 LLM 调用。
- 在每个
graft ask/grep/callers命令之前,都会运行一个轻量级的$0结构化刷新,确保图谱反映未提交的编辑,且无需网络调用。
与编程代理的集成
graft init检测支持的代理(Claude Code, Cursor, Gemini, Codex, Copilot 等)并写入必要的指令或技能文件。Claude Code 会接收实时状态行、自动同步钩子以及匹配节点的单次会话导入。- MCP server – 注册了六个工具端点 (
graft_find_code,graft_file_api,graft_trace_calls,graft_find_all,graft_repo_map,graft_check_freshness),代理可以直接调用。 - 无需守护进程 – 图谱以普通文件形式存在;除非用户选择可选的 MCP server,否则不需要后台服务。
基准测试
受控 162 次运行扫描
| 指标 | 冷 Claude Code | Claude Code + Graft |
|---|---|---|
| 成本节省 ($) | 0.0429 | 0.0292 (+32%) |
| Token 节省 | 8,070 | 4,650 (+42%) |
| 工具调用节省 | 4.2 | 2.3 (+46%) |
| 延迟 (s) | 39.8 | 15.8 (+60%) |
| 正确性 | 93% | 93% |
“拉取”(pull)变体(按需使用 graft 工具)实现了最高的正确率 (98%),但牺牲了大部分速度优势。
SWE‑bench Verified (50 个真实问题)
| 指标 | 冷 Claude Code | Claude Code + Graft |
|---|---|---|
| 正确性 | 27/50 (54%) | 33/50 (66%) |
| Token 节省 | 142 M | 109.4 M (+23%) |
| 成本节省 | $52.34 | $42.43 (+19%) |
| 工具调用节省 | 1,370 | 1,031 (+25%) |
| 墙上时钟时间 | 13,094 s | 8,922 s (+32%) |
正确性的提升源于更好的跨文件推理;基准测试通常只修复单个文件而忽略了依赖文件。
Hacker News 上的社区反馈
@seizethecheese – “这个基准测试部分读起来像是 Claude/Codex 写的;50 个任务的 SWE‑bench 样本太小,且 p-value (0.22) 很弱。很容易进行樱桃拾取(cherry-pick)任务。”
该评论强调发布的结果是基于有限样本和单次运行的,这限制了统计置信度。
@icodestuff – “我担心长会话中的图谱陈旧问题。增量刷新可能会悄无声息地发生漂移,而且
graft/中的合并冲突可能会很痛苦。”
这指出了一个实际风险:长时间运行的会话可能会依赖过时的摘要,当多位开发人员编辑相同的概念时,可能会出现版本控制冲突。
@xhrpost – “Claude 的 LSP 集成是否已经减少了 grep 的使用?Graft 是否在解决一个重复的问题?”
该问题澄清了 Graft 的价值主张是独特的:它提供的是持久的、人类可读的知识图谱,而不是一次性的基于 LSP 的符号查找。
@gabosarmiento – “与 Graphify 相比的基准测试是什么?”
仓库中未提供直接对比;该主张仍有待验证。
总的来说,评论者对这个想法表示赞赏,但要求进行更严谨、更大规模的评估以及冲突解决工具。
实际用法
快速开始 (npm)
npm install -g @nanonets/graft # 安装 CLI
graft init # 选择代理,构建 `graft/`,连接 Claude Code
graft init --dry-run显示将要写入的文件。graft build在不调用 LLM 的情况下创建图谱;graft build --deep添加 LLM 生成的摘要(需要 API 密钥)。
核心 CLI 命令
| 命令 | 用途 |
|---|---|
graft ask "<task>" |
对回答自然语言查询的节点进行排序(无需 LLM)。 |
graft grep "<regex>" |
详尽的正则搜索,按包含的符号分组。 |
graft map |
受 Token 预算限制的仓库导向(目录集群、枢纽、热点)。 |
graft callers <symbol> |
显示符号的入站/出站调用图谱。 |
graft viz |
启动 Markdown 和代码图谱的交互式 Web 查看器。 |
所有命令都接受 --no-refresh 来跳过自动结构更新,环境变量 GRAFT_NO_REFRESH=1 可全局禁用它。
局限性与开放问题
- 统计稳健性 – 基准测试基于 162 次运行和 50 个 SWE‑bench 实例;更大规模、多种子研究将增强主张的力度。
- 图谱陈旧 – 增量刷新仅限于结构;如果源代码在未重建的情况下发生变化,LLM 生成的摘要可能会过时。
- 合并冲突 –
graft/存在于仓库中;对同一节点的同步编辑可能会导致需要手动解决的 Git 冲突。 - 对比基准 – 未提供与其他代码图谱工具(如 Graphify, Repowise)的公开对比。
结论
Graft 证明了确定性的、基于 Markdown 的代码图谱可以显著降低 LLM 驱动的编程代理的 Token 和工具调用开销,同时提高在 SWE‑bench 上的实际正确性。这种方法很有吸引力,因为它不需要守护进程,适用于任何 LLM 供应商,并通过简单的 CLI 与多个代理集成。然而,目前的证据建立在适中的基准测试规模之上,生成知识图谱的长期稳定性仍然是一个开放的工程挑战。
Sources
相关
- 项目
- Dispatch
- 项目
- Dispatch
- 项目