前言
在 RAG(检索增强生成)的实际落地中,检索质量直接决定最终答案的上限。尤其在法律等垂直领域,用户问题口语化、术语专业、信息密度高,单靠传统向量检索远远不够。
本文总结了一套经过验证的“RAG 三板斧”实战方法:
- 语义理解(检索前)
- 多路 + 混合检索(检索中)
- 融合与精排(检索后)
整体流程如下:
语义理解 → 多路检索 + 混合检索 → 融合(RRF/加权)→ 截取 top-K(如 50)→ Reranker 精排 → 截取 top-N(如 5)→ 送 LLM
第一板斧:语义理解(Query Understanding)
在正式检索之前,先让系统“读懂”用户问题。这一步相当于给检索系统装了一个懂意图、懂实体、懂过滤的大脑。
1. 意图识别
判断用户想问什么类型的问题,例如:
- 条款查询
- 概念解释
- 法条对比
实现方式:
- 基于 LLM:直接让大模型分类,灵活准确,适合复杂问题。
- 基于 Embedding:与意图样例库做语义匹配,速度快、成本低。
- 混合模式(推荐) :先用规则/轻量模型快速分类,置信度低时再走 LLM 兜底。
2. 实体抽取
抽出问题中的关键信息,例如:
- 法律名称
- 条款号
- 时间范围
- 状态(现行/废止)
常用技术:规则 + BERT / NER 模型 + LLM 兜底。
3. 元数据过滤(Metadata Filtering)
这是减少检索噪声最有效的一步。
每段文档(chunk)提前打好元数据标签,例如:
json
{
"法律名称": "中华人民共和国民法典",
"章节": "合同编",
"状态": "现行有效"
}
根据意图和实体生成过滤条件,例如:
法律名称 = “民法典” AND 章节 = “合同编” AND 状态 = “现行有效”
检索只在这个子集内进行,避免从全库中“大海捞针”。
元数据过滤执行步骤:
- 获取意图 + 实体结果
- 根据意图添加默认过滤(如条款查询 → 仅准则)
- 将实体转为过滤表达式(如
standard_code = 'ISA 315') - 添加全局过滤(如
status = 'active') - 用
AND组合所有条件
第二板斧:多路检索 + 混合检索
在缩小后的检索范围内,同时执行多条检索路径,每条路径都采用“关键词 + 向量”双保险。
多路检索(Multi-Query)
用户问题往往模糊或不完整,因此生成多个不同角度的检索版本:
- 原问题
- 查询重写(Query Rewriting) :LLM 将口语化问题改写为多个清晰版本
- HyDE:让 LLM 生成一段“假设答案”,用这段答案去检索(更贴近真实文档风格)
混合检索(Hybrid Search)
每一路检索内部,都同时使用两种方法:
| 方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 关键词检索(BM25) | 字面匹配 | 精确、不丢专有名词 | 不懂语义、词汇鸿沟 |
| 向量检索(Dense) | 语义匹配 | 懂同义词、模糊表达 | 对精确编号不敏感 |
混合检索 = 同时跑 BM25 + 向量,再用 RRF 等算法融合排序。
效果显著:在法条场景中,准确率可从 60% 提升到 80–85% 以上。
比喻:
关键词 = 查字典(精确但死板)
向量 = 问朋友(灵活但可能猜错)
混合 = 两人一起找,互相补短板
第三板斧:融合与精排
多路检索会产生大量候选结果,需要进一步提纯。
1. 多路结果融合(RRF / 加权)
将不同检索路径返回的结果合并排序。
RRF(倒数排名融合) 是常用方法,不依赖绝对分数,只看相对排名。
示例(k=60):
- D2 在两个路径中均排名靠前 → 总分最高
- 只在单一路径出现的结果排名较低
2. 截取 top-K(如 50)
减少后续精排的计算压力。
3. Reranker 精排
使用更强的交叉编码器模型(如 BGE-reranker、Cohere rerank)对候选文档逐一精细打分。
这一步比普通向量检索更准,但计算成本高,因此只在较小集合上做。
4. 截取 top-N(如 5)
最终将最相关的少量片段送入 LLM 生成答案。
完整流程回顾(带示例)
-
语义理解
用户问:“民法典合同编里违约赔偿怎么规定?”- 意图:条款/概念查询
- 实体:法律=民法典,章节=合同编
- 过滤条件:
法律=民法典 AND 章节=合同编 AND 状态=现行
-
多路 + 混合检索
- 原问题、改写版本、HyDE 并行
- 每路都做 BM25 + 向量检索
- 每路内部 RRF 融合 → 输出该路 top-k
-
融合与精排
- 多路结果合并(RRF)→ top-50
- Reranker 精排 → top-5
- 送 LLM 生成最终答案
补充:关键概念澄清
实体抽取 vs 关键词检索
| 维度 | 实体抽取 | 关键词检索 |
|---|---|---|
| 技术 | NER / LLM / 规则 | BM25 倒排索引 |
| 输出 | 结构化字段 | 文档列表 |
| 是否建索引 | 否 | 是 |
| 是否理解上下文 | ✅ | ❌ |
结论:两者是完全不同的任务,但在 RAG 流程中配合使用。
意图识别(Embedding版) vs 向量检索
| 维度 | 意图识别 | 向量检索 |
|---|---|---|
| 技术 | 相同(embedding + 相似度) | 相同 |
| 搜索范围 | 小(5–20 个类别) | 大(全量文档) |
| 是否需要索引 | 否(暴力计算) | 是(HNSW/IVF) |
| 目的 | 分类 | 检索 |
结论:技术原理相同,但规模和用途完全不同。
总结
语义理解缩小范围,多路混合保证召回,融合精排提升精度——这就是 RAG 三板斧的核心思想。