LlamaIndex 系列【24】检索增强策略:交叉编码器(Cross‑Encoder)

文章目录

  • [1. 双编码器(Bi‑Encoder)](#1. 双编码器(Bi‑Encoder))
  • [2. 交叉编码器(Cross‑Encoder)](#2. 交叉编码器(Cross‑Encoder))
    • [2.1 什么是 Cross‑Encoder ?](#2.1 什么是 Cross‑Encoder ?)
    • [2.2 工作流程](#2.2 工作流程)
    • [2.3 应用模式](#2.3 应用模式)
      • [2.3.1 召回模式(用于检索召回)](#2.3.1 召回模式(用于检索召回))
      • [2.3.2 重排模式(用于检索精排)](#2.3.2 重排模式(用于检索精排))
  • [3. 案例演示](#3. 案例演示)
    • [3.1 混合检索器](#3.1 混合检索器)
    • [3.2 模型选择](#3.2 模型选择)
    • [3.3 自定义节点后置处理器](#3.3 自定义节点后置处理器)
    • [3.4 构建查询引擎](#3.4 构建查询引擎)
    • [3.5 执行查询](#3.5 执行查询)

1. 双编码器(Bi‑Encoder)

双编码器Bi‑Encoder)就是有两个独立 的编码器,分别把Query(查询) 和 Document Chunk(文档片段)各自独立编码成稠密向量Embedding),再用余弦相似度计算两者匹配分数。

这也是我们之前学习的 RAG 基础架构,已经能实现效果不错的高质量检索。

工作流程:

  • 查询编码器Query Encoder):独立对用户问题进行编码,输出查询向量。
  • 文档编码器Document Encoder):独立对知识库单条文本编码,输出文档向量。

核心机制与优势:

  • 离线预计算文档向量 :提前批量对全量知识库文本生成 Embedding,持久化存入向量数据库
  • 在线轻量推理 :用户实时提问时,仅对问题做一次编码,通过向量库近似最近邻(ANN)完成召回
  • 性能优势 :检索速度高,可支撑百万至千万级文档规模,是 RAG 流程中粗召回阶段的主流方案

2. 交叉编码器(Cross‑Encoder)

2.1 什么是 Cross‑Encoder ?

交叉编码器Cross‑Encoder)将【查询 + 文档】拼接后共同编码,把拼接后的完整文本送入同一个 Transformer 模型,模型可以同时看到问题 + 文档全部内容,理解深层上下文关系,获得精度更高的相关性分数。

核心特征:

  1. 输入形式 :查询和文档成对拼接输入,不能分开独立编码。
  2. 语义交互 :自注意力层可以直接计算问题词汇和文档词汇之间的关联,捕捉深层上下文依赖,这是双塔 Bi‑Encoder不具备的能力。
  3. 向量特性无法离线预生成文档向量,每一组「查询‑文档」都需要实时推理打分。

2.2 工作流程

工作流程:

  1. 构造配对输入 :取用户查询单条候选文档 进行文本拼接,组成一条完整输入序列:[CLS]用户问题[SEP]文档片段[SEP]一次只能输入一组问答对

  2. 联合编码计算 :拼接文本送入同一个 Transformer 网络,依靠自注意力机制,问题中的词汇和文档中的词汇直接互相作用,实现细粒度的语义关联计算。

  3. 输出相关性分值 :提取 [CLS] 位置向量,经过分类层输出 0~1 的相关性分数,代表该文档与用户问题的匹配程度。

2.3 应用模式

2.3.1 召回模式(用于检索召回)

Cross‑Encoder 召回模式,是直接使用交叉编码器完成知识库文档的相关性筛选与排序,全程不依赖向量检索、关键词检索等粗召回手段,属于全域精准检索方案,整体流程简洁直接。

完整标准链路:

  1. 知识库预处理 :对海量长文档进行统一切片、分段处理,生成标准化短文片段(Passage),并统一固定文本长度,适配 Cross‑Encoder 模型的上下文窗口限制。
  2. 用户查询遍历 :接收用户输入的自然语言查询 Query,系统对知识库内所有预处理完成的文档片段进行全量遍历,覆盖全部候选资源。
  3. 模型输入拼接 :按照标准格式拼接模型输入序列 [CLS] Query [SEP] 候选文档片段 [SEP],将每一组「查询+文档」配对文本,依次送入 Cross‑Encoder 模型。
  4. 语义交互与分值计算 :模型通过全量交叉注意力机制,完成查询与文档片段的细粒度语义交互,自主学习二者的关联关系,最终输出每篇文档 0~1 区间的精准相关性分数。
  5. 全局排序与结果输出 :依据模型输出的相关性分数对所有文档片段进行全局降序排序,筛选出 Top-K 高相关文档作为最终召回结果,直接送入后续大模型生成阶段。

该模式核心特点是无粗召回、无向量索引、全域逐一对齐打分,完全依靠模型语义理解能力筛选文档。

这种模式召回精度极高 ,能识别细粒度语义与否定关系,无需构建向量索引。但是检索效率差,需全量遍历文档,计算量随文档数线性增长;不能预计算加速,算力显存开销大;受模型上下文窗口限制,长文本会进一步增加计算成本,难以支撑海量知识库。

仅适合小规模、低并发、高精度需求场景 :小型企业知识库、内部文档查询、小众业务问答、低频次精准检索场景,绝对不适合互联网级海量数据检索

2.3.2 重排模式(用于检索精排)

重排模式是 Cross‑Encoder 在工业 RAG 中的标准落地形态 ,不参与全域检索,仅作为后置精细化优化模块,搭配粗召回链路使用,兼顾检索速度与精度,也是目前主流 RAG 架构的标配方案。

完整标准链路:

  1. 粗召回阶段 :通过 Bi-Encoder 向量检索 + BM25 关键词检索双路并行,或单一检索方式,从海量知识库中快速筛选出 Top10~Top50 的候选文档;
  2. 结果融合 :通过 RRF 倒数排名融合算法,合并多路召回结果,去除重复文档,得到初步排序候选集;
  3. 精细重排 :将少量候选文档逐一与查询拼接,送入Cross‑Encoder 模型逐一对齐打分;
  4. 重新排序:依据模型输出的精准相关性分数,更新文档排序,过滤低分噪声文档;
  5. 结果输出 :筛选 Top3~Top5 最优高相关文档,送入 LLM 生成最终答案。

该模式核心逻辑:粗召回保速度、保召回率,重排保精度、保相关性,各司其职、优势互补。

这种模式是当前主流的落地方案:

  • 粗召回BM25/Bi‑Encoder)快速从海量知识库筛选出一批候选文档,牺牲部分精准度换取低延迟;
  • 再由 Cross‑Encoder 对少量候选做细粒度语义打分重排,剔除假阳性,把高相关文档前置,在可控算力开销下兼顾检索吞吐量与 RAG 答案质量。

3. 案例演示

3.1 混合检索器

直接沿用之前案例中的混合检索器:

python 复制代码
fusion_retriever = QueryFusionRetriever(
    retrievers=[vector_retriever, bm25_retriever],
    llm=llm,
    num_queries=1,              # 不扩展查询,仅做结果融合
    mode="reciprocal_rerank",   # RRF倒数排名融合算法
    similarity_top_k=3,
    use_async=False,
)

3.2 模型选择

官方示例中,接入的是 HuggingFacesentence‑transformers ,它是一个开源 Python 库,基于 PyTorchTransformers,专门用于文本语义表征与文本对匹配 ,内置大量预训练权重,包含 MS MARCO 系列 Cross‑EncoderBGE、MiniLM 等,支持多语言,可用于语义检索、聚类、重复文本识别、RAG 检索重排,也支持用户微调 Bi‑Encoder/Cross‑Encoder

这里,我们使用阿里云的排序模型:

3.3 自定义节点后置处理器

LlamaIndex 使用时需要自定义一个 QwenRerank 节点后置处理器:

python 复制代码
from llama_index.core.postprocessor.types import BaseNodePostprocessor


class QwenRerank(BaseNodePostprocessor):
    """调用 DashScope 原生 text-rerank 接口,给粗召回结果重新打分"""

    model_name: str = "qwen3.7-text-rerank"
    top_n: int = 3
    api_key: str = ""
    api_host: str = ""

    @classmethod
    def class_name(cls) -> str:
        return "QwenRerank"

    def _postprocess_nodes(self, nodes, query_bundle=None):
        if not nodes or query_bundle is None:
            return nodes

        resp = requests.post(
            f"{self.api_host}/api/v1/services/rerank/text-rerank/text-rerank",
            headers={
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json",
            },
            json={
                "model": self.model_name,
                "input": {
                    "query": query_bundle.query_str,
                    "documents": [n.node.get_content() for n in nodes],
                },
                "parameters": {"return_documents": False, "top_n": self.top_n},
            },
            timeout=30,
        )
        resp.raise_for_status()

        # results 已按 relevance_score 降序,index 是传入 nodes 的下标
        results = resp.json()["output"]["results"]
        reranked = []
        for r in results:
            hit = nodes[r["index"]]
            hit.score = r["relevance_score"]
            reranked.append(hit)
        return reranked

初始化:

python 复制代码
rerank = QwenRerank(
    model_name="qwen3.7-text-rerank",
    top_n=3,
    api_key=api_key,
    api_host=API_HOST,
)

3.4 构建查询引擎

构建查询引擎并传入自定义的 QwenRerank

python 复制代码
query_engine = vector_index.as_query_engine(
    llm=llm,
    similarity_top_k=10,            # 先粗召回:10 个分块全取回
    node_postprocessors=[rerank],   # 再精排收敛到 top 3
)

3.5 执行查询

python 复制代码
now = time()
response = query_engine.query("明珠手机的处理器是?")
print(f"Elapsed: {round(time() - now, 2)}s")

print(f"\n答案:{response}")

print("\n重排后的引用分块:")
for i, item in enumerate(response.source_nodes, 1):
    print(f"[{i}] rerank 分数:{item.score:.4f}")
    print(f"    {item.node.get_content()[:60]}\n")

输出示例:

python 复制代码
Elapsed: 3.16s

答案:明珠手机 MINGZHU‑M1 搭载的是旗舰 4nm 制程八核处理器。

重排后的引用分块:
[1] rerank 分数:0.9454
    核心规格参数表
|项目|详细参数|
| ---- | ---- |
|产品型号|MINGZHU‑M1|
|处理器

[2] rerank 分数:0.5979
    产品核心亮点功能介绍
### 5.1 明珠影像系统
搭载自研明珠图像计算引擎,支持夜景长曝光、人像自然虚化、长焦远景

[3] rerank 分数:0.5759
    # 明珠手机 MINGZHU‑M1 产品说明文档
**文档版本:V1.0|发布日期:2026‑09‑04|产品定位:高
相关推荐
薛定谔的猫-菜鸟程序员1 小时前
端侧免费大模型实测:MiniCPM5-2B-Q4_K_M 架构拆解与 4GB 显卡实测
人工智能·大模型·agent·hermes·minicpm5-2b
callmeSoon1 小时前
Prompt Caching in Agent Harnesses
agent
Darling噜啦啦2 小时前
LangGraph 实战:从 StateGraph 基础到多 Agent 编排,分支循环中断恢复全掌握
langchain·agent
YuKeeHgg2 小时前
HuabSmart Skills:一个开源的 AI Skill、Agent、Prompt 与 MCP 能力库
人工智能·ai·prompt·华彬智融
知无涯者2 小时前
Agent 008 - Permission
agent
孙启超3 小时前
【AI开发之Rust】第 1 课:认识 Rust 与开发环境 —— 装好工具链,跑通第一个程序
开发语言·人工智能·后端·ai·rust·安全架构
Erishen3 小时前
从 SQLite 到 LLM 重排:一个 Rust RAG 服务的七层设计决策
架构·开源·agent
大树883 小时前
液冷系统的真正瓶颈,藏在那层不到1毫米的材料里
大数据·运维·服务器·人工智能·ai
码农哈丁3 小时前
用 Trait 给系统留出后路:RAG 存储层如何做到 5 种后端可插拔
人工智能·知识图谱·rag