Skip to main content

分块策略概述

分块策略是 KnowFlow 知识库系统的核心功能之一,它决定了如何将长文档切分成适合检索和理解的文本片段。合理的分块策略能够显著提升知识库的检索准确率和问答质量。

什么是分块?

分块(Chunking)是将长文档拆分成较小文本片段的过程。这些文本片段被称为"块"(Chunk),每个块会被转换为向量并存储在向量数据库中,用于后续的语义检索。

为什么需要分块?

  1. 向量模型限制: 大多数向量模型对输入文本长度有限制(通常 512-1024 tokens)
  2. 检索精度: 较小的文本块能够更精确地匹配用户查询
  3. 计算效率: 小块向量化和检索速度更快
  4. 上下文控制: 控制返回给 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:

系统架构如下图所示:
![系统架构图](./architecture.png)

启用图片理解后:

系统架构如下图所示:
![系统架构图](./architecture.png)
[图片描述]: 该图展示了三层架构设计,包括前端展示层、业务逻辑层和数据存储层。各层之间通过 RESTful API 进行通信。

适用场景:

  • ✅ 技术文档中的架构图、流程图
  • ✅ 数据报告中的图表、统计图
  • ✅ 产品手册中的产品图片
  • ✅ UI 设计文档中的界面截图
  • ❌ 纯装饰性图片
  • ❌ 图片内容已在文字中描述

前置要求:

  • VLM 服务运行中(默认端口: 30000)
  • 足够的 GPU 内存支持图片处理
  • 网络连接正常

注意事项:

  1. 图片理解会增加处理时间
  2. 大批量处理可能导致 GPU 内存不足
  3. 描述质量取决于 VLM 模型能力
  4. 建议先小范围测试,再批量处理

如何选择分块策略?

决策流程图

是否有清晰的标题结构?
├─ 是 → 文档层级是否均衡?
│ ├─ 是 → 使用「标题分块」
│ └─ 否 → 使用「智能分块」

└─ 否 → 是否需要同时保留精度和上下文?
├─ 是 → 使用「父子分块」
└─ 否 → 文档格式是否特殊?
├─ 是 → 使用「正则分块」
└─ 否 → 使用「智能分块」(默认)

具体建议

技术文档、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. 图片理解使用建议

  1. 先测试后应用: 用小批量文档测试效果
  2. 控制批量大小: 推荐 batch_size=3-6
  3. 监控性能: 关注 VLM 服务负载
  4. 评估必要性: 并非所有图片都需要理解

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_tokenschunk_token_num 设置

3. 图片理解失败怎么办?

检查:

  1. VLM 服务是否运行(端口 30000)
  2. GPU 内存是否充足
  3. 减小 vision_batch_size
  4. 查看 VLM 服务日志

4. 如何验证分块效果?

  1. 在 KnowFlow 界面查看分块预览
  2. 检查块的大小分布
  3. 测试检索准确率
  4. 根据反馈调整参数

5. 可以混合使用多种策略吗?

不可以。每个知识库只能选择一种分块策略,但可以:

  • 为不同知识库选择不同策略
  • 根据效果切换策略(需重新处理文档)