做 RAG 应用时,我受够了数据预处理的各种坑

70 阅读7分钟

做 RAG 应用时,我受够了数据预处理的各种坑

写在前面

去年开始做 RAG 项目,遇到的第一个问题不是模型选型,也不是向量数据库,而是:怎么把各种格式的文档转成 AI 能用的数据?

PDF 里的表格识别不出来,Word 文档的格式乱七八糟,扫描件 OCR 效果一言难尽。试了一圈开源工具,要么只能处理单一格式,要么需要自己写一堆胶水代码把不同的工具串起来。

更头疼的是,公司要求私有化部署,不能把文档传到第三方 API。而且我们有多张 GPU 卡,但大部分解析工具要么不支持 GPU,要么就是多卡调度一团糟,经常爆显存。

于是,我决定自己做一个工具,解决这些问题。

这就是 MinerU Tianshu(天枢)的由来。


它能做什么?

简单说,把各种格式的数据,转成 AI 能直接用的结构化格式

📄 文档处理

支持 PDF、Word、Excel、PPT、HTML 等常见格式,输出 Markdown 或 JSON。

  • MinerU Pipeline:完整的文档解析,表格、公式、图片都能识别
  • PaddleOCR-VL:支持 109+ 种语言,中英日韩都不在话下

🎙️ 音频处理(NEW)

这是最近刚加的功能。用的是 SenseVoice 引擎,效果超出预期:

  • 多语言识别:中文、英文、日语、韩语、粤语
  • 说话人识别:自动区分不同说话人
  • 情感识别:能识别出中性、开心、生气、悲伤
  • 事件检测:语音、掌声、背景音乐、笑声

最关键的是,转写结果会自动用 emoji 标注情感和事件,比如 😊、😠、🎵,可读性特别好。

🖼️ 图片处理

JPG、PNG 直接提取文字,支持多种 OCR 引擎,GPU 加速。


为什么要做这个?

市面上的文档解析工具其实不少,但在实际使用中,总会遇到各种问题:

1. 工具分散,接口不统一

做 RAG 应用需要处理各种格式的数据,但市面上没有一个工具能覆盖所有场景: 这意味着要维护好几套代码,每个工具的调用方式、参数格式、输出结构都不一样。想统一处理?得自己写一层封装。 更麻烦的是,这些工具的依赖经常冲突。某个 OCR 库要 PyTorch 1.13,某个 PDF 工具要 2.0,为了兼容性得建好几个虚拟环境。每次部署到新机器,光装环境就要折腾半天。

2. 多 GPU 并发是个大坑

公司有多张 GPU 卡,想着可以并行处理文档提高效率。但实际跑起来发现:

  • 多个进程同时调用模型,显存很容易爆
  • 手动分配 GPU?得自己写调度逻辑,处理各种边界情况
  • CUDA_VISIBLE_DEVICES 限制?任务一多,配置就乱了

试过用多进程 + 固定 GPU 编号,结果某个任务卡住了,对应的 GPU 就一直被占着,其他任务排队等着。

也试过用 Ray 做分布式调度,但为了处理文档专门搭一套 Ray 集群,感觉有点重。而且 Ray 对 GPU 的管理还是得自己写不少代码。

最理想的状态是:我只管提交任务,系统自动把任务分配到空闲的 GPU 上,出错了自动重试。 但大部分开源工具都没有这个能力。

3. 没有生产级的任务管理

开源工具基本都是"一次性脚本"的思路,没考虑生产环境的需求:

  • 批量处理:没有队列机制,只能一个一个文件处理,或者自己写多进程
  • 错误重试:某个文档解析失败了,得手动找出来重新跑
  • 优先级:老板要的紧急任务,只能等前面的任务跑完
  • 进度追踪:不知道任务跑到哪了,是卡住了还是在正常处理

有一次处理了几千个文档,跑了一晚上,早上来看发现中间出错了,前面的结果也没保存。又得重新跑一遍。

4. 对 RAG 应用不友好

