← 返回文章列表

Dify 知识库三种分段模式实测:通用、父子、Q&A 到底怎么选?

基于 Dify 1.16.x 云端实测(2026-08-28)。

📖 摘要:把文档灌进 Dify 知识库时,「分段模式」只有通用分段这一个选项吗?不是——Dify 还支持父子模式和 Q&A 模式。本文用同一份语料、同一批问题,在云端实测三种分段模式的检索分数与问答效果,给出「文档形态 → 分段模式」的选型建议,并记录三个实测中踩到的坑(doc_form 传错位置、中文语料生成英文问答、Q&A 模式限流)。

导读

一、业务场景:知识库「分段」不是切就完了

我们接手的很多 RAG 交付,客户甩来一堆文档:「做成知识库,能回答问题就行」。第一步往往是切分——但怎么切,直接决定后面检索准不准、回答全不全。

之前我们一直用通用分段(按分隔符切段),直到最近才发现:Dify 知识库其实还支持父子模式Q&A 模式,三种模式的检索行为完全不同。于是我们在云端做了一组对照实验:同一份语料、同一批问题,三种模式各建一个库,用 hit-testing 看召回分数,再建三个同样的问答应用看端到端效果。

二、场景痛点:通用分段的两难

用通用分段(一段一向量,命中哪段返回哪段)时,我们反复撞上同一个矛盾:

最典型的翻车现场(本次实验实测):FAQ 语料里问「首次登录默认账号密码是什么」,通用分段命中的是「固件升级」段——段内塞了太多问答对,向量糊成一团,检索直接错位。

三、解决方案:另外两种模式解决什么问题

Dify 的三种分段模式,本质是三种「定位与回答」的拆法:

模式 机制 回答来源
通用分段 一段一向量,命中即返回 命中段原文
父子模式 父段(大块)+ 子段(小块),子段建向量 命中子段 → 返回父段上下文
Q&A 模式 每段用 LLM 生成 Q/A 对,question 建向量 question 命中 → 返回 answer
graph TD A["同一份文档"] --> B["通用分段:一段一向量"] A --> C["父子模式:子段定位 + 父段回答"] A --> D["Q&A 模式:LLM 生成 Q/A 对"] B --> E["命中哪段返回哪段"] C --> F["子段建向量,命中子段后取父段内容"] D --> G["question 建向量,命中后返回 answer"]

四、整体架构:实验怎么设计的

为了公平对比,我们严格控制变量:

实验项 设计
语料 模拟文档两类:① 产品手册(长文、章节结构、跨节指代)② FAQ(问题/答案形态明确)
建库 三模式 × 两类文档 = 6 个临时知识库,同一份语料分别入库
对比 ① 同 query 三库 hit-testing 召回分数 ② 同一模板的问答应用(只换绑定的库)端到端对比
环境 云上 Dify 1.16.1,阿里云 embedding,deepseek-v4-flash 负责 Q&A 生成

五、模块设计:三模式建库参数差异

建库时三模式只有一个关键差异——文档创建 body 里的 doc_form 字段:

{

  "indexing_technique": "high_quality",

  "doc_form": "hierarchical_model",

  "doc_language": "Chinese Simplified",

  "process_rule": {

    "mode": "custom",

    "rules": {

      "segmentation": {"separator": "\n## ", "max_tokens": 300, "chunk_overlap": 0},

      "parent_mode": "paragraph",

      "subchunk_segmentation": {"separator": "\n", "max_tokens": 100, "chunk_overlap": 10}

    }

  }

}

⚠️ 第一个坑就在这:doc_form文档级字段——创建 dataset 时传会被静默忽略(我们第一轮三模式段数一模一样,就是栽在这),必须在 POST /datasets/{id}/documents 的 body 里显式传。

六、运行验证:实测数据对比

6.1 手册类 hit-testing(同 query 召回分数)

query 通用 父子 Q&A
设备的工作温度范围是多少 0.741 0.781 0.694(命中泛化问题)
Modbus 接入需要配置哪些参数 0.832(命中故障段,错位) 0.869 0.984(精准命中)
MQTT 连接不稳定怎么排查 0.871 0.946 0.923(命中配置段)

6.2 FAQ 类 hit-testing

