Hotdry.

Article

基于代码知识图谱的RAG问答管道:图遍历与向量搜索的混合策略

探讨代码库RAG系统中图遍历检索与向量语义搜索的混合策略,分析上下文组装机制与LLM注入的工程实践。

2026-05-27ai-systems

代码库的智能问答面临着独特的挑战:开发者的问题既包含语义层面的模糊表达(如 "认证逻辑在哪里"),也涉及精确的结构依赖(如 "修改这个函数会影响哪些模块")。传统的纯向量检索 RAG 系统在处理这类问题时往往捉襟见肘 —— 它能找到语义相似的代码片段,却无法捕捉函数调用链、类继承关系等结构性信息。Understand-Anything 项目通过构建代码知识图谱,将图遍历检索与向量语义搜索相结合,形成了一套面向代码问答的混合 RAG 管道。

混合检索的必要性

代码库中的信息具有双重属性。一方面,代码片段本身承载着语义信息:函数命名、注释、实现逻辑都蕴含着 "这段代码做什么" 的语义。另一方面,代码之间存在着显式的结构关系:导入依赖、函数调用、类继承、接口实现等。纯向量检索擅长处理前者,通过嵌入相似度找到语义相关的代码块;但对于后者,如 "哪些函数调用了这个 API" 这类问题,必须依赖图结构才能准确回答。

Microsoft GraphRAG 的实现表明,将向量搜索与图遍历结合能够显著提升检索质量。具体而言,系统首先通过向量搜索识别与用户查询语义相关的种子实体,然后利用图遍历从这些种子出发,沿着关系边收集关联的上下文信息。这种 "向量召回 + 图扩展" 的模式,既保留了语义理解的灵活性,又获得了结构导航的精确性。

代码知识图谱的建模

构建有效的代码知识图谱需要精心设计节点类型和边关系。在 Understand-Anything 的架构中,图谱节点涵盖文件、函数、类、方法、常量等代码实体,边关系则包括导入(imports)、调用(calls)、包含(contains)、继承(inherits)、引用(references)等。这种建模方式使得图谱能够完整表达代码库的结构拓扑。

图谱构建采用 Tree-sitter 与 LLM 的混合策略。Tree-sitter 负责确定性解析:从源代码中提取函数定义、类声明、调用站点等结构化事实,保证相同输入始终产生相同的输出。LLM 则负责语义层补充:生成代码片段的英文摘要、标记架构层级、识别业务域映射。这种分工使得图谱在结构层面可复现,在语义层面富有表现力。

检索管道的执行流程

混合 RAG 管道的执行可分为六个阶段。首先是查询理解,系统判断用户问题的类型 —— 是纯粹的语义查询("查找处理支付的代码"),还是结构查询("谁调用了这个函数"),或是二者的结合。这一判断决定了后续检索策略的权重分配。

第二阶段是向量种子检索。系统将用户查询编码为向量,在代码片段的向量索引中检索最相似的 Top-K 候选。这些候选作为 "种子节点" 进入下一阶段。第三阶段是图遍历扩展:从种子节点出发,沿着预定义的边类型(如调用关系、导入关系)向外遍历,收集邻居节点及其关联的代码片段。

遍历过程需要设置合理的约束参数:最大遍历深度(通常 2-3 层)、边类型过滤(如仅遍历调用链)、节点重要性阈值。这些约束防止图扩展失控,确保检索结果的相关性。第四阶段是混合评分:结合向量相似度、图距离、节点重要性等因素对候选节点进行重排序。

第五阶段是上下文组装。系统从排序后的节点中提取关联的代码片段、关系描述、社区摘要等信息,组装成结构化的上下文块。第六阶段是将组装好的上下文注入 LLM 提示,生成最终答案。答案中通常包含指向原始代码位置的引用,增强可追溯性。

上下文组装的工程细节

上下文组装是混合 RAG 的关键环节。对于代码问答场景,有效的上下文通常包含三类信息:核心代码片段(与查询直接相关的函数 / 类实现)、关系上下文(调用者、被调用者、依赖模块)、以及高层摘要(模块职责、架构层级说明)。

在实现层面,可以借鉴 Microsoft GraphRAG 的本地搜索策略:首先通过向量检索定位相关实体,然后使用类 Cypher 查询语言遍历图谱,收集关联的文本块、社区报告和实体关系。例如,对于 "请求验证如何到达数据库层" 这类问题,系统可能先通过向量搜索定位 "validation" 和 "database" 相关的代码片段,然后遍历调用链和导入关系,将控制器、服务层、仓库层的代码串联成完整的执行路径。

局限与优化方向

混合 RAG 方案并非没有局限。首先是索引成本:代码知识图谱的构建需要消耗大量 Token 进行实体提取和摘要生成,且当代码库更新时需要重新索引或增量更新。其次是规模问题:当节点存在数千个连接时,图遍历的性能会显著下降,需要对通用实体类型进行过滤以避免结果倾斜。

优化方向包括:采用增量更新机制,仅重新分析变更的文件;引入分层社区检测算法(如 Leiden 算法),在高层生成社区摘要以加速大范围查询;以及设计更精细的遍历策略,根据查询类型动态调整边权重和深度限制。

结语

基于代码知识图谱的混合 RAG 管道,通过融合向量语义搜索与图结构遍历,为代码库智能问答提供了更全面的检索能力。这种架构特别适合处理既需要语义理解又依赖结构导航的复杂查询场景。随着多智能体代码分析工具的普及,类似的混合检索策略有望成为代码 AI 助手的标准配置。


参考来源

  1. Understand-Anything GitHub 仓库:https://github.com/Lum1104/Understand-Anything
  2. Weaviate GraphRAG 技术博客:https://weaviate.io/blog/graph-rag
  3. Microsoft GraphRAG 官方文档:https://microsoft.github.io/graphrag/

ai-systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com