Dify 第3课:RAG 知识库与检索策略


🎯 本课目标

  • 理解 RAG Pipeline 完整流程
  • 掌握 Dify 的知识库功能细节
  • 面试能深聊检索策略选型
  • 产出:一个完整的 RAG 问答系统

一、RAG 是什么------先不急着看 Dify

为什么需要 RAG?

大模型有两大痛点:

  • 知识截止 --- GPT-4 的知识只到某个时间点
  • 幻觉 --- 没见过的内容会瞎编

RAG(Retrieval-Augmented Generation)= 检索增强生成,流程:

复制代码
用户提问 → 检索知识库 → 拿到相关文档片段 → 拼到 Prompt 里 → LLM 回答

RAG vs 微调(Fine-tuning)

对比维度 RAG 微调
成本 低(不需要重新训练) 高(需要 GPU 训练)
更新 加文档就行 得重新训练
知识精度 高(检索原文) 可能遗忘或记忆偏差
适用范围 知识问答、客服、文档 风格模仿、指令遵循

面试高频题:「你什么时候选 RAG,什么时候选微调?」

→ 标准答案:要精准引用原文用 RAG,要学新能力/风格用微调,最佳实践往往是两者结合。


二、Dify RAG 完整 Pipeline

Dify 的 RAG 是一条完整链路,每一步都有对应配置:

复制代码
文档上传 → 文档预处理(清洗)→ 分段(Chunking)
→ Embedding 向量化 → 存入向量库
→ 用户提问 → 检索(向量/全文/混合)
→ 重排序(Rerank)→ 注入 Prompt → LLM 生成

① 文档预处理

Dify 支持的文档格式:

  • 文本类:TXT, Markdown, PDF, DOCX, HTML, CSV, JSON
  • 代码类:各种源码文件
  • 网页:通过 API 抓取(也可以用 Notebook 爬了再传)

预处理做了什么:

  • 空行/空格清理
  • HTML 标签剥离
  • PDF 解析(注意表格和图片的极限)

⚠️ 面试坑点:Dify 对复杂 PDF(多栏、表格)解析一般,生产环境建议先用 Unstructured.io 或 LlamaParse 预处理再喂给 Dify。

② 分段策略(Chunking)--- 这是核心知识点

Dify 提供三种分段模式:

a) 段落分段(默认)
  • 按自然段落(连续换行)拆分
  • 每个段落作为一个片段
  • 优点:语义完整,不会打断内容
  • 缺点:段落长度差异大,长段落会截断
b) N 元分段(N-gram)
  • 按固定字符数拆分
  • 参数:分段长度 + 重叠长度(滑动窗口)
  • 优点:控制粒度均匀
  • 缺点:可能把一句话切成两半
c) 滑动窗口分段
  • 类似 N-gram 但带上下文重叠
  • 比如每 500 字符一段,与上一段重叠 100 字符
  • 平衡方案:保持粒度 + 保留上下文衔接
分段的面试考点

「分段的理想大小是多少?」

  • 没有标准答案,取决于检索场景
  • 通用建议:200-500 tokens/段
  • 太短 → 丢失上下文
  • 太长 → 噪声多,检索不精确

「如果有表格怎么办?」

  • Dify 原生对表格支持一般
  • 建议分段前把表格转成 Markdown 或自然语言描述

③ Embedding(向量化)

文档分好段后,每一段转成一个向量(浮点数数组)。

嵌入模型的选择:

  • Dify 支持多种嵌入模型:OpenAI text-embedding-3-small/large、text-embedding-ada-002、通义千问 embedding、BGE 系列等
  • 维度:OpenAI ada-002 使用 1536 维,text-embedding-3-small 可选 512/1536 维
  • 维度越高 ≠ 越好,1000+ 维足够

面试考点:

  • 「你的向量库选什么?」 → Dify 支持 Qdrant, Weaviate, Milvus, pgvector, Chroma 等
  • 「中文场景用什么嵌入模型?」 → BGE(BAAI)系列(bge-large-zh)、通义千问 text-embedding-v2/v3
  • 「Embedding 维度怎么选?」 → 根据数据量和查询精度,1536 维够用,降维可以减少存储和计算

④ 检索模式(Retrieval)

Dify 提供三种检索模式:

a) 向量检索
复制代码
原理:用户问题转向量 → 向量库找最近邻(余弦相似度/内积/欧式距离)
优点:语义理解好,同义句也能匹配
缺点:冷门关键词可能召回差
b) 全文检索(Keyword / BM25)
复制代码
原理:传统倒排索引,关键字匹配(类似 Elasticsearch)
优点:精确匹配,关键词命中率高
缺点:语义理解弱,"苹果"搜不到"水果"
复制代码
原理:先同时跑向量检索 + 全文检索
      然后合并结果 → 用 Rerank 模型重新排序
      取 Top K