query 通用 父子 Q&A
设备支持哪些接入协议 0.703 0.838 0.853
首次登录默认账号密码 0.720 错位(命中固件段) 0.972 0.893
固件升级需要多长时间 0.820 0.969 0.751 错位
设备离线了怎么办 0.803 错位 0.938 0.831 错位

6.3 端到端问答(同一模板应用,只换绑定的库)

问题 通用 父子 Q&A
设备支持哪些接入协议 ✅ 答对 ✅ 答对 ✅ 答对
首次登录默认账号密码 ⚠️ 答对但引用池有噪声 ✅ 精准 ✅ 答案最完整
固件升级需要多长时间 ✅ 答对 ✅ 答对 答错(检索错位)
设备离线了怎么办 ✅ 答对 ✅ 答对 答错(答非所问)

6.4 三种模式回答形态的差异(实测观察)

端到端测试除了「对错」,三种模式的回答形态也明显不同:

一句话总结实测观感:父子是「稳」,Q&A 是「准的时候极准、偏的时候极偏」

七、选型矩阵与建议

文档形态 推荐模式 理由
FAQ / 客服知识(问题形态明确) Q&A 优先 question 向量匹配精准(0.984 最高分);但必须验证 LLM 生成的问题质量
长文手册 / 强上下文依赖 父子模式 子段定位准、父段上下文全,分数全面领先;FAQ 场景也从 0.720 错位提升到 0.972
自包含段落(清洗后单段可独立回答) 通用分段 成本最低,够用即可
描述型/排查型 query(「怎么办」「什么原因」) 父子(勿用 Q&A) Q&A 生成问题与 query 语义错位,端到端实测答错

成本提醒:父子模式要父段+子段双份向量;Q&A 模式每段都要 LLM 生成 + 全量 embedding——Q&A 段数会爆炸(手册 18 段 → 118 段),限流环境索引容易 429 失败(我们实测踩中,阿里云 Throttling.RateQuota)。

通用分段不是「不能用」,是「要用对」:我们的 H3C 手册知识库(337 份文档、4277 页)至今用通用分段,靠的是建库前的数据清洗管线把文档切成「单段自包含」——每一段都能独立回答问题,段内不混主题(清洗管线实战见《RAG 知识库建库前,数据到底该怎么清洗?》)。所以判断顺序应该是:

  1. 先问:文档能被清洗/改造成「单段自包含」吗?能 → 通用分段够用(成本最低)
  2. 不能(长文强依赖、段内必然多主题)→ 父子模式
  3. 文档是问答体、问题形态明确 → Q&A 模式(并验证生成问题质量)

八、实战坑(都是本次实测踩出来的)

现象 修复
doc_form 没生效 三模式段数一模一样 doc_form 是文档级字段,创建 dataset 不收——文档创建 body 显式传
中文语料生成英文问答 FAQ 生成「How long does a firmware upgrade take...」 doc_language 默认 English,中文文档显式传 Chinese Simplified
Q&A 索引 429 限流 段数爆炸 + embedding 请求密集 → 索引 error 分批/降并发/重试;大语料先评估成本
父子子段查不到 segments API 的 child_chunks 为空 子段存独立表 child_chunks,DB 直查才看得到

九、启示

分段模式不是越高级越好,是「文档形态 × 问题形态」的匹配问题。通用分段不是不能用,而是要知道它的边界:段内多主题就是它的死穴。父子模式把定位和回答拆开,是长文档的稳健解;Q&A 模式是问题库的加速器,但「LLM 生成的问题质量」是它的命门——生成偏了,检索就偏了。

下次建知识库前,先问自己一句:这份文档是「叙述体」还是「问答体」?用户的问题是「问什么」还是「怎么办」?答案基本就定好了。

本文基于真实项目交付经验撰写(Dify 1.16.x 云端环境)。文中数据均来自我们自己的实测记录(6 个临时知识库 × 2 类语料、hit-testing 分数与端到端问答对照),理论与推断部分以「实测」标注边界,不构成任何平台的官方结论。

联系我

15088711270

手机端点击号码可直接拨打 · 桌面端可复制

微信二维码

扫码加微信 · 备注「门户」更快通过