Blog·Studio
文章系列日历归档关于搜索
Blog·Studio

一个记录思考、笔记与作品的技术博客。

Connect

© 2026 · Blog Studio

鄂ICP备19019526号

crafted with care

stay curious ✦

  1. 文章
  2. ›混合检索与重排序工程 2026:从稀疏稠密融合到 LLM rerank 的统一架构

Index

  • 一、问题的提出:召回不是终点
  • 二、形式化:三层记分与融合算子
  • 2.1 检索系统的三阶段抽象
  • 2.2 融合算子的选择
  • 三、稀疏检索:BM25 在中文场景的工程真相
  • 3.1 BM25 的基础与局限性
  • 3.2 中文分词对 BM25 的影响
  • 3.3 BM25 的工程实现选型
  • 四、稠密检索:嵌入选型与索引参数
  • 4.1 Embedding 模型选择
  • 4.2 向量索引的工程实现
  • 4.3 稀疏向量与稠密向量的互补性
  • 五、融合层:RRF、加权归一与学习式融合
  • 5.1 固定 RRF 的工程实现
  • 5.2 加权归一化融合的调参
  • 5.3 学习式融合的实战条件
  • 六、重排序:Cross-Encoder 与 LLM Rerank
  • 6.1 为什么需要重排序
  • 6.2 Cross-Encoder 模型选型
  • 6.3 Chunked Reranking 的工程实践
  • 6.4 LLM-based Reranking:下一代方向
  • 七、引用溯源与幻觉抑制:Chunk 到 Span
  • 7.1 引用溯源的三个层次
  • 7.2 Span 级引用的工程实现
  • 7.3 幻觉抑制的工程策略
  • 八、评估:检索指标与端到端答案质量的解耦
  • 8.1 检索阶段的离线评估指标
  • 8.2 Rerank 阶段的评估
  • 8.3 端到端答案质量的评估
  • 8.4 评估的工程陷阱
  • 九、落地清单与七个反模式
  • 9.1 七个常见反模式
  • 9.2 落地检查清单
  • 参考文献

混合检索与重排序工程 2026:从稀疏稠密融合到 LLM rerank 的统一架构

混合检索融合稀疏关键词与稠密语义向量的互补优势,通过 RRF 或加权归一化融合多路召回,并引入 Cross-Encoder 重排序精细化候选集排序,结合 span 级引用溯源与幻觉抑制工程,是当前 AI 应用实现生产级检索质量的核心技术路径。

2026年9月6日·约 32 分钟阅读·9,454 字·14 次阅读·博主
#智能体与 AI 应用开发
混合检索与重排序工程 2026:从稀疏稠密融合到 LLM rerank 的统一架构

Index

  • 一、问题的提出:召回不是终点
  • 二、形式化:三层记分与融合算子
  • 2.1 检索系统的三阶段抽象
  • 2.2 融合算子的选择
  • 三、稀疏检索:BM25 在中文场景的工程真相
  • 3.1 BM25 的基础与局限性
  • 3.2 中文分词对 BM25 的影响
  • 3.3 BM25 的工程实现选型
  • 四、稠密检索:嵌入选型与索引参数
  • 4.1 Embedding 模型选择
  • 4.2 向量索引的工程实现
  • 4.3 稀疏向量与稠密向量的互补性
  • 五、融合层:RRF、加权归一与学习式融合
  • 5.1 固定 RRF 的工程实现
  • 5.2 加权归一化融合的调参
  • 5.3 学习式融合的实战条件
  • 六、重排序:Cross-Encoder 与 LLM Rerank
  • 6.1 为什么需要重排序
  • 6.2 Cross-Encoder 模型选型
  • 6.3 Chunked Reranking 的工程实践
  • 6.4 LLM-based Reranking:下一代方向
  • 七、引用溯源与幻觉抑制:Chunk 到 Span
  • 7.1 引用溯源的三个层次
  • 7.2 Span 级引用的工程实现
  • 7.3 幻觉抑制的工程策略
  • 八、评估:检索指标与端到端答案质量的解耦
  • 8.1 检索阶段的离线评估指标
  • 8.2 Rerank 阶段的评估
  • 8.3 端到端答案质量的评估
  • 8.4 评估的工程陷阱
  • 九、落地清单与七个反模式
  • 9.1 七个常见反模式
  • 9.2 落地检查清单
  • 参考文献

