1. 为什么要在喂给 AI 之前做格式统一
1.1 一个被大多数人忽略的隐形瓶颈
很多人用 AI 处理文档时,习惯直接把 PDF、Word、Excel 或者手机拍的图片一股脑丢进去,然后抱怨"AI 读不懂我的文件""提取出来的表格全乱了""公式变成了一堆乱码"。问题往往不在模型本身,而在于输入格式的解析损耗。
我做过一个粗略的对比测试:同一份 20 页的产品需求文档,分别以 PDF、Word、纯文本、Markdown 四种形式喂给同一个模型,让它提取"所有功能点及其优先级"。结果 Markdown 版本的召回率最高,PDF 版本漏掉了将近三分之一的功能点,Excel 里的表格在 PDF 转换后行列关系完全错位。这不是模型不行,是格式在进入模型之前就已经把信息结构破坏了。
Markdown 之所以成为 AI 友好的中间格式,核心原因有三个:第一,它是纯文本,没有二进制编码和复杂排版指令,模型不需要"猜"内容边界;第二,它用极简的符号(#、-、|、**)表达层级、列表、表格、强调,这些符号本身就是语义信号;第三,它的 token 效率高,同样的内容用 Markdown 表示比 HTML 或富文本少很多冗余标签,等于给模型省了"阅读成本"。
1.2 哪些人最需要这套流程
如果你属于以下几类人,这套"先统一成 Markdown 再喂 AI"的思路会直接改变你的工作效率:
- 知识工作者:每天要处理大量合同、报告、会议纪要,想让 AI 帮忙摘要、问答、提取要点。
- 数据分析师:手里有几十个 Excel 报表,想让 AI 做跨表对比、异常检测、趋势总结。
- 内容创作者:收集了一堆 PDF 资料和网页截图,想让 AI 帮忙整理成文章或脚本。
- 开发者:需要把技术文档、API 说明、代码注释喂给 AI 做代码生成或文档问答。
- 学生和研究者:面对大量论文 PDF 和扫描件,想让 AI 辅助文献综述和笔记整理。
这套流程不要求你会写代码,但如果你会一点 Python 或愿意用现成工具,效率会成倍提升。下面我会从整体设计思路讲起,然后逐个拆解 PDF、Word、Excel、图片四类格式的处理要点,最后给出一套可以直接抄作业的实操方案和避坑清单。
2. 整体设计思路与方案选型
2.1 核心原则:先结构化,再语义化
很多人做格式转换时只想着"把内容弄出来就行",结果转出来的 Markdown 是一坨没有层级的纯文本,标题和正文混在一起,表格变成了一堆用空格分隔的数字。这种 Markdown 喂给 AI,效果和直接喂纯文本差不多,白白浪费了 Markdown 的结构优势。
我的做法是分两步走:第一步做结构化提取,把原始文件里的标题层级、列表、表格、图片位置、公式等元素识别出来;第二步做语义化标注,用 Markdown 语法把这些结构表达清楚,必要时补充上下文说明。比如一个 Excel 表格,不能只把单元格内容按行导出,还要在表格上方加一行说明"下表为 2024 年各季度销售额,单位为万元",这样 AI 才知道这些数字代表什么。
2.2 工具选型的三个维度
选择转换工具时,我主要看三个维度:格式覆盖度、结构保留能力、可批量处理性。下面这张表是我实测下来几类常见方案的对比:
| 方案类型 | 代表工具 | 格式覆盖 | 结构保留 | 批量能力 | 适合场景 |
|---|---|---|---|---|---|
| 在线转换服务 | 各类文档转换网站 | 广 | 中等 | 弱 | 偶尔处理单个文件 |
| 办公软件另存 | Word/WPS 导出 | 窄 | 中等 | 弱 | 已有 Office 环境 |
| 命令行工具 | Pandoc、LibreOffice | 广 | 好 | 强 | 开发者、批量处理 |
| Python 库 | pdfplumber、python-docx、openpyxl | 广 | 可定制 | 强 | 需要精细控制 |
| 专用 AI 解析 | 各类文档解析 API | 广 | 很好 | 强 | 复杂版式、扫描件 |
我的建议是:日常零散文件用在线服务或办公软件导出,批量处理用 Pandoc 加 Python 脚本,扫描件和复杂版式用专用解析工具。不要指望一个工具解决所有问题,组合使用才是常态。
2.3 为什么不用 HTML 或纯文本作为中间格式
有人会问,HTML 也能表达结构,纯文本最简单,为什么偏偏选 Markdown?这里有个 token 经济学的考量。HTML 的标签(<div>、<span>、<table>)会占用大量 token,而且很多标签对语义理解没有帮助。纯文本则丢失了所有结构信息,AI 需要从排版中"猜"层级,准确率不稳定。Markdown 在两者之间取得了平衡:结构表达足够清晰,冗余信息足够少。实测同一份文档,Markdown 版本的 token 数通常只有 HTML 版本的 30% 到 50%,而信息保留度能达到 90% 以上。
3. 四类格式的转换要点与实操细节
3.1 PDF:最难啃但最有价值的一类
PDF 的设计初衷是"固定版式呈现",而不是"结构化存储",所以它是四类格式里最难处理的。PDF 里的文字可能来自文本层,也可能来自扫描图像;表格可能用线条绘制,也可能用空格对齐;标题可能用字号区分,也可能只是加粗。转换时要把这些视觉信号翻译成 Markdown 的语义信号。
文本型 PDF 的处理:优先用pdfplumber或PyMuPDF提取文本,它们能保留基本的段落和换行信息。提取后要做后处理:把连续的空行合并,把被错误断行的句子接起来,根据字号和加粗信息推断标题层级。我通常会用字号阈值来判断:正文假设是 10.5pt,那么 16pt 以上算一级标题,13pt 到 16pt 算二级标题,加粗且字号略大的算三级标题。
扫描型 PDF 的处理:必须先做 OCR。OCR 之后同样要做版面分析,区分标题区、正文区、表格区、图片区。这一步的准确率直接决定最终 Markdown 的质量。我的经验是,OCR 结果一定要人工抽检,尤其是数字和专有名词,错一个字符可能导致后续 AI 理解完全跑偏。
表格提取的坑:PDF 表格是最容易翻车的地方。跨页表格、合并单元格、无边框表格都会让自动提取失败。我的做法是先用工具提取,然后人工检查行列对齐情况,必要时手动修正。如果表格特别复杂,宁可把它转成图片,在 Markdown 里用文字描述表格内容,也不要输出一个错位的 Markdown 表格误导 AI。
注意:PDF 里的公式、图表、脚注往往在转换中丢失。如果这些内容对 AI 理解很重要,需要在 Markdown 里用文字补充说明,比如"图 3 展示了 2020 到 2024 年的增长趋势,整体呈上升态势"。
3.2 Word:结构最规整,但暗藏样式陷阱
Word 文档本身就有样式系统(标题 1、标题 2、正文等),理论上转换应该最轻松。但实际工作中,很多人写 Word 时根本不用样式,全靠手动加粗和放大字号来"假装"标题。这种情况下,转换工具无法识别层级,输出的 Markdown 会是一堆平铺的段落。
正确做法:转换前先检查 Word 文档是否使用了标准样式。如果是,直接用 Pandoc 转换,命令如下:
pandoc input.docx -o output.md --wrap=none --extract-media=./media--wrap=none防止长段落被硬换行,--extract-media把图片单独导出到 media 目录,Markdown 里用相对路径引用。如果文档没用标准样式,我会先用 Python 的python-docx库读取每个段落的样式名和字号,自己写规则映射到 Markdown 标题层级。
Word 里的表格和批注:Pandoc 能较好地保留表格,但合并单元格会丢失。批注和修订记录默认不导出,如果这些信息对 AI 理解有帮助,需要单独提取并附加在 Markdown 末尾。我一般会在文档开头加一段"元信息",说明文档来源、作者、修订状态,让 AI 有上下文。
3.3 Excel:不是转文本,而是转"可理解的表格"
Excel 转 Markdown 最大的误区是直接把整个工作表按行列导出。一个 50 列 1000 行的表,转成 Markdown 后是一坨巨大的表格,AI 读起来非常吃力,而且很多列可能是空的或者无关的。
我的处理策略:先做数据清洗和裁剪。用openpyxl或pandas读取工作表,删掉全空的行列,合并同类项,只保留有分析价值的字段。然后根据表格大小决定输出形式:小于 20 行 10 列的表,直接转成 Markdown 表格;更大的表,转成 CSV 风格的代码块,并在上方用文字说明字段含义和数据类型。
import pandas as pd df = pd.read_excel("sales.xlsx", sheet_name="Q1") df = df.dropna(how="all", axis=1).dropna(how="all", axis=0) # 只保留关键列 df = df[["产品名称", "销售额", "同比增长"]] markdown_table = df.to_markdown(index=False) print(markdown_table)多工作表处理:一个 Excel 文件可能有多个 sheet,每个 sheet 代表不同维度。我会为每个 sheet 生成一个独立的 Markdown 二级标题,并在标题下用一句话说明该表的内容,比如"## 4. 各区域销售明细(单位:万元)"。这样 AI 在回答跨表问题时能准确定位。
公式和计算列:Excel 里的公式在转换后会变成计算值,公式本身丢失。如果公式逻辑对理解很重要,需要在 Markdown 里用文字补充,比如"毛利率 = (销售额 - 成本) / 销售额"。
3.4 图片:OCR 只是第一步,版面理解才是关键
图片类文档包括扫描件、截图、照片。很多人以为 OCR 一下就行了,但 OCR 只给出文字流,丢失了版面信息。一张发票截图,OCR 后可能把金额、日期、编号混在一起,AI 根本分不清哪个是哪个。
我的流程:先 OCR 获取文字和坐标信息,然后根据坐标做版面聚类。同一水平线上的文字归为一行,相邻行归为一段,字号明显大的归为标题。对于表格类图片,检测表格线或根据文字对齐关系重建行列结构。最后输出带结构的 Markdown。
图片质量的影响:倾斜、模糊、光照不均的图片会显著降低 OCR 准确率。实操中我会先做预处理:灰度化、二值化、去噪、纠偏。用 OpenCV 几行代码就能搞定。如果图片质量实在太差,宁可重新拍摄或扫描,不要在垃圾输入上浪费时间。
提示:图片里的手写内容 OCR 准确率普遍较低,如果手写内容关键,建议人工转录后再喂给 AI。
4. 完整实操流程与关键环节实现
4.1 环境准备与工具安装
这套流程的核心工具是 Pandoc、Python 和相关库。下面是我在 Linux 和 macOS 上常用的安装命令,Windows 用户可以用对应的包管理器或直接下载安装包。
# 安装 Pandoc(文档转换主力) # macOS brew install pandoc # Ubuntu/Debian sudo apt install pandoc # 安装 Python 依赖 pip install pdfplumber PyMuPDF python-docx openpyxl pandas pytesseract pillow opencv-pythonpytesseract是 OCR 引擎的 Python 封装,需要额外安装 OCR 引擎本体。安装完成后,可以用tesseract --version验证。
4.2 批量转换脚本的编写
零散文件手动处理没问题,但如果你有几十上百个文件,必须写脚本批量处理。下面是我常用的一个批量转换框架,核心思路是:遍历目录,根据扩展名分发到不同的处理函数,统一输出到markdown_output目录。
import os from pathlib import Path def convert_pdf(path): # 调用 PDF 处理逻辑 pass def convert_docx(path): # 调用 Word 处理逻辑 pass def convert_xlsx(path): # 调用 Excel 处理逻辑 pass def convert_image(path): # 调用图片 OCR 逻辑 pass def batch_convert(input_dir, output_dir): input_path = Path(input_dir) output_path = Path(output_dir) output_path.mkdir(parents=True, exist_ok=True) handlers = { ".pdf": convert_pdf, ".docx": convert_docx, ".xlsx": convert_xlsx, ".png": convert_image, ".jpg": convert_image, ".jpeg": convert_image, } for file in input_path.rglob("*"): if file.suffix.lower() in handlers: try: md_content = handlers[file.suffix.lower()](file) out_file = output_path / (file.stem + ".md") out_file.write_text(md_content, encoding="utf-8") print(f"转换成功: {file.name}") except Exception as e: print(f"转换失败: {file.name}, 原因: {e}") if __name__ == "__main__": batch_convert("./raw_docs", "./markdown_output")这个框架的好处是扩展性强,后续要支持新格式只需加一个处理函数和扩展名映射。每个处理函数内部可以做得非常精细,比如 PDF 处理函数里先判断是文本型还是扫描型,再走不同分支。
4.3 转换后的质量校验
转换完成不代表工作结束,必须做质量校验。我的校验清单包括:
- 标题层级是否连续:不能出现一级标题直接跳到三级标题的情况。
- 表格行列是否对齐:随机抽几个表格,检查列数和内容是否匹配。
- 图片引用是否有效:Markdown 里的图片路径能否正确打开。
- 特殊字符是否转义:比如内容里本身有
|或#,是否被正确转义。 - 空段落和乱码:是否有大量空行或无法识别的字符。
我通常会写一个简单的校验脚本,自动检查前四项,最后一项靠人工抽检。校验不通过的文件打回重新处理,不要带着问题进入 AI 环节。
4.4 喂给 AI 时的组织方式
Markdown 准备好之后,怎么喂给 AI 也有讲究。如果文档很长,不要一次性全部塞进去,而是按章节切分,每次喂一个章节,让 AI 做局部处理,最后再汇总。如果文档有多个来源,在开头加一个"文档清单",说明每个文件的主题和关系。
我常用的提示词结构是这样的:
以下是一份从 PDF 转换而来的 Markdown 文档,主题是 XX。 文档中的表格用 Markdown 表格表示,图片用文字描述代替。 请帮我提取所有功能点,按优先级排序,并标注每个功能点所在的章节。明确告诉 AI 文档的来源和格式特点,能显著提升它的理解准确率。
5. 常见问题与排查技巧实录
5.1 转换结果乱码或字符丢失
这是最常见的问题,通常有三个原因:编码不匹配、字体缺失、OCR 语言包不对。排查顺序是:先确认源文件编码(用file -i命令查看),再确认转换工具的输出编码设置为 UTF-8,最后检查 OCR 是否安装了对应语言的训练数据。中文文档一定要装中文语言包,否则识别出来全是问号。
5.2 表格转换后行列错位
PDF 和图片里的表格最容易出现这个问题。排查时先看原始表格是否有明确的边框线,有边框的用线条检测,无边框的用文字对齐关系推断。如果表格跨页,需要手动合并两页的表格内容。我的经验是,复杂表格不要强求自动转换,人工修正往往更快更准。
5.3 标题层级识别错误
Word 文档如果没用标准样式,标题识别全靠字号和加粗判断,容易出错。解决办法是转换后人工快速浏览一遍,把错误的层级改过来。如果文档很多,可以写一个规则脚本,根据字号分布自动聚类,但最终仍需抽检。
5.4 图片 OCR 准确率低
先检查图片质量,做预处理。如果还是不行,尝试更换 OCR 引擎或调整识别参数(如页面分割模式)。对于关键数字和专有名词,建议人工核对。我踩过的坑是:一张发票上的金额"8"被识别成"3",导致后续 AI 分析完全错误。从那以后,所有涉及金额、日期、编号的 OCR 结果我都会人工过一遍。
5.5 转换后的 Markdown 文件过大
如果单个 Markdown 文件超过几万字,AI 处理时会截断或丢失上下文。解决办法是按章节拆分,每个文件控制在 5000 字以内。拆分时注意保留章节标题和上下文说明,不要让每个文件变成孤立的碎片。
| 问题现象 | 可能原因 | 排查方法 | 解决技巧 |
|---|---|---|---|
| 乱码 | 编码不匹配 | 查看源文件编码 | 统一转 UTF-8 |
| 表格错位 | 无边框或跨页 | 检查原始表格结构 | 人工修正或转图片描述 |
| 标题层级乱 | 未用标准样式 | 检查 Word 样式 | 按字号规则映射 |
| OCR 错误 | 图片质量差 | 预处理后重试 | 关键内容人工核对 |
| 文件过大 | 未拆分 | 统计字数 | 按章节拆分 |
6. 我个人的实操心得与建议
这套流程我用了大半年,处理过上千份各类文档,最大的体会是:转换质量的上限取决于原始文件的质量,而不是工具。一份排版规范的 Word 文档,转换起来又快又好;一份模糊倾斜的扫描件,再好的工具也救不回来。所以,如果条件允许,从源头就做好文档规范,比事后补救划算得多。
另外,不要追求 100% 自动化。我的实际工作流是"自动转换 + 人工抽检 + 重点修正",自动化负责 80% 的重复劳动,人工负责 20% 的关键判断。这个比例下,效率和质量能达到最好的平衡。全自动方案听起来很美,但一旦出错,排查成本远高于人工抽检。
最后分享一个小技巧:在 Markdown 文件开头加一段"文档元信息",包括来源、转换日期、已知问题。比如"本文档由 XX.pdf 转换而来,第 3 页表格因跨页可能不完整,已人工补全"。这段信息不仅方便你自己后续追溯,也能让 AI 在回答时知道哪些地方需要谨慎。这个习惯让我在多次文档问答中避免了因转换瑕疵导致的错误结论。