Files
rag/docs/云端MinerU输出分析与优化方案.md
lacerate551 ee5295cc97 fix(parser): PDF/DOCX 切片层级结构修复与 MinerU V2 解析增强
核心修复:
- _post_process_chunks: 用 _buffer_has_body 标志替代 buffer.text_level=0,
  标题+正文合并后保留 text_level 不置零,修复层级信息丢失
- heading_rules numeric_level2: 正则从 ^\d+\.\d+[\.、\s] 改为
  ^\d+\.\d+(?!\.\d),修复无空格标题如"2.1运行调度"无法匹配
- V2 title handler: heading_rules 优先(模式匹配可靠),VLM 仅兜底
  (VLM 常给所有标题 level=1)

MinerU V2 解析增强:
- 两轮 TOC 过滤:多行目录块检测 + 孤立标题/单字符残留清理
- 封面 logo 过滤、重复标题去重
- chart VLM 描述和 Markdown 数据表提取
- ChromaDB metadata 新增 text_level/bbox/table_type/sub_type 字段

配置调整:
- CLUSTER_SECTION_PREFIX_LEVELS 1→2(两级 section 聚类更精确)
- MINERU_LOCAL_BACKEND 默认改为 pipeline

文档:
- RAG检索流程逻辑.md 更新 MinerUChunk 字段、ChromaDB metadata、
  MinerU 解析策略等章节
- 新增 RAG引用跳转-优化计划.md、云端MinerU输出分析与优化方案.md
2026-06-19 23:56:13 +08:00

