01 切片的概念
知识库文档的切片(Chunking),可以理解为为AI大模型“裁剪”便于阅读和理解的“知识卡片”。
它的核心目标是把长文档切分成一个个语义完整、主题集中的小片段。这样做的原因有两个:
- AI的“内存”有限:大模型一次能处理的内容长度(上下文窗口)是有限的,没法“吞下”整本百科全书。
- 检索更精准:切成小片后,搜索引擎才能像查目录一样,快速定位到最相关的那个片段,而不是在整本书里“大海捞针”。
02 主流的切片策略
目前主流的切片策略,可以根据“智能”程度分为几类:
1、基础策略:简单直接,快速上手
这类方法实现简单,适合处理格式规范、结构清晰的文档。
- 固定大小切分:最直接的方法,就是按固定的字符数或Token数(比如512或1024个Token)来“一刀切”。它的缺点是可能会从句子中间切断,破坏语义。
- 固定大小 + 重叠窗口:这是对上面方法的改进。让相邻的片段之间有一部分内容重叠(通常为10%-20%),确保在片段边界的关键信息不会丢失。
- 按句子切分:以句号、问号等标点符号为边界进行切分。这是最自然的语义单元,能保证每个片段都是完整的句子。
- 按段落/标题切分(结构切分):尊重文档的天然结构,用空行、标题(H1, H2等)或列表符号作为切分依据。这种方法能最大程度保留文档的原始逻辑。
2、高级策略:追求极致语义完整性
当基础策略无法满足精度要求时,就需要更聪明的方法。
- 递归切分:这是目前工程上最常用的“够用”方案,也是LangChain库的默认选择。它会尝试用不同级别的分隔符(优先用段落`\n\n`,不行再用句子,最后才用字符)来切分,在保持语义和均匀大小之间取得平衡。
- 语义切分:这是目前效果最好的方法之一。它会先计算每个句子的向量(Embedding),然后根据相邻句子向量的相似度来判断语义是否发生变化。当相似度突然下降时,就认为是主题的转折点,在此处切开。虽然计算成本高,但能确保每个切片主题一致。
- LLM辅助切分(如LumberChunker):代表了一种前沿思路,即利用大模型自身的语义理解能力来做切分决策。它的流程通常是三步,最终由大模型决定在哪切开。
1. 自然拆分:先把文章按段落拆开。
2. 初步分组:设定一个Token上限(如550),将连续的段落合并成不超过这个上限的组。
3. 寻找语义断点:将这一组段落送给大模型,让它判断“从哪个段落开始,话题变了?”。大模型会返回一个断点位置,从而在语义变化处精准切开。
3、专项策略:处理复杂内容
- 表格/内容感知切分:专门处理文档中的表格、代码块、列表等特殊元素。例如,将表格转换为Markdown或JSON格式,确保其结构完整性不被破坏。
- 层次切分(父子块):建立多层级索引。先切出较大的“父块”用于粗检索,再从中提取更小的“子块”用于精读。
04 主流工具与框架
在实际操作中,我们通常会借助现成的工具:
- LangChain:其 `RecursiveCharacterTextSplitter` 是递归切分的经典实现。
- Unstructured:一个强大的库,能处理PDF、Word、HTML等多种格式,并自动识别标题、表格等元素。
- Llamaindex:另一个知名的LLM应用框架,也提供了丰富的文本切分器。
- Semantic Chunking:可以直接借助 `sentence-transformers` 等库,计算句子向量相似度来实现。
05 最佳实践与避坑指南
- 1. 先解析,再切分:对于PDF、Word等格式,首先要做的是文档解析,把文字、表格、图片等内容干净地提取出来。解析质量直接决定后续切分的天花板。
- 2. 推荐起点:如果不知道从何下手,可以优先尝试递归切(RecursiveCharacterTextSplitter)。
- 3. 参数调优:切片长度和重叠大小是关键参数,需要根据文档特点调整。一个常见的起步值是300-500字,重叠30-50字。
- 4. 善用元数据:为每个切片附带来源信息(如文档名、章节标题、页码),这对后续检索和答案溯源至关重要。
- 5. 可视化验证:在确定最终方案前,可以使用Hugging Face的`chunk-visualizer`等工具,直观地检查切分效果,避免“盲切”。
总的来说,没有一种“万能”的切片策略。最佳实践是根据文档的结构化程度、内容复杂度和业务场景,灵活组合使用上述方法。
07 产品截图
知识库配置截图参考: