给 AI 编程工具装上「代码地图」:code-review-graph 如何用结构化图谱砍掉 82 倍 token

凌晨一点,你的 Claude Code 正在 review 一个 2000 文件的 monorepo PR。它刚刚第三次重新读 package.json,又一次展开整个 src/utils/ 目录去” 理解结构”,又一次把已经看过的测试文件重新加载一遍 —— 单次 review 的 token 账单悄悄爬到了 87 万,眼看就要触发速率限制。这一幕对任何用过 AI 编程工具做 code review 的人来说都不陌生:AI 不缺能力,缺的是一张地图。今天要拆解的 tirth8205/code-review-graph,正是为这个问题而生的 —— 一个本地优先的代码智能图谱,已经在 GitHub 上拿下 26.9k stars、2.5k forks,并且在 Trending 当日榜上稳居前列。

一、项目背景:为什么 AI 编程工具需要” 代码地图”

过去两年,AI 编程工具(Claude Code、Codex、Cursor、Copilot 等)的演进一直围绕一个矛盾展开:模型上下文窗口越来越大,但仓库本身在爆炸

一个真实的中型 monorepo 往往有:

  • 代码体量:5 万到 50 万行,文件数 2,000 到 30,000
  • 依赖深度:从入口函数到底层工具函数,调用链可能 8 层以上
  • 测试覆盖:每个核心模块都伴随大量 mock、fixture、集成测试
  • 跨语言模块:前端 TS、后端 Go、算法 Rust、配置 YAML 混杂

当 AI 工具被要求” 理解这个 PR 影响哪些文件” 或” 为这个函数补一个测试” 时,它的默认行为是:

  1. 盲目 ls + read:把入口文件和它能看到的依赖全部加载
  2. 反复重读:每次新工具结果回来,都要重新” 认识” 项目结构
  3. 过度展开:把 5 个相关文件展开成 50 个上下文片段,因为没有结构化的” 哪些调用了哪些” 信息

直接后果:

  • token 消耗爆炸:单次中型 review 动辄 50-100 万 token,单次任务成本可能超过 $1
  • 精度反降:上下文窗口被无关文件填满,关键信号被稀释
  • 响应变慢:网络往返 + 推理时间都拉长
  • 撞上速率限制:tool-heavy 任务最容易触发 RPM 上限

传统解决方案各有缺陷:

  • RAG 向量检索:粒度太粗,给回大段代码片段
  • cgrep/ripgrep:只能搜文本,看不出调用图
  • LSP / 语言服务:每个 IDE 各一套,跨工具不通用
  • 手写索引脚本:只为单次任务写,不可复现

code-review-graph 走的是另一条路:用 Tree-sitter 把整个仓库解析成结构化图谱(节点 = 函数 / 类 / 导入,边 = 调用 / 继承 / 测试覆盖),存进本地 SQLite,然后通过 MCP 协议暴露给 AI 工具。这样 AI 不是” 读代码”,而是” 查询图”。

二、核心功能:一张图,五种能力

code-review-graph 的设计哲学是” 一次建图,处处查询”。安装和初始化极其轻量:

1
2
3
pip install code-review-graph      # 或 pipx install code-review-graph
code-review-graph install # 自动探测并配置 15+ AI 平台
code-review-graph build # 建图,500 文件约 10 秒

install 子命令会智能检测你已经安装了哪些 AI 编程工具,自动写好 MCP 配置,无需手动编辑 JSON。支持范围包括:Codex、Claude Code、CodeBuddy Code、Cursor、Windsurf、Zed、Continue、OpenCode、Antigravity、Gemini CLI、Qwen、Qoder、Kiro、GitHub Copilot、GitHub Copilot CLI。

建图完成后,你的 AI 工具获得了五个关键能力:

1. 最小上下文查询(Minimal Context Query)

这是最核心的能力。AI 不再 cat 整个文件,而是查询:” 要理解 AuthService.login 的修改,我需要读哪些文件?” 图谱直接返回最小集合。

在 6 个真实开源仓库上做的基准测试,平均削减 82 倍 token,最高 fastapi 仓库达 528 倍

仓库 朴素全文 token 图谱查询平均 token 削减倍数
fastapi 951,071 2,169 528.4x
code-review-graph 208,821 2,495 93.0x
gin 166,868 1,990 91.8x
flask 125,022 1,986 71.4x
express 135,955 3,465 40.6x
httpx 89,492 2,438 38.0x