197 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 云端 MinerU V4 输出分析 & 信息利用优化方案
### 一、测试环境
- 云端 API: MinerU V4 (`https://mineru.net/api/v4`)
- 模型: `vlm`(高精度视觉语言模型)
- DOCX 测试: `1.docx`472KB→ 5秒完成
- PDF 测试: `三峡公报_1-15页.pdf`2.7MB)→ 5秒完成
---
### 二、云端输出 Schema 对比
#### 2.1 DOCXoffice 后端)
| 字段 | 状态 | 说明 |
|------|------|------|
| `type` | paragraph/table/image | 无独立 title 类型 |
| `content.paragraph_content[].content` | 文本内容 | |
| `content.paragraph_content[].style` | 仅 `bold` | 无 italic/underline/font_size |
| `bbox` | **无** | DOCX 不做 OCR |
| `anchor` | 偶有 | Word 书签(如 `_Toc423623536` |
| `table_type`/`table_nest_level` | 有 | 表格类型和嵌套层级 |
| `image_source.path` | 有 | 图片路径 |
DOCX 的 V2 输出非常精简,与本地 `pipeline` 模式基本一致。
#### 2.2 PDFhybrid 后端VLM 模型)
| 字段 | 状态 | 说明 |
|------|------|------|
| `type` | paragraph/title/list/image/chart/table/page_header/footer/number | **丰富的类型区分** |
| `bbox` | **全部有** | 96/96 项都有坐标 |
| `title_content` (title 项) | 有 level 字段 | 标题层级 |
| `paragraph_content` (paragraph 项) | 文本内容 | 无 style/font_size |
| `sub_type` (image) | `natural_image` 等 | 图片子类型 |
| `content.content` (chart) | **Markdown 表格** | VLM 从图表中提取的数据表 |
| `content.content` (image) | **VLM 视觉描述** | 如 "Aerial view of a large dam..." |
| `list_items` (list) | 结构化列表 | 目录条目等 |
| `table_footnote` | 表格脚注 | |
| `chart_caption`/`chart_footnote` | 图表元数据 | |
| `image_source.path` | 图片路径 | 新格式(旧代码用 `img_path` |
#### 2.3 V1 vs V2 格式差异
| 特性 | V1 (`content_list.json`) | V2 (`content_list_v2.json`) |
|------|--------------------------|------------------------------|
| 结构 | 扁平列表 | 按页嵌套 `[[page0], [page1]...]` |
| title 文本 | `text` 字段 | `title_content` 字段 |
| title 级别 | `text_level` 字段 | `level` 字段 |
| bbox | 有 | 有 |
| bold style | Markdown `**text**` | `style: ["bold"]` |
| list 类型 | 有 `list_items` | 有 `list_items` |
| chart 数据 | 无 markdown 表格 | `content.content` 含 markdown |
| VLM 描述 | 无 | `content.content`image 项) |
---
### 三、发现的严重 Bug全部已修复 2026-06-19
#### Bug #1: V2 title 文本全部丢失(严重)✅ 已修复
当前 `_parse_v2_content_list()` 处理 title 类型时:
```python
elif v2_type == 'title':
level = content.get('level', 0)
text_parts = []
para_content = content.get('paragraph_content', []) # ← 错误!
for part in para_content:
...
```
但 PDF 的 title 项使用的是 `title_content` 字段,不是 `paragraph_content`
```json
{
"type": "title",
"content": {
"title_content": [{"type": "text", "content": "三峡工程公报"}],
"level": 1
},
"bbox": [203, 138, 794, 211]
}
```
**影响**: 所有 PDF 标题的文本丢失 → section_path 为空 → 章节层级结构完全破坏。
#### Bug #2: list 类型未处理 ✅ 已修复
V1/V2 都有 `list` 类型(如目录条目),但当前 `_parse_v2_content_list()` 没有处理分支,直接被静默丢弃。
#### Bug #3: chart markdown 数据未提取 ✅ 已修复
V2 的 chart 类型在 `content.content` 中包含 VLM 提取的 Markdown 表格,当前代码只提取 `img_path``caption`,丢掉了结构化数据。
#### Bug #4: VLM 图片描述未利用 ✅ 已修复
V2 的 image 项的 `content.content` 包含 VLM 生成的视觉描述文本(如 "Aerial view of a large hydroelectric dam..."),可用于增强图片检索,当前被丢弃。
#### Bug #5: image_source 路径格式不兼容 ✅ 已修复
V2 图片路径从 `img_path` 改为 `image_source.path`,当前转换代码未适配。
---
### 四、优化方案
#### Phase 1: 修复 V2 解析 BugP0已完成 2026-06-19
**目标**: 修复 PDF 标题丢失等严重问题。
| 改动 | 文件 | 状态 |
|------|------|------|
| title 项读 `title_content` | `mineru_parser.py` `_parse_v2_content_list()` | ✅ 已完成 |
| 添加 list 类型处理 | `mineru_parser.py` `_parse_v2_content_list()` | ✅ 已完成 |
| image_source 路径兼容 | `mineru_parser.py` `_parse_v2_content_list()` | ✅ 已完成 |
| chart markdown 提取 | `mineru_parser.py` `_parse_v2_content_list()` | ✅ 已完成 |
| VLM 图片描述提取 | `mineru_parser.py` `_parse_v2_content_list()` | ✅ 已完成 |
| MinerUChunk 新增 vlm_description/chart_markdown | `mineru_parser.py` | ✅ 已完成 |
| 在线/本地路径同步更新 | `mineru_parser.py` | ✅ 已完成 |
#### Phase 1.5: 审计修复(已完成 2026-06-19
**目标**: 修复审计发现的"提取但未用"字段和 bbox 存储断裂。
| 改动 | 文件 | 状态 |
|------|------|------|
| bbox 存入 ChromaDB metadataJSON 序列化DOCX None 保护) | `knowledge/manager.py` | ✅ 已完成 |
| table_type/table_nest_level → MinerUChunk → ChromaDB | `mineru_parser.py` + `manager.py` | ✅ 已完成 |
| sub_type → MinerUChunk → ChromaDB | `mineru_parser.py` + `manager.py` | ✅ 已完成 |
| MINERU_LOCAL_BACKEND 改为 pipeline | `config.py` | ✅ 已完成 |
#### Phase 2: 增强信息利用P1待实施
**目标**: 在检索管线中利用已存储的新元数据。
| 改动 | 文件 | 说明 |
|------|------|------|
| ~~VLM 图片描述存入 chunk~~ | ~~mineru_parser.py~~ | ✅ Phase 1 已完成 |
| ~~bbox 存入 ChromaDB~~ | ~~manager.py~~ | ✅ Phase 1.5 已完成 |
| ~~sub_type 存入 ChromaDB~~ | ~~manager.py~~ | ✅ Phase 1.5 已完成 |
| bbox 空间感知检索 | `core/engine.py` | 同页内容优先聚合 |
| VLM 描述增强图片检索 | `core/engine.py` | 图片 chunk 用描述文本做语义匹配 |
| table_type 检索路由 | `core/engine.py` | 按表格类型区别处理 |
#### Phase 3: 检索管线利用P2中期
**目标**: 在检索阶段利用新增的元数据。
| 改动 | 文件 | 说明 |
|------|------|------|
| bbox 空间感知检索 | `core/engine.py` | 同页内容优先聚合 |
| VLM 描述增强图片检索 | `core/engine.py` | 图片 chunk 用描述文本做语义匹配 |
| chart markdown 表格检索 | `core/engine.py` | 图表数据表按表格类型路由 |
| table_footnote 上下文补充 | `core/engine.py` | 表格命中时附带脚注 |
#### Phase 4: 架构调整
| 改动 | 说明 |
|------|------|
| 云端优先 + 本地 pipeline 备选 | `MINERU_PREFER_ONLINE=True`, 失败回退 `pipeline` |
| V2 默认启用 | `MINERU_PREFER_V2=True`(保持现状) |
| 本地 backend 改为 `pipeline` | `MINERU_LOCAL_BACKEND="pipeline"`(快速备选) |
---
### 五、字段利用状态汇总(更新于 2026-06-19
| 字段 | 来源 | 状态 | 说明 |
|------|------|------|------|
| `title_content` | PDF V2 | ✅ 已利用 | Phase 1 修复,标题文本正确提取 |
| `list_items` | PDF V1/V2 | ✅ 已利用 | Phase 1 拼接为段落文本 |
| `content.content` (chart) | PDF V2 | ✅ 已利用 | Phase 1 存入 chart_markdown → ChromaDB |
| `content.content` (image) | PDF V2 | ✅ 已利用 | Phase 1 存入 vlm_description → 嵌入 chunk content |
| `bbox` | PDF V1/V2 | ✅ 已利用 | Phase 1.5 存入 ChromaDBJSON 序列化) |
| `table_type` | PDF V2 | ✅ 已利用 | Phase 1.5 存入 ChromaDB metadata |
| `table_nest_level` | PDF V2 | ✅ 已利用 | Phase 1.5 存入 ChromaDB metadata |
| `sub_type` | PDF V1/V2 | ✅ 已利用 | Phase 1.5 存入 ChromaDB metadata |
| `table_footnote` | PDF V1/V2 | ✅ 已利用 | Phase 1 附加到表格 chunk content |
| `anchor` | DOCX V2 | 暂不利用 | Word 书签/交叉引用RAG 场景无需求 |
| `chart_caption`/`chart_footnote` | PDF V2 | ✅ 已利用 | chart caption 已提取 |
| `font_size`/`font_name` | 均无 | N/A | 云端 V4 不输出这些字段 |
| `layout.json` | 两者 | 暂不利用 | 精细布局分析,当前无需求 |
---
### 六、DOCX vs PDF 策略差异
| 策略 | DOCX (office) | PDF (hybrid/VLM) |
|------|---------------|-------------------|
| 标题识别 | 依赖 heading_rules正则+bold | VLM 已识别 title+levelheading_rules 做补充校正 |
| 图片检索 | 仅靠 caption | VLM 描述 + caption 双通道 |
| 图表处理 | 无 | chart 类型含 markdown 数据表 |
| 列表处理 | 无独立 list 类型 | list 类型保留结构化列表 |
| 表格增强 | table_type/nest_level | table_type + footnote + 嵌入图片 |