文章目录
- [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 模型,模型可以同时看到问题 + 文档全部内容,理解深层上下文关系,获得精度更高的相关性分数。
核心特征:
- 输入形式 :查询和文档成对拼接输入,不能分开独立编码。
- 语义交互 :自注意力层可以直接计算问题词汇和文档词汇之间的关联,捕捉深层上下文依赖,这是双塔
Bi‑Encoder不具备的能力。 - 向量特性 :无法离线预生成文档向量,每一组「查询‑文档」都需要实时推理打分。
2.2 工作流程

工作流程:
-
构造配对输入 :取用户查询 和单条候选文档 进行文本拼接,组成一条完整输入序列:
[CLS]用户问题[SEP]文档片段[SEP],一次只能输入一组问答对。 -
联合编码计算 :拼接文本送入同一个
Transformer网络,依靠自注意力机制,问题中的词汇和文档中的词汇直接互相作用,实现细粒度的语义关联计算。 -
输出相关性分值 :提取
[CLS]位置向量,经过分类层输出0~1的相关性分数,代表该文档与用户问题的匹配程度。
2.3 应用模式
2.3.1 召回模式(用于检索召回)
Cross‑Encoder 召回模式,是直接使用交叉编码器完成知识库文档的相关性筛选与排序,全程不依赖向量检索、关键词检索等粗召回手段,属于全域精准检索方案,整体流程简洁直接。
完整标准链路:
- 知识库预处理 :对海量长文档进行统一切片、分段处理,生成标准化短文片段(
Passage),并统一固定文本长度,适配Cross‑Encoder模型的上下文窗口限制。 - 用户查询遍历 :接收用户输入的自然语言查询
Query,系统对知识库内所有预处理完成的文档片段进行全量遍历,覆盖全部候选资源。 - 模型输入拼接 :按照标准格式拼接模型输入序列
[CLS] Query [SEP] 候选文档片段 [SEP],将每一组「查询+文档」配对文本,依次送入Cross‑Encoder模型。 - 语义交互与分值计算 :模型通过全量交叉注意力机制,完成查询与文档片段的细粒度语义交互,自主学习二者的关联关系,最终输出每篇文档
0~1区间的精准相关性分数。 - 全局排序与结果输出 :依据模型输出的相关性分数对所有文档片段进行全局降序排序,筛选出
Top-K高相关文档作为最终召回结果,直接送入后续大模型生成阶段。
该模式核心特点是无粗召回、无向量索引、全域逐一对齐打分,完全依靠模型语义理解能力筛选文档。
这种模式召回精度极高 ,能识别细粒度语义与否定关系,无需构建向量索引。但是检索效率差,需全量遍历文档,计算量随文档数线性增长;不能预计算加速,算力显存开销大;受模型上下文窗口限制,长文本会进一步增加计算成本,难以支撑海量知识库。
仅适合小规模、低并发、高精度需求场景 :小型企业知识库、内部文档查询、小众业务问答、低频次精准检索场景,绝对不适合互联网级海量数据检索。
2.3.2 重排模式(用于检索精排)
重排模式是 Cross‑Encoder 在工业 RAG 中的标准落地形态 ,不参与全域检索,仅作为后置精细化优化模块,搭配粗召回链路使用,兼顾检索速度与精度,也是目前主流 RAG 架构的标配方案。
完整标准链路:
- 粗召回阶段 :通过
Bi-Encoder向量检索 +BM25关键词检索双路并行,或单一检索方式,从海量知识库中快速筛选出Top10~Top50的候选文档; - 结果融合 :通过
RRF倒数排名融合算法,合并多路召回结果,去除重复文档,得到初步排序候选集; - 精细重排 :将少量候选文档逐一与查询拼接,送入
Cross‑Encoder模型逐一对齐打分; - 重新排序:依据模型输出的精准相关性分数,更新文档排序,过滤低分噪声文档;
- 结果输出 :筛选
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 模型选择
官方示例中,接入的是 HuggingFace 的 sentence‑transformers ,它是一个开源 Python 库,基于 PyTorch 与 Transformers,专门用于文本语义表征与文本对匹配 ,内置大量预训练权重,包含 MS MARCO 系列 Cross‑Encoder、BGE、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|产品定位:高