2. 影响半径分析(Blast-radius Analysis)

一个 PR 改了 utils/parser.py,影响半径有多大?哪些业务函数调用了它?哪些测试会失败?哪些文档需要同步?

通过图谱的” 反向可达性” 查询,AI 可以一次问清楚:

1
2
查询:被 parse_expression() 直接或间接调用的所有函数 + 它们的测试用例
返回:23 个生产函数 + 11 个测试用例 = 最小影响范围

这比让 AI 自己 grep -r parse_expression 然后人工总结快一个数量级。

3. 增量更新(Incremental Reindex < 2 秒)

代码图谱不是” 一次性快照”。它用 SHA-256 哈希检测文件变化,只重解析变动的部分。对一个 2,900 文件的项目,reindex 稳定在 2 秒内

你的工作流变成:

1
2
3
$ code-review-graph watch   # 后台守护,自动监听文件保存
# 改完一个文件,立刻触发增量更新
# 下次 AI 问问题,图谱已经是最新状态

4. Monorepo 友好

code-review-graph 自己就是一个 monorepo:27,700+ 文件。它能识别哪些文件属于” 应该索引的核心代码”,哪些是 node_modulesdistvendor__pycache__ 这类应该排除的目录。查询时只返回~15 个真正相关的文件

5. 14+ 语言统一图谱

不像 LSP 每个语言一套,code-review-graph 用 Tree-sitter 的统一接口支持:Python、JavaScript/TypeScript/TSX、Go、Rust、Java、C/C++、C#、VB.NET、Ruby、Kotlin、Swift、PHP、Scala、Solidity、Dart、R、Perl、Lua、Objective-C、Shell、Elixir、Zig、PowerShell、Julia。这意味着跨语言 monorepo(前端 TS + 后端 Go + 工具 Rust)也能用同一张图。

三、实战示例:把 code-review-graph 接到 Claude Code

理论说完,下面走一遍真实操作流程。我假设你有一个中小型 Node + Python 混合项目,对接 Claude Code。

Step 1:环境准备

1
2
3
4
5
6
7
8
# 推荐 uv(更快的 Python 包管理)
curl -LsSf https://astral.sh/uv/install.sh | sh

# 安装 code-review-graph(推荐 pipx 隔离环境)
pipx install code-review-graph

# 验证安装
code-review-graph --version

Step 2:进入项目目录,自动配置

1
2
3
4
5
6
7
8
9
cd ~/projects/my-app

# 自动探测 Claude Code 并写入 MCP 配置
code-review-graph install --platform claude-code

# 控制台会输出:
# ✓ Detected Claude Code at ~/.claude/mcp.json
# ✓ Wrote MCP server config for code-review-graph
# ✓ Registered .code-review-graph/ in .gitignore suggestion

Step 3:第一次建图

1
2
3
4
5
6
7
8
code-review-graph build

# 输出:
# [1/4] Indexing 487 files...
# [2/4] Parsing AST with Tree-sitter (Python + TypeScript + Go)...
# [3/4] Building graph edges (calls, inheritance, imports)...
# [4/4] Writing to .code-review-graph/graph.db (SQLite, 12MB)
# ✓ Done in 9.3s

.code-review-graph/graph.db 就是本地知识图谱。它是纯 SQLite 文件,意味着可以 git diff、备份、跨机器迁移,不像向量数据库那样需要单独服务

Step 4:让 Claude Code 用上图谱

打开 Claude Code,直接自然语言提问:

1
2
3
4
5
我刚改了 src/auth/login.py 的 login() 函数,返回值从 Optional[User] 改成 AuthResult。
请用代码图谱分析:
1. 这个变更的影响半径(列出所有直接/间接调用方)
2. 需要同步更新的测试文件
3. 是否有任何公开 API 文档需要改

Claude Code 会调用 code-review-graph 暴露的 MCP 工具 query_impact_radiusfind_callersfind_tests_for,而不是 read 一堆文件。最终回复会附上 token 节省估算(v2.3.4+ 自动附加):

1
2
3
4
5
6
7
8
9
10
11
12
【分析完成】context_savings: 减少 87.3% token (从 ~91k 降到 ~12k)

