代码库问答比文档问答难在哪
把 RAG 用在代码上("这个函数在哪被调用""这个配置项什么意思" ✔)会遇到四个特有难点 ✔:
一、四个难点
**① 切分单位不对** ✗
按行或固定字数切,会把函数切断 ✔ → 应**按语法单元切**(函数/类/配置块 ✔)。
做不到语法解析时,至少按**空行 + 缩进**启发式切 ✔。
**② 跨文件引用** ✗
"这个函数在哪调用"需要**跨文件**信息 ✔,而向量检索只看语义相似 ✔
→ 需要**结构索引**(导入关系、调用关系 ✔)辅助 ✔。
**③ 版本与分支** ✗
同一份文件有多个版本与分支 ✔ → 必须带 `repo + branch + commit` ✔
(见文档版本那篇 ✔ —— 代码更严格 ✔)。
**④ 代码与自然语言不同分布** ✗
问句是自然语言 ✔,代码是符号密集的文本 ✔ → 纯向量检索常常不准 ✔
→ **关键词/符号检索 + 向量**混合更有效 ✔(见混合检索那篇 ✔)。
二、四项对策(按性价比排序)
```
① 切分按语法单元(收益最大,见切分那篇)
② 记录 repo/branch/commit 并在检索时过滤(安全性要求)
③ 混合检索(符号精确匹配 + 语义)
④ 结构索引(调用关系、导入关系)—— 成本最高,按需做
```
**要点**:**先做 ① 与 ②** ✗→✔ —— 它们成本低、收益大 ✔;
③④ 属于进阶 ✔。
三、必须注意的安全问题
四、该观测什么
五、一条判据
> 问"这个函数在哪被调用" ✔,答案是否**完整且可核对**(给出文件与行号 ✔)?
> 只能给"可能在某个文件里",说明还是纯向量检索 ✗。