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 的工作原理

两阶段图谱构建

  1. 文件摘要 – 每个源文件都会传递给 LLM(可选)以生成一段简短的英文描述。
  2. 节点聚合 – 摘要被分组到一组精选的 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
  • 项目