用规则引擎解决PDF非结构化数据提取的难题,直接适用于RAG系统建设,可即插即用。
本项目为 llmsherpa API 连接提供服务代码。该项目包含针对以下文件格式的自定义 RAG(检索增强生成)友好解析器:
PDF 解析器是一个基于规则的解析器,它使用来自 nlmatics 修改版本的 tika(位置:https://github.com/nlmatics/nlm-tika)的文本坐标(边界框)、图形和字体数据。PDF 解析器基于文本层工作,同时提供 OCR 选项(apply_ocr),可在您的 PDF 包含扫描页面时自动使用 OCR。OCR 功能基于 nlmatics 修改的 tika 版本,该版本在底层使用 tesseract。可以查看笔记本 pdf_visual_ingestor_step_by_step 来直接实验 PDF 解析器。
PDF 解析器提供以下功能:
这些文件类型的 html 输出来自 tika,由 html 解析器进行解析。
从 https://www.oracle.com/java/technologies/downloads/ 安装最新版本的 Java
java -jar <path_to_nlm_ingestor>/jars/tika-server-standard-nlm-modified-2.9.2_v2.jar
!pip install nlm-ingestor
python -m nlm_ingestor.ingestion_daemon
可通过公开的 GitHub 容器注册表获得 Docker 镜像。
拉取 Docker 镜像:
docker pull ghcr.io/nlmatics/nlm-ingestor:latest
运行 Docker 镜像,将端口 5001 映射到您选择的端口:
docker run -p 5010:5001 ghcr.io/nlmatics/nlm-ingestor:latest-<version>
一旦服务器运行,您可以使用 llmsherpa API 库来获取文本块并将其用于您的 LLM 项目。您的 llmsherpa_url 将是:"http://localhost:5010/api/parseDocument?renderFormat=all"
应用 OCR,添加 &applyOcr=yes
使用新的缩进解析器(它使用不同的算法来分配标题级别),添加 &useNewIndentParser=yes
该服务器适合开发使用 - 生产环境中建议在使用 nginx 或云网关的安全网关后面运行此服务
用 llmsherpa 解析器测试服务器的示例测试代码在此笔记本中。
在过去 4 年中,nlmatics 团队评估了多种选项,包括由 Tom Liu 和 Yi Zhang 开发的基于 YOLO 的视觉解析器。最终,我们选择了基于规则的解析器,原因如下:
相比任何视觉解析器,它的速度快得多(快 100 倍)。最起码您必须从 PDF 的所有页面创建图像(即使对于具有文本层的页面也要这样做)来使用视觉解析器。我们认为,视觉解析器对于没有文本层的 OCR 扫描 PDF 或包含表单类数据的小 PDF 文件是更好的选择,但对于跨越数百页的大型文本层 PDF,基于规则的解析器(如我们的解析器)更实用。
如果您不使用 PDF OCR 功能,运行此解析器不需要特殊硬件。您甚至可以用 2000 年初期的硬件运行它!
我们发现视觉解析器(或实际上任何解析器,包括这个)容易出错,修复模型中错误的解决方案并不理想:向训练集添加更多示例可能会降低模型以前学习的准确性,并导致之前工作的代码出现不确定性。使用基于规则的思想来修复基于模型的解析器问题会让我们回到编写大量规则的状态。
PDF 解析器的 visual_ingestor 和 new_indent_parser 由 Ambika Sukla 编写,Reshav Abraham 提供了额外贡献(他编写了修改 tika 的初始代码),Tom Liu 编写了原始的缩进解析器,Kiran Panicker 对解析速度、表格解析准确性、缩进解析准确性和重新排序准确性进行了多项改进。
HTML 摄取器由 Tom Liu 编写。
Markdown 解析器由 Yi Zhang 编写。
文本摄取器由 Reshav Abraham 编写。
XML 摄取器由 Ambika Sukla 编写,主要用于处理 PubMed XML。
line_parser(作为所有其他解析器的核心句子处理实用工具)由 Ambika Sukla 编写。
我们还要感谢 Apache PDFBox 和 Tika 开发者社区多年来为 PDF 解析器提供基础的工作。
Nlm 修改版本的 Tika 可在此处的 2.4.1-nlm 分支中找到:https://github.com/nlmatics/nlm-tika/tree/2.4.1-nlm。为了方便起见,该代码的编译 jar 文件包含在此仓库的 jars/ 文件夹中。在某些情况下,您的 PDF 可能导致 Java 服务器出现错误,您将需要修改该处的代码以解决问题并重新编译 jar 文件。
修改的文件如下:
以上是为每个文本元素添加字体和坐标。它还会移除水印。
以上是添加可能有助于表格检测的线条和矩形。
要查看这些更改的影响,请参阅此笔记本的第一部分:https://github.com/nlmatics/nlm-ingestor/blob/main/notebooks/pdf_visual_ingestor_step_by_step.ipynb
运行测试:
make test make test-pdf-ingestor
构建镜像。这会推送到 Pacific 生产 ECR 仓库:
make build_and_push
镜像构建后,您需要进入 pacific-server 仓库并部署 modal 应用。确保您在本地环境中设置了 Pacific 生产 AWS 变量。
如果需要更新 nlm-utils,请进入 nlm-utils 仓库,更新依赖项,构建 whl,并将其复制到此仓库的 whl/ 文件夹下。