优点:语义 + 关键词双保险
缺点:需要额外部署 Rerank 模型,多一步延迟

这是面试绝对会问到的高频点。

面试题:「为什么需要 Rerank?」

→ 向量检索和全文检索各自算出来的分数尺度不同,直接合并排序不合理。Rerank 模型拿用户问题和候选文档做交叉编码(Cross-encoder),重新打分的精度远高于向量余弦相似度。

⑤ 检索参数

在 Dify 知识库里配置检索时你会看到的参数:

参数 作用 建议
Top K 返回前 K 个片段 3-5 够用,太多会稀释关键信息
Score 阈值 低于此分数的片段丢弃 0.3-0.5,看你的嵌入模型
分段数量限制 限制最终进入 Prompt 的片段数 一般 ≤5

⑥ Prompt 注入

检索到的文档片段会拼到 Prompt 中:

复制代码
请基于以下文档回答问题:
<context>
{检索到的文档片段}
</context>

问题: {用户问题}

Dify 中可以在知识库配置中定制这段 Prompt 模板。


三、Dify 知识库功能实操要点

创建知识库流程

  1. 知识创建知识库 → 选择文档
  2. 设置分段策略(推荐滑动窗口 500+100)
  3. 选择嵌入模型
  4. 索引完成后可以预览和删除片段
  5. 检索测试:输入问题看召回效果

多知识库策略

  • Dify 支持一个应用绑定多个知识库
  • 场景:技术文档库 + 客服问答库 + 产品说明库
  • 每个知识库可以独立配置不同的检索模式

知识库的维护

  • 文档更新:重新分片 → 重新嵌入(新向量覆盖旧向量)
  • 面试题:「知识库更新后,旧向量怎么处理?」
    → Dify 会在重新处理时自动替换该文档下的所有分段向量

四、面试高频题(RAG 专场)

Q1:双检索(混合检索)为什么比单向量检索好?

向量检索擅长语义相似,但精确关键词(产品型号、订单号)需要 BM25 命中。混合检索取两者之长。

Q2:Rerank 在 Pipeline 的哪个环节?成本怎么样?

检索后、生成前。Rerank 模型(如 BGE-Reranker-v2)需要额外 GPU 资源,但能显著提升 Top-K 命中率。

Q3:RAG 的检索准确度怎么优化?

技术层面:分段策略调优 + 嵌入模型选型 + 混合检索 + Rerank。非技术层面:清洗文档质量比调参更重要。

Q4:Dify vs LangChain 做 RAG 的区别?

Dify 开箱即用,LangChain 灵活但需要自己搭 Pipeline。面试可以说「Dify 适合快速验证和中小规模生产,LangChain 适合需要深度定制的大规模场景」。

Q5:百万级文档的 RAG 怎么优化?

  • 多层索引(先分类再检索)
  • 分段大小和 Top K 数量控制
  • 增加 Rerank 精排
  • 考虑多级缓存(热门问答缓存命中直接返回)

💻 实操产出:搭建一个 RAG 问答系统

建议大王今天实操:

  1. 在 Dify 里创建一个知识库,上传一个你手头的技术文档(比如 Python 文档、产品说明)
  2. 试不同的分段策略,看看效果差异
  3. 配置混合检索 + Rerank
  4. 在应用里引用这个知识库,跑几个问答题验证召回质量

课后小测验

  1. Dify 支持哪三种检索模式?各自优缺点是什么?
  2. 为什么混合检索需要搭配 Rerank?
  3. 分段太小和分段太大分别有什么问题?
  4. 面试中被问到「RAG vs 微调」你怎么答?
  5. Dify 知识库嵌入模型选型,中文场景推荐什么?

好,逐个讲。


Q1:Dify 支持哪三种检索模式?各自优缺点是什么?

答案:

检索模式 原理 优点 缺点
向量检索 用户问题→嵌入→向量库找最近邻(余弦相似度) 语义理解强,同义句也能匹配 冷门关键词召回差,精确型号/编号匹配弱
全文检索 传统倒排索引,BM25 关键字匹配 关键词精确命中,速度快 语义理解弱,"苹果"搜不到"水果"
混合检索 向量+全文 双通道 → 合并 → Rerank 语义+关键词双保险,召回精度最高 需要额外部署 Rerank 模型,多一步延迟

面试加分点:

Dify 的混合检索是"检索时并行、排重用 Rerank 精排"。向量和全文各自独立的分数尺度不同,不能直接相加排序------这就是为什么必须加一层 Rerank 做交叉编码重打分。


Q2:为什么混合检索需要搭配 Rerank?

