分块将经过归一化的原始页面内容转换为检索单元。糟糕的选择会抬高成本(碎片过多)、降低召回率(块过大)或稀释精度(边界断裂)。不存在一种普遍最优的方法;策略应与语料结构、波动性和查询模式相匹配。本指南梳理了生产级 RAG 流水线的设计空间、权衡、评估流程和优化杠杆。
为什么分块很重要
目标:
- 最大化相关事实出现在 top‑k 检索中的概率。
- 保持语义内聚,使生成的答案有据可依。
- 优化 token 利用率(避免重复嵌入样板内容)。
- 实现确定性的增量更新(稳定的块 ID)。
错位的分块会表现为:高冗余、低 Recall@k、边界处出现幻觉事实、嵌入开支膨胀。
固定窗口分块
简单的 N‑token 窗口(例如 500 个 token)。优点:确定性强、易于实现、更新行为稳定。缺点:边界会切断概念;需要冗余的重叠来减少截断 → 成本增长。谨慎使用:对于语义信号不可靠的异构或结构欠佳的内容,它是一个不错的基线。
重叠滑动窗口
窗口大小 W 加上重叠 O(例如 500 / 50 个 token)可减少边界处事实的截断。重叠超过约 15% 时,召回率收益递减,同时索引规模不断累加。跟踪 duplication_ratio = distinct_token_count / total_token_count,以便向下调整 O。
语义边界检测
沿结构信号进行分段:H2/H3 标题、列表分组、代码块、表格边界。强制执行最小/最大 token 边界(合并过小的兄弟节点,拆分过大的章节)。优点:更高的内聚性、更少的重叠。风险:标记格式错误、标题层级不一致。可通过层级修复 + 在缺少标题时回退到按段落拆分来缓解。
分层分块
两级索引:粗粒度的章节嵌入(例如整个教程章节)+ 细粒度的子块。检索流程:粗粒度 ANN → 筛选出前 N 个章节 → 在其中进行细粒度检索。优点:减小大型语料的全局搜索空间,改善延迟。复杂性:可移动部件更多,需要级联评分逻辑。
自适应 / 动态分块
根据局部语义密度和结构线索调整块大小。示例逻辑:从一个标题章节开始,若 >800 个 token → 按语义相似度评分的段落簇进行拆分;若 <120 个 token → 与下一个兄弟节点合并,除非主题分歧超过阈值。这需要一次嵌入或相似度预处理;在摄取时一次性付出成本,以换取更好的长期检索效率。
嵌入方面的考量
维护元数据:token_count、model_version、content_hash。避免截断——预先计算 token 并在调用模型之前进行拆分。密集模型在样板内容过多时会性能下降;分块前先剥离导航伪影。监控 vector_density(唯一词项 / token),以暴露低信号碎片(重新合并的候选项)。
评估方法
各策略的基准测试:
| 指标 | 用途 |
|---|---|
| Recall@k | 事实保留 |
| Precision@k | 上下文噪声 |
| 块数量 | 成本指标 |
| 重复率 | 重叠调优 |
| 每块平均 token 数 | 窗口利用率 |
| 延迟(检索) | 索引效率 |
在黄金查询集上运行;仅当召回率收益超过成本和延迟增量时,才采用某项策略。
实施操作手册
- 基线:固定 500 + 10% 重叠;收集基准数据。
- 引入语义边界:在标题可靠的地方替换窗口;重新测量。
- 当语料 >250k 块或延迟超过目标时,添加分层层。
- 对方差较大的章节大小部署自适应逻辑。
- 季度重新评估:将每单位质量增量的成本与新模型能力进行比较。
按迭代存储块清单差异,以便回滚。
关键要点
- 在精度/成本方面,语义边界通常优于纯固定窗口。
- 重叠是一个旋钮:测量重复率,不要靠猜。
- 分层检索有助于在不出现线性延迟增长的情况下进行扩展。
- 稳定的块 ID 可实现安全的增量嵌入刷新。
- 像评估代码部署一样评估策略变更:基准测试、比较、记录。