当前位置: 首页 > news >正文

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

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.9900−0.990
D3−0.9900−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 RerankerBM25‑Rerank、Learning‑to‑Rank (LTR) 基于手工特征
Dense Bi‑EncoderSBERT、Dual‑Encoder
Cross‑EncoderBERT Cross‑Encoder、T5 Score
Poly‑EncoderPoly‑Encoder (Facebook AI)
Late‑InteractionColBERT, SPLADE
Lightweight RerankerTinyBERT 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,\quads_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 / DenseBM25 快速召回;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异步编码、向量检索速度快但交互浅
http://www.dtcms.com/a/270820.html

相关文章:

  • 【编程史】IDE 是谁发明的?从 punch cards 到 VS Code
  • 【Python基础】变量、运算与内存管理全解析
  • Vue的watch和React的useEffect
  • 第4章:实战项目一 打造你的第一个AI知识库问答机器人 (RAG)
  • SQL Server 2008R2 到 2012 数据库迁移完整指南
  • Debezium:一款基于CDC的开源数据同步工具
  • css支持if else
  • css sprites使用
  • tailwindcss详解
  • CSS中的Element语法
  • WSL创建Ubuntu子系统与 VS code 开发
  • IT系统安全刚需:绝缘故障定位系统
  • 无线鼠标产品整体技术分析总结
  • python+vue的会议室预定管理系统
  • 编译安装zabbix7.2
  • idea2023.1.1配置scala并创建第一个Scala工程
  • Rust赋能美团云原生DevOps实践
  • Docker 高级管理--容器通信技术与数据持久化
  • 离线在docker环境使用vllm部署qwen3
  • JAVA如何实现Redis同步
  • 华为动态路由配置
  • 【图像处理基石】图像超分辨率有哪些研究进展值得关注?
  • ARM单片机OTA解析(一)
  • 图像处理中的凸包检测:原理与实现
  • MS32C001-C单片机,32位ARM M0+内核,宽电压、低功耗、小封装。
  • 图像处理中的模板匹配:原理与实现
  • vue3+ts+echarts多Y轴图表
  • 【WEB】Polar靶场 21-25题 详细笔记
  • ProxySQL 入门到实战
  • Grafana容器化部署