
分块在RAG检索增强生成项目中分块Chunking是连接原始文档与AI模型的核心桥梁很多新手会疑惑“为什么非要分块什么是分块分块就是把原始长文本拆成若干个小块每个小块通常几百到上千字包含相对完整的语义单元比如一个段落、几个段落或一个小节。通俗理解把一本厚书拆成按章节划分的小册子每本小册子保留完整章节内容不用每次都抱整本书方便查找和阅读。为什么要分块为什么需要分块?核心原因有三个:1)模型处理能力有上限。大语言模型一次能吃进去的文本长度是有限制的GPT-4 Turbo是128KtokensClaude 3是200K tokens。一本10万字的书直接塞进去模型消化不了得先切成小块。2)检索需要精准定位。用户提问通常只关心局部内容比如问”第三章的案例是什么”。把整本书向量化成一个大向量检索时根本分不清哪段最相关。切成小块后每个块都有自己的向量表示检索时能快速找到最匹配的那几个块。3)平衡上下文和计算效率。小块既能保留足够的上下文让模型理解前后逻辑又能让向量计算和存储更高效。一个500tokens的块比5000tokens的块在相似度计算时快得多。分块大小怎么定实践中常用的chunk大小在200到500tokens之间作为起点。对于长技术文档或学术报告可以放宽到512到1024tokens。同时建议设置10%到20%的重叠让相邻块之间有交集避免关键信息刚好卡在分界线上被截断。也可以参考OpenAI官方RAG分块默认值元数据标注不能少光切块不够每个块还得带上身份信息:1)来源信息:这个块属于原文档的哪一章、哪一节2)位置信息:在原文档中的页码、段落编号3)类型信息:是正文、标题、列表还是图表说明这些元数据在检索时很关键。用户问附录A的公式怎么推导检索系统能通过元数据直接定位到附录A的块不会误匹配到正文里长得像的内容。常用分块工具LangChain 的RecursiveCharacterTextSplitter支持滑动窗口和语义拆分是目前用得最多的。Hugging Face的Tokenizers 能按token数精确拆分适合对token 限制敏感的场景。Llamalndex也有内置的分块器支持按段落、句子等多种粒度切分。追问提问1:分块时设置重叠有什么好处?重叠比例一般设多少?回答:**重叠是为了防止关键信息刚好卡在分界线上被截断。**比如一段话讲的是方案的优点和缺点”刚好在优点和缺点中间被切开了前一个块只有优点后一个块只有缺点检索时可能漏掉完整的对比信息。设置重叠后边界附近的内容在两个块里都有检索时更容易命中。重叠比例一般10%到20%太大浪费存储和计算资源太小起不到作用。提问2:分块粒度对检索效果有什么影响?回答:粒度太细每个块信息量太少检索出来的块可能不足以回答问题得召回很多块拼凑。粒度太粗块里混了多个话题检索精度下降模型容易被无关内容干扰。实际项目中一般先用300到500tokens跑个基线再根据检索召回率和答案质量调整。不同类型的文档最优粒度也不一样技术文档可以粗一点FAQ类的要细一点。提问3:除了固定长度分块还有什么更智能的分块方式?回答:语义分块是目前比较火的方向。不是机械地按字数切而是用模型判断句子之间的语义相似度相似度高的句子放一个块相似度突然下降的地方就是分界点。LangChain有个SemanticChunker就是干这个的。还有基于文档结构的分块比如Markdown按标题切、PDF按段落切、代码按函数切这种方式能保证每个块在结构上是完整的。