📌 项目地址vitali87/code-graph-rag
| ⭐ 2,850 颗星 | 🔧 Python | 📜 未标注

问题:代码检索的两种困境

代码库大到一定程度,开发者会面对两类头疼的问题。

第一类是定位问题。“这个函数在哪里定义”“谁调用了它”“这个模块依赖了哪些其他模块”。传统文本搜索对这类问题基本无效,因为跨文件、跨语言的结构关系根本不是字符串能表达的。

第二类是修改问题。改一个接口签名,会影响哪些调用方?删掉一段代码,有没有别的地方在引用?大多数团队用
grep 加人工确认,过程慢,还容易漏。

近几年流行的向量 RAG
方案能解决一部分“语义相似检索”的问题,但它对“调用链”和“继承关系”这类结构化问题无能为力。向量嵌入只记录代码块之间的语义相似性,不记录它们之间的真实依赖关系。

解法:用图结构存代码,用自然语言查图

Code-Graph-RAG 走了一条完全不同的路。它不是把代码切块算嵌入,而是用
Tree-sitter 把整个代码库解析成
AST,再抽取函数、类、方法、模块以及它们之间的关系,存入 Memgraph
图数据库。用户提问时,系统用 LLM 把自然语言翻译成 Cypher
查询,直接在图上检索。

Source Code -> Tree-sitter Parser -> AST Analysis -> Memgraph Knowledge Graph
                                                             |
User Query -> AI Model (Cypher Gen) -> Cypher Query -> Graph Results -> Response

这套设计有两个直接好处。

查询准确度更高。“被谁调用”这个问题在图数据库里是一条遍历边操作,答案是有确定性的,不是相似度排序的结果。

修改更安全。代码编辑发生在 AST
层,不是文本替换。系统可以给出精确的语法树级修改,先看 diff
再应用,降低了改坏代码的风险。

图里存了什么

项目的核心是“一套语言无关的图模式”,意思是无论源码是 Python 还是
Rust,解析出来的图结构都一样:节点是函数、类、方法、模块,边是调用、继承、导入等关系。

这套模式在项目中定义为:文件代表模块,模块里有类和函数,类里有方法,函数之间通过调用关系连接。所有语言都映射到同一个结构,这样才能跨语言查询,也方便在
monorepo 中追踪依赖。

项目还沿调用和引用边从入口点遍历来识别死代码。这是图结构的一个天然用途:从入口节点出发,标记所有可达的节点,不可达的就是候选死代码。

多语言支持的设计

支持语言列表相当长:Python、TypeScript、TSX、JavaScript、Rust、Go、Java、C、C++、C#、PHP、Lua、Dart。Scala
还在开发中。

Ruby 的加入方式值得一提。项目没有为 Ruby
手写解析器,而是通过一个可插拔的 ast-grep 层,用一个描述语法模式的 YAML
文件就把新语言加入图结构。这意味着它抽取支持的语言并生成模块、函数、类节点和导入边,不需要为每种语言写一次性代码。

类似的,项目在结构搜索与替换中用了 ast-grep,可以按 AST
模式匹配代码结构并重写,而不是依赖文本或正则表达式。对“把某种模式全部改成另一种写法”这类批量重构,这种能力比字符串替换可靠得多。

数据流追踪是另一个值得关注的功能。它给值流添加 FLOWS_TO
污点边,标记值如何经过赋值、函数调用最终到达 I/O 汇点。目前覆盖
C#、Java、C 和
Go。如果是分析安全漏洞的数据路径,这种跨函数跟踪能力是有价值的。

使用中需要注意什么

项目有两点使用门槛。

一是需要部署 Memgraph。整个系统的存储和查询都依赖它,不是简单的 pip
install 就能跑。实际使用前需要安装 Memgraph 实例,并确保网络连通。

二是 README 没有提供具体的安装命令。项目目录下有两个入口:Tree-sitter
解析器和 codebase_rag/ 下的 RAG
CLI。具体安装和配置过程要看项目的文档。想试用的人需要费点功夫。

图数据库的运维知识也需要有。Cypher 查询虽然由 LLM 生成,但 Memgraph
本身是独立服务,需要了解如何启停、备份、调参。

实验性功能的比例

这个项目在快速迭代中。最新更新频繁,说明功能在持续变化。如果你要用真实项目,我建议先在非核心仓库跑一遍,确认对所用语言的支持状态和输出质量。图数据库作为代码索引的架构目前还是小众方案,遇到问题社区支持不如主流工具多。

适合什么人用

需求明确的团队最合适:维护多语言
monorepo、经常需要回答跨语言依赖问题、要做结构性重构。如果你只是单语言项目而且团队规模小,传统工具链可能已经够用,迁移到这套方案的成本需要认真评估。但如果你长期被“改动影响范围”和“代码导航”问题困扰,这套基于图结构的技术路线值得关注。

项目的 GitHub 仓库有 2850 颗星,架构文档和工作原理在 docs
目录下有详细说明,源代码也已开放。

这篇文章对你有帮助吗?

发表回复