Bi-Encoder 和 Cross-Encoder 的区别,以及它们在 RAG 中的应用
Bi-Encoder (双塔模型) 和 Cross-Encoder (交互模型) 是自然语言处理 (NLP) 中用于计算两个文本句子相似度或相关性的两种主要架构。
在 RAG (检索增强生成) 系统中,理解它们的区别对于构建既快又准的检索流水线至关重要。
一、 核心区别 (Core Differences)
1. Bi-Encoder (双塔编码器)
- 架构:将两个输入(如 Query 和 Document)分别送入两个独立的 BERT 模型(通常共享权重)。这两个模型互不干扰,各自输出一个句向量(Embedding)。
- 计算方式:
Vector_A = BERT(Sentence_A)Vector_B = BERT(Sentence_B)Score = Cosine_Similarity(Vector_A, Vector_B)
- 特点:
- 独立性:文档的向量可以预先计算并存储在向量数据库中。
- 交互时机:仅在最后一步计算余弦相似度时发生交互。
- 优点:检索速度极快。适合在大规模数据集中进行初步筛选(ANN 搜索)。
- 缺点:精度相对较低。因为将长文本压缩成一个固定长度的向量会丢失细节,且 Query 和 Document 在编码阶段没有信息交互。
2. Cross-Encoder (交叉编码器)
- 架构:将两个输入拼接在一起,作为一个整体送入同一个 BERT 模型。
- 计算方式:
Input = [CLS] Sentence_A [SEP] Sentence_BScore = BERT(Input) -> Classification Layer
- 特点:
- 全交互:Query 和 Document 的每一个 Token 在模型的每一层都在通过 Self-Attention 机制进行交互。
- 不可预计算:必须知道 Query 是什么,才能和 Document 一起输入模型,无法预先存成向量。
- 优点:精度极高。模型能够捕捉到 Query 和 Document 之间细微的语义关系和逻辑匹配。
- 缺点:计算速度慢。每来一个 Query,都要和所有候选文档进行一次完整的模型前向传播,计算量巨大。
二、 对比总结表
| 特性 | Bi-Encoder | Cross-Encoder |
|---|---|---|
| 别名 | 双塔模型 (Siamese Network) | 交互模型 / 重排序模型 |
| 输入处理 | 两个句子分别独立输入 | 两个句子拼接后一起输入 |
| 向量存储 | 可以 (存入向量数据库) | 不可以 (实时计算) |
| 计算复杂度 | 低 (预存后只需计算点积) | 高 (每次都需要完整推理) |
| 检索速度 | 极快 (毫秒级) | 慢 (秒级,取决于候选数量) |
| 准确度 | 较好 (捕捉整体语义) | 最好 (捕捉细微语义交互) |
| 主要用途 | 召回 (Retrieval) | 重排序 (Re-ranking) |
三、 在 RAG 中的应用 (Application in RAG)
在生产级的 RAG 系统中,通常采用 "两阶段检索" (Two-Stage Retrieval) 策略,结合两者的优点:
第一阶段:召回 (Retrieval) -> 使用 Bi-Encoder
目标:从海量知识库(如 100 万篇文档)中快速筛选出最相关的 Top-K 个候选(如 Top 100)。
- 工作流:
- 预先使用 Bi-Encoder 将所有文档转化为向量,存入向量数据库(如 Milvus, Pinecone, FAISS)。
- 用户提问时,将 Query 转化为向量。
- 在向量数据库中进行近似最近邻搜索 (ANN)。
- 为什么用它:因为 Cross-Encoder 无法在几毫秒内处理 100 万次对比,只有 Bi-Encoder 配合向量索引能做到。
第二阶段:重排序 (Re-ranking) -> 使用 Cross-Encoder
目标:从第一阶段筛选出的 Top 100 个候选中,精准找出最匹配的 Top-N 个(如 Top 5),喂给 LLM。
- 工作流:
- 获取 Bi-Encoder 返回的 Top 100 文档。
- 将
(Query, Doc_1),(Query, Doc_2)...(Query, Doc_100)组成 100 个对子。 - 送入 Cross-Encoder 模型进行打分。
- 根据分数从高到低排序,截取前 5 个。
- 为什么用它:向量检索(Bi-Encoder)有时会因为语义模糊或关键词缺失导致召回不准(例如“苹果”是水果还是公司)。Cross-Encoder 通过深度注意力机制,能精准剔除不相关的文档,显著提升 RAG 最终生成的质量。
四、 形象的比喻
Bi-Encoder (相亲角的简历筛选):
- 你(Query)把你的条件写在纸上,所有相亲对象(Documents)也把条件写在纸上。
- 红娘(算法)只看纸面对比(身高、学历、收入),快速从 1000 个人里挑出 50 个大概匹配的。你们还没见面。
Cross-Encoder (面对面约会):
- 你和这 50 个人逐一见面聊天(Full Attention)。
- 通过深入交流,你发现其中 45 个虽然简历匹配但性格不合,只有 5 个是真正合适的。
- 这个过程很花时间,所以你不可能和 1000 个人都见面,只能先通过简历筛选。
五、 总结建议
在构建 RAG 时:
- 如果你的知识库很小(< 1000 条),可以直接用 Cross-Encoder 暴力扫描,效果最好。
- 如果知识库很大,必须使用 Bi-Encoder + 向量数据库进行初筛。
- 为了解决“检索到了但 LLM 回答不对”的问题,强烈建议加入 Cross-Encoder (Re-ranker) 模块。目前很多开源模型(如 BGE-Reranker, Cohere Rerank)效果都非常好,只需极小的延迟代价就能大幅提升准确率。
右滑查看面试常问