核心修复: - _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
197 lines
8.5 KiB
Markdown
197 lines
8.5 KiB
Markdown
## 云端 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 DOCX(office 后端)
|
||
|
||
| 字段 | 状态 | 说明 |
|
||
|------|------|------|
|
||
| `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 PDF(hybrid 后端,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 解析 Bug(P0,已完成 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 metadata(JSON 序列化,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 存入 ChromaDB(JSON 序列化) |
|
||
| `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+level,heading_rules 做补充校正 |
|
||
| 图片检索 | 仅靠 caption | VLM 描述 + caption 双通道 |
|
||
| 图表处理 | 无 | chart 类型含 markdown 数据表 |
|
||
| 列表处理 | 无独立 list 类型 | list 类型保留结构化列表 |
|
||
| 表格增强 | table_type/nest_level | table_type + footnote + 嵌入图片 |
|