数据分块Chunk策略与实践
作者:程序员马丁
热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。
为什么不能把整篇文档直接丢给大模型?
假设你在一家电商公司做开发,老板让你搞一个智能客服系统。公司有一份 200 页的《客服知识库》,涵盖退货政策、物流规则、会员权益、售后流程等内容。用户问“买了 7 天的商品还能退吗?”,系统要能从知识库里找到答案并回复。
最直觉的做法——把整份知识库的文本一股脑塞给大模型,然后让它回答。
听起来很合理,但实际跑起来你会撞上两堵墙。
1. 大模型的上下文窗口限制
大模型在处理文本时,有一个上下文窗口的概念。你可以把它理解成大模型的工作台——它一次能摊开看的纸张数量是有限的。
拿目前主流的模型来说,上下文窗口大概在 128k 到 1M 个 token 之间(token 是什么后面会解释,这里你先理解成大约等于一个汉字或单个英文)。128K token 听起来很多,但一份 200 页的知识库文档,纯文本量轻松超过 30 万字,远远超出窗口上限。
直接后果:文本塞不进去,或者会触发输入长度限制/截断/费用显著增加。
从 128K token 到 1M token,跨度还不到一年,进步确实非常快。但接下来是否还需要继续把上下文做得更大,仍有待观察:从成本、延迟到实际效果来看,token 并不是越多越好。
就算未来模型的窗口越来越大,能装下整份文档了,还有第二个更本质的问题。
2. 检索精度的问题——大海捞针
假设你有一个上下文窗口无限大的模型,把整份知识库都塞进去了。用户问“生鲜商品支持七天无理由退货吗?”,模型需要从 30 万字里找到相关的那几段话。
这就像你去图书馆找一句话,但图书管理员把整个图书馆的书全摊在你面前说自己找。信息太多,噪音太大,模型很容易走神——要么找不到重点,要么把不 相关的内容混进回答里。
即使上下文做到 1M,很多在线客服场景仍会偏向 RAG,因为全量长提示会显著拉高成本与响应延迟,且吞吐更差。
在 RAG 的架构中,做法不是把所有文本都丢给模型,而是先检索出最相关的几段文本,只把这几段喂给模型。这样模型拿到的上下文精准、干净,回答质量自然就上去了。
但问题来了:要做检索,你得先有可以被检索的单元。一整份知识库是没法作为检索单元的——粒度太粗了。你需要把它切成一段一段的小块,每一块聚焦一个相对完整的知识点。
这就是分块(Chunking)要干的事。
分块到底在干什么
1. 分块在 RAG 流程中的位置
上一篇我们用 Apache Tika 从 PDF、Word 等文件中提取出了纯文本。但纯文本只是原材料,还不能直接用于检索。分块是紧接着文本提取之后的一步,它把长文本切成适合检索的小段。
整个数据准备阶段的流程是这样的:

分块之后的下一步是向量化——把每个文本块转成一组数字(向量),方便计算机做相似度检索。向量化的原理和实现下一篇单独讲,这里你只需要知道:分块的质量直接决定了后续检索的质量。块切得好,检索就准;块切得烂,后面怎么优化都救不回来。
2. 几个关键参数:chunkSize、overlap
在动手切之前,有两个参数你必须搞清楚:chunkSize(块大小)和 overlap(重叠量)。
2.1 chunkSize 怎么理解
chunkSize 就是每个块的长度上限。比如你设 chunkSize = 200,意思是每个块最多包含 200 个字符(或 200 个 token,取决于你用什么单位,后面会说)。
chunkSize 设多大合适?这没有标准答案,但有一个基本的权衡:
- 块太大(比如 2000 字):每个块包含的信息多,但检索时容易混入不相关的内容,精度下降。就像用户问退货政策,结果返回了一整章包含退货、换货、维修的内容,模型还得自己从里面挑。
- 块太小(比如 50 字):每个块很精准,但可能把一个完整的意思切断了,上下文丢失。就像把一条退货规则从中间劈开,前半句和后半句单独看都不知道在说什么。
一般来说,200 到 1000 个字符是比较常见的范围,具体取决于你的文档类型和检索需求。