前言

做 RAG 时,很多人的第一反应是:既然知识都在文档里,那就把整份文档直接交给大模型,让它自己读完再回答。这个思路看起来简单直接,但在真实系统里往往既昂贵又不稳定。问题不只在于上下文窗口有限,更在于“看得下”并不等于“找得准”。要让检索真正可用,关键不是喂给模型更多文本,而是先把文本切成适合检索的高质量片段,这就是分块的意义。

目录

前言

一、为什么不能直接把整篇文档喂给大模型?

1. 上下文窗口不是无限的

2. 全量长上下文不等于更高准确率

二、分块到底在做什么?

1. 分块是 RAG 数据准备中的关键步骤

2. 为什么整篇文档不能作为检索单元?

三、分块的两个核心参数:chunkSize 和 overlap

1. chunkSize:每个块应该切多大?

2. overlap:为什么相邻块之间要重叠?

3. 字符和 token 有什么区别?

四、主流分块策略有哪些?

1. 固定大小分块(Fixed Size Chunking)

2. 重叠分块(Overlapping Chunking)

3. 递归分块(Recursive Chunking)

4. 语义分块(Semantic Chunking)

5. 混合分块(Hybrid Chunking)

五、分块策略应该怎么选?

1. 先看文档结构,再决定策略

2. 参数应该如何起步?

六、企业级 RAG 中,分块往往不是唯一问题

七、如何评估分块是否有效?

1. 召回是否准确

2. 语义是否完整

3. 回答是否更稳定

结语


一、为什么不能直接把整篇文档喂给大模型?

假设你在一家电商公司做智能客服。公司内部有一份几百页的《客服知识库》,内容覆盖退货政策、物流规则、会员权益、售后流程等。用户提问:

买了 7 天的商品还能退吗?

系统需要从知识库中找到相关规则,并生成准确回答。

最直觉的方案是:把整份知识库直接作为提示词输入给大模型,让模型自己从中找答案。这个方案看似合理,但一旦落地,通常会遇到两个根本问题:上下文窗口限制,以及全量输入带来的检索失焦

1. 上下文窗口不是无限的

大模型一次能够处理的输入长度有限,这个限制通常称为上下文窗口。可以把它理解为模型的一张工作台:一次能摊开的内容越多,模型能同时参考的信息越多;但这张工作台始终是有限的。

企业知识库往往包含大量规则、条款、流程说明和例外条件。即使不考虑图片、表格和版式,只看抽取后的纯文本,整体长度也可能非常可观。把整份文档直接输入模型,通常会面临几个现实问题:

  • 输入长度可能超限,无法一次提交;
  • 即使放得下,推理成本也会明显上升;
  • 输入越长,响应延迟越高;
  • 在高并发业务场景中,整体吞吐能力会显著下降。

因此,问题不只是“能不能塞进去”,更是“是否值得这样做”。

2. 全量长上下文不等于更高准确率

即使假设模型窗口足够大,能一次装下整份文档,也不意味着回答质量就会更好。

用户问“生鲜商品支持七天无理由退货吗”,真正相关的信息,可能只藏在知识库中的一两段文字里。如果把几十万字全部交给模型,相当于要求它在大量噪音中自行定位、筛选、组合答案。这会带来两个典型问题:

  • 检索范围过大:模型容易把相关但不关键的信息一起带入回答;
  • 规则边界模糊:模型可能忽略例外条件,或把多条规则混在一起解释。

换句话说,更多上下文并不天然等于更强答案,过多无关信息反而会干扰模型判断。

这也是为什么在知识问答、企业搜索、智能客服等场景里,实际系统通常不会把全量文档直接交给模型,而是采用 RAG(Retrieval-Augmented Generation,检索增强生成) 的方式:

  1. 先从知识库中检索出最相关的少量内容;
  2. 再把这些内容交给大模型生成最终答案。

这个流程的核心思想很简单:先缩小信息范围,再让模型推理。

但这就带来一个新的前提:如果要检索,文档就不能以“整本书”的形式存在,而必须先被拆成可检索的文本单元。这个过程,就是分块(Chunking)


二、分块到底在做什么?

1. 分块是 RAG 数据准备中的关键步骤

在 RAG 的数据处理流程中,文档通常会先经过文本抽取,变成纯文本。比如从 PDF、Word、网页或扫描件中提取出文字内容。但纯文本只是原始材料,还不能直接用于高质量检索,因为它通常太长、粒度太粗、语义边界也不清晰。

因此,文本抽取之后,通常还要做两步关键处理:

  1. 分块:把长文本切成适合检索的小段;
  2. 向量化:把每个文本块转换成向量,供后续相似度检索使用。

分块看起来只是预处理的一步,实际上会直接影响后续检索质量。块切得合理,检索更准;块切得粗糙,后面再换模型、调提示词,效果提升也会很有限。

2. 为什么整篇文档不能作为检索单元?

因为粒度太粗。

一整份知识库往往同时包含多个主题,例如退货、换货、会员、物流、售后。如果用户只问退货政策,但检索返回的是整章甚至整本内容,那么虽然“答案在里面”,对模型来说依然是噪音很重的输入。