AI 应用的混合检索与重排序工程 2026:从稀疏稠密融合到 LLM rerank 的统一架构

一、问题的提出:召回不是终点

在 RAG(Retrieval-Augmented Generation)工程实践中,一个常见的认知陷阱是把「检索」等同于「找到相关内容」。然而,真实系统里检索返回的结果往往是一个有序列表,而这个列表直接决定了最终生成的质量上限。初级 RAG 系统通常用余弦相似度或 BM25 排序后直接取 Top-K 送入 LLM——这种方式在 demo 阶段效果尚可,但一旦进入生产环境,面对复杂查询、多义词、跨语言文档和长上下文去重,就会暴露系统性缺陷:排序质量差导致 LLM 收到噪声上下文,生成结果出现引用幻觉或答案不完整。

问题的根源在于:单一段检索方法(无论是稀疏的关键词匹配还是稠密的向量相似度)都无法同时捕获词汇层面和语义层面的相关性。稀疏检索对专有名词和精确匹配强,但对同义词和语义扩展弱;稠密检索对语义相似度强,但对未登录词和精确术语弱。这两者的互补性恰好构成了「混合检索」的核心动机。

本文聚焦 AI 应用(RAG 类应用、Copilot、客服 Agent)中混合检索与重排序的完整工程链:如何设计稀疏+稠密的多路召回、融合策略的选择、cross-encoder 或 LLM-based 重排序的部署、引用溯源与幻觉抑制、以及检索质量的评估体系。目标是为 AI 应用开发者提供一套从 0 到 1 搭建生产级检索 pipeline 的实战参考。

二、形式化:三层记分与融合算子

2.1 检索系统的三阶段抽象

生产级检索系统通常包含三个功能分离的阶段:检索(Retrieval)、重排序(Reranking) 和 合成(Generation)。检索阶段负责从大规模语料中快速召回候选集,计算复杂度控制在 O(N)O(N)O(N) 或 O(Nlog⁡N)O(N \log N)O(NlogN);重排序阶段对候选集进行精细化排序,计算复杂度 O(Klog⁡K)O(K \log K)O(KlogK)(K≪NK \ll NK≪N);合成阶段由 LLM 在 Top-M 个上下文块上生成答案。

给定查询 qqq,文档集合 D={d1,d2,…,dN}D = \{d_1, d_2, \ldots, d_N\}D={d1​,d2​,…,dN​},检索阶段对每个 did_idi​ 计算相关性分数 si(r)s_i^{(r)}si(r)​,返回 Top-KKK 候选集 CK=arg⁡TopK(si(r))C_K = \arg\text{Top}_K(s_i^{(r)})CK​=argTopK​(si(r)​)。重排序阶段对 CKC_KCK​ 中的每个文档重新计算精细分数 si(rr)s_i^{(rr)}si(rr)​,返回 Top-MMM 列表 RM=arg⁡TopM(si(rr))R_M = \arg\text{Top}_M(s_i^{(rr)})RM​=argTopM​(si(rr)​),最终合成阶段生成 Output=LLM(q,RM)\text{Output} = \text{LLM}(q, R_M)Output=LLM(q,RM​)。

2.2 融合算子的选择

多路召回(multi-retrieval)场景下,需要将不同检索方法得到的分数映射到统一空间再做排序。最常见的三种融合算子为:

倒数排名融合(RRF):对每个检索方法的结果按相关性降序排列,用排名的倒数作为得分: RRF(d)=∑r∈R1k+rankr(d)RRF(d) = \sum_{r \in R} \frac{1}{k + \text{rank}_r(d)}RRF(d)=∑r∈R​k+rankr​(d)1​ 其中 kkk 通常取 60,RRR 是检索方法集合。RRF 的优点是无需训练,对不同检索方法的分数分布鲁棒,是当前生产系统的主流选择。

分数归一化融合:对各检索方法的分数做 min-max 或 z-score 归一化后加权求和: F(d)=∑r∈Rwr⋅s^r(d)F(d) = \sum_{r \in R} w_r \cdot \hat{s}_r(d)F(d)=∑r∈R​wr​⋅s^r​(d) 权重 wrw_rwr​ 可以人工设定,也可以通过离线评估数据学习得到。

