RAG 中如何处理 Markdown、表格、代码块和图片?

RAG 中如何处理 Markdown、表格、代码块和图片?
在 RAG 系统里,文档处理是个技术活。面试这道题考的是:你对文档结构化处理的完整理解,包括怎么切分、怎么保留语义、怎么应对不同类型的内容。核心就一句话——让切分不破坏语义,让每种内容都能被正确理解和检索。
下面我们从文档处理的完整流程说起。
板块1:文档处理全流程——从上传到入库的关键步骤
文档从上传到进入向量数据库,要经过 6 个环节:
- 文件上传:接收用户的文档
- 格式校验:检查文件类型、完整性
- Layout 解析:识别文档结构(标题、段落、表格等)
- 清洗去噪:去掉无关内容(页眉页脚、水印)
- Chunking:把文档切成小块
- Metadata + 入库:添加元信息,存入向量数据库

每个环节都可能丢信息。比如 Layout 解析不准确,后面怎么切都是错的;清洗环节把表格的边框线当噪音去掉,表格结构就毁了。
这就像餐厅处理食材:洗菜、切菜、烹饪每个环节都在损耗,最终端上桌的菜好不好,取决于每个环节的处理质量。
板块2:Chunking策略——如何让切分不破坏语义
切分策略直接决定检索质量。常见的有 4 种:
| 策略 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 固定长度 | 按 Token 数切 | 简单 | 容易截断语义 |
| 递归字符 | 按层级字符切(换行→空行→句号) | 保留层级结构 | 复杂 |
| 语义切分 | 用 Embedding 判断语义边界 | 语义完整 | 慢 |
| 按结构切 | 按 Markdown 标题、表格切 | 利用天然边界 | 依赖格式识别 |

代码文档有特殊要求:推荐 100 Token 块大小 + 15 Token 重叠。太小切断了函数上下文,太大检索精度下降。
切分文档就像切分一篇文章——在句号处切比在单词中间切更容易让人读懂。
板块3:不同内容类型的结构化处理
这是本题的核心。每种内容类型,处理方式完全不同。
Markdown
按 H1/H2/H3 层级切分。每个标题下的内容作为一个 Chunk,保留层级关系。
# 第一章 ## 1.1 基础概念 内容... ## 1.2 进阶内容 内容...切分结果:3 个 Chunk,标题层级作为元信息存储。
表格
表格是最难处理的。结构化数据被装进文本格式,解析容易丢失语义。
推荐方案:多模态 LLM + Table Transformer
- 用 Table Transformer 定位表格区域
- 用多模态 LLM 提取表格内容,转成结构化格式(JSON 或 LaTeX)
- 同时保留原始文本版本作为兜底
索引策略:细粒度 + 粗粒度
- 细粒度:表格摘要(如“2024年Q1各地区销售额对比”)
- 粗粒度:完整 LaTeX 格式表格

代码块
代码按函数/类/包粒度切分,不要按行数切。
- 识别代码语言类型(Python、Java 等)
- 用 AST 解析提取函数、类
- 每个函数作为一个语义单元
图片
图片有三条路:
- OCR 识别:提取图片中的文字
- 多模态 LLM 描述:生成图片的文字描述
- 原图存储:图片作为独立 Chunk,用 CLIP 等模型提取向量
实际项目中,通常用方案 1 + 2:先 OCR 提取文字,再用多模态模型生成描述,两者都存。
板块4:异常处理与降级策略
生产环境中,文档什么情况都有。你需要一套降级机制:
| 异常情况 | 处理策略 |
|---|---|
| 空文件 | 拒绝入库,提示用户 |
| 格式不支持 | 建议用户转 PDF/DOCX |
| 解析失败 | 进入人工处理队列 |
| 乱码率高 | 尝试 OCR,仍失败则降级为纯文本 |
| Chunking 异常 | 兜底用固定长度切分 |

核心原则:永远不要让解析失败导致整个流程挂掉,要有兜底方案。
就像餐厅接收食材:蔬菜蔫了可以做员工餐,烂了就退回供应商,但厨房不能因此停业。
面试怎么答
基础版
RAG 处理多类型文档,核心是结构化解析 + 语义保留的切分。文档入库要经过 6 步:上传、格式校验、Layout 解析、清洗、Chunking、Metadata 入库。Chunking 策略根据内容类型选择——Markdown 按标题层级切,表格用多模态 LLM 提取并建立细粒度+粗粒度索引,代码按函数粒度切,图片用 OCR + 多模态描述。对于解析失败的情况,要有降级策略兜底。
加分版
补充一个关键点:Parent-Child Chunk 策略。召回时先匹配细粒度 Chunk,找到后再带着父 Chunk 的上下文去生成答案。这解决了召回精度和上下文完整性的矛盾。另外,表格索引推荐用摘要存在细粒度、LaTeX 表格存在粗粒度的方案,检索效率和语义完整性都能保证。
一句话总结
多类型文档处理的核心是:针对不同内容采用差异化策略,用结构化保留语义,用降级兜底保证鲁棒性。

