分块策略概述
分块策略是 KnowFlow 知识库系统的核心功能之一,它决定了如何将长文档切分成适合检索和理解的文本片段。合理的分块策略能够显著提升知识库的检索准确率和问答质量。
什么是分块?
分块(Chunking)是将长文档拆分成较小文本片段的过程。这些文本片段被称为"块"(Chunk),每个块会被转换为向量并存储在向量数据库中,用于后续的语义检索。
为什么需要分块?
- 向量模型限制: 大多数向量模型对输入文本长度有限制(通常 512-1024 tokens)
- 检索精度: 较小的文本块能够更精确地匹配用户查询
- 计算效率: 小块向量化和检索速度更快
- 上下文控制: 控制返回给 LLM 的上下文长度,避免超出限制
四种分块策略
KnowFlow 提供四种不同的分块策略,适用于不同类型的文档和使用场景:
1. 智能分块 (Smart)
基于 Markdown AST(抽象语法树)的智能分块,在保持语义完整性的同时控制块大小。
适用场景:
- 通用文档,没有明确的标题结构
- 混合内容(文字、表格、代码)
- 博客文章和技术文档
特点:
- ✅ 自动识别语义边界
- ✅ 保持表格、列表、代码块完整性
- ✅ 平衡块大小和语义完整性
- ⚠️ 需要合理的 Markdown 格式
2. 标题分块 (Title-based)
严格按照文档标题层级(H1、H2、H3)进行切分,完全保留文档结构。
适用场景:
- 结构化文档(技术手册、规范文档)
- 书籍章节
- 具有清晰层级的用户手册
特点:
- ✅ 完美保留文档结构
- ✅ 块边界清晰可预测
- ✅ 适合层次化导航
- ⚠️ 不控制块大小,可能产生过大或过小的块
3. 父子分块 (Parent-Child)
创建两级层次结构:小的子块用于精确检索,大的父块提供完整上下文。
适用场景:
- 需要同时兼顾检索精度和上下文完整性
- 技术文档、学术论文
- 法律文档、合同条款
特点:
- ✅ 检索精度高(通过子块)
- ✅ 上下文完整(通过父块)
- ✅ 三种检索模式可选
- ⚠️ 存储空间需求较大
- ⚠️ 处理速度较慢
4. 正则分块 (Regex)
使用自定义正则表达式模式进行切分,提供最大的灵活性。
适用场景:
- 特殊格式的文档(日志、数据文件)
- 纯文本文件
- 需要自定义切分规则的场景
特点:
- ✅ 极高的灵活性
- ✅ 处理速度快
- ✅ 支持任意自定义模式
- ⚠️ 需要正则表达式知识
- ⚠️ 不考虑语义完整性
策略对比
| 策略 | 处理速度 | 准确性 | 灵活性 | 学习成本 | 推荐场景 |
|---|---|---|---|---|---|
| 智能分块 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐ | 通用场景(推荐) |
| 标题分块 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐ | 结构化文档 |
| 父子分块 | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐ | 复杂检索需求 |
| 正则分块 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | 自定义格式 |
通用配置项
所有分块策略都支持以下通用配置:
1. 块大小控制
块大小 (chunk_token_num)
- 作用: 控制每个文本块的目标大小
- 单位: Tokens(词元)
- 默认值: 256 tokens
- 推荐范围:
- 短问答: 128-256 tokens
- 通用场景: 256-512 tokens
- 长上下文: 512-1024 tokens
最小块大小 (min_chunk_tokens)
- 作用: 过滤过小的文本块
- 默认值: 10 tokens
- 说明: 小于此值的块会被合并到相邻块或丢弃
2. 包含父标题 (enable_heading_in_content)
将文档的标题层级信息添加到块内容的开头,提供更好的上下文。
启用前:
这部分介绍了系统的安装步骤...
启用后:
# 用户手册 > ## 第三章 安装指南 > ### 3.1 环境准备 > 这部分介绍了系统的安装步骤...
配置:
{
"enable_heading_in_content": true
}
何时启用:
- ✅ 文档层级较深(3 层以上标题)
- ✅ 块需要独立理解
- ✅ 跨章节引用较多
- ❌ 扁平结构文档
- ❌ 标题信息冗余
3. 标题分割层级 (split_level)
控制在哪些标题层级进行切分(主要用于标题分块和父子分块)。
层级说明:
- Level 1: 仅在 H1(一级标题)处切分
- Level 2: 在 H1 和 H2(二级标题)处切分 (推荐)
- Level 3: 在 H1、H2、H3(三级标题)处切分
- Level 4+: 更细粒度的切分
配置:
{
"split_level": 2
}
示例文档结构:
# 第一章 概述 ← Level 1
## 1.1 背景介绍 ← Level 2
### 1.1.1 行业现状 ← Level 3
内容...
split_level=1: 只在"第一章"处切分,整章作为一个块split_level=2: 在"第一章"和"1.1 背景介绍"处切分split_level=3: 在所有标题处切分,粒度最细
4. 图片理解 (enable_vision_enhancement)
使用视觉语言模型(VLM)为文档中的图片生成文字描述,使图片内容可被检索。
工作流程:
PDF 文档 → 提取图片 → VLM 分析 → 生成描述 → 插入文本块 → 可检索
配置参数:
{
"enable_vision_enhancement": true,
"vision_description_format": "[图片描述]: {desc}",
"vision_batch_size": 3
}
参数说明:
-
enable_vision_enhancement: 是否启用图片理解功能
-
vision_description_format: 图片描述的插入格式
{desc}会被替换为实际的图片描述- 默认:
[图片描述]: {desc} - 可自定义,如:
<IMG>{desc}</IMG>
-
vision_batch_size: 每次 API 调用处理的图片数量
- 小批量(1-3): 更稳定,错误隔离好
- 中批量(4-6): 平衡性能和稳定性 (推荐)
- 大批量(7-10): 更快,但风险更高
效果示例:
原始 Markdown:
系统架构如下图所示:

