检索增强

检索增强生成(RAG)的技术架构:从文档切分到混合检索与重排序的落地实践

系统拆解检索增强生成(RAG)的核心技术栈:文档分块策略、混合检索、倒数排名融合(RRF)、Cross-Encoder 重排序与动态自校正范式。

发布于 6 分钟阅读

引言:打破大模型的“知识孤岛”

尽管现代大语言模型在数十万亿 Token 的无监督语料上预训练出了极其庞大的世界知识,但在企业级实际生产应用中,它面临着三大无法逾越的原生缺陷:

  1. 参数知识时效性截止(Knowledge Cutoff):基座模型一旦训练完成,其参数权重即告凝固,无法感知现实世界中最新发生的事实变动;
  2. 私域专属数据盲区(Private Domain Blindness):企业内部的代码仓库、财务报表、机密客户档案与技术规范等从未公开于互联网,通用模型对此一无所知;
  3. 事实性幻觉(Hallucination):当遇到不熟悉或模棱两可的问题时,自回归模型倾向于根据局部语法概率自信地编造看似真实但完全错误的答案。

为了解决这一系列痛点,检索增强生成(Retrieval-Augmented Generation, 简称 RAG) 成为了当代生成式 AI 应用落地最为广泛、工程成熟度最高的技术范式。RAG 的核心理念非常直观:将大模型的“内部参数化记忆”与外部高可靠的“非参数化动态检索库”有效解耦。当用户提出疑问时,系统首先从海量外部知识库中精确定位最相关的证据段落,随后将检索结果连同原始问题一并作为上下文,交给大模型进行阅读理解、事实整合与推理总结。


一、经典 RAG 的三段论管线

在工程实现上,一个完整的端到端 RAG 系统通常可以分解为三个互联的流水线阶段:

【离线知识入库阶段】
 原始非结构化文档 (PDF / Markdown / HTML / DOCX)
          │
          ▼
 [文档清洗与层次化切块 (Chunking)]
          │
          ▼
 [文本嵌入模型 (Embedding Model)]
          │
          ▼
 [写入向量数据库 (Vector DB) & 倒排索引 (BM25)]

【在线查询与生成阶段】
 用户查询 (User Query) ──► 混合检索 (Dense + Sparse) ──► 重排序模型 (Reranker)
                                                                 │
                                                                 ▼
 最终输出回答 ◄── 大语言模型阅读合成 ◄── Top-K 最优上下文切片装配
  1. 索引阶段(Indexing):离线提取企业海量私域文件,进行文本清洗、元数据标记,按照特定的切分算法分割为紧凑的信息切片(Chunks),并通过 Embedding 模型转换为稠密向量持久化存入向量库;
  2. 检索阶段(Retrieval):当在线用户输入 Query 时,系统实时计算 Query 的向量表征,在索引库中快速检索语义空间距离最近的若干候选切片;
  3. 生成阶段(Generation):将经过重排筛选后的前几个高置信度切片组织入 Prompt 模板中,大模型作为信息阅读合成器输出严谨可靠的回答,并附带引用来源出处。

二、文档预处理与分块策略(Chunking Strategies)

分块是 RAG 质量的“天花板”。若分块过小,切片将丧失完整的上下文语境;若分块过大,切片中混入大量无关噪音,不仅稀释了嵌入向量的相似度区分度,更容易消耗宝贵的模型上下文窗口。

目前工业界主流的分块策略包括以下几种:

1. 固定滑动窗口切分(Fixed-Size Chunking with Overlap)

按固定字符数(如 512 字符)配合一定比例的重叠区(如 10% 即 50 字符)滑动切分。虽然算法极简高效,但极易粗暴地在句子中间或专有名词内部发生截断,破坏段落语义的自然连贯。

2. 递归字符切分(Recursive Character Text Splitter)

优先尝试按照段落换行符(\n)切分;若段落仍超长,则退化至单换行符(\n);若依旧超长,再退化至句号、感叹号、分号,最后才是空格。这种自顶向下的递归降级机制最大程度地保留了文本的自然语法结构。

3. 父子文档分块(Parent-Child / Hierarchical Chunking)

这是一种兼顾“高精度检索”与“完整语境生成”的高级设计模式:

  • 小块(Child Chunk):将文本切分为较小的切片(例如 128 字符),专门用于向量嵌入与快速相似度比对;
  • 大块(Parent Chunk):每个小块保留一个指向其所属大段落或整篇章节(例如 1024 字符)的父节点引用 ID;
  • 生成替换:检索阶段利用小块的高信噪比命中目标,但在最终交付大模型生成时,系统自动将命中子块“向上寻亲”替换为其父块的大上下文,完美解决了检索粒度与阅读粒度的矛盾。

三、混合检索与倒数排名融合(Hybrid Search & RRF)

单纯依赖高维稠密向量(Dense Embeddings)存在着显著的短板。向量检索擅长捕捉模糊的上位概念与语义同义替换(如“心肌梗死”与“心脏病发作”在空间中高度临近),但面对精准的专有名词、产品型号、函数名称、工号或错误代码(如 Error Code 0x80070005 或 iPhone 16 Pro Max)时,向量相似度常常产生严重偏离。