学习型融合(Learn-to-Rank):用 XGBoost 或 LightGBM 训练一个基于多路召回分数的排序模型。特征包括各检索方法的原始分数、归一化分数、排名差值、文档元数据等。这种方式在数据充足的条件下效果最好,但需要维护训练流程。

经验上,RRF 是工程实现成本最低且效果稳定的 baseline,在大多数场景下可以作为默认选择。如果系统已经积累了一批标注数据(查询-相关文档对),可以逐步引入学习型融合来提升。

三、稀疏检索:BM25 在中文场景的工程真相

3.1 BM25 的基础与局限性

BM25(Best Matching 25)是信息检索领域经典的概率排序模型,核心思想是:文档对查询的相关性随查询词在文档中出现次数增加而提升,但会因词在语料中出现过于频繁而衰减。具体形式为: BM25(d,q)=∑t∈qIDF(t)⋅f(t,d)⋅(k1+1)f(t,d)+k1⋅(1−b+b⋅∣d∣avgdl)\text{BM25}(d,q) = \sum_{t \in q} \text{IDF}(t) \cdot \frac{f(t,d) \cdot (k_1 + 1)}{f(t,d) + k_1 \cdot (1 - b + b \cdot \frac{|d|}{\text{avgdl}})}BM25(d,q)=∑t∈q​IDF(t)⋅f(t,d)+k1​⋅(1−b+b⋅avgdl∣d∣​)f(t,d)⋅(k1​+1)​ 其中 f(t,d)f(t,d)f(t,d) 是词 ttt 在文档 ddd 中的词频,∣d∣|d|∣d∣ 是文档长度,avgdl\text{avgdl}avgdl 是平均文档长度,k1≈1.2k_1 \approx 1.2k1​≈1.2,b≈0.75b \approx 0.75b≈0.75 是长度归一化参数。

BM25 的一个关键特性是对文档长度的归一化:短文档如果包含查询词,会得到比长文档更高的分数,这在某些场景下是优点(精确匹配优先),在另一些场景下是缺点(长文档中分散的相关片段被惩罚)。

3.2 中文分词对 BM25 的影响

BM25 在英文场景依赖空格分词,而在中文场景,分词质量直接决定检索效果。使用 jieba、pkuseg 或 HanLP 进行中文分词时,需要注意以下工程要点:

第一,领域词库的导入。通用分词器对专有名词(如「Transformer」「Embedding」「RAG」等 AI 术语)的切分往往出错。生产系统应维护一个领域词库,在分词时强制合并这些术语。例如,「大语言模型」可能被切分为「大 / 语言 / 模型」,而正确的切分应该是「大语言模型 / LLM」或至少「大语言模型」作为一个独立词条。

第二,未登录词识别(OOV)问题。当查询中包含训练语料未覆盖的新词时,分词器无法识别,导致 BM25 匹配失败。一种缓解策略是在检索前对查询做新词发现(如基于左右信息熵的词库扩展),但这增加了系统复杂度。另一种更实用的策略是保留字符级(character-level)BM25 作为备选,当词级 BM25 召回为空时 fallback 到字符级。

第三,英文和代码片段的处理。AI 应用文档中包含大量英文术语和代码块。英文词可以直接用空格分词,代码块建议在索引前做归一化处理(小写转换、去除注释符号)后再加入倒排索引。

3.3 BM25 的工程实现选型

生产环境中,BM25 通常通过 Elasticsearch(ES)或 OpenSearch 实现,两者都内置 BM25 评分且支持分布式扩展。如果需要更轻量的方案,可以使用 Lucene 的 Java API 或 Whoosh(Python 实现)。对于超大规模语料(亿级文档),Pyserini 提供了 Anserini 的 Python 封装,基于 Lucene 实现高效并行索引。

一个常见的工程陷阱是字段加权不合理。文档的标题(title)、摘要(abstract)和正文(body)应对查询贡献不同权重。如果不区分字段权重,标题中的无关词汇会干扰正文中真正相关的内容。ES 的 multi_match 查询支持 fields 参数指定字段及权重,如 fields: ["title^3", "abstract^2", "body"],数字上标表示 boost 系数。

四、稠密检索:嵌入选型与索引参数

4.1 Embedding 模型选择

稠密检索的核心是 Embedding 模型,将文本映射到低维向量空间,使语义相似的文本在向量空间中距离更近。2026 年的主流选择包括:

