用知识图谱替代海量嵌入向量:单体仓库代码分析新方案
一个常见场景:当你将一个大型单体仓库交给 AI 助手时,它开始混淆相邻服务的函数调用,失去模块间的连接,甚至编造出不存在的参数。常规向量搜索在查找相似文本片段方面相当不错。然而,向量表示在理解代码的严格结构方面存在困难——一个变量的重命名或隐式导入就可能改变整个应用的逻辑。
开发者 Vitaliy 创建了 code-graph-rag 项目来系统性地解决这个问题。该工具不依赖向量嵌入,而是构建代码库的知识图谱。
底层工作原理
该系统建立在三个核心组件之上:Tree-sitter 解析器、Memgraph 图数据库和 Qdrant 向量数据库。
工作流程如下:
- Tree-sitter 将源代码文件解析为抽象语法树(AST)。
- 分析器提取节点:函数、类、方法、模块及其之间的关系。
- 数据以统一的、与语言无关的架构写入 Memgraph。
- 在此结构之上,CLI 工具
cgr将自然语言问题转换为精确的 Cypher 查询,发送到图数据库。
因此,当你问"函数 X 在哪里被使用,数据接下来流向哪里?"时,系统不会基于空间中的向量相似性来猜测答案。它对图执行有针对性的查询,并返回实际的调用路径。
Исходный код -> Tree-sitter -> AST-анализ -> Граф знаний Memgraph
|
Запрос пользователя -> AI-модель (Cypher) -> Запрос Cypher -> Результаты
工具功能
该项目支持 13 种语言,包括 Python、TypeScript、Go、Rust、Java、C++、C# 和 PHP。Scala 支持仍在开发中,Ruby 使用 ast-grep 模式匹配进行解析。
以下是 cgr 能解决的主要任务:
- 代码导航和问答。你不仅可以按名称查询函数源代码,还可以按含义或架构角色进行查询。
- 死代码检测。该工具从应用入口点遍历关系图,找出通过任何调用链都无法到达的函数或模块。
- 结构化搜索和替换。它使用 ast-grep 而非经典正则表达式。该工具在语法树中搜索模式,并在保持结构的同时仔细重写代码。
- 数据流追踪。
FLOWS_TO功能追踪变量值如何通过赋值链和函数调用传递,最终到达 I/O 操作。目前支持 C#、Java、C 和 Go 的追踪。
额外的好处是支持 Model Context Protocol (MCP)。这意味着 code-graph-rag 可以作为 MCP 服务器运行,并直接连接到 Claude Code 或任何其他支持 MCP 的客户端。AI 代理将能够自主查询精确的项目结构,并以现成的 diff 形式提出修改建议。
快速开始和系统要求
该工具以 Python 包 code-graph-rag 的形式分发。要获得完整功能,你需要安装 Docker(用于 Memgraph 和 Qdrant 容器),以及 cmake 和 ripgrep 系统工具。
安装 CLI 工具最简单的方式是通过 uv 或 pipx:
uv tool install "code-graph-rag[treesitter-full,semantic]"
安装后,你需要设置本地环境并开始为仓库建立索引:
# Запуск контейнеров базы данных
cgr daemon up
# Индексация кодовой базы в новый граф
cgr start --repo-path /path/to/repo --update-graph --clean
# Интерактивный режим работы
cgr start --repo-path /path/to/repo
如果你计划在 CI/CD 中使用该工具或通过 MCP 连接到代理,文档中有关于配置设置和图导出的详细章节。
值得采用吗?
对于使用多语言单体仓库的团队来说,这个项目看起来很有前景。当代码库超过十万行且服务间连接依赖于跨不同文件夹的函数调用时,常规 AI 助手往往力不从心。图方法从根本上解决了这个问题,将严格的代码拓扑与语言模型的灵活性相结合。
当然,你应该考虑学习曲线。你需要运行包含 Memgraph 的 Docker 容器,在初始扫描期间为图构建分配资源,并配置 LLM API 密钥。但如果你厌倦了在重构复杂项目时的神经网络幻觉,花半小时熟悉 code-graph-rag 绝对是值得的。
相关项目