1 什么是分块
文本分块(Chunking)是自然语言处理(NLP)和检索增强生成(RAG)中的核心技术,旨在将长文本拆分为更小、更易处理的语义单元。
2 分块作用
-
突破模型输入限制
主流预训练模型(如GPT系列)的输入长度通常在512-2048 tokens之间。分块可确保每段文本在模型处理范围内,避免信息截断。 -
提升检索与生成质量
合理的分块能保留上下文关联性,使RAG系统更精准地定位相关语义片段,生成答案的准确率提升30%以上。 -
优化计算效率
分块后并行处理文本可降低内存消耗,减少约40%的计算时间,尤其在大规模数据处理中优势显著。
3 常用分块方法
3.1 固定长度分块
- 原理:按预定义字符数或Token数切分,允许部分重叠(如保留10%重复内容防止语义断裂)。
- 适用场景:格式统一文档(如技术手册)、基础问答系统。
-
工具示例:Langchain的CharacterTextSplitter。
text = "..." # your text from langchain.text_splitter import CharacterTextSplitter text_splitter = CharacterTextSplitter( separator = "\n\n", chunk_size = 256, chunk_overlap = 20 ) docs = text_splitter.create_documents([text])
3.2 语义分块(基于内容意图分块)
- 原理:基于句点、换行符或语义相似度动态划分,确保每块表达完整主题。
- 适用场景:逻辑推理任务、专业领域分析(如法律合同)。
-
工具示例:Chonkie的SemanticChunker。
# 句分割(最简单) text = "..." # 你的文本 docs = text.split(".") # NLTK库 -- 提供了一个句子标记器,将文本分成句子,还可以结合LangChain一起使用 text = "..." # 你的文本 from langchain.text_splitter import NLTKTextSplitter text_splitter = NLTKTextSplitter() docs = text_splitter.split_text(text) #spaCy库 -- 提供复杂的句子切割功能,同样可以结合LangChain使用 text = "..." # 你的文本 from langchain.text_splitter import SpacyTextSplitter text_splitter = SpaCyTextSplitter() docs = text_splitter.split_text(text)
3.3 递归分块
使用一组分隔符以分层和迭代的方式将输入文本分成更小的块。如果分割文本开始的时候没有产生所需大小或结构的块,那么这个方法会使用不同的分隔符或标准对生成的块递归调用,直到获得所需的块大小或结构。这意味着虽然这些块的大小并不完全相同,但它们仍然会逼近差不多的大小。
- 原理:优先按段落/章节切分,若超长则二次分割,支持多粒度内容覆盖。
-
适用场景:学术论文、多层级文档(如电子病历)。
text = "..." # 你的文本 from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter( # 设置一个非常小的块大小。 chunk_size = 256, chunk_overlap = 20 ) docs = text_splitter.create_documents([text])
3.4 基于文档结构分块
- 原理:利用标题、表格等固有结构划分,需依赖文档格式规范性。
-
工具示例:HTMLHeaderTextSplitter可处理HTML/Markdown。
# markdown格式 from langchain.text_splitter import MarkdownTextSplitter markdown_text = "..." markdown_splitter = MarkdownTextSplitter(chunk_size=100, chunk_overlap=0) docs = markdown_splitter.create_documents([markdown_text]) #LaTex格式 from langchain.text_splitter import LatexTextSplitter latex_text = "..." latex_splitter = LatexTextSplitter(chunk_size=100, chunk_overlap=0) docs = latex_splitter.create_documents([latex_text])
总结
针对不同的业务场景要使用不同的分块策略