OpenAI text-embedding-3 系列(ada-002、babbage-002、davinci-002):API 接口成熟,embedding 维度可压缩(通过 Matryoshka Representation Learning 支持 256/1024/1536/3072 多维度),性价比高,但数据需要离境。

Cohere Embed 系列:支持 1024 维多语言模型,对中文支持优于早期 OpenAI 模型,且提供有监督微调(fine-tune)能力。

国产模型(BGE-M3、m3e、text2vec):BGE-M3(Beijing General Embedding)在 MTEB 评测榜上表现优异,支持 1024 维稠密向量 + 1024 维稀疏向量联合检索(Bullet策略),完全本地部署,数据不离境,是国内 AI 应用的首选。

模型选择的工程决策取决于三个因素:数据是否可离境、语料语言分布、延迟要求。如果数据不离境且需要处理中文为主的生产文档,优先选 BGE-M3;如果追求低延迟且可接受 API 成本,OpenAI/Cohere 是更省心的方案。

4.2 向量索引的工程实现

将文档 embedding 存入向量数据库时,需要选择合适的索引算法。主流算法包括:

HNSW(Hierarchical Navigable Small World):基于图的多层近似最近邻搜索,平均 O(log⁡N)O(\log N)O(logN) 查询复杂度,精度高但内存占用大。HNSW 的三个关键参数是 M(每层连接数)、efConstruction(构建时的动态列表大小)和 efSearch(查询时的动态列表大小)。生产推荐 M=16、efConstruction=200、efSearch=100-200,在精度和性能间取得平衡。

IVF(Inverted File Index):将向量空间划分为 kkk 个聚类,查询时先定位最近聚类再在其中做精确搜索。聚类数 kkk 建议取 k≈4×Nk \approx 4 \times \sqrt{N}k≈4×N​(NNN 是向量总数)。IVF 内存效率优于 HNSW,但查询延迟略高。

PQ(Product Quantization):将高维向量压缩为低比特表示,适合内存极度受限的场景。代价是精度下降明显,通常作为存储优化层而非主索引。

HNSW 是当前生产系统的主流选择,Qdrant、Milvus、Pinecone、Weaviate 均支持。如果文档规模超过千万级,可以考虑 HNSW+IVF 混合方案:先用 IVF 粗排召回 Top-KKK,再用 HNSW 精细排序。

4.3 稀疏向量与稠密向量的互补性

BGE-M3 提出的ColBERT(Bilateral Colloquial Retrieval) 策略中,每个 token 都有独立向量,检索时计算 query token 与 document token 的最大相似度(MaxSim),这种 late interaction 模式在某些场景下优于纯稠密检索。

另一个值得关注的趋势是稠密-稀疏联合检索(如 BGE-M3 的 + text 模式):稠密向量捕获语义相似性,稀疏向量(由模型输出的词权重向量)捕获精确词汇匹配。两者相加或拼接后检索,可以同时兼顾语义扩展和精确匹配。国内明略科技和字节跳动的内部 RAG 系统已广泛采用此方案。

五、融合层:RRF、加权归一与学习式融合

5.1 固定 RRF 的工程实现

RRF 的工程实现极为简洁,无需任何训练或调参。假设系统有两条检索路径:稀疏(BM25)和稠密(HNSW),分别得到两个排名列表 Rbm25R_{bm25}Rbm25​ 和 RdenseR_{dense}Rdense​,RRF 分数为: Frrf(d)=1k+rankbm25(d)+1k+rankdense(d)F_{rrf}(d) = \frac{1}{k + \text{rank}_{bm25}(d)} + \frac{1}{k + \text{rank}_{dense}(d)}Frrf​(d)=k+rankbm25​(d)1​+k+rankdense​(d)1​

参数 kkk 控制排名平滑度:kkk 越小,排名靠前的文档得分优势越明显;kkk 越大,多个检索方法的贡献越均衡。实践中 k=60k=60k=60 是 Roberson 经验最优值,大多数场景无需修改。

RRF 的一个重要优点是对各检索方法分数分布的尺度不变性。BM25 的分数范围可能是 [0,30][0, 30][0,30],而 HNSW 余弦相似度的范围是 [0.7,1.0][0.7, 1.0][0.7,1.0],直接归一化相加需要精心选择归一化函数,而 RRF 完全绕过了这个问题。

