把文章切成碎片喂给AI,切不好它就消化不良
先问大家一个问题:
你吃西瓜,直接囫囵吞下去会怎样?
会噎着,会消化不良,可能会去医院。
但如果切成小块呢?一口一块,舒服。
AI吃文档也是一样的道理。
你不能把一整本《哈利波特》直接塞给AI,说:”帮我总结一下这本书的第三章在讲什么。”
AI会懵的。
它需要先把文档切成小块——就像你切西瓜一样——然后一块一块地”吃”。
这个过程,在RAG系统里叫文本分块。
切成什么样?切多大?
你以为随便切就行?
Too young too simple.
我见过最离谱的做法:按固定500字符切,不管句子边界,不管语义完整。
结果就是——
原文:”检索增强生成(RAG)是一种结合检索和生成的AI技术。”
切成这样:
块1:”检索增强生成(RAG)是一种结合检索和生成的AI技”
块2:”术。”
“技术”被腰斩了。
向量化之后,这两块生成的向量完全偏离了原意。检索的时候,用户问”RAG是什么”,系统可能根本匹配不上。
一个法律文档的血泪教训
某公司做了个法律问答系统,放了5万份合同和法律条文。
他们按每500字符一切,想着”小块更精准”。
结果用户问”合同违约金怎么算”,系统召回了三段话:
- 块1:违约金按实际损失计算,但不超过合同总金额30%…
- 块2:计算方式为:违约金 = 损失金额 × 违约系数…
- 块3:甲方未按时付款的,应支付违约金…
看起来都对是吧?
但问题是——
块1说的是”违约金上限”,块2说的是”计算公式”,块3说的是”甲方违约情形”。
这三段来自同一份文档的不同章节,本来应该作为整体回答,但被切散了。AI最后生成的答案支离破碎。
更惨的是,还召回了块4:
“租赁合同的违约金为月租金的200%,计算方式见附件三…”
这是租赁合同的条款,和用户问的采购合同完全是两码事。但因为包含”违约金”和”计算”两个关键词,被错误召回了。
切得太碎,上下文全丢了,还混进了噪音。
怎么切才对?
原则一:尽量在语义边界切
什么是语义边界?就是句号、段落、章节结束的地方。
一句话完整切,比把一句话切成两半要好得多。
比如递归分块策略,按优先级依次尝试:
1. 先按段落切(`\n\n`)
2. 如果还是太大,按句子切(`\n`、`。`)
3. 还是太大,按词语切(空格)
4. 最后才按字符切
原则二:代码文件要按语法切
代码不能乱切。
你见过把一个函数切成两半吗?上半部分是函数定义,下半部分是函数体——检索时匹配到函数体,但不知道是哪个函数说的,AI直接懵掉。
所以Python代码按函数边界切,JavaScript按类边界切,SQL按语句切。
原则三:Markdown按标题结构切
Markdown文档有标题(`#`、`##`、`###`),每个标题下的内容应该作为一个整体。
切的时候别把标题和下面的内容分开——检索”Redis集群怎么配置”,如果只召回内容块,没有标题,AI就不知道这个内容属于哪个章节。
chunk_size选多大?
这是被问最多的问题。
没有标准答案,但有经验值:
| 文档类型 | 推荐大小 |
|———|———|
| 普通文章 | 500-750 tokens |
| 技术文档 | 512-1024 tokens |
| 代码文件 | 200-500 tokens |
| 法律/医疗 | 400-600 tokens |
通用场景,512 tokens + 15%重叠是个不错的起点。
重叠的作用是防止”正好切在关键信息上”的悲剧。比如一个知识点被分到了两个块里,没有重叠的话,检索时可能只召回一块,信息就不完整。
三个要命的坑
坑一:专业术语被腰斩
医疗文档里,”糖化血红蛋白测定”是个专业术语。如果被切成”糖化血红蛋白测”和”定”两部分,向量化之后完全变味。
用户问”糖化血红蛋白怎么测”,系统可能根本匹配不上。
建议:专业术语多的文档,把overlap调大(25-30%),或者用Sentence Window策略——检索用小块,但返回时带上周围上下文。
坑二:所有文档用同一套策略
代码、Markdown、PDF、HTML统统用chunk_size=500?
结果代码被切成单行失去意义,Markdown的标题和内容被拆散,HTML的标签残留把向量”毒化”了。
建议:根据文件类型选择不同的分块策略,代码用语法感知切分,Markdown按标题结构切。
坑三:分完块就完了,元数据全扔了
元数据很重要!
文件名、章节标题、更新时间——这些信息可以帮你过滤召回结果、排序优化、甚至让AI在回答时标注来源。
扔了就太可惜了。
给普通人的建议
如果你在用AI知识库类产品:
1. 问问题尽量具体——”Redis怎么配置集群”比”Redis怎么用”更容易召回精确的内容。
2. 看回答有没有”幻觉”——如果AI引用了文档,但文档里没有这个内容,可能是分块时把上下文切散了,导致AI自己脑补。
3. 复杂问题拆开问——”请先告诉我年假天数,再告诉我怎么申请”比”年假怎么休”更容易得到准确答案。
—
核心就一句话:切得好,AI才能消化好。
切得太碎,上下文丢了,AI只能瞎拼凑;
切得太粗,噪音太多,AI会被带偏;
切得刚刚好,AI才能精准命中你想要的内容。
下次你的AI又开始答非所问,别急着骂它,先看看它吃的那块”西瓜”,是不是被切得稀碎。
夜雨聆风