ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

RAG 分块策略实战:固定、递归与语义分块的选型与评测

2026/10/1 8:44:56 拓冰建站 浏览量
RAG 分块策略实战:固定、递归与语义分块的选型与评测 RAG 分块策略实战:固定、递归与语义分块的选型与评测一、从一次"答非所问"说起去年我接手过一个企业知识库问答项目,语料是三百多份产品手册和售后工单,总计约四百万字。向量库用的是当时很流行的组合:bge-large-zh 做嵌入,Milvus 做存储,检索 top-5 拼接后丢给大模型。上线第一周,用户提了一个非常朴素的问题:"保修期内人为损坏能不能免费维修?“系统的回答却在大谈"设备安装环境要求"和"开箱验收流程”。排查了半天,问题不在嵌入模型,也不在提示词,而是出在最上游、最不起眼的一步:分块。当时的分块逻辑是教科书式的chunk_size=512, overlap=50,按字符硬切。而那份手册的"售后服务条款"章节里,前 400 字在讲服务网点分布,真正的"人为损坏不在免费保修范围"只占第 500 到 560 个字符——正好被切开,前半句留在第 3 块,后半句跑到第 4 块。检索时第 3 块命中了"保修"这个关键词,向量相似度排在第一,于是模型拿到的是半截条款,自然答得驴唇不对马嘴。这件事让我意识到一个常被忽略的事实:在 RAG 系统里,分块是唯一一个"上游做错、下游无法补救"的环节。嵌入模型可以换,重排序可以加,提示词可以调,但如果条款本身被切成了两半,任何下游手段都拼不回来。这篇文章把分块这件事讲清楚:三种策略的原理与边界、代码实现,以及如何用数据而非直觉判断哪个策略更适合你的语料。二、分块为什么决定 RAG 的性能上限要理解分块的重要性,得先看清楚检索这一步到底在做什么。RAG 的检索本质是一个语义匹配问题:问题编码成向量qqq,每个片段编码成cic_ici​,再按余弦相似度排序:sim(q,ci)=E(q)⋅E(ci)∥E(q)∥ ∥E(ci)∥ \text{sim}(q, c_i) = \frac{E(q) \cdot E(c_i)}{\|E(q)\| \, \|E(c_i)\|}sim(q,ci​)=∥E(q)∥∥E(ci​)∥E(q)⋅E(ci​)​这里的关键在于嵌入模型的工作方式。绝大多数中文嵌入模型(bge、m3e、text2vec 系列)把输入截断在 512 个 token 左右,输出一个定长向量——无论片段是 50 字还是 2000 字,都被压成同一个 1024 维向量。这意味着片段内部包含的主题越多,这个向量就越像多个主题向量的"平均"。用一个简化模型说明。假设片段ccc包含mmm个主题,嵌入近似为主题向量的加权和E(c)≈∑i=1mwiE(ti)E(c) \approx \sum_{i=1}^{m} w_i E(t_i)E(c)≈∑i=1m​wi​E(ti​),∑wi=1\sum w_i = 1∑wi​=1。查询只关心主题tjt_jtj​时:sim(q,c)≈wj⋅cos⁡(E(q),E(tj)) \text{sim}(q, c) \approx w_j \cdot \cos\big(E(q), E(t_j)\big)sim(q,c)≈wj​⋅cos(E(q),