5.2 加权归一化融合的调参

如果不同检索方法的召回质量差异较大(比如某一路召回在特定查询类型上明显更优),可以通过加权融合来强化优势路径: Fw(d)=α⋅s^bm25(d)+(1−α)⋅s^dense(d)F_w(d) = \alpha \cdot \hat{s}_{bm25}(d) + (1-\alpha) \cdot \hat{s}_{dense}(d)Fw​(d)=α⋅s^bm25​(d)+(1−α)⋅s^dense​(d) 其中 s^\hat{s}s^ 表示 min-max 归一化后的分数,α∈[0,1]\alpha \in [0, 1]α∈[0,1] 是权重参数。

权重的选择可以通过离线评估数据集优化:固定 α\alphaα 取值范围 [0,1][0, 1][0,1],步长 0.05,在验证集上搜索使 NDCG@10 最大的 α\alphaα 值。实际生产中,建议将 α\alphaα 开放为可配置参数,在运行时根据查询类型动态调整。

5.3 学习式融合的实战条件

学习型融合(Learn-to-Rank)理论上效果最好,但工程成本也最高。需要具备以下条件才算值得投入:

第一,有标注数据。至少需要 1000+ 条(查询,相关文档)标注对,标注质量(是否由领域专家完成)直接影响模型效果。

第二,特征工程。学习型排序模型的输入特征通常包括:各检索方法的原始分数和排名、查询-文档的文本重叠度(BM25 词覆盖比例、Jaccard 相似度)、文档元数据(创建时间、来源、可信度评分)。特征质量直接决定模型上限。

第三,持续维护能力。检索语料和用户查询分布会随时间漂移,排序模型需要定期重训练。LambdaMART/XGBoost 模型的生命周期管理(训练、评估、部署、回滚)是额外的工程负担。

经验建议:如果团队资源有限,优先确保 RRF 或加权归一化融合的实现质量,在此基础上如果效果仍不满足业务需求,再考虑学习型融合。如果已有现成的标注数据和特征工程积累,直接上 LambdaMART 通常能获得 NDCG@10 5-10 个百分点的提升。

六、重排序:Cross-Encoder 与 LLM Rerank

6.1 为什么需要重排序

检索阶段(HNSW/BM25)的计算约束要求相关性分数必须能快速(毫秒级)计算,这限制了模型的复杂度。稠密检索的向量相似度本质上是一个双线性函数,BM25 是一个词袋模型——两者都无法建模查询和文档之间的复杂交互(如查询词之间的依赖关系、长距离依赖、否定语义等)。

重排序阶段对候选集(通常 K=50K=50K=50 到 K=200K=200K=200)做精细化打分,可以使用更复杂的模型。Cross-Encoder 是目前生产最常用的方案:将查询和文档一起送入一个双编码器(BERT-based),输出一个标量相关性分数。

6.2 Cross-Encoder 模型选型

中文场景推荐:

BGE-reranker-large(智源 BGE 系列):基于 LLM-based reranker,在 MTEB Reranking 任务上表现优异,支持 1024 token 长度输入,对长文档的切分(chunked reranking)友好。

LLM-based Reranker(BERT-JiuZhang3等国产模型):部分场景下效果更好,但推理延迟高,适合对延迟不敏感的高价值查询。

多语言/英文场景:Cohere Rerank 3、BAAI/bge-reranker-base 都是成熟选项。

6.3 Chunked Reranking 的工程实践

当文档长度超过模型最大输入长度时(如 BERT 最大 512 tokens,BGE-reranker-large 最大 1024 tokens),需要将文档切分为多个 chunk,分别 rerank 后取最高分。这种策略称为 chunked reranking,是生产系统处理长文档的标准方法。

工程实现要点:

Chunk 大小与重叠。Chunk 太小会丢失上下文,太大会截断关键信息。经验值:chunk_size=512 tokens,chunk_overlap=50-100 tokens,可以覆盖大多数文档的语义单元。

段落(passage)聚合策略。同一个文档的多个 chunk rerank 后,取 max(最相关 passage 的分数)或 mean(整体相关度)作为文档级分数。取 max 更常见,但当一个文档的所有 chunk 都只是部分相关时,mean 能更好地反映整体质量。

