垂直场景:代码与法律
通用 RAG 套路在垂直领域常水土不服。本章以代码与法律两个高频场景为例,讲适配要点。
1. 代码检索 RAG
代码不是散文,切分时不能破坏语法结构:
# 按「函数 / 类」为粒度切分,而非固定字数
def chunk_by_symbol(code):
return [extract_function(fn) for fn in parse_ast(code)]
# 用代码专用 Embedding(如针对代码的向量模型)效果更好
vec = code_embedding(chunk)ℹ️代码要保留结构上下文
光给一个函数往往不够——调用方、所属模块、依赖才决定含义。父子文档(第 14 章)在此特别有用:检索命中函数,返回其所在文件上下文。
要点:
- 优先按 AST/符号切分,避免截断语句
- 用代码专用嵌入模型,而非通用文本模型
- 检索时附上文件路径、导入关系,帮模型定位
2. 法律合同 RAG
法律文本长、条款相互引用、措辞严谨,错一字意思全变:
# 保留条款编号层级,检索结果带出处条款号
hits = retrieve(question, k=5)
for h in hits:
print(h["clause_no"], h["text"]) # 如「第 8.2 条」要点:
- 切分保留条款边界,别把「8.2 条」拆成两半
- 答案必须精确引用条款号,便于律师核验
- 长合同用父子文档:命中小条款,返回整章上下文防断章取义
⚠️法律场景严禁编造条款
幻觉在医疗/法律下后果严重。务必开第 20 章的 Self-RAG 反思校验,且生成时强制「每条结论附条款号」,无出处即拒答。
3. 两场景对比
| 维度 | 代码 RAG | 法律 RAG |
|---|---|---|
| 切分粒度 | 函数 / 类(AST) | 条款(保留编号) |
| 嵌入模型 | 代码专用 | 通用或更细粒度 |
| 核心风险 | 结构丢失、缺上下文 | 断章取义、幻觉条款 |
| 必做校验 | 父子文档补全上下文 | 强制引用 + 反思校验 |
💡垂直领域先改切分与嵌入
多数垂直 RAG 的失败不在模型,而在「切分破坏了领域结构」。先按领域结构切分、选对嵌入模型,再用指标验证。
🎯练习
拿一段你熟悉的代码文件,分别用「固定 200 字切分」和「按函数切分」建库,问一个需要跨函数理解的问题,对比两种召回的答案质量。
小结
- 代码 RAG:按 AST/符号切分 + 代码专用嵌入 + 父子文档补上下文
- 法律 RAG:保留条款边界、强制引用条款号、开反思校验防幻觉
- 两类场景失败多在「切分破坏结构」,先改切分与嵌入
- 下一章讲如何低成本自动构建评测集,持续衡量这些适配效果 →