【实战】Dify从0到100进阶--知识库相关模型原理

发布于:2025-07-10 ⋅ 阅读:(45) ⋅ 点赞:(0)

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)和多任务学习,将三种检索功能合一:

  1. 密集检索(Dense Retrieval):输入文本编码为向量,利用余弦相似度进行召回。
  2. 多向量检索(Multi-Vector Retrieval):对长文档切片,多向量编码,选取片段分数最高者。
  3. 稀疏匹配(Sparse Retrieval):类似于 BM25 的稀疏表示,增强关键词匹配能力。

其核心训练目标可抽象为对比损失(Contrastive Loss):
L=−∑(q,d+)log⁡exp⁡(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+)logd{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θ([CLSqSEPd]))

  • 其中 fθf_\thetafθ 为 Transformer 编码器的输出映射到一个标量,σ\sigmaσ 为 Sigmoid 函数,将得分归一化到 [0,1][0,1][0,1]

案例介绍

  1. 检索增强生成(RAG)管道:先用 BGE‑M3 拉取 Top‑k 候选,再用 BGE‑Reranker‑v2‑M3 细排,显著提升前 5 条的准确率。
  2. 法律文档检索:对长法规条文进行精细匹配,增强法律问答系统的精度。

优缺点

  • 优点
    • 高精度: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=1nIDF(qi)f(qi,D)+k1(1b+bavgdlD)f(qi,D)(k1+1),

其中

  • f(qi,D)f(q_i,D)f(qi,D):词 qiq_iqi 在文档 DDD 中的频次;
  • ∣D∣|D|Davgdl\mathrm{avgdl}avgdl:文档长度与平均长度;
  • k1∈[1.2,2.0]k_1\in[1.2,2.0]k1[1.2,2.0]b≈0.75b\approx0.75b0.75:超参数;
  • IDF(qi)=ln⁡N−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.5Nn(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θ([CLSqSEPDi])),输出按 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|=12D1=12∣D2∣=9|D_2|=9D2=9∣D3∣=9|D_3|=9D3=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(机组)=ln⁡3−3+0.53+0.5+1≈−0.9459,df(停运前)=1,IDF(停运前)=ln⁡3−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.533+0.5+10.9459,=1,IDF(停运前)=ln1+0.531+0.5+11.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(1b+bavgdlD).

  • D1 (∣D∣=12|D|=12D=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|=9D=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.8670.9459×2.7251×2.50.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.9900.9459×2.38752.50.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 密集检索计算步骤

  1. 文本编码:用 BGE‑M3 分别将查询与每篇文档编码为向量
    q, di∈RD\mathbf{q},\,\mathbf{d}_i\in\mathbb{R}^Dq,diRD

  2. 计算余弦相似度

    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)=qdiqdi.

  3. 示例相似度分(假定):

    • D1: 0.78
    • D2: 0.55
    • D3: 0.30
  4. 排序:D1 (0.78) > D2 (0.55) > D3 (0.30)。

Cross‑Encoder Rerank 计算步骤

  1. 输入拼接:将查询与文档拼接为

    [CLS] 机组停运前,要怎么做 [SEP] <文档内容> [SEP]
    
  2. 前向推理:通过 Transformer,取 [CLS] 对应的输出向量 hCLSh_{\rm CLS}hCLS

  3. 线性打分与 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=σ(whCLS+b),σ(z)=1+ez1.

  4. 示例得分(假定):

    • D1: 0.95
    • D2: 0.45
  5. 最终排序: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=1mwjϕ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∥∥diqdi.

  • 训练 Loss:对比学习(Contrastive Loss)

    L=−log⁡exp⁡(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=logd{d+}Dexp(qd/τ)exp(qd+/τ).

  • 应用:实时性要求高、候选集较大时,用于快速打分再排序。

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=whCLS(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(cjd),q~=j=1majcj,

    • 最终打分 q~⋅d\tilde{\mathbf{q}}\cdot \mathbf{d}q~d

  • 应用:大规模检索场景,兼顾精度和吞吐。

5. Late‑Interaction(如 ColBERT)

  • 思路:保留 token 级别交互,同时支持高效检索。

  • 流程

    1. 编码查询与文档,保留每个 token 的向量序列。

    2. 对每个查询 token,在文档 token 上做最大池化相似度:

      si=∑t∈qmax⁡u∈Di(qt⋅du). s_i = \sum_{t\in q}\max_{u\in D_i}(\mathbf{q}_t\cdot \mathbf{d}_u). si=tquDimax(qtdu).

  • 应用:需要细粒度匹配,同时检索规模很大时。

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 模型,需要在检索精度在线延迟计算资源之间进行权衡。一般推荐:

  1. 初筛:BM25 或 Dense Bi‑Encoder。
  2. 精排:若对实时性要求不高,用 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 异步编码、向量检索速度快但交互浅

网站公告

今日签到

点亮在社区的每一天
去签到