跨仓库代码RAG实战:如何对百万行代码做语义检索?ai-engineering-from-scratch手把手教程
【免费下载链接】ai-engineering-from-scratchLearn it. Build it. Ship it for others.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-from-scratch
ai-engineering-from-scratch是一个从零构建 AI 工程师的开源课程仓库,其中 Capstone 02「RAG over Codebase」专门演示了跨仓库代码RAG的完整方案:对多个代码仓库做 AST 感知切块、混合语义检索(向量 + BM25)、重排序并输出带文件:行号引用的答案。本文将带你理解它的核心原理,并跑通仓库里自带的可运行示例。
为什么代码搜索需要 RAG?
当代码库长到几十万甚至上百万行时,传统的字符串搜索会遇到三个问题:
- 理解不了"意思":你问"权限是怎么校验的",但代码里只有
check_permission,关键词根本对不上; - 跨仓库问答无解:一个问题的答案可能横跨 4 个仓库的文件;
- 上下文装不下:即便模型有 100 万 token 上下文,也扛不住整个单体仓库,必须先做排序检索。
生产级的解法就是一条 RAG 流水线:切块 → 嵌入 → 混合检索 → 重排 → 带引用地回答。
核心思路一:AST 感知切块,而不是按 token 硬切
固定窗口切块会把一个函数拦腰截断,导致检索质量暴跌。Capstone 的做法是用 tree-sitter 解析源码,按函数/类节点边界切块,每块记录:
{仓库, 路径, 起始行, 结束行, 符号名, 代码体, 自然语言摘要}关键亮点是每个块额外附一句 LLM 生成的摘要。这样用户问 "how is X authorized" 时,即使代码里只有check_permission,摘要中提到 "authz" 也能被命中——相当于给检索增加了第三种模态。
核心思路二:混合检索 + 倒数排名融合(RRF)
纯向量搜索对"按符号名精确查找"很弱,纯 BM25 又不懂语义。所以两个索引并行查询,再用倒数排名融合(Reciprocal Rank Fusion)合并结果:
- 每个候选按
1/(60 + 排名)累计分数,两路都靠前的结果自然胜出; - BM25 侧还做了字段加权:符号名权重 ×4、摘要 ×2、代码体 ×1,兼顾"找叫 X 的函数"和"找做 X 的函数"两类查询。
仓库里的 Python 参考实现只有两百多行,包含真实可跑的 BM25、余弦相似度索引和 RRF 融合:code/main.py。TypeScript 版把它做成了 HTTP API,融合逻辑见 retrieval.ts,索引实现见 index_store.ts。
核心思路三:增量索引与强制引用
- 增量重索引:git push 触发 diff,只重新嵌入变化的代码块。目标是"200 万行代码库上,50 个文件的提交 60 秒内可被检索";
- 引用强制:回答中每个论断都必须带
(仓库/路径:起止行)锚点,后过滤器会直接丢弃没有引用的内容,杜绝模型"幻觉引用"。
动手跑一遍示例
先克隆仓库(本地离线可运行,无需任何 API Key):
git clone https://gitcode.com/GitHub_Trending/ai/ai-engineering-from-scratch方式一:Python 快速演示。内置 6 个模拟代码块(来自 uploader / auth / client / catalog 四个仓库),跑三条真实跨仓库问题:
python phases/19-capstone-projects/02-rag-over-codebase/code/main.py方式二:TypeScript 服务版。启动后自动做健康检查和三条探针查询:
cd phases/19-capstone-projects/02-rag-over-codebase/code/ts npm install && npm start它会暴露/query?q=...接口,返回 dense、sparse、融合后三路的 top 结果及最终引用——示例语料见 corpus.ts。
如何评价检索质量?
Capstone 的评分标准可以直接当作你自建系统时的验收清单(docs/en.md):
| 指标 | 含义 |
|---|---|
| MRR@10 / nDCG@10 | 正确代码块是否排在前 10 |
| 引用忠实度 | 论断中带可验证文件:行锚点的比例 |
| 增量索引正确性 | git push 到"可被检索"的耗时 |
| p95 延迟 | 大规模查询语料下的响应时间 |
相关路径速查
- 完整概念与架构文档:phases/19-capstone-projects/02-rag-over-codebase/docs/en.md
- Python 参考实现:phases/19-capstone-projects/02-rag-over-codebase/code/main.py
- TypeScript API 实现:phases/19-capstone-projects/02-rag-over-codebase/code/ts/src/
- 技能产出文档:phases/19-capstone-projects/02-rag-over-codebase/outputs/skill-codebase-rag.md
- 前置 RAG 基础课:phases/11-llm-engineering/06-rag/docs/en.md
小结
跨仓库代码 RAG 的精髓不在模型,而在工程:AST 感知切块保证切得对,混合检索 + 重排保证找得准,增量索引保证更新快,强制引用保证说得实。仓库里的双语言示例让你无需任何外部服务就能完整跑通这条流水线,建议从main.py读起,再看 TypeScript 版的 HTTP 封装,最后对照文档实现自己的版本。
【免费下载链接】ai-engineering-from-scratchLearn it. Build it. Ship it for others.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-from-scratch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考