文档 Chunk(分块)到底咋回事?

B站影视 欧美电影 2025-10-30 13:57 1

摘要:想象一下,你有一份 200 页的技术报告 ,现在要问大模型一个问题:“第二季度的销售增长是多少?”

文档 Chunk(分块)到底咋回事?他是RAG 准确率背后的秘密武器,我们今天来聊聊

想象一下,你有一份 200 页的技术报告 ,现在要问大模型一个问题:“第二季度的销售增长是多少?”

你当然希望模型聪明地只去看第 2 季度那一页,而不是通篇翻 200 页。
可问题是,大模型并不能“一次性吃下整本书” **。 (也许未来可以)**

于是我们想了个办法:
把文档拆成一块一块的小片段(chunk),
给每块生成 embedding 向量,
存进向量数据库,
提问时再从这些块里“捞出”最相关的几块,拼成上下文交给模型。

这,就是 RAG 的核心套路

召回(Retrieve) → 生成(Generate)

而“怎么切块”,直接决定了:

模型能不能找对地方; 回答是否准确; 是否会答非所问。

一句话总结:

Chunking 就是把一大段文本切成许多语义合理的小块,让模型更好地理解和召回。

每个 chunk 通常包含:

一小段文字;一个 embedding 向量;一些元信息(来源、页码、章节等)。

像这样:

{ "doc_id": "report_2024_01", "chunk_id": "report_2024_01_3", "text": "第二季度销售额同比增长了12%。", "metadata": { "page": 12, "section": "Q2 Performance" }} 1️⃣ 固定长度切割法(Fixed-size Sliding Window)

最朴素的办法——就像切寿司 :
每刀切 500 个 token,相邻块之间重叠一点(比如 100 个 token),这样上下文还能衔接得上。

foriinrange(0, len(tokens), chunk_size-overlap): chunk=tokens[i : i+chunk_size]简单粗暴,万金油;适合任意文本。容易“刀下留情”——半句话被切断;重叠多了浪费存储空间。

常见场景:
LangChain 默认就是这个方案。
适合普通网页、聊天记录、代码注释等。

举例:

“我爱北京天安门,天安门上太阳升”
被切成

块1:我爱北京天安门,天安门上

块2:天安门上太阳升

模型:嗯……我大概明白了,但不太确定

顾名思义,先分句,再拼接。

比如用 NLP 工具(spaCy、HanLP)识别出句子边界,每凑够 400~500 token 组成一个 chunk。
这样不会在句中“半截腰斩”。

优点:

语义更完整;embedding 向量更“干净”;模型理解更连贯。

缺点:

分句器不靠谱的话,容易乱切;不太适合有表格或列表的内容。

举例:

“第二季度收入增长12%。成本下降5%。利润率提升显著。”

→ 一个 chunk 含 3 句,模型理解: “哦,这是一个连续的业务描述。”

这个方法更“聪明”一点:
它不是随便切,而是“顺着文档的章节结构”来。

比如你有一个 Markdown:

# 第一章 市场概况## !(https://mmbiz.qpic.cn/mmbiz_png/NeVo2wFHxWB3DVJxtsK6czGC2KEkHrBr4x94z9I3aZFpl7jynxEDDjueibLQRxyBVpd4Bycxic97LjrRicSm6cIfA/640?wx_fmt=png&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1) 1.1 全球趋势内容A...## !(https://mmbiz.qpic.cn/mmbiz_png/NeVo2wFHxWB3DVJxtsK6czGC2KEkHrBr4x94z9I3aZFpl7jynxEDDjueibLQRxyBVpd4Bycxic97LjrRicSm6cIfA/640?wx_fmt=png&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1) 1.2 中国市场内容B...

分块结果是:

Chunk 1:第一章 → 全球趋势Chunk 2:第一章 → 中国市场

优点:

结构清晰,上下文自然;检索时可以保留层级(比如:“第几章第几节”)。

缺点:

实现略复杂,要能解析结构;不适合“无格式”的纯文本。

适用:报告、说明书、产品文档。

4️⃣ 语义相似度分块(Semantic Similarity Chunking)

这就更“AI 味儿”了 。
核心思想:让 embedding 自己决定哪里该切!

实现原理:

先按句子生成 embedding;计算相邻句子的相似度;相似就合并,不相似就分开。ifcosine(sent_emb[i], sent_emb[i+1]) >threshold: mergeelse: split

优点:

语义自然连续;模型召回准确率更高;不会因为机械切割打断逻辑。

缺点:

算法复杂,embedding 成本高;调参(相似度阈值)麻烦。

适用:科研论文、法律、医疗类文档。

⚙️ 5️⃣ Tokenizer 感知切割(Tokenizer-aware Chunking)

这是“工程师风格”的切法。
不是按字符数,而是按 模型实际的 token 长度切,比如 tiktoken。

这样可以确保每个 chunk 不会超出 embedding 模型的最大限制。

优点:

精准控制;不会“爆 token”。

缺点:

语义可能被截断;需要配合其他策略(如 overlap)。

“单一切法不够看?那就全都要!”

例如:

先按标题结构分层;每层再按句子分割;最后再 tokenizer-aware 限制 token 长度;加点 overlap,保证衔接。 文档类型 推荐策略⚙️ Chunk Size Overlap 说明普通网页 / 日志Fixed + Overlap300–50050–100通用快速方案技术报告 / 论文Hierarchical + Sentence500–800100保留章节结构医疗 / 法律类Semantic Similarity400–70050逻辑连续性更好代码文档按函数 / 类分块--AST 分块效果更佳多语言文本Tokenizer-aware + Sentence400–60080防止 token 边界错乱LLM 自行判断语义边界;(现在也可以,但是要花费token)不再需要固定 chunk_size;分块与召回一体化(End-to-End Retrieval)。

也许在不远的将来,你只需要告诉模型一句话:

“帮我切好这份文档。”

然后它会智能地说:

“切好了,语义连贯度 98%,召回覆盖率 93%,您请查收 。”

项目核心点分块目的让模型理解、召回更精准核心挑战切割边界、语义连续、控制 token主流方法固定长度 / 语义分句 / 结构化 / 相似度 / 混合最佳实践结构化 + 语义分句 + overlap一句话总结分块分得好,RAG 跑得稳!

如果你现在理解了 chunk 是啥,那恭喜你:你已经比 80% 的 RAG 实践者更清楚这块的门道了。

下次再有人问你:“为什么我的 RAG 总答不准?”

你就可以微微一笑说:
“兄弟,你这块切得不太对。”

文章参考:https://blog.dailydoseofds.com/p/5-chunking-strategies-for-rag

来源:正正杂说

相关推荐