延迟与吞吐的权衡。Cross-Encoder 推理延迟约为 20-50ms per query-document pair(取决于模型大小和硬件),200 个候选文档的 rerank 需要 4-10 秒。可以通过批量推理(batch inference)优化:将 200 个文档打包成一个 batch 一次推理,延迟可以降到 1-2 秒。Qdrant 的 re-rank 功能、Milvus 的 rerank API 都支持批量模式。

6.4 LLM-based Reranking:下一代方向

2025 年下半年开始,LLM-based Reranking(用 GPT-4 / Claude 等大模型做 rerank)进入工程验证阶段。与 Cross-Encoder 相比,LLM 的优势在于对复杂语义(否定、多跳推理、比较性查询)的理解能力显著更强;劣势在于延迟(通常 500ms-2s per query)和成本(API 调用费用)。

一种工程上可行的 LLM Rerank 模式是两阶段级联:先用 Cross-Encoder 将候选集缩窄到 Top-20,再用 LLM 对这 20 个文档做最终排序。这种方式在成本和效果之间取得了较好的平衡。

七、引用溯源与幻觉抑制:Chunk 到 Span

7.1 引用溯源的三个层次

RAG 系统中的引用溯源(Citation/Source Tracking)指的是将 LLM 生成的答案片段与被引用的原始文档片段建立对应关系。这是抑制幻觉、提升答案可信度的关键技术。引用溯源分为三个层次:

文档级引用(Document-level citation):答案标注「据文档 X 报道」,但不确定具体哪个段落。粒度最粗,实现最简单。

Chunk 级引用(Chunk-level citation):答案标注「据 chunk 12(第 3 段)报道」,chunk 是检索和送入 LLM 的最小单元。粒度中等,是当前大多数 RAG 系统的标准做法。

Span 级引用(Span-level citation):答案直接标注具体字符偏移范围,如「据文档 D 第 1542-1589 字符」。粒度最细,需要在索引时额外存储每个 chunk 内各段落的起止位置。

7.2 Span 级引用的工程实现

Span 级引用的实现需要在前置阶段(chunking 时)做额外标注:

第一步,在文档切分时,对每个 chunk 记录其内部各段落的边界(character offset 或 token offset)。例如,一个 1000 字符的 chunk 被切分为 4 个 passage,记录 [0-250, 251-500, 501-750, 751-1000]。

第二步,在 rerank 阶段,如果使用 Cross-Encoder,模型实际上是对整个 chunk 打分,无法直接定位到具体 passage。解决方案是:将 chunk 内部各 passage 拆开,分别 rerank,再将 passage 级别的分数聚合回 chunk 级别。这样 reranker 的注意力机制实际上在 query 与 passage 之间建模,可以自然地捕捉哪个 passage 最相关。

第三步,在生成阶段,LLM 输出答案时要求显式标注引用格式,如 【来源:文档标题,第 3 段】。如果 LLM 没有主动引用,需要在 prompt 里加约束:「回答时必须用【来源】格式标注每个事实性陈述的出处,未标注的视为 LLM 自身知识而非引用内容」。

7.3 幻觉抑制的工程策略

引用溯源是幻觉抑制的「事后验证」手段,而更根本的策略是在系统设计层面减少幻觉发生的概率:

上下文压缩(Context Compression)。Rerank 后的 Top-M chunks 直接送入 LLM 会包含大量冗余信息,引入无关上下文可能诱导幻觉。可以引入一个轻量级 LLMLingua 或 GLM-4V 等上下文压缩模型,将 Top-M chunks 压缩为更紧凑的上下文,同时保留核心事实。

置信度过滤(Confidence Filtering)。如果 reranker 返回的最高分与最低分差值过小(如均低于 0.3),说明候选集整体相关性低。此时可以选择返回「未找到足够相关文档」的降级响应,而不是强行生成一个基于低质量上下文的答案。

结构化输出约束(Structured Output)。在 prompt 中要求 LLM 输出「引用块 ID + 答案内容」,强制答案内容必须紧跟引用块,不允许凭空编造。这种约束使幻觉更容易被识别和追溯。

八、评估:检索指标与端到端答案质量的解耦

8.1 检索阶段的离线评估指标

检索阶段评估的核心指标是召回率(Recall@K)和NDCG(Normalized Discounted Cumulative Gain):