核心原因:分数不可比

  • 向量检索输出的 cosine similarity 取值范围是 -1, 1
  • 全文检索(BM25)的分数是无上限的原始词频分
  • 两者分数尺度不同,不能直接合并排序

Rerank 干了什么:

复制代码
用户问题 + 候选文档 K1
用户问题 + 候选文档 K2
...
用户问题 + 候选文档 K100
   ↓
Rerank(Cross-encoder)逐对编码,输出统一的 [0,1] 相关性分数
   ↓
按新分数重排,取 Top K

面试深度回答:

Rerank 用的是 Cross-encoder,跟向量检索的 Bi-encoder 不同。Bi-encoder 把问题和文档各自编码成向量,用余弦算相似------快但精度有限。Cross-encoder 把"问题+文档"一起过 transformer,注意力能直接在问题和文档之间交互,精度高出一个档次,但速度也慢了十倍。所以架构上:Bi-encoder 粗筛 Top 50-100,Cross-encoder 精排到 Top 3-5


Q3:分段太小和分段太大分别有什么问题?

分段太小(< 100 tokens):

  • 一段只包含一句话或半句话,上下文被切碎
  • 用户问一个需要前后文理解的问题,检索到的片段信息不完整
  • 比如一份文档的介绍段:"该系统的核心架构由三个组件组成...分别负责...",如果切成两段,第一段只看到"三个组件",第二段只看到"分别负责",各自都缺少上下文

分段太大(> 1000 tokens):

  • 一段包含多页内容,噪声太多
  • 用户问"配置文件的格式是什么",命中了一个大段落,但大段落里还包含安装步骤、API 说明、示例代码......LLM 容易被噪声干扰
  • 检索命中率表面高,但真正相关的内容占比低

最佳实践:

复制代码
通用建议:200-500 tokens / 段
滑动窗口重叠:50-100 tokens(避免上下文断裂)
特殊场景调整:
  - 代码文档 → 200-300(粒度细,按函数/方法分)
  - 技术手册 → 300-500(完整覆盖一个小节)
  - FAQ/问答 → 100-200(一问一答一个片段)

Q4:面试中被问到「RAG vs 微调」你怎么答?

结构化回答:

复制代码
         RAG(检索增强生成)              微调(Fine-tuning)
        ─────────────                  ─────────────
 输入:  从知识库检索相关文档              在训练数据上训练
 输出:  依赖 LLM + Prompt 中的上下文      模型本身学到了新知识/能力
 更新:  加文档就行,秒级生效              得重新训练,几小时到几天
 成本:  低(存储+检索)                    高(GPU 训练)
 幻觉:  ⚠️ 仍有,但可引用原文溯源          ⚠️ 可能遗忘或过拟合
 适用:  知识问答、客服、产品文档           风格模仿、指令遵循、特定任务

选择标准:

  • 需要引用原文、可溯源的 → RAG
  • 需要模型学会新能力、新风格的 → 微调
  • 最佳实践:RAG + 微调 两者结合------基座模型先微调成领域专家,再挂 RAG 知识库做实时检索

面试能拿分的收尾:

「在实际生产里,我从来不把 RAG 和微调对立。基座模型先做轻量 LoRA 微调,学会领域术语和表达方式;上面挂 RAG 知识库,提供实时、可溯源的业务知识。微调把回答的专业度拉高,RAG 保证准确性和实时性,两者互补不互斥。」


Q5:Dify 知识库嵌入模型选型,中文场景推荐什么?

推荐排序:

推荐 模型 维度 适合场景
🥇 bge-large-zh-v1.5(BAAI) 1024 中文场景综合最优,社区最成熟
🥇 bge-m3(BAAI) 1024 多语言(中英日韩等),检索精度更高
🥈 text-embedding-3-small/large(OpenAI) 512/1536/3072 英文为主时选,中文也不错但不如 BGE
🥈 通义千问 text-embedding-v2/v3(阿里) 1536 阿里云用户首选,国内调用延迟最低
🥉 m3e-base/m3e-large 768/1024 轻量开源,小项目够用

选型建议:

复制代码
中文为主 + 精度优先 → bge-large-zh-v1.5(1024维)
多语言混合         → bge-m3(1024维,支持 100+ 语言)
阿里云生态         → 通义千问 text-embedding-v3
预算有限           → m3e 系列或 bge-small-zh

面试深度补充:

「BGE 系列是 BAAI 开源的,中文 SOTA。bge-m3 支持稠密检索 + 稀疏检索 + 多向量三种检索方式,算力够的话一步到位。维度方面可以基于 Matryoshka 表示学习降维到 256 维,精度损失 < 2%,但检索速度和存储都能翻倍。」