Ch40: 挑战深读③——分块与多模态
Part 10 · 覆盖 challenges #3 分块 + #12 多模态 前置:Ch27 分块源码 · 案例:case-1725
结论先行:分块矛盾 = 粗则丢细节、细则丢上下文,且 最优分块是 query 依赖的,却必须在 ingest 离线决定;多模态矛盾 = 架构图/财务报表/公式承载关键信息,文本管线却常丢弃或展平。大师做法:按 文档类型 选策略,不是全局一个 chunk_size;多模态默认 文本化 OCR,图搜图或 VLM 按需叠加。
一、日常类比(分块)
把教材拆成检索卡片:按页拆太长搜不准;按段拆有的段只有一句话脱离上下文;按句拆逻辑关系全丢。理想是按 知识点 拆——但「什么算一个知识点」本身难解,且同一本书对「总结全书」与「第三页 p-value」需要 不同粒度。WeKnora 四级自适应是在 文档维度 做折中,仍非 query 维度最优。
二、分块失败场景与根因
| 场景 | 失败表现 | 根因 |
|---|---|---|
| 代码文档 | 函数签名与实现分属两 chunk,各「半相关」 | 固定长度切断语法单元 |
| FAQ | 问题 chunk 召回、答案 chunk 未召 | 分块只看长度,不懂 Q-A 绑定 |
| 表格 | 表头与数据行分离,数字无语义 | 表格语义 = 表头×数据 组合 |
| 长距离指代 | 「它」指 WeKnora 图谱,指代跨 chunk 丢失 | 分块破坏共指消解 |
这些失败直接喂养 挑战 #1 最后一公里 的「跨 chunk」形态;也加剧 挑战 #6 向量失真(大块语义稀释 vs 小块上下文缺失)。
三、分块决策树(ingest 时选用)
上传文档
├─ 短 FAQ / 单页说明(< 阈值 token)→ L1 文档级整篇
├─ 有清晰 # 标题的手册/API → L2 章节级
├─ 长文叙述、结构弱 → L3 段落(\n\n + max tokens)
├─ L3 仍超限 → L4 语义切(embedding 跳变点)
├─ 检测到 Markdown/HTML 表格 → 整表 chunk,禁止滑动窗口切表
├─ 检测到代码块 ``` → 按函数/类边界,不拦腰断
└─ 降级链:L4 失败 → L3 → 固定长度 + overlap
平台对照(摘自 challenges.md):
| 项目 | 策略 | 未解根本问题 |
|---|---|---|
| WeKnora | 四级自适应 + 降级 | 文档维非 query 维 |
| RAGFlow | DeepDoc 结构感知 | 解析错则分块错 |
| Dify | 固定长 + overlap + 父子 | 父 chunk 仍固定 |
| FastGPT | QA 对 LLM 拆 | 叙述性 doc 失真 |
| AnythingLLM | 固定长 + overlap | 无语义感知 |
源码走读见 Ch27:ChunkSize、protectedPatterns、降级 if-else。贡献时必做 表格 / 代码 / FAQ 三类回归。
四、case-1725:分块与解析的格式契约
PaddleOCR-VL 输出带 style="text-align:..." 的 HTML <table>,WeKnora chunker 的 protectedPatterns 只认 Markdown 管道表 |...|:
docreader(HTML table) → docparser(未归一化) → chunker(只保护 pipe 表)
↓
表超 ChunkSize → 从 <td> 中间切断
style 属性 → token 为同内容 MD 的 2–3 倍
PR #1755 在 docparser 加 HTML 表归一化:简单表转 GFM MD(chunker 天然保护);rowspan/colspan 表剥 presentational 属性保留 HTML。教学点:管线中间层输出必须满足下游保护条件——修 chunker alone 不够,上游仍喷 HTML 仍会浪费 token。
五、多模态:核心矛盾与三架构
文档中图/表/公式承载关键信息,文本检索却无法直接利用——或 ingest 时丢弃,或展平丢结构。
日常类比:菜谱只有文字描述「色泽金黄」,照片被扔掉;更糟的是正文写「见上图」而图已丢失。
| 架构 | 做法 | 成本 | 何时默认 |
|---|---|---|---|
| 文本化 OCR | 图→文字/caption 进同一文本索引 | 低 | 生产默认;WeKnora IMA、RAGFlow OCR |
| 多向量 CLIP | 图文共嵌入,文本查图 | 中 | 以图搜图、商品/catalog |
| VLM 按需 | 单页 GPT-4V/Qwen-VL 理解版式+语义 | 高 | L2 失败后的单页精答 |
未解共性:OCR 拿不到「箭头表示调用方向」;CLIP 对架构图 vs 流程图粒度粗;VLM 贵且慢。RAGFlow DeepDoc 表格最好;WeKnora 可贡献 ingest 时 VLM 生成图片描述 关联存储,检索间接吃语义。
公式:LaTeX 可解析;扫描 PDF 公式需数学 OCR,开源效果有限——常落 Level 3 按需 VLM。
六、五平台多模态能力快照
| 项目 | 图片 | 表格 | 公式 |
|---|---|---|---|
| RAGFlow | OCR + 图注 | 深度表格识别 | 基础 LaTeX |
| WeKnora | IMA + OCR | 实体抽取向 | 基础 |
| Dify | 可配 OCR 插件 | 基础 | 无 |
| FastGPT | 外部服务 | 基础 | 无 |
| AnythingLLM | 无 | 无 | 无 |
多模态质量 上限 受 Ch39 解析天花板 约束;下限 受本分块策略约束(图 OCR 文本应与 caption 同 chunk_id,避免图注分离)。
七、前沿与贡献 idea
Late Chunking、Contextual Chunking、Sentence-Window 见 challenges.md。WeKnora 可落地 PR:
- 上传
doc_type枚举 → 绑定 chunk 策略(法规/FAQ/论文) - 表格检测 →
force chunk_boundaries(与 1725 归一化双做) - 图片 OCR + caption 同 chunk;MHTML 分辨率见 case-1743
独立工具向:分块 内聚性/完整性/边界质量 评估器(challenges.md 机会 2),服务自适应降级调参。
八、挑战耦合
- #2 解析:HTML 表不归一化则 #3 必败
- #6 向量:大块稀释关键词,小块丢上下文
- #1 最后一公里:FAQ 拆散 = 语义相关无答案
- #16 Token:chunk 从 500→200 token → chunk 数 ×2.5 → embed 与检索成本线性涨(Ch45)
章末自检
- 默写 WeKnora 四级(L1 文档→L4 语义)及降级方向
- 解释为何「整表 chunk」优于对表做 overlap 滑动窗口
- 对一份含架构图的技术 PDF,写出 OCR / CLIP / VLM 选型理由
- 画出 1725 根因链并指出 docparser 与 chunker 各修什么