
目录文本分块的设计动机固定长度分块段落分割语义分块递归拆分文本分块的边界与失效模式摘要文本分块Chunking是将长文档拆分为适合检索和生成的小块的过程是 RAG 系统中的关键预处理步骤。本文从文本分块的设计动机出发分析固定长度分块、段落分割、语义分块和递归拆分四种主流策略以及在 RAG 系统中的工程实践。1. 文本分块的设计动机RAG 系统需要从知识库中检索相关信息。如果文档不做分块整个文档作为一个块检索器无法精确定位到相关段落。如果分块太小每个块缺乏上下文信息检索器无法理解语义。文本分块的目标是在块的大小和语义完整性之间取得平衡。1.1 为什么需要分块问题不切分切分检索精度低无法精确定位高精确定位相关段落上下文长度长超出 LLM 窗口短在窗口内语义完整性好完整文档中可能切断上下文检索效率低一个块太大高块大小适中1.2 分块的核心挑战文本分块的核心挑战是平衡块大小影响检索效率和上下文窗口占用和语义完整性影响检索质量。文本分块的核心挑战块大小: 小 ↔ 大语义完整性: 低 ↔ 高小块的优点: 检索精确、节省上下文大块的优点: 语义完整、上下文丰富需要平衡: 块大小适中 语义完整1.3 分块策略的演进固定长度切分早期 RAG→ 段落分割2022→ 语义分块2023→ 递归拆分 自适应分块2024。1.4 分块对 RAG 质量的影响分块策略检索召回率生成质量适用场景固定长度低中简单场景段落分割中高结构化文档语义分块高高通用场景递归拆分高高复杂文档1.5 分块的局限性分块策略的设计需要权衡多个因素。2. 固定长度分块2.1 固定长度分块的实现固定长度分块是最简单的分块策略按固定 Token 数或字符数切分deffixed_length_chunking(text,chunk_size512,overlap50):固定长度分块chunks[]start0whilestartlen(text):endmin(startchunk_size,len(text))chunktext[start:end]chunks.append(chunk)startend-overlap# 重叠部分returnchunks2.2 重叠策略重叠Overlap确保块边界附近的上下文信息不会丢失重叠大小上下文保留冗余度适用场景0无重叠无短文本10-50少量上下文低一般场景50-100中等上下文中长文本100-200大量上下文高需要精确匹配2.3 固定长度分块的优缺点优点缺点实现简单可能切断语义完整的段落计算快块语义不完整可预测块大小检索质量差3. 段落分割3.1 段落分割的实现段落分割根据文档的自然结构段落、标题、章节切分defparagraph_chunking(text,separators[\n\n,\n,.,。,,]):段落分割chunks[]current_chunkforseparatorinseparators:ifseparatorintext:segmentstext.split(separator)forsegmentinsegments:segmentsegment.strip()iflen(segment)50:# 过滤过短段落chunks.append(segment)breakreturnchunks3.2 段落分割的适用场景场景适合原因新闻报道是段落结构清晰学术论文是有章节标题技术文档是有明确标题对话否对话结构不清晰3.3 段落分割的优缺点优点缺点语义完整块大小不固定实现简单段落可能过长或过短保留文档结构依赖文档格式4. 语义分块4.1 语义分块的原理语义分块根据文本的语义边界切分确保每个块具有完整的语义。语义分块使用嵌入模型检测语义变化点。4.2 语义分块的实现defsemantic_chunking(text,embedding_model,max_chunk_size1000):语义分块# 1. 将文本分割为句子sentencessplit_sentences(text)# 2. 计算每个句子的嵌入sentence_embeddings[embedding_model.encode(s)forsinsentences]# 3. 计算相邻句子间的语义相似度similarities[]foriinrange(1,len(sentence_embeddings)):simcosine_similarity(sentence_embeddings[i-1],sentence_embeddings[i])similarities.append(sim)# 4. 在语义相似度低的地方切分chunks[]current_chunk[]foriinrange(len(sentences)):current_chunk.append(sentences[i])ifilen(similarities)andsimilarities[i]0.5:chunks.append( .join(current_chunk))current_chunk[]ifcurrent_chunk:chunks.append( .join(current_chunk))returnchunks4.3 语义分块的参数参数描述默认值效果相似度阈值判定语义边界的阈值0.5越高分块越少最大块大小块的最大 Token 数1000防止块过大最小块大小块的最小 Token 数50防止块过小4.4 语义分块的优缺点优点缺点语义完整实现复杂检索质量高计算开销大自适应对嵌入模型敏感5. 递归拆分5.1 递归拆分的原理递归拆分从最大的分隔符开始分割如果块仍然太大递归使用更小的分隔符继续分割。5.2 递归拆分的实现defrecursive_chunking(text,separators,chunk_size1000,chunk_overlap200):递归拆分# 如果没有分隔符按固定长度拆分ifnotseparators:returnfixed_length_chunking(text,chunk_size,chunk_overlap)separatorseparators[0]remaining_separatorsseparators[1:]# 使用当前分隔符分割chunks[]segmentstext.split(separator)forsegmentinsegments:iflen(segment)chunk_size:chunks.append(segment)else:# 如果块仍然太大递归拆分chunks.extend(recursive_chunking(segment,remaining_separators,chunk_size,chunk_overlap))returnchunks5.3 递归拆分的配置# 递归拆分配置RECURSIVE_CHUNK_CONFIG{separators:[\n\n,\n,.,!,?,,。, ,],chunk_size:512,chunk_overlap:50}5.4 递归拆分的优缺点优点缺点适应性强实现复杂语义完整可能产生过多块块大小可控参数调优困难6. 文本分块的边界与失效模式6.1 块大小选择块大小Token优点缺点适用场景128检索精确上下文不足短文本问答256平衡上下文中等通用场景512上下文丰富检索精度降低长文本1024上下文完整检索精度低长文档分析6.2 分块质量的评估指标描述评估方法语义完整性块内信息是否完整人工评估检索召回率检索到相关块的比例标注测试集生成质量基于块生成的回答质量人工评估6.3 分块效果的对比分块策略检索召回率生成质量计算开销固定长度75%7.0低段落分割82%7.8低语义分块88%8.2高递归拆分85%8.0中6.4 分块策略的选择文档类型推荐策略原因结构清晰段落分割保留文档结构长文本递归拆分适应性强学术论文段落分割章节结构清晰非结构化语义分块自动检测边界7. 分块在 RAG 中的工程实践7.1 分块后处理分块后需要处理去重删除内容重复的块、过滤过滤过短或无关的块以及增强为块添加元数据如来源、标题、位置。7.2 分块与检索的协同分块策略直接影响检索质量。块过大导致检索不精确块过小导致上下文不足。需要在分块大小和检索质量之间迭代优化。7.3 分块策略的自动化使用 LLM 辅助分块策略选择LLM 分析文档结构自动选择最优分块策略和参数。defauto_chunking(text,llm):自动分块promptf 请分析以下文档的结构并推荐最适合的分块策略和参数。 文档:{text[:2000]}... 请输出推荐的策略fixed_length/paragraph/semantic/recursive和参数。 recommendationllm.generate(prompt)strategyparse_recommendation(recommendation)ifstrategyparagraph:returnparagraph_chunking(text)elifstrategysemantic:returnsemantic_chunking(text,embedding_model)elifstrategyrecursive:returnrecursive_chunking(text,RECURSIVE_CHUNK_CONFIG[separators])else:returnfixed_length_chunking(text)8. 分块策略的评估与优化8.1 分块质量的评估指标指标描述计算方法语义完整性块内信息是否自包含人工评估1-5 分检索召回率相关块被检索到的比例在标注测试集上计算生成质量基于块生成的回答质量人工评估或自动指标块大小一致性块大小的标准差计算各块大小的标准差8.2 分块策略的 A/B 测试defchunking_ab_test(documents,strategies,test_queries,ground_truth):分块策略 A/B 测试results{}forstrategyinstrategies:chunksstrategy(documents)# 评估检索质量retrieval_scoresevaluate_retrieval(chunks,test_queries,ground_truth)# 评估生成质量generation_scoresevaluate_generation(chunks,test_queries,ground_truth)results[strategy.name]{retrieval:retrieval_scores,generation:generation_scores,chunk_count:len(chunks)}returnresults8.3 分块参数的调优分块参数块大小、重叠大小、分隔符需要根据具体文档和任务调优参数调优范围对质量的影响块大小128-1024大小影响检索精度和上下文完整性重叠大小0-200影响边界上下文保留分隔符多个级别影响语义完整性最小块大小20-100影响检索质量8.4 分块策略的自适应选择根据文档类型自动选择最优分块策略defadaptive_chunking(documents):自适应分块策略选择fordocindocuments:doc_typedetect_document_type(doc)ifdoc_typearticle:chunksparagraph_chunking(doc)elifdoc_typecode:chunkscode_chunking(doc)elifdoc_typeconversation:chunkssemantic_chunking(doc,embedding_model)else:chunksrecursive_chunking(doc,separators)store_chunks(chunks)9. 分块在特定文档类型中的应用9.1 代码分块代码文档的分块需要保留代码的结构代码语言分块策略说明Python函数/类按函数定义切分Java类/方法按类和方法切分HTML标签/区块按 HTML 标签切分Markdown标题/段落按标题层级切分9.2 PDF 文档分块PDF 文档的分块需要处理文本提取从 PDF 中提取文本、表格识别识别表格结构、图像提取提取图像用于多模态检索defpdf_chunking(pdf_path,embedding_model):PDF 文档分块# 1. 提取文本textextract_text_from_pdf(pdf_path)# 2. 提取表格tablesextract_tables_from_pdf(pdf_path)# 3. 提取图像imagesextract_images_from_pdf(pdf_path)# 4. 合并分块all_chunks[]all_chunks.extend(recursive_chunking(text,[\n\n,\n,.]))all_chunks.extend(tables)all_chunks.extend(images)returnall_chunks9.3 多语言文档分块多语言文档的分块需要处理不同语言的分隔符差异语言分隔符说明中文。句号、感叹号、问号英文. ! ?句号、感叹号、问号日文。句号、感叹号、问号阿拉伯文. ! ?从右向左阅读10. 分块与检索的深度协同10.1 分块重叠的重要性重叠策略确保分块边界附近的上下文信息不会丢失这对检索质量至关重要。10.2 分块元数据管理元数据字段描述示例source文档来源“document_123.pdf”page页码15section章节标题“3.2 分块策略”chunk_index块索引3total_chunks总块数2010.3 分块与嵌入的配合分块策略直接影响嵌入质量块太小导致嵌入向量缺乏语义信息块太大导致嵌入向量过于通用。优化分块与嵌入的协同defoptimize_chunk_embedding(documents,embedding_model,chunk_sizes):优化分块与嵌入的配合best_score0best_size0forsizeinchunk_sizes:chunksfixed_length_chunking(documents,chunk_sizesize)embeddings[embedding_model.encode(chunk)forchunkinchunks]avg_distancecompute_average_distance(embeddings)# 距离越大表示块间差异越大检索质量越高ifavg_distancebest_score:best_scoreavg_distance best_sizesizereturnbest_size11. 分块系统的工程实现11.1 分块处理流水线生产环境中的分块处理流水线classChunkingPipeline:分块处理流水线def__init__(self,chunking_strategy,embedding_model,vector_db):self.strategychunking_strategy self.embedding_modelembedding_model self.vector_dbvector_dbdefprocess_document(self,document):处理单个文档# 1. 预处理cleanedself.clean(document)# 2. 分块chunksself.strategy.chunk(cleaned)# 3. 后处理chunksself.post_process(chunks,document.metadata)# 4. 生成嵌入并存储forchunkinchunks:embeddingself.embedding_model.encode(chunk[text])self.vector_db.insert(embeddingembedding,metadatachunk)returnlen(chunks)defprocess_batch(self,documents,batch_size100):批量处理文档total_chunks0foriinrange(0,len(documents),batch_size):batchdocuments[i:ibatch_size]fordocinbatch:total_chunksself.process_document(doc)returntotal_chunks11.2 分块系统的监控指标描述告警阈值平均块大小所有块的平均大小 1024 或 128块数文档产生的块数 1000处理时间单文档处理时间 10s失败率分块失败的文档比例 1%11.3 分块系统的可扩展性文档数量分块策略处理时间存储需求1K任何策略分钟级100MB10K固定长度分钟级1GB100K段落分割小时级10GB1M固定长度小时级100GB总结文本分块是 RAG 系统的基础设施。不同的分块策略适用不同的文档类型和任务需求。固定长度分块简单高效段落分割保留文档结构语义分块自动检测语义边界递归拆分适应性强。在实际应用中通常需要根据文档类型和任务需求组合使用多种分块策略并通过 A/B 测试不断优化分块参数。外部引用补充代码分块策略https://python.langchain.com/docs/modules/data_connection/document_transformers/code_splitterPDF 分块技术https://arxiv.org/abs/2303.04226多语言分块https://arxiv.org/abs/2303.04226分块与检索协同https://arxiv.org/abs/2312.10997分块系统监控https://arxiv.org/abs/2303.04226