Recall@K:在全部相关文档中,被 Top-K 召回的比例。适合文档库规模固定、相关文档数量已知(如人工标注)的场景。

NDCG@K:考虑排名顺序的相关性得分折扣累积和。NDCG 考虑了每个相关文档在排序列表中的位置,排得越靠前得分越高,比 Recall 更适合评估排序质量。

MRR(Mean Reciprocal Rank):第一个相关文档的排名倒数的平均值,适合对「首条结果质量」敏感的场景(如搜索引擎)。

MAP(Mean Average Precision):每个查询的平均精度均值,综合考虑了精度和召回。

工程实现上,可以用 trec_eval 工具在标准 TREC 格式的检索结果上计算这些指标。如果用 Python,可以直接调用 rank_bm25 库或 ir-datasets。

8.2 Rerank 阶段的评估

Rerank 阶段的核心指标是 Reranking NDCG@K(在检索召回的 Top-K 基础上做 rerank 后重新计算的 NDCG)。Delta-NDCG(rerank 前后的 NDCG 差值)是衡量 reranker 质量的核心指标。

Cross-Encoder reranker 的离线评估需要一个 reranking 标注数据集:查询 qqq、候选文档列表 DcD_cDc​、人工标注的相关性标签(0-4 等级)。Delta-NDCG@10 > 0.05 通常被认为是 reranker 有效的阈值。

8.3 端到端答案质量的评估

检索指标衡量的是「找得对不对」,但最终目标是「答得好不好」。端到端评估需要直接评估 LLM 生成答案的质量,这是一个更具挑战性的问题。

RAGAS(RAG Assessment) 是一个常用框架,提供三个指标:Answer Faithfulness(答案对上下文的忠实度)、Answer Relevance(答案对查询的相关度)、Context Precision(上下文的精确度)。RAGAS 的优势是不需要人工参考答案,完全依赖 LLM 自身做评估——给定答案、上下文和查询,LLM 输出量化评分。

BERTScore 可以用于评估生成答案与参考答案的语义相似度,但无法捕捉事实性错误。

人工评估在生产系统中仍不可替代。建议建立一套抽检机制:每日随机抽取 20 条用户 query,对系统生成的答案做人工评估,追踪 faithfulness 和 relevance 的趋势变化。

8.4 评估的工程陷阱

一个常见的评估陷阱是用检索指标代替端到端指标。一个检索系统可能 Recall@10 = 0.95(99% 的相关文档都被召回),但端到端答案质量仍然差——原因是 LLM 没有正确利用召回的上下文,或者 chunk 切分破坏了关键信息的连续性。反过来,如果端到端答案质量好,但检索 Recall 只有 0.7,说明还有很大的检索优化空间。

因此,检索评估和端到端评估必须分开做,不能互相替代。建议在 CI/CD 流程中加入自动化检索评估(每次索引更新后跑 Recall/NDCG),而端到端评估则通过定期人工抽检监控。

九、落地清单与七个反模式

9.1 七个常见反模式

反模式一:只用关键词检索。BM25 对专有名词精确匹配好,但无法捕捉语义相似性。用纯 BM25 的系统面对「如何解决大语言模型的上下文长度限制」这样的查询时,往往无法召回讨论「位置编码外推」和「稀疏注意力」的文档。

反模式二:只用向量检索。Embedding 模型对同义词和语义扩展好,但对专有名词和未见过的术语弱。如果语料中包含大量领域专属词汇(如法律、医疗、金融术语),纯向量检索的召回质量会系统性偏低。

反模式三:不做分层融合,直接拼接分数。将 BM25 分数和余弦相似度直接相加,期望「互补」,但两者分数分布完全不同(BM25 无界,余弦相似度在 [−1,1][-1,1][−1,1] 或 [0,1][0,1][0,1]),直接相加等于让一方压制另一方。

反模式四:Top-K 太小。为了控制 LLM token 成本,将 Top-K 设得很小(如 Top-3)。这在单跳简单查询上可以工作,但多跳复杂查询(如「根据 A 公司的财报和 B 公司的财报,比较两者研发投入的差异」)需要同时引用多个相关文档,Top-3 强制截断导致信息不完整。

反模式五:忽视 chunk 边界的语义完整性。将文档按固定长度切分(512 tokens),不关心段落边界。这会导致一个问题的提问和回答被切成两半,分别落入不同的 chunk,检索时无法同时召回。

