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