code-review-graph架构深潜:从Tree-sitter AST到SQLite知识图谱的完整流水线
【免费下载链接】code-review-graphLocal-first code intelligence graph for MCP and CLI. Builds a persistent map of your codebase so AI coding tools read only what matters, with benchmarked context reductions on reviews and large-repo workflows.项目地址: https://gitcode.com/GitHub_Trending/co/code-review-graph
code-review-graph 是一个本地优先(local-first)的代码智能工具:它用Tree-sitter把源码解析成 AST,再存入SQLite 知识图谱,让 AI 编程工具在代码评审时只读取真正相关的代码,把 token 消耗降低一到两个数量级。这篇文章带你深入它的完整流水线——从文件收集、AST 解析、图存储,到增量更新与影响范围分析,看看这张"代码地图"是如何一步步建成的 🗺️
为什么要给代码建知识图谱:71 倍的 token 账单
传统方式下,AI 工具评审一次改动,往往要把大半个仓库塞进上下文。以 Flask 为例:读全量代码需要143,594 tokens,而基于知识图谱的回答只要2,196 tokens——71 倍的差距 💸
code-review-graph 的答案是:不要每次都重读仓库,而是提前把代码结构画成一张图,常驻本地。评审时,直接查图。
总览架构:从仓库到评审的四段流水线
整条流水线可以概括为四个阶段:收集文件 → Tree-sitter 解析 AST → 存入 SQLite 图 → 评审时计算最小阅读集。
系统通过 CLI 和 MCP 服务器(stdio 或 localhost HTTP)两种形态对外提供服务,内置约 30 个 MCP 工具与 5 个评审提示词,可接入 Codex、Claude Code、Cursor、Windsurf、Zed、Gemini CLI 等主流 AI 编程工具。服务入口在 main.py,完整架构说明见 docs/architecture.md。
第一站:Tree-sitter AST 解析——把源码变成节点和边
一切从收集文件开始:collect_all_files()通过git ls-files拿到全部受跟踪文件,并应用.code-review-graphignore过滤规则,实现位于 incremental.py。
随后每个文件交给CodeParser.parse_file()(parser.py),由 Tree-sitter 生成 AST。解析器递归遍历语法树,按语言特定的节点类型映射表(_CLASS_TYPES、_FUNCTION_TYPES等)识别出两类信息:
- 结构节点(Node):文件、类、函数、类型、测试函数,连同行号、语言、参数、返回类型、是否测试等属性;
- 关系边(Edge):函数调用(CALLS)、模块导入(IMPORTS_FROM)、继承(INHERITS)、实现接口(IMPLEMENTS)、包含(CONTAINS)、测试覆盖(TESTED_BY)等十余种关系。
为了让图中每个符号都能唯一定位,code-review-graph 采用**限定名(qualified name)**方案,格式统一为「文件路径 +::+ 符号名」,例如:
/repo/src/auth.py::AuthService.login这个设计在后续所有查询中都作为图的"主键"使用,规则详见 docs/schema.md。
第二站:SQLite 知识图谱——节点的"户籍档案"
解析出的节点与边由GraphStore.store_file_nodes_edges()持久化到 SQLite(graph.py),数据库文件为.code-review-graph/graph.db。核心表结构非常清晰:
| 表 | 作用 |
|---|---|
nodes | 节点:kind、限定名、文件路径、行号、语言、文件 SHA-256 哈希等 |
edges | 边:关系类型、源/目标限定名、位置、置信度 |
metadata | 键值对:最后构建时间、构建类型、schema 版本 |
flows/flow_memberships | 调用流及其成员节点,用于"从入口出发了哪些路径" |
communities | 社区(功能聚类):内聚度、规模、主导语言 |
nodes_fts | FTS5 全文索引,支持名称/签名/路径的全文检索 |
community_summaries、flow_snapshots、risk_index | 预计算的紧凑摘要,专为 token 高效查询服务 |
embeddings(独立库) | 语义向量,用于语义搜索 |
几个值得新手注意的工程细节:
- 表上建了限定名、文件路径、边源/目标等大量索引,保证百万节点级仓库上的查询仍然飞快;
- 开启WAL 模式,更新期间读请求不阻塞;
- 每个文件节点记录SHA-256 哈希,这是第三站增量更新的钥匙 🔑
第三站:增量更新——只重解析真正变了的文件
全量构建一个 500 文件的项目大约只要 10 秒,但大仓库天天重建不现实。code-review-graph 的增量引擎(incremental.py)分四步走:
get_changed_files()通过git diff(也支持 SVN)找出变更文件;find_dependents()在图里反查"谁 import 了这些文件";- 变更文件 + 依赖文件一起重解析,其余文件通过哈希比对直接跳过;
- 只更新 SQLite 中受影响的行。
解析阶段还会用进程池并行(默认取 CPU 核心数与 8 的较小值),一个约 3,000 文件的 django 规模项目上,两文件改动重索引约 2.5 秒。
配合 watch 模式与平台原生 hooks,保存文件时图谱会自动跟上,无需手动执行任何命令。
第四站:影响范围分析——评审时的"爆破半径"
图谱建好后,评审时发生了什么?当你修改了login(),get_impact_radius()(graph.py)会从变更符号出发,同时向两个方向扩展:
- 正向边:这个函数影响了谁(下游调用链);
- 反向边:谁依赖这个函数(上游调用者);
默认扩展 2 跳,并对每条路径按「边类型权重 × 深度衰减」计算加权得分,而不是朴素的 BFS,因此越近、关系越强的节点排名越高。最终得到变更的影响范围(blast radius)——AI 只读这一小撮文件,而不必扫描整个项目。
效果量化:token 节省有多大
在大仓库上效果最明显:208,821 个源 token 的代码库,每个问题只需约 3,190 tokens 的上下文。仓库自带基准测试(eval/目录)在 Flask、FastAPI、Gin、Express 等真实项目上持续回归验证冲击精度、多跳检索与 token 效率。
基准的复现方法写在 docs/REPRODUCING.md,配置示例在 eval/configs/。
上手指南:三步建好你的第一张代码知识图谱
- 克隆仓库并安装:
git clone https://gitcode.com/GitHub_Trending/co/code-review-graph pip install code-review-graph- 一条命令自动检测已安装的 AI 平台并写入 MCP 配置:
code-review-graph install- 构建图谱:
code-review-graph build之后打开任意 AI 助手,直接说"Build the code review graph for this project"即可。全部命令见 docs/COMMANDS.md,遇到问题查 docs/TROUBLESHOOTING.md。
总结
code-review-graph 的流水线设计堪称"本地优先"代码智能的教科书范例:
- Tree-sitter提供语言无关的 AST,解析稳健且易扩展到 40+ 语言(docs/CUSTOM_LANGUAGES.md);
- SQLite承担持久化:节点/边双表 + FTS5 + 向量库,零运维、可离线;
- SHA-256 哈希 + 图边反查让增量更新只碰真正变化的文件;
- 加权双向扩展的影响范围算法,把"读全仓库"变成"读最小集"。
理解了这条从 AST 到知识图谱的完整链路,你就不只是会用它,还能看懂它为什么快、为什么省 token 🚀
【免费下载链接】code-review-graphLocal-first code intelligence graph for MCP and CLI. Builds a persistent map of your codebase so AI coding tools read only what matters, with benchmarked context reductions on reviews and large-repo workflows.项目地址: https://gitcode.com/GitHub_Trending/co/code-review-graph
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考