本文目录导读:

- 按字符/Token 长度直接切分(最简单,但最粗暴)
- 按分隔符/段落分割(推荐,保持语义)
- 按文档结构/语义分割(最精准)
- 基于Embedding/语义的智能分割(最先进)
- 实际操作建议:用哪个工具?
- 黄金参数建议(针对RAG)
文档分割工具(Document Splitting/Chunking)主要用于处理大篇幅文本(如PDF、Word、TXT、Markdown等),尤其是在AI知识库构建(RAG)、大模型微调、或文本分析场景中,将其拆分为语义完整且长度适中的小片段。
具体的分割方式取决于你使用的工具和业务需求,以下是主流的4种分割策略及其对应工具的操作方法:
按字符/Token 长度直接切分(最简单,但最粗暴)
这是最基本的方式,直接按固定的字符数(或Token数)切一刀,不管语义。
-
适用场景: 对语义连贯性要求不高,仅需控制片段长度。
-
缺点: 容易把一句话或一个段落从中切断,导致语义断裂。
-
操作方法:
- 参数: 设置
chunk_size(500 字符) 和chunk_overlap(重叠部分,50字符,防止关键内容被截断在边界)。 - 工具示例: Python
LangChain的CharacterTextSplitter。from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50) chunks = text_splitter.split_text(your_document_text)
- 参数: 设置
按分隔符/段落分割(推荐,保持语义)
这是最常用的“智能”分割方式,工具会寻找文档中的自然分隔符(如换行符 \n、句号、Markdown标题 )。
-
适用场景: 大多数通用的文档(PDF、Word、Markdown)。
-
核心原则: 优先按段落(
\n\n)切,如果段落太长,再在段落内按句子(句号)切。 -
操作方法:
- 参数: 设置
separators = ["\n\n", "\n", "。", "!", "?", ",", " ", ""],工具会从前往后匹配。 - 工具示例: LangChain 的
RecursiveCharacterTextSplitter(业界最常用)。
from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, # 最大片段长度 chunk_overlap=100, # 重叠长度,保证上下文衔接 separators=["\n\n", "\n", "。", "!", "?", ",", " ", ""] # 优先级从高到低 ) chunks = text_splitter.split_text(your_document_text) - 参数: 设置
按文档结构/语义分割(最精准)
针对有明确结构的文档(如Markdown、HTML、代码、PDF表格),按标题、章节、表格行进行分割。
- 适用场景: 完整的书稿、技术文档(带标题层级)、HTML页面。
- 操作方法:
- Markdown分割: 识别 标题,每个标题下的段落作为一个独立块。
- 代码分割: 按函数(
def)或类(class)进行分割。 - 工具示例:
- LangChain
MarkdownHeaderTextSplitter层级分组。 - LangChain
HTMLHeaderTextSplitter:根据h1,h2等标签分组。# 示例:按 Markdown 标题分割 headers_to_split_on = [ ("#", "Header 1"), ("##", "Header 2"), ("###", "Header 3"), ] markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on) md_header_splits = markdown_splitter.split_text(markdown_document)
- LangChain
基于Embedding/语义的智能分割(最先进)
使用向量相似度来决定分割点,当模型检测到文档的语义发生重大转变(如从“背景介绍”进入“实验方法”)时,才进行切割。
-
适用场景: 需要极高检索精度的RAG系统。
-
缺点: 需要调用LLM或embedding模型(成本高、速度慢)。
-
操作方法:
- 策略1(贪婪分割): 通过滑动窗口检查每个句子与前后句的语义相似度,相似度下降则切割。
- 策略2(LLM分割): 提示GPT/Claude:“请将以下文本按照逻辑含义分割成块,输出JSON列表。”
- 工具示例:
spacy+sentence-transformers(自己实现)。- LangChain 实验性
SemanticChunker。
from langchain_experimental.text_splitter import SemanticChunker from langchain_openai.embeddings import OpenAIEmbeddings text_splitter = SemanticChunker( OpenAIEmbeddings(), breakpoint_threshold_type="percentile" # 基于分位数确定分割点 ) chunks = text_splitter.split_documents(documents)
实际操作建议:用哪个工具?
| 你的需求 | 推荐方法 | 工具/库 |
|---|---|---|
| 你只是要处理PDF/Word文件 | 第2种:按段落/句子递归分割 | LangChain + Unstructured ( pip install unstructured ) |
| 你有一本Markdown书 | 第3种:按标题层级分割 | MarkdownHeaderTextSplitter |
| 你写代码,想给模型喂代码 | 第3种:按语言特性分割 | RecursiveCharacterTextSplitter 且 separators 设为 ["\ndef ", "\nclass ", ...] |
| 你不在乎成本,追求最高召回率 | 第4种:语义分割 | SemanticChunker 或调用大模型 |
| 你没有编程基础 | 使用可视化工具 | 开源: AnythingLLM (内置分割器) 2. 商业: 腾讯云/阿里云的文档解析API / 飞书文档 |
黄金参数建议(针对RAG)
无论用哪种工具,这两个参数最关键:
- Chunk Size (块大小):
- 标准答案: 300 - 500 Tokens(约200-400个中文字或1-2个段落)。
- 如果文档非常技术性,可以设小一点(200 Tokens)。
- 如果文档是散文/故事,可以设大一点(1000 Tokens)。
- Chunk Overlap (重叠大小):
- 标准答案: 10% - 20% 的 Chunk Size。
chunk_size=500,则overlap=50-100。- 作用:避免上下文完全断裂。
对于普通人,直接用 RecursiveCharacterTextSplitter,设置 chunk_size=500, overlap=100,分隔符按顺序用 `["\n\n", "\n", "。", " "],这能解决90%的文档分割问题。
标签: 智能分块