理想的检索单元需要同时满足两个条件:

  • 足够小,便于精准命中;
  • 足够完整,能独立表达一个相对清晰的意思。

分块的本质,就是在“检索精度”和“语义完整性”之间找到平衡。


三、分块的两个核心参数:chunkSize 和 overlap

1. chunkSize:每个块应该切多大?

chunkSize 表示单个文本块的长度上限。这个长度可以按字符数计算,也可以按 token 数计算。

它没有统一标准,但有非常明确的权衡关系:

  • 块太大:信息更完整,但容易混入不相关内容,降低检索精度;
  • 块太小:定位更精准,但可能把一条完整规则切散,导致上下文丢失。

以客服知识库为例,如果一个块同时包含“退货条件、例外品类、运费责任”三类信息,那么检索时可能会召回过多附带内容;但如果一个块只有几十个字,又可能不足以独立表达完整规则。

所以,chunkSize 的目标不是越大越好,也不是越小越好,而是让每个块既能表达一个相对完整的语义单元,又不过度混杂多个主题。

2. overlap:为什么相邻块之间要重叠?

overlap 指的是相邻两个文本块之间共享的内容长度。

它的作用是:避免关键信息刚好落在分块边界上而被切断。

例如一条规则写的是:

自签收之日起 7 天内,商品未经使用且不影响二次销售的,消费者可申请七天无理由退货。生鲜食品、定制商品、贴身衣物等特殊品类不适用此规则。

如果切分时不考虑重叠,“七天无理由退货”这几个关键词可能刚好被分到两个块中,导致两个块都不完整。加入适量重叠后,边界附近的关键内容会在相邻块中重复出现,从而降低漏召回的概率。

当然,overlap 也不是越大越好。重叠越多,重复文本越多,存储、向量化和检索成本也会随之上升。实践中通常会从一个适中的比例开始,再结合效果微调。

3. 字符和 token 有什么区别?

很多人在设置分块参数时,会同时看到“字符数”和“token 数”两种口径。

  • 字符(Character):就是我们肉眼看到的字母、汉字、空格和标点;
  • Token:是模型在内部处理文本时使用的最小单位。

大模型的上下文窗口和计费通常都以 token 为单位,因此从理论上说,基于 token 的分块更精确。但在很多业务系统中,按字符数分块也完全可行,因为它更简单、更直观,也更便于快速试验。

一个常见做法是:

  • 原型阶段先按字符切分;
  • 方案稳定后,再根据模型特点切换到 token 级控制。

四、主流分块策略有哪些?

分块并不是一种固定方法。不同文档结构、不同检索目标,适合的策略也不同。下面是几种常见方案。

1. 固定大小分块(Fixed Size Chunking)

这是最简单的方式:不考虑文本语义和结构,只按固定长度切分,比如每 500 个字符切一块。

它的优点很明显:

  • 实现最简单;
  • 性能稳定;
  • 易于快速上线和验证。

但缺点同样明显:

  • 完全不关心句子、段落或章节边界;
  • 很容易把一条完整规则从中间切开;
  • 生成的块在语义上往往不自然。

因此,固定大小分块更适合结构不重要的文本,例如日志、流水文本,或者作为其他复杂策略的兜底方案。

2. 重叠分块(Overlapping Chunking)

重叠分块是在固定大小分块的基础上加入了重叠区域。相邻两个块共享一部分文本,以减少边界处的信息损失。

它的优势在于:

  • 实现依旧简单;
  • 能有效缓解句子被切断的问题;
  • 适合作为通用入门方案。

但它的本质仍然是“规则切分 + 局部补偿”,并没有真正理解文本结构,只是用重复内容来降低边界风险。因此,它适合作为基础方案,但未必是长期最优解。

3. 递归分块(Recursive Chunking)

递归分块是实践中非常常见的默认选择。

它的核心思路是:优先按照较大的自然边界切分,如果某个块仍然过大,再逐层使用更细的分隔符继续切。

例如可以按这样的优先级逐步尝试:

  • 空行或章节分隔;
  • 换行;
  • 句号;
  • 逗号;
  • 空格;
  • 最后才按字符硬切。

这种策略的好处是,它会尽可能保留文档原有结构。能按章节切就不按句子切,能按句子切就不按字符切。这样既能控制块大小,又尽量保证语义完整性。

对于知识库、产品手册、政策文档、FAQ 等结构相对清晰的文本,递归分块通常都是最稳妥的默认方案。

4. 语义分块(Semantic Chunking)

前面几种方法本质上都属于规则分块:按长度切、按标点切、按层级切。它们并不真正理解文本“在讲什么”。

语义分块的思路不同。它会借助 Embedding 模型,或者直接借助大模型的语义理解能力,在主题发生明显变化的位置切分文本

典型流程通常是:

  1. 先按句子拆分;
  2. 为每个句子生成向量表示;
  3. 计算相邻句子之间的语义相似度;
  4. 在相似度显著下降的位置切分。

