问答

本地文档识别页数比较多的PDF出现了资源消耗问题

Authored by

留学专家菊叔

Authored on

本地文档识别页数比较多的PDF出现了资源消耗问题,我们必须变更和简化实现RAG化drupal file attachements的方式。

黄仁勋说邮件TL;DR。我觉得在我们构建RAG的时候,pdf也是一样。

我们用其他方式来实现pdf2text,而在drupal里面这样的方式有很多。


Drupal中实现PDF转文本的替代方案

为解决服务器资源消耗问题并优化性能,可以采用以下几种策略将PDF内容转换为文本。

方案一:集成外部API服务

将PDF解析的繁重任务外包给专业的第三方云服务。这种方法可以显著降低本地服务器的CPU和内存消耗,尤其适合处理大量或复杂的PDF文件。通过API调用,将文件发送至外部服务进行处理,然后接收返回的纯文本结果。

常用服务包括:

Google Cloud Vision API: 提供强大的OCR功能,能从扫描版PDF中提取文本。这个不行的,google在国内访问受限

AWS Textract: 专门用于从文档和图片中提取文本和数据,支持PDF格式。这个可以考虑

Azure Cognitive Services for Vision: 同样提供OCR和文档分析能力。这个要大力考虑

在Drupal中,可以通过编写自定义模块或使用HTTP Client模块(如Guzzle)来与这些服务的REST API进行集成。

方案二:调用服务器端命令行工具

利用服务器上已安装的高效命令行工具来处理PDF文件。这种方式通常比纯PHP库执行速度更快,资源占用更可控。Drupal可以通过PHP的

exec()

shell_exec()

函数,或者使用Symfony的Process组件来调用这些外部程序。

 

常用工具包括:

Poppler (pdftotext): 一个广泛使用的开源工具集,其

pdftotext

命令可以快速、准确地从原生PDF中提取文本。

Tesseract OCR: 当PDF是图片或扫描件时,Tesseract是业界领先的开源OCR引擎,可以识别并提取图像中的文本。

Apache Tika: 一个功能强大的内容分析工具包,支持包括PDF在内的多种文件格式,可以通过其命令行接口或服务器模式调用。

方案三:采用异步队列处理

对于耗时较长的PDF解析任务,应避免在用户请求的同步流程中处理。可以利用Drupal内置的Queue API,将PDF文件处理任务添加到一个后台队列中。由Cron或其他计划任务触发的队列工作器(worker)在后台逐一处理这些任务。

实现优势:

避免请求超时: 将耗时操作移出主请求线程,防止页面加载时间过长或出现HTTP超时。

负载削峰: 将任务分散到不同时间执行,避免服务器因瞬时大量文件上传而过载。

提高可靠性: 队列系统通常支持任务重试机制,确保即使处理失败也能再次尝试。

此方法可以与方案一或方案二结合使用,将API调用或命令行执行放入队列任务中。

方案四:构建专用微服务

将PDF解析功能剥离出来,构建一个独立的、专门的微服务。Drupal主站仅负责文件上传和任务分发,通过API与这个微服务通信。该微服务可以使用更适合密集型计算的语言(如Python、Go或Java)和相关库(如PyMuPDF, PDFBox)来构建。 如果要构建微服务,我为什么用效率低下的php呢?我还不如用效率更高的其他编程语言和现成的服务。

架构优点:

技术栈解耦: 为特定任务选择最合适的工具和技术,不受Drupal(PHP)的技术限制。这个是可以考虑的

独立扩展: 当PDF处理需求增加时,可以独立地扩展该微服务的资源,而无需扩展整个Drupal应用。

隔离故障: 解析服务的故障不会直接导致整个网站崩溃,提高了系统的整体健壮性。