为此,现代工业级架构全面采用了混合检索(Hybrid Search)方案:

# 混合检索:BM25 词项检索与 Dense 向量检索的倒数排名融合 (RRF) 算法
from collections import defaultdict

def reciprocal_rank_fusion(
    dense_results: list[dict],    # 包含 [{'doc_id': 'doc_1', 'score': 0.89}, ...]
    sparse_results: list[dict],   # 包含 [{'doc_id': 'doc_2', 'score': 12.4}, ...]
    rrf_k: int = 60,
    top_n: int = 5
) -> list[tuple[str, float]]:
    rrf_scores = defaultdict(float)
    
    # 统计 Dense 向量检索排名倒数加权得分
    for rank, item in enumerate(dense_results):
        doc_id = item['doc_id']
        rrf_scores[doc_id] += 1.0 / (rrf_k + rank + 1)
        
    # 统计 Sparse (BM25) 稀疏检索排名倒数加权得分
    for rank, item in enumerate(sparse_results):
        doc_id = item['doc_id']
        rrf_scores[doc_id] += 1.0 / (rrf_k + rank + 1)
        
    # 按综合得分降序排列
    sorted_docs = sorted(rrf_scores.items(), key=lambda x: x[1], reverse=True)
    return sorted_docs[:top_n]

倒数排名融合(Reciprocal Rank Fusion, RRF) 的精妙之处在于:它完全不依赖两种检索算法绝对打分值的具体范围(BM25 往往是无界非负数,而余弦相似度在 [−1,1][-1, 1] 之间),仅根据候选条目在各自列表中的相对位次进行平滑归一化融合,表现出极强的工程鲁棒性。


四、重排序(Reranking):高精度语义仲裁者

无论是向量检索还是 BM25,为了在百万甚至亿级文档库中实现毫秒级响应,其底层本质上均采用了基于双塔(Bi-Encoder)或词频索引的独立解耦打分。在双塔模型中,Query 与 Document 各自独立生成向量,在检索时仅进行简单的点积或余弦计算,完全无法建模 Query 与 Document 之间精细入微的词级交叉注意力交互。

为了彻底滤除低相关度切片,现代 RAG 系统在混合检索之后引入了重排序模型(Cross-Encoder Reranker):

对比维度

双塔嵌入模型 (Bi-Encoder Embedding)

交叉编码器重排序 (Cross-Encoder Reranker)

计算复杂度

极低,O(N)O(N) 向量点积,可预先离线索引

极高,需对 [Query; Document] 进行端到端全注意力计算

适用阶段

粗排检索阶段(从 1,000,000 条候选过滤至 50 条)

精排过滤阶段(从 50 条候选深度仲裁选出最优 Top 3~5 条)

交互能力

无 Query-Doc 交叉注意力,仅靠语义高维几何临近

全层自注意力深度交叉,能精准识别否定、条件句与细节依赖

典型开源代表

BGE-M3, OpenAI text-embedding-3, E5

BGE-Reranker-Large, Cohere Rerank, Jina Reranker

引入 Reranker 能够显著压制检索噪音,将大模型阅读理解阶段遭遇无关上下文干扰的概率降低 60% 以上。


五、先进 RAG 范式:从静态流水线到自适应纠错

传统的 Naive RAG 是线性的、被动的单向流水线。一旦初次检索没有获取到有效信息,后续生成必定彻底失败。针对这一缺陷,前沿研究提出了更具弹性的先进范式:

  1. 纠正性 RAG(Corrective RAG, CRAG):在检索之后引入一个轻量级的评估模型。如果评估判定检索到的知识质量“良好”,则直接输入大模型;如果质量“模糊”,则启动网络搜索引擎进行外部证据补充;如果判定知识质量“完全无关”,则果断丢弃检索内容,回退至纯参数化推理或请求用户澄清;
  2. 自我反思 RAG(Self-RAG):通过在训练中向大模型引入特殊的反思标记(Reflection Tokens),如 [Retrieve]、[IsRel]、[IsSup]、[IsUse],让模型在生成回答的同时,自主决定何时触发检索、当前生成的句子是否得到了外部文档的可靠支撑,以及答案是否真正切题。

六、RAG 系统的评测体系与工业总结

构建高可靠的 RAG 系统必须依托严谨的量化评测体系。当前工业界广泛采用 Ragas(Retrieval Augmented Generation Assessment) 框架构建的核心四维指标雷达:

  • 忠实度(Faithfulness):生成的回答内容是否能够完全从检索到的上下文证据中推导出来,杜绝任何外部主观胡编;
  • 答案相关度(Answer Relevance):回答是否紧扣用户的初始提问,是否存在答非所问;
  • 上下文精确度(Context Precision):检索并送给大模型的切片中,真正有用的高价值信息密度占比;
  • 上下文召回率(Context Recall):回答问题所需的黄金参考事实,有多少百分比被成功检索入库。

RAG 绝不是简单拼装一个开源向量库与调用一下大模型 API。从文本分块粒度的精雕细琢、混合检索的倒数融合,到 Cross-Encoder 的精细重排与自适应反思纠错,每一个环节都凝聚着现代信息检索(IR)与自然语言处理(NLP)深度融合的工程智慧。