它的优势非常明显:

  • 切分点更符合真实语义边界;
  • 每个块内部主题更集中;
  • 对高精度检索场景更友好。

但代价也同样明显:

  • 计算成本更高;
  • 实现复杂度更大;
  • 处理速度通常慢于规则分块;
  • 还需要调节阈值和策略。

因此,语义分块更适合对准确率要求很高的场景,例如法律、医疗、金融合规等高价值知识库。

5. 混合分块(Hybrid Chunking)

真实项目里,单一策略往往无法覆盖所有文档类型。更常见的做法是把多种策略组合使用。

例如:

  • 产品手册使用递归分块;
  • FAQ 按问答对切分;
  • 合同文本使用语义分块;
  • OCR 文本采用重叠分块来缓解结构破碎问题;
  • 分块完成后,再做一次后处理:合并过短块、拆分过长块、补充标题和来源等元数据。

混合分块的优点是适应性更强、整体效果更好;缺点是实现和维护成本更高。因此它更适合文档来源复杂、质量要求较高的企业级 RAG 系统,而不适合一开始就用于简单 Demo。


五、分块策略应该怎么选?

1. 先看文档结构,再决定策略

很多人在做 RAG 时,一上来就纠结 chunkSize 应该设多少。实际上,参数通常不是第一决策点,文档类型和结构才是。

一个更合理的思路是:

  • 知识库 / 产品手册:优先递归分块;
  • FAQ / 问答集:优先按问答对切分;
  • 合同 / 法律条款:优先语义分块;
  • 日志文本:按行切分或固定长度切分;
  • 代码文件:按函数、类、模块等结构切分;
  • HTML 页面:先清洗标签,再做递归分块;
  • OCR 或格式混乱文本:优先重叠分块,再结合清洗或后处理。

结论很简单:先理解文本天然结构,再设计分块方式,而不是先拍脑袋设一个统一参数。

2. 参数应该如何起步?

分块参数没有放之四海而皆准的最优值,但可以遵循一个务实原则:先用经验值启动,再用真实查询验证。

调参时可以重点观察两个现象:

  • 如果检索结果经常过于发散,说明块可能太大;
  • 如果检索结果经常缺少必要上下文,说明块可能太小,或重叠不足。

也就是说,参数调整的目标不是追求理论上的最佳值,而是在你的文档分布和用户问题分布上,找到更适合业务的平衡点。


六、企业级 RAG 中,分块往往不是唯一问题

很多团队在检索效果不理想时,会把问题全部归结为分块策略不对。但在真实系统中,效果差往往不只是“切得不对”,而是上游文本本身就不干净

尤其是 PDF、扫描件、复杂版式文档,常见问题包括:

  • 页眉页脚、页码、目录混入正文;
  • 一句话被错误断行,段落结构被打散;
  • 表格被拆成碎词,字段顺序错乱;
  • OCR 误识别过多,导致原始语义变形。

如果抽取出来的文本已经充满噪音,那么再好的分块策略也很难稳定发挥作用。因此,更可靠的工程流程通常是:

  1. 文本抽取;
  2. 文本清洗与结构修复;
  3. 分块;
  4. 向量化;
  5. 检索评估与迭代优化。

此外,在一些中小规模但高价值的知识库中,纯自动分块未必总是效果最好。很多时候,先自动分块,再做少量人工二次编排,反而更符合真实业务问题。这种做法虽然不够“全自动”,但在企业场景里往往更实用。


七、如何评估分块是否有效?

一个常见误区是:只看分块结果“读起来顺不顺”,却不验证它是否真的提升了检索效果。实际上,分块的好坏最终应该用检索表现来衡量。

至少可以从三个角度去判断:

1. 召回是否准确

同样一个问题,系统召回的内容是不是明显更聚焦?是否更容易命中真正相关的条款,而不是一大段泛泛而谈的背景信息?

2. 语义是否完整

召回的块能不能独立表达清楚规则?如果一个块命中了关键词,却因为边界切分不当而缺失前提条件、例外说明或结论,那么它在检索层面其实是不合格的。

3. 回答是否更稳定

高质量分块带来的好处,不只是“命中答案”,更是让模型在生成答案时更稳定。因为它拿到的是更干净、更聚焦的上下文,而不是一堆相关但混乱的信息。

从这个角度看,分块不是单纯的数据处理问题,它会直接影响最终回答的可解释性与一致性。


结语

在 RAG 系统里,分块不是一个可有可无的预处理步骤,而是决定检索效果上限的关键环节。

把整篇文档直接交给大模型,看似省事,实际上既不经济,也不稳定。更合理的做法是:先把长文本拆成大小合适、语义尽可能完整的文本块,再通过检索把真正相关的内容交给模型推理。

从工程实践看:

  • 固定大小分块 最简单,但也最粗糙;
  • 重叠分块 能缓解边界断裂问题;
  • 递归分块 是大多数场景下的默认选择;
  • 语义分块 精度更高,但成本也更高;
  • 混合分块 更适合复杂企业知识库。

最终要记住的一点是:没有一种分块策略适合所有文档,只有适合当前业务场景的分块方案。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