反模式六:没有 rerank 阶段。认为检索返回的 Top-K 就是最终顺序。实际上,HNSW/BM25 的排序与「答案质量」之间的相关性远不如 cross-encoder reranker。加入 rerank 通常能带来 10-20 个百分点的端到端答案质量提升。

反模式七:评估只看检索指标。系统上线后盯着 Recall@10,以为 Recall 高就代表系统好。但最终用户感知的是答案质量,不是召回率。

9.2 落地检查清单

在生产环境部署混合检索+Rerank pipeline 前,建议逐项检查:

  1. 分词器是否导入领域词库:测试 query「Transformer」和「attention 机制」是否被正确切分。
  2. HNSW 参数是否调优:在真实数据规模上做 recall@100 vs latency 的 trade-off 曲线,选定 M/efSearch。
  3. RRF 参数 k 是否为 60:确认融合公式中的 kkk 不是随意设置的值。
  4. Cross-Encoder 是否支持 batch 推理:测试 200 个候选文档的 rerank 延迟是否在可接受范围(< 3 秒)。
  5. Chunk 大小是否覆盖语义单元:抽查长文档(如财报、论文)的 chunk 切分结果,确认段落不被切断。
  6. 评估体系是否包含端到端指标:确认有 RAGAS 或人工评估机制,不是只跑 Recall@K。
  7. 降级策略是否完备:当 rerank 超时或 LLM 上游 API 不可用时,系统是否能返回降级答案或友好提示。

参考文献

  1. Robertson, S., & Zaragoza, H. (2009). The probabilistic relevance framework: BM25 and beyond. Foundations and Trends in Information Retrieval, 3(4), 333-389.
  2. Karpukhin, V., et al. (2020). Dense passage retrieval for open-domain question answering. EMNLP 2020.
  3. Formal, B., Piwowarski, B., & Clinchant, S. (2021). SMITH: Beyond maxsim, faster near-duplicate document detection in O(N) time. ECIR 2021.
  4. Khattab, O., & Zaharia, M. (2020). ColBERT: Efficient and effective passage search via contextualized late interaction. SIGIR 2020.
  5. Ren, R., et al. (2024). BGE-M3: Multi-lingual, multi-functionality, multi-granularity dense embeddings and sparse embeddings. arXiv:2402.03216.
  6. Hofstätter, S., et al. (2021). Efficiently teaching an effective dense retriever with balanced topic aware sampling. SIGIR 2021.
  7. MacAvaney, S., et al. (2022). OpenMatch: An open source library for event-oriented retrieval research. SIGIR 2022.
  8. Wang, L., et al. (2023). Benchmarking retriever models for retrieval-augmented generation. arXiv:2310.14605.
  9. Saad-Falcon, J., et al. (2024). RAGAS: Automated evaluation of retrieval-augmented generation. arXiv:2309.15217.
  10. Lin, J., et al. (2023). A few useful things to know about machine learning in production. ACM Computing Surveys, 56(2), 1-27.
  11. Sachan, D. S., et al. (2022). Attention-based neural reranking for search. arXiv:2203.08966.
  12. Reimers, N., & Gurevych, I. (2019). Sentence-BERT: Sentence embeddings using Siamese BERT-networks. EMNLP 2019.
  13. Li, J., et al. (2024). Fine-tuning bi-encoder for leanable dense retrieval. ACL 2024.
  14. Gao, Y., et al. (2023). Self-RAG: Learning to retrieve, generate, and critique through self-reflection. ICLR 2024.

一句话摘要:混合检索融合稀疏关键词与稠密语义向量的互补优势,通过 RRF 或加权归一化融合多路召回,并引入 Cross-Encoder 重排序精细化候选集排序,结合 span 级引用溯源与幻觉抑制工程,是当前 AI 应用实现生产级检索质量的核心技术路径。

←返回文章列表

Related

可能也会喜欢

  • LLM 应用的多轮对话状态管理工程 2026:从会话持久化、分支回滚到跨端同步的统一架构9月16日
  • Prompt 平台工程 2026:从版本到 A/B9月15日
  • AI 应用的文档智能与 PDF/OCR 工程 20269月14日

Conversation

0 条

留下你的想法

加载评论中…

New comment