为什么我为旧版 Office 文件构建了纯 Python 库(以及为什么 RAG 流水线需要它)

发布: (2025年12月26日 GMT+8 05:30)
5 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的文章正文内容,我将把它翻译成简体中文并保留原有的格式、Markdown 语法以及技术术语。谢谢!

遗留文件问题

Enterprise SharePoints are digital archaeology sites.
营销部门在 2008 年上传了 PowerPoint 文件。
Legal has Word documents from 2005.
Finance runs on Excel files that predate most of your team’s careers.

These aren’t edge cases.
在我的经验中,遗留的 .doc.xls.ppt 文件占任何长期运行的企业文档库的相当大比例。
And if you’re building a system that needs to ingest all the documents, you can’t just skip them.

为什么现有解决方案对我不起作用

我需要在 AWS Lambda 函数中处理这些文件,以用于 RAG 流水线。我的选项有:

LibreOffice

标准答案。安装 LibreOffice,使用无头模式运行,将文件转换为文本。它可以工作,但会让你的容器镜像体积增加超过 1 GB。Lambda 对部署包的大小限制为 250 MB(容器镜像上限为 10 GB,但仍然受限)。此外,配置无头 LibreOffice 本身就是一场冒险。

Apache Tika

可靠的工具,使用广泛。但它需要 Java 运行时,通常作为独立的服务器运行。这意味着需要再部署、监控和保护一个服务。对于流水线中的文档提取步骤来说,这显得有些大材小用。

使用子进程调用命令行工具

有各种工具可以通过 shell 调用。但子进程调用存在安全隐患,在受限环境中会出问题,而且会让你的代码依赖于特定平台。

我想要更简单的方案:一个可以 pip install 并直接调用的 Python 库。

构建 sharepoint-to-text

于是我创建了 sharepoint-to-text

核心思路:在 Python 中直接解析传统的 Office 二进制格式(OLE2)和现代基于 XML 的格式(OOXML)。无需外部依赖,也不调用子进程。只做文本提取。

import sharepoint2text

# 对传统文件和现代文件的使用方式相同
result = sharepoint2text.read_file("ancient_report.doc")
result = sharepoint2text.read_file("modern_report.docx")

它支持:

  • 传统格式:.doc.xls.ppt
  • 现代格式:.docx.xlsx.pptx
  • 以及 .pdf 和纯文本

统一的接口,无需在代码中编写条件判断或格式检测的样板代码。

为什么这对 RAG 和 LLM 代理很重要

如果你正在为 RAG 构建文档摄取流程,通常会面对多种异构输入。用户会上传文件,流水线会爬取文档存储,你无法控制出现的文件格式。

典型的做法是使用一连串 if 语句并调用多个库:

# 丑陋的实现方式
if path.endswith('.docx'):
    text = extract_with_python_docx(path)
elif path.endswith('.doc'):
    text = extract_with_libreoffice(path)  # 希望系统已安装
elif path.endswith('.xlsx'):
    text = extract_with_openpyxl(path)
# ... 依此类推

使用 sharepoint-to-text,只需要:

import sharepoint2text

result = sharepoint2text.read_file(path)

该库会自动识别文件格式并进行相应处理。

部署优势

因为它是纯 Python 且没有系统依赖:

  • 容器镜像保持小巧 — 没有 LibreOffice 的臃肿
  • 无服务器友好 — 可在 Lambda、Cloud Functions、Azure Functions 中运行
  • 没有安全顾虑 — 没有子进程调用,也没有 shell 执行
  • 跨平台 — Windows、macOS、Linux,等等

何时可能需要此功能

  • 您正在针对企业文档存储构建 RAG 流水线
  • 您的 LLM 代理需要处理用户上传的未知年代的文件
  • 您正部署到具有大小限制的无服务器环境
  • 您的安全团队不允许子进程执行
  • 您厌倦了在容器中维护 LibreOffice

Try It Out

pip install sharepoint-to-text

GitHub:

我非常期待收到反馈,尤其是当你在处理特定文件类型时遇到边缘情况。旧版 Office 格式一向不够统一,真实世界中的文件是最好的测试集。

Back to Blog

相关文章

阅读更多 »