影响函数(4 层深度):
1. AuthService.login() (src/auth/service.py:42)
└─ AuthController.handle_login() (src/api/auth.py:18)
└─ api_router /auth/login (src/api/routes.py:88)
└─ 测试: tests/integration/test_auth_flow.py::test_login_success
└─ 测试: tests/unit/test_service.py::test_login_invalid_token

需要更新文档:
- docs/api/auth.md (描述了旧的 Optional[User] 返回值)
- CHANGELOG.md (新增 breaking change 条目)

Step 5:watch 模式 + CI 集成

开发时持续监听:

1
2
3
code-review-graph watch
# 监听文件保存,自动 reindex 变动的文件
# 一个 2,900 文件的项目,reindex < 2s

CI 里可以加 GitHub Action:

1
2
3
4
5
6
# .github/workflows/crg.yml
- uses: tirth8205/code-review-graph@v2
with:
action: impact-analysis
base: main
head: ${{ github.head_ref }}

这样 PR 提交流程会自动运行影响分析,AI 编程 agent 拿到的就是已经结构化好的 blast-radius 报告,而不是把整个 PR diff 重新塞进上下文。

四、适用场景和限制

适用场景

  • 中型及以上代码库的 code review:5,000+ 文件的仓库效果最明显
  • 跨语言 monorepo:前后端 / 工具链混合项目
  • 高频 AI 重构任务:长会话、跨多个 PR 的连续工作
  • CI 中的自动化影响分析:配合 GitHub Action 拦截 PR 风险
  • 成本敏感的个人 / 小团队开发者:每省一倍 token,等于省一倍账单

已知限制(README 诚实声明)

作者在 README 中明确标注了几条重要限制:

  1. 召回上限是循环的:平均 recall 显示 1.000,但这是因为 ground truth 来自同一张图 —— 基本上是上限值。作者提到”honest co-change mode” 会更低但更真实,正在补测。
  2. 小修改不如全文本:单行 typo fix 建图不划算
  3. 不支持的语言不索引:Tree-sitter 不识别的语言文件直接跳过
  4. 首次建图成本:500 文件~10s,超大 monorepo 可能需要预热缓存
  5. MCP 协议依赖:必须用支持 MCP 的 AI 工具,老式 chat-only 模型无法直接受益

另外提一个工程现实:528x 是 fastapi 的极端 case,~82x 才是中位数。这数字仍然惊人,但如果项目方沟通时被” 用 528x 当 headline” 误导就尴尬了 ——README 也专门加了一行注释澄清。

五、和同类方案的对比

维度 code-review-graph 向量 RAG (e.g. Cognee) cgrep / ripgrep LSP 单语言
粒度 函数 / 类节点 文本块 文本行 符号级
跨语言 ✅ 14+ ✅ 通用 ✅ 通用 ❌ 单语言
调用图 ✅ 原生 ❌ 需后处理 ✅(但单语言)
持久化 ✅ SQLite ✅ 向量库 ❌ 无状态 ⚠️ IDE 进程
AI 集成 ✅ MCP 一键 ⚠️ 需自己接 ⚠️ IDE 限定
Token 削减 82x 中位数 5-10x N/A N/A
本地优先 ⚠️ 多数要云

定位上,code-review-graph 更像”AI 编程工具专用的代码图谱层”,而不是通用代码搜索引擎 —— 这一定位让它在 AI Agent 时代找到了非常精准的缝隙。

六、总结

tirth8205/code-review-graph 不性感、不复杂,但它解决的是 AI 编程时代一个具体到刺痛的体验问题:AI 浪费在读无关文件上的时间、金钱、上下文窗口

它的产品决策值得借鉴:

  • 本地优先 + SQLite:消除部署摩擦,背靠 git diff 友好的纯文件
  • MCP 原生集成:不与某个 IDE/Agent 绑定,而是成为它们共同依赖的能力层
  • 诚实公开 limitation:README 主动标注 circular recall 等边界问题,比画大饼的项目让人放心得多

如果你正在用 Claude Code / Codex / Cursor 做中型以上项目的 review、开发、重构,强烈建议花 5 分钟装一下。一周下来你能直观感受到的不只是 token 账单下降,更是 AI 突然变得” 懂你的代码” 的那种流畅 —— 因为它终于拿到了地图。

仓库地址:https://github.com/tirth8205/code-review-graph
PyPI:https://pypi.org/project/code-review-graph/
项目官网:https://code-review-graph.com