启用图片理解后:
系统架构如下图所示:

[图片描述]: 该图展示了三层架构设计,包括前端展示层、业务逻辑层和数据存储层。各层之间通过 RESTful API 进行通信。
适用场景:
- ✅ 技术文档中的架构图、流程图
- ✅ 数据报告中的图表、统计图
- ✅ 产品手册中的产品图片
- ✅ UI 设计文档中的界面截图
- ❌ 纯装饰性图片
- ❌ 图片内容已在文字中描述
前置要求:
- VLM 服务运行中(默认端口: 30000)
- 足够的 GPU 内存支持图片处理
- 网络连接正常
注意事项:
- 图片理解会增加处理时间
- 大批量处理可能导致 GPU 内存不足
- 描述质量取决于 VLM 模型能力
- 建议先小范围测试,再批量处理
如何选择分块策略?
决策流程图
是否有清晰的标题结构?
├─ 是 → 文档层级是否均衡?
│ ├─ 是 → 使用「标题分块」
│ └─ 否 → 使用「智能分块」
│
└─ 否 → 是否需要同时保留精度和上下文?
├─ 是 → 使用「父子分块」
└─ 否 → 文档格式是否特殊?
├─ 是 → 使用「正则分块」
└─ 否 → 使用「智能分块」(默认)
具体建议
技术文档、API 文档、产品手册:
- 首选: 标题分块(结构化强)
- 备选: 智能分块(结构化弱)
学术论文、研究报告:
- 首选: 父子分块(需要完整上下文)
- 备选: 标题分块
博客文章、新闻稿:
- 首选: 智能分块
- 备选: 正则分块(段落分隔)
代码文档、API 参考:
- 首选: 智能分块(保持代码块完整)
- 备选: 标题分块
日志文件、数据文件:
- 首选: 正则分块
- 备选: 智能分块
法律文档、合同:
- 首选: 父子分块(精度和上下文兼顾)
- 备选: 标题分块
最佳实践
1. 块大小设置
// 推荐配置
{
"chunk_token_num": 256, // 通用场景
"min_chunk_tokens": 10 // 过滤噪声
}
// 短问答场景
{
"chunk_token_num": 128,
"min_chunk_tokens": 20
}
// 长上下文场景
{
"chunk_token_num": 512,
"min_chunk_tokens": 50
}
2. 图片理解使用建议
- 先测试后应用: 用小批量文档测试效果
- 控制批量大小: 推荐 batch_size=3-6
- 监控性能: 关注 VLM 服务负载
- 评估必要性: 并非所有图片都需要理解
3. 包含父标题的时机
// 深层级文档(推荐启用)
{
"enable_heading_in_content": true,
"split_level": 2
}
// 扁平文档(不推荐启用)
{
"enable_heading_in_content": false,
"split_level": 1
}
4. 性能优化
- 大文档: 使用标题分块或正则分块,速度最快
- 实时处理: 避免使用父子分块和图片理解
- 批量导入: 可以启用所有高级特性
下一步
常见问题
1. 如何调整块大小?
修改 chunk_token_num 参数。注意:
- Token 数量 ≠ 字符数量
- 中文: 约 1 token = 1-2 个汉字
- 英文: 约 1 token = 0.75 个单词
2. 为什么有些块特别大或特别小?
- 标题分块: 不控制大小,严格按标题切分
- 其他策略: 检查
min_chunk_tokens和chunk_token_num设置
3. 图片理解失败怎么办?
检查:
- VLM 服务是否运行(端口 30000)
- GPU 内存是否充足
- 减小
vision_batch_size - 查看 VLM 服务日志
4. 如何验证分块效果?
- 在 KnowFlow 界面查看分块预览
- 检查块的大小分布
- 测试检索准确率
- 根据反馈调整参数
5. 可以混合使用多种策略吗?
不可以。每个知识库只能选择一种分块策略,但可以:
- 为不同知识库选择不同策略
- 根据效果切换策略(需重新处理文档)