做 RAG 最看重的是数据质量和格式统一,但很多工具在这方面做得不够:

  • 输出格式乱:有的输出纯文本,有的输出 HTML,有的是自定义格式。接到 RAG 系统之前,得先写一堆清洗脚本
  • 结构信息丢失:标题、列表、表格这些结构信息没了,后续很难做语义分块
  • 元数据缺失:不知道这段文字来自第几页,是表格还是正文,对 RAG 检索的准确率有影响
  • 私有化部署难:很多商业 API 效果不错,但企业的敏感文档不能传到外部服务器

最后就是维护成本的问题。工具一多,环境依赖就复杂,Python 版本冲突、CUDA 版本不兼容、依赖库冲突……每次换台机器部署,都要折腾半天。

5. 商业方案太贵,开源方案太散

商业方案(比如各种 OCR API)确实省心,但有几个问题:

  • 成本高:按量付费,处理量大了账单吓人
  • 数据安全:金融、医疗、法律这些行业的文档,不能传到外部
  • 功能受限:只能用它提供的功能,不能定制

开源方案虽然免费,但太分散:

  • 不同格式要用不同工具
  • 每个工具要单独部署、单独维护
  • 工具之间没有统一的接口和输出格式
  • 出了问题不知道是哪个环节的锅

我就在想,能不能有一个工具,把这些痛点都解决掉?

不需要大而全,但至少要覆盖 RAG 应用最常见的数据类型。不需要完美无缺,但至少要在生产环境中用得舒服。

于是就有了天枢。


所以,我是怎么做的?

🎯 多引擎集成

不重复造轮子。市面上已经有很多优秀的开源引擎了,比如 MinerU、DeepSeek OCR、PaddleOCR、SenseVoice。我要做的是把它们整合在一起,让用户可以根据场景选择最合适的引擎。

⚡ GPU 负载均衡

用 LitServe 做 GPU 调度,支持多卡并发,避免显存冲突。任务自动分配到空闲的 GPU 上,利用率能到 90%+。

📦 完整的任务管理

  • 任务队列:支持批量提交,自动排队
  • 优先级管理:紧急任务可以插队
  • 自动重试:失败了会自动重试,不用手动干预
  • 实时监控:Web 界面可以看到所有任务的状态

🔗 MCP 协议支持

这个是后来加的,但我觉得特别有用。

MCP 是 Anthropic 提出的开放协议,AI 助手可以通过它调用外部工具。集成之后,Claude Desktop 可以直接调用天枢来处理文档,不用再手动上传下载。


一些使用场景

  • 法律文书处理:批量 OCR 扫描版判决书,私有化部署保证数据安全
  • 多语言文档:统一处理中英日韩等多语言技术文档,输出标准 Markdown
  • 会议记录:录音转文字 + 说话人识别 + 情感标注,自动生成会议纪要
  • 知识库构建:批量处理企业内部文档,为 RAG 检索系统准备数据

为什么叫"天枢"?

天枢是北斗七星的第一颗星,在古代被用来指引方向。

做 RAG 应用时,数据预处理就像这颗"天枢",它决定了整个系统的数据质量。数据准备好了,后面的检索、生成才能顺利进行。

另外,项目的核心能力是 引擎调度,就像天枢在天空中"调度"其他星星一样。


开源协议和贡献

项目采用 Apache 2.0 协议,欢迎任何形式的贡献:

  • 🐛 报告 Bug
  • 💡 提出新功能建议
  • 📝 改进文档
  • 🔧 提交代码

GitHub: github.com/magicyuan87…


写在最后

做这个项目的初衷很简单:解决自己的问题

我不是想做一个大而全的平台,也不是要跟商业产品竞争。我只是希望,当其他开发者遇到和我一样的问题时,能有一个开箱即用的工具,不用再踩我踩过的坑。

如果你也在做 RAG 应用,也被数据预处理折磨过,欢迎试试天枢。

如果你觉得这个项目有用,点个 Star 就是对我最大的支持

如果你有任何建议或问题,欢迎在 GitHub 上提 Issue,我会尽快回复。


MinerU Tianshu(天枢)

RAG 数据预处理工作站

GitHub | 📖 文档