1.原理
BGE‑M3
来源
- 由北京智源人工智能研究院(BAAI)提出,论文 “BGE M3‑Embedding: Multi‑Lingual, Multi‑Functionality, Multi‑Granularity Text Embeddings Through Self‑Knowledge Distillation” 于 2024 年 2 月发布。
- 同时可在 Hugging Face 平台获取模型代码与权重:
BAAI/bge-m3
。
原理公式
BGE‑M3 采用自蒸馏(self‑knowledge distillation)和多任务学习,将三种检索功能合一:
- 密集检索(Dense Retrieval):输入文本编码为向量,利用余弦相似度进行召回。
- 多向量检索(Multi-Vector Retrieval):对长文档切片,多向量编码,选取片段分数最高者。
- 稀疏匹配(Sparse Retrieval):类似于 BM25 的稀疏表示,增强关键词匹配能力。
其核心训练目标可抽象为对比损失(Contrastive Loss):
L=−∑(q,d+)logexp(sim(q,d+)/τ)∑d′∈{ d+ }∪{ d− }exp(sim(q,d′)/τ) \mathcal{L} = -\sum_{(q, d^+)} \log \frac{\exp(\mathrm{sim}(q, d^+)/\tau)}{\sum_{d'\in \{\!d^+\!\}\cup\{\!d^-\!\}} \exp(\mathrm{sim}(q, d')/\tau)} L=−(q,d+)∑log∑d′∈{d+}∪{d−}exp(sim(q,d′)/τ)exp(sim(q,d+)/τ)
并在此基础上融合从不同功能子模型获得的“软标签”作为教师信号进行自蒸馏。
案例介绍
- 多语言文档检索:同一模型可在英、中、法、德等 100+ 语言上检索,最长支持 8192 Token 文档。
- 电商问答系统:利用 Dense+Sparse 混合检索,提升长查询和关键词查询的覆盖率。
优缺点
- 优点
- 一体化:三种检索功能统一到一个模型,简化部署。
- 多语言:覆盖 100+ 语言,跨语种迁移效果好。
- 大粒度:支持长文档,多向量切片检索。
- 缺点
- 资源消耗:模型本身较大(数 GB),推理时显存/CPU 开销高。
- 微调成本:自蒸馏与多功能训练需要海量正负样本,数据准备成本高。
BGE‑Reranker‑v2‑M3
来源
- 同样由 BAAI 发布,模型 ID 为
BAAI/bge-reranker-v2-m3
,可在 Hugging Face 查看详细说明。 - Pinecone 文档给出了在向量检索管道中作为再排序器(Reranker)的用法示例。
原理公式
与纯嵌入检索不同,Reranker 采用 Cross‑Encoder 结构,直接将查询与候选文档拼接为输入:
score=σ(fθ([CLS ∥ q ∥ SEP ∥ d])) \mathrm{score} = \sigma\big(f_\theta([\text{CLS}\,\|\,q\,\|\,\text{SEP}\,\|\,d])\big) score=σ(fθ([CLS∥q∥SEP∥d]))
- 其中 fθf_\thetafθ 为 Transformer 编码器的输出映射到一个标量,σ\sigmaσ 为 Sigmoid 函数,将得分归一化到 [0,1][0,1][0,1] 。
案例介绍
- 检索增强生成(RAG)管道:先用 BGE‑M3 拉取 Top‑k 候选,再用 BGE‑Reranker‑v2‑M3 细排,显著提升前 5 条的准确率。
- 法律文档检索:对长法规条文进行精细匹配,增强法律问答系统的精度。
优缺点
- 优点
- 高精度:Cross‑Encoder 能更精细地建模句间交互,提升相关度判别。
- 多语种:支持中英等多语言,适应国际化场景。
- 缺点
- 速度瓶颈:需要对每个候选对做前向推理,计算量为 O(k)O(k)O(k),不适合大规模初筛。
- 资源要求:推理时显存占用高,适合第二阶段再排序。
BM25
来源
- 基于 1970–80 年代的二元独立模型(Binary Independence Model),由 Robertson、Spärck Jones 等人提出,最早用于 London City University 的 Okapi 系统。
原理公式
给定查询 Q={q1,…,qn}Q=\{q_1,\dots,q_n\}Q={q1,…,qn} 和文档 DDD,BM25 评分为:
score(D,Q)=∑i=1nIDF(qi) f(qi,D) (k1+1)f(qi,D)+k1(1−b+b ∣D∣avgdl), \mathrm{score}(D,Q) = \sum_{i=1}^n \mathrm{IDF}(q_i)\; \frac{f(q_i,D)\,(k_1+1)} {f(q_i,D) + k_1\Bigl(1 - b + b\,\tfrac{|D|}{\mathrm{avgdl}}\Bigr)}, score(D,Q)=i=1∑nIDF(qi)f(qi,D)+k1(1−b+bavgdl∣D∣)f(qi,D)(k1+1),
其中
- f(qi,D)f(q_i,D)f(qi,D):词 qiq_iqi 在文档 DDD 中的频次;
- ∣D∣|D|∣D∣、avgdl\mathrm{avgdl}avgdl:文档长度与平均长度;
- k1∈[1.2,2.0]k_1\in[1.2,2.0]k1∈[1.2,2.0]、b≈0.75b\approx0.75b≈0.75:超参数;
- IDF(qi)=lnN−n(qi)+0.5n(qi)+0.5+1\mathrm{IDF}(q_i)=\ln\frac{N - n(q_i)+0.5}{n(q_i)+0.5}+1IDF(qi)=lnn(qi)+0.5N−n(qi)+0.5+1。
案例介绍
- Elasticsearch 默认检索:在电商、新闻站点中作为关键词检索的基础。
- Wikipedia 检索:维基媒体推荐将其作为初始排序函数,再结合 PageRank 等信号。
优缺点
- 优点
- 计算快捷:只依赖稀疏倒排索引,无需深度模型。
- 易调优:参数少,可根据数据集快速调整。
- 缺点
- 语义能力弱:无法捕捉同义词、深层语义;
- 长文本不友好:过度依赖文档长度校正,长文可能被低估。
通用 Rerank(再排序)机制
来源
- Dify 官方文档对再排序(Re‑rank)的流程与原理有介绍:先拉取候选列表,再计算语义匹配打分并重新排序。
原理公式
对于候选列表 {D1,…,Dk}\{D_1,\dots,D_k\}{D1,…,Dk},再排序模型计算:
si=σ(fθ([CLS ∥ q ∥ SEP ∥ Di])),输出按 si 从大到小排序后的列表. s_i = \sigma\big(f_\theta([\text{CLS}\,\|\,q\,\|\,\text{SEP}\,\|\,D_i])\big), \quad \text{输出按 }s_i\text{ 从大到小排序后的列表}. si=σ(fθ([CLS∥q∥SEP∥Di])),输出按 si 从大到小排序后的列表.
案例介绍
- 多阶段检索系统:第一阶段用 BM25+Dense 快速召回 Top‑100,第二阶段用 Reranker 对前 100 条精排。
- 问答系统:保证最相关的上下文被优先选入生成模型的提示(prompt)中。
优缺点
- 优点
- 精细排序:克服浅层召回模型的不足。
- 灵活可替换:可选用不同大小、性能的 rerank 模型。
- 缺点
- 时延增加:额外的模型推理步骤,需权衡实时性。
- 资源消耗高:特别是在并发场景下,对 GPU/CPU 压力大。
总结:在 Dify 的知识库检索管道中,通常采用“BM25 或 Dense Embedding(如 BGE‑M3)→ Top‑k 候选 → Cross‑Encoder Rerank(如 BGE‑Reranker‑v2‑M3)”的多阶段检索策略,以兼顾效率与精度。
2.案例
BM25 计算步骤
参数设定
- 语料库大小 N=3N=3N=3。
- 文档长度 ∣D1∣=12|D_1|=12∣D1∣=12,∣D2∣=9|D_2|=9∣D2∣=9,∣D3∣=9|D_3|=9∣D3∣=9。
- 平均文档长度 avgdl=10\text{avgdl}=10avgdl=10。
- 调参 k1=1.5, b=0.75k_1=1.5,\;b=0.75k1=1.5,b=0.75。
- 查询核心词集合 Q={机组, 停运前}Q=\{\texttt{机组},\;\texttt{停运前}\}Q={机组,停运前}。
1. 计算文档频次(df)与 IDF
df(机组)=3,IDF(机组)=ln3−3+0.53+0.5+1≈−0.9459,df(停运前)=1,IDF(停运前)=ln3−1+0.51+0.5+1≈1.5108. \begin{aligned} \mathrm{df}(\texttt{机组})&=3,\quad \mathrm{IDF}(\texttt{机组}) =\ln\frac{3-3+0.5}{3+0.5}+1\approx -0.9459,\\ \mathrm{df}(\texttt{停运前})&=1,\quad \mathrm{IDF}(\texttt{停运前}) =\ln\frac{3-1+0.5}{1+0.5}+1\approx 1.5108. \end{aligned} df(机组)df(停运前)=3,IDF(机组)=ln3+0.53−3+0.5+1≈−0.9459,=1,IDF(停运前)=ln1+0.53−1+0.5+1≈1.5108.
2. 计算长度校正项
对于任一文档 DDD:
denom(D)=f+k1(1−b+b ∣D∣avgdl). \text{denom}(D) = f + k_1\Bigl(1 - b + b\,\tfrac{|D|}{\text{avgdl}}\Bigr). denom(D)=f+k1(1−b+bavgdl∣D∣).
- D1 (∣D∣=12|D|=12∣D∣=12):
denom=1+1.5(0.25+0.75 ×1.2)≈2.725\text{denom}=1 + 1.5(0.25 + 0.75\,\times1.2)\approx2.725denom=1+1.5(0.25+0.75×1.2)≈2.725. - D2/D3 (∣D∣=9|D|=9∣D∣=9):
denom=1+1.5(0.25+0.75 ×0.9)≈2.3875\text{denom}=1 + 1.5(0.25 + 0.75\,\times0.9)\approx2.3875denom=1+1.5(0.25+0.75×0.9)≈2.3875.
3. 计算每个词在每篇文档上的子项得分
score(D,q)=IDF(q)×f(q,D) (k1+1)denom(D). \mathrm{score}(D,q) = \mathrm{IDF}(q)\times\frac{f(q,D)\,(k_1+1)}{\text{denom}(D)}. score(D,q)=IDF(q)×denom(D)f(q,D)(k1+1).
以 D1 为例:
- “机组” 子项:−0.9459×1×2.52.725≈−0.867-0.9459\times\frac{1\times2.5}{2.725}\approx -0.867−0.9459×2.7251×2.5≈−0.867。
- “停运前” 子项:+1.5108×1×2.52.725≈+1.385+1.5108\times\frac{1\times2.5}{2.725}\approx +1.385+1.5108×2.7251×2.5≈+1.385。
对于 D2/D3,“停运前” 子项均为 0,“机组” 子项为 −0.9459×2.52.3875≈−0.990-0.9459\times\frac{2.5}{2.3875}\approx -0.990−0.9459×2.38752.5≈−0.990。
4. 累加得到总分并排序
文档 | “机组” | “停运前” | BM25 总分 |
---|---|---|---|
D1 | −0.867 | +1.385 | +0.518 |
D2 | −0.990 | 0 | −0.990 |
D3 | −0.990 | 0 | −0.990 |
→ BM25 排序:D1 (0.518) > D2 (−0.990) = D3 (−0.990)。
BGE‑M3 密集检索计算步骤
文本编码:用 BGE‑M3 分别将查询与每篇文档编码为向量
q, di∈RD\mathbf{q},\,\mathbf{d}_i\in\mathbb{R}^Dq,di∈RD。计算余弦相似度:
sim(q,di)=q⋅di∥q∥ ∥di∥. \mathrm{sim}(\mathbf{q},\mathbf{d}_i) = \frac{\mathbf{q}\cdot\mathbf{d}_i}{\|\mathbf{q}\|\;\|\mathbf{d}_i\|}. sim(q,di)=∥q∥∥di∥q⋅di.
示例相似度分(假定):
- D1: 0.78
- D2: 0.55
- D3: 0.30
排序:D1 (0.78) > D2 (0.55) > D3 (0.30)。
Cross‑Encoder Rerank 计算步骤
输入拼接:将查询与文档拼接为
[CLS] 机组停运前,要怎么做 [SEP] <文档内容> [SEP]
前向推理:通过 Transformer,取
[CLS]
对应的输出向量 hCLSh_{\rm CLS}hCLS。线性打分与 Sigmoid:
si=σ(w⊤hCLS+b),σ(z)=11+e−z. s_i = \sigma\bigl(w^\top h_{\rm CLS} + b\bigr),\quad \sigma(z)=\frac1{1+e^{-z}}. si=σ(w⊤hCLS+b),σ(z)=1+e−z1.
示例得分(假定):
- D1: 0.95
- D2: 0.45
最终排序:D1 (0.95) > D2 (0.45)。
3.Rerank模型
定义
再排序模型:给定一个查询 qqq 和初筛阶段召回的候选文档集合 {D1,D2,…,Dk}\{D_1, D_2, \dots, D_k\}{D1,D2,…,Dk},再排序模型对每个 (q,Di)(q,D_i)(q,Di) 对计算一个相关性分数 sis_isi,并按分数降序输出最终排序结果。
- 输入:查询 qqq,候选文档/段落 DiD_iDi。
- 输出:相关性分数 sis_isi,或直接输出排序后的列表。
- 目标:在召回结果中筛出最相关的 Top‑n 条,通常 kkk 在几十到数百之间。
主要类别
类别 | 模型示例 |
---|---|
Lexical Reranker | BM25‑Rerank、Learning‑to‑Rank (LTR) 基于手工特征 |
Dense Bi‑Encoder | SBERT、Dual‑Encoder |
Cross‑Encoder | BERT Cross‑Encoder、T5 Score |
Poly‑Encoder | Poly‑Encoder (Facebook AI) |
Late‑Interaction | ColBERT, SPLADE |
Lightweight Reranker | TinyBERT Reranker, Distilled Cross‑Encoder |
各类模型原理与公式
1. Lexical Reranker
基本思路:在召回阶段(如 BM25/ELK)后,结合更多手工或学习到的关键词匹配特征,通过传统学习‑排序方法(如 LambdaMART、RankSVM)进行再排序。
核心公式(示例:LTR 中的加权线性模型):
si=∑j=1mwj ϕj(q,Di) s_i = \sum_{j=1}^m w_j \, \phi_j(q, D_i) si=j=1∑mwjϕj(q,Di)
- ϕj\phi_jϕj:查询-文档特征(如 BM25 分数、词汇重叠度、文档新鲜度等)。
- wjw_jwj:模型学习到的权重,通常通过梯度提升树等方法训练。
应用:传统搜索引擎(Elasticsearch、Solr)的第二阶段;金融、法务等对可解释性要求高的场景。
2. Dense Bi‑Encoder
结构:查询和文档分别通过同一或不同网络编码成向量
q=fθ(q), di=fθ(Di)\mathbf{q} = f_\theta(q),\;\mathbf{d}_i = f_\theta(D_i)q=fθ(q),di=fθ(Di)。相似度计算(点积或余弦):
si=sim(q,di)=q⋅di∥q∥∥di∥. s_i = \mathrm{sim}(\mathbf{q}, \mathbf{d}_i) = \frac{\mathbf{q}\cdot\mathbf{d}_i}{\|\mathbf{q}\|\|\mathbf{d}_i\|}. si=sim(q,di)=∥q∥∥di∥q⋅di.
训练 Loss:对比学习(Contrastive Loss)
L=−logexp(q⋅d+/τ)∑d′∈{d+}∪D−exp(q⋅d′/τ). \mathcal{L} = -\log\frac{\exp(\mathbf{q}\cdot\mathbf{d}^+/ \tau)} {\sum_{d'\in\{d^+\}\cup D^-}\exp(\mathbf{q}\cdot\mathbf{d}'/\tau)}. L=−log∑d′∈{d+}∪D−exp(q⋅d′/τ)exp(q⋅d+/τ).
应用:实时性要求高、候选集较大时,用于快速打分再排序。
3. Cross‑Encoder
结构:将查询与文档拼接,输入同一个 Transformer:
input=[CLS] q [SEP] Di [SEP]. \text{input} = [\text{CLS}]\;q\;[\text{SEP}]\;D_i\;[\text{SEP}]. input=[CLS]q[SEP]Di[SEP].
打分公式:
zi=w⊤hCLS(q,Di)+b,si=σ(zi), z_i = w^\top h_{\rm CLS}(q,D_i) + b,\quad s_i = \sigma(z_i), zi=w⊤hCLS(q,Di)+b,si=σ(zi),
其中 hCLSh_{\rm CLS}hCLS 是 Transformer 最后一层
[CLS]
向量,σ\sigmaσ 为 Sigmoid(或直接回归打分)。训练 Loss:二分类交叉熵或 Pairwise Ranking Loss。
应用:Top‑k 精排阶段,尤其需要细粒度交互判断时。
4. Poly‑Encoder
设计动机:平衡 Bi‑Encoder 的效率与 Cross‑Encoder 的精度。
结构:
查询生成多组“全局上下文”向量 {c1,…,cm}\{c_1,\dots,c_m\}{c1,…,cm}。
文档生成单一向量 d\mathbf{d}d。
两者之间做多头注意力交互:
aj=softmax(cj⋅d),q~=∑j=1maj cj, a_j = \mathrm{softmax}(c_j \cdot \mathbf{d}),\quad \tilde{\mathbf{q}} = \sum_{j=1}^m a_j\,c_j, aj=softmax(cj⋅d),q~=j=1∑majcj,
最终打分 q~⋅d\tilde{\mathbf{q}}\cdot \mathbf{d}q~⋅d。
应用:大规模检索场景,兼顾精度和吞吐。
5. Late‑Interaction(如 ColBERT)
思路:保留 token 级别交互,同时支持高效检索。
流程:
编码查询与文档,保留每个 token 的向量序列。
对每个查询 token,在文档 token 上做最大池化相似度:
si=∑t∈qmaxu∈Di(qt⋅du). s_i = \sum_{t\in q}\max_{u\in D_i}(\mathbf{q}_t\cdot \mathbf{d}_u). si=t∈q∑u∈Dimax(qt⋅du).
应用:需要细粒度匹配,同时检索规模很大时。
6. Lightweight/Distilled Rerankers
- 做法:将大型 Cross‑Encoder 蒸馏到小模型(TinyBERT、MiniLM),或只在最后几层做精排,以降低延迟。
- 公式:与 Cross‑Encoder 同构,参数量和层数更少。
- 应用:对响应时延敏感的在线服务。
应用场景
场景 | 推荐模型类别 | 原因 |
---|---|---|
传统文档检索 | Lexical / Dense | BM25 快速召回;Dual‑Encoder 快速计算海量向量相似度 |
问答 & 对话系统 | Cross‑Encoder | 需要精确定性回答相关段落,交互式理解更强 |
大规模检索服务 | Poly‑Encoder / ColBERT | 平衡查询延迟与精排质量,支持千万级文档库 |
实时推荐 & 召回 | Lightweight Bi‑Encoder | 延迟要求苛刻,模型需小且预测快 |
专业领域检索 | Lexical + Cross‑Encoder | 领域词汇丰富,用 BM25 确保关键词召回,再用 Cross‑Encoder 确定精度 |
优缺点比较
模型类别 | 优点 | 缺点 |
---|---|---|
Lexical Reranker | 解释性强;部署简单;训练/推理成本低 | 语义能力弱;无法处理同义、上下文 |
Dense Bi‑Encoder(双塔) | 推理高效;易扩展到大规模底库;端到端学习语义 | 交互浅;精度低于 Cross‑Encoder |
Cross‑Encoder(单塔) | 精度最高;建模深度交互,理解查询与文档细节 | 计算量大;延迟高;不适合大规模初筛 |
Poly‑Encoder | 对比 Cross‑Encoder 延迟低;比 Bi‑Encoder 精度高 | 实现复杂;对长文档效果有时受限 |
Late‑Interaction | 保留 token 级匹配;在较大规模下仍能获得高精度 | 索引与检索成本较高;需要定制倒排索引结构 |
Lightweight Reranker | 延迟低;适合在线场景 | 相比原始大模型精度有所下降;蒸馏过程复杂 |
总结:选择合适的 Rerank 模型,需要在检索精度、在线延迟和计算资源之间进行权衡。一般推荐:
- 初筛:BM25 或 Dense Bi‑Encoder。
- 精排:若对实时性要求不高,用 Cross‑Encoder;大规模场景可选 Poly‑Encoder 或 Late‑Interaction;对延迟敏感时选 Lightweight 版本。
4.单塔和双塔模型
在我们上面提到的几大 Rerank 模型类别里:
- 单塔(Single‑Tower) 通常指 Cross‑Encoder 这种结构:
- 查询和文档拼接在一起,作为一个整体送入同一个 Transformer 模型(“单”塔)去做深度交互和打分。
- 双塔(Two‑Tower 或 Bi‑Encoder) 则对应 Dense Bi‑Encoder:
- 查询和文档各自独立通过一个“塔”去编码成向量(两座塔),然后再通过向量间的点积/余弦相似度来快速打分。
简而言之:
- 查询和文档各自独立通过一个“塔”去编码成向量(两座塔),然后再通过向量间的点积/余弦相似度来快速打分。
结构名称 | 对应类别 | 特点 |
---|---|---|
单塔 | Cross‑Encoder | 一次前向即可捕捉查询–文档深度交互,精度高但推理慢 |
双塔 | Dense Bi‑Encoder | 异步编码、向量检索速度快但交互浅 |