Show HN: RAG向けのオープンソース・ルールベースPDFパーサー
(github.com/nlmatics)- nlm-ingestor は llmsherpa API が接続して利用するサービスコードで、RAG 向けに PDF・HTML・Text・DOCX・PPTX などの文書パーサーを提供する
- PDF パーサーは nlmatics の改変版 Tika から得たテキスト座標、グラフィック、フォントデータを使用し、スキャンページがある場合は
apply_ocrオプションで OCR を自動適用できる - PDF 処理機能には、セクション・サブセクションレベル、段落結合、セクション-段落リンク、表、ネストされたリスト、ページ間コンテンツ結合、繰り返しヘッダー・フッター除去、ウォーターマーク除去、OCR バウンディングボックスが含まれる
- モデルベースのビジョンパーサーと比べて、ルールベースパーサーは PDF ページ画像を生成する必要がないため 100倍高速 だと説明しており、OCR ではないテキストレイヤー PDF や数百ページの文書でより実用的だとしている
- 開発用サーバーは Docker または直接実行で起動でき、本番環境では nginx やクラウドゲートウェイのような セキュリティゲートウェイ の背後で実行する構成が推奨される
nlm-ingestor が提供する文書パーサー
- nlm-ingestor は llmsherpa API が接続できるサービスコードのリポジトリ
- RAG(retrieval augmented generation)向けにカスタムパーサーを複数のファイル形式へ提供する
-
PDF
-
HTML
-
Text
- DOCX、PPTX、Apache Tika がサポートするその他の形式
-
PDF パーサーの動作方式と機能
- PDF パーサーはルールベースで、nlmatics の改変版 nlm-tika から取得した テキスト座標、グラフィック、フォントデータを使用する
- PDF テキストレイヤーを基盤として動作し、
apply_ocrオプションにより PDF にスキャンページがある場合は OCR を自動適用できる - OCR 機能は内部的に tesseract を使う nlmatics の改変版 Tika に基づいている
- PDF パーサーを直接試せるノートブックとして pdf_visual_ingestor_step_by_step が提供されている
- PDF パーサーの機能は次のとおり
- セクションとサブセクション、および各 レベル の識別
- 複数行を結合して 段落 を構成
- セクションと段落の間のリンクを生成
- 表と、表が見つかったセクションの識別
- リストとネストされたリストの処理
- ページをまたぐコンテンツの結合
- 繰り返し現れるヘッダーとフッターの除去
- ウォーターマークの除去
- OCR 結果に対するバウンディングボックスの提供
HTML・Text・Office 文書処理
- HTML パーサーは RAG 性能を高めるため、より高品質なチャンクを作れるよう レイアウト認識ブロック を生成する
- Text パーサーは視覚情報、フォント情報、バウンディングボックスなしでテキストだけを見て、リスト、表、ヘッダーなどを推定する
- DOCX、PPTX および Apache Tika がサポートするその他の形式は、Tika の HTML 出力 を使ったあとに HTML パーサーで処理する
実行と API 利用
- 直接実行の手順は、Java のインストール、Tika サーバーの起動、
nlm-ingestorのインストール、ingestor の実行で構成される- Tika サーバー起動:
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
- Tika サーバー起動:
- 公開 GitHub Container Registry に Docker イメージが提供されている
- イメージ取得:
docker pull ghcr.io/nlmatics/nlm-ingestor:latest - 実行例:
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 - ヘッダーレベル割り当てに別のアルゴリズムを使う新しい indent パーサーの利用:
&useNewIndentParser=yes
- OCR 適用:
- 開発用サーバーとしては使えるが、本番環境では nginx やクラウドゲートウェイのような セキュリティゲートウェイ の背後で実行する構成が推奨される
- llmsherpa パーサーでサーバーをテストするサンプルコードは test_llmsherpa_api ノートブックにある
ルールベースパーサーを選んだ理由
- nlmatics チームは 4 年間にわたり、Tom Liu と Yi Zhang が開発した YOLO ベースのビジョンパーサーを含む複数の選択肢を評価したうえで、ルールベースパーサー を選択した
- ルールベースパーサーはどのビジョンパーサーよりもかなり高速で、リポジトリ説明ではこれを 100倍高速 と表現している
- ビジョンパーサーは、テキストレイヤーがある PDF でもすべてのページ画像を生成しなければならない
- ビジョンパーサーは、テキストレイヤーのない OCR PDF やフォームデータで構成された小さな PDF ではより良い選択肢になる可能性がある
- 数百ページに及ぶ大きなテキストレイヤー PDF では、ルールベースパーサーのほうがより実用的だと見ている
- PDF OCR 機能を使わないなら、特別なハードウェアは不要
- リポジトリ説明では 2000 年代初頭のハードウェアでも実行できるとしている
- ビジョンパーサーを含むすべてのパーサーでエラーは起こり得るが、モデルベースパーサーのエラー修正方法には満足できなかったと説明している
- 学習セットに例を追加すると、以前の学習精度が落ち、既存で動いていたコードが不確実になる可能性がある
- モデルベースパーサーの問題をルールベースのアイデアで修正すると、結局また多数のルールを書くことになる
nlmatics の改変版 Tika
- nlmatics の改変版 Tika は 2.4.1-nlm ブランチ にある
- 便宜のため、コンパイル済み jar ファイルがリポジトリの
jars/フォルダに含まれている - 一部の PDF では Java サーバーでエラーが発生することがあり、その場合は該当コードを修正して jar ファイルを再コンパイルする必要がある
- 変更されたファイルは、各 PDF テキスト要素に フォントと座標 を追加し、ウォーターマークを除去する
PDF2XHTML.javaAbstractPDF2XHTML.java
GraphicsStreamProcessor.javaの変更は、表検出に役立つ 線と矩形 を追加するためのもの- 変更の影響は pdf_visual_ingestor_step_by_step ノートブック前半で確認できる
- 今後の作業アイデアは次のとおり
- pdfbox 上に独自ラッパーを書き、Tika 変更への依存をなくす
- 最新の Tika バージョンへアップグレードする
- 返される HTML 形式をより CSS フレンドリーに整理する
1件のコメント
Hacker News のコメント
科学論文を扱うなら GROBID も追加する価値があります: https://github.com/kermitt2/grobid
paperetl(https://github.com/neuml/paperetl) と一緒に使っています
良いプロジェクトです。ドキュメント解析には、成熟度が高く対応形式も幅広いので、長年 Tika を使ってきました。XHTML 出力は RAG 向けのドキュメント分割に役立ちます
例としては https://neuml.hashnode.dev/build-rag-pipelines-with-txtai と https://neuml.hashnode.dev/extract-text-from-documents があります
ちなみに txtai(https://github.com/neuml/txtai) の主な作者です
pdfminer.six(unstructured が使っているもの)はレイアウト検出がかなり基本的で、複数段組みテキストの解析に失敗したので期待外れでした。一方 MuPDF は完璧に処理しました
今は MuPDF + AWS Textract(主に表)を組み合わせて使っていますが、他の人が何を使っているのか知りたいです
かなり役に立ちそうです。私が働いている会社には、PDF を読み込んで意味的な差分を比較する PDF 比較ツール「PDFC」があります: https://www.inetsoftware.de/products/pdf-content-comparer
PDF 形式は非常に複雑なので、解析はかなり厄介になり得ます。私たちはすでにこうした機能の大半をサポートしていますが、エッジケースは常に多いので、追加のアプローチは役立つ可能性があります
Tesseract OCR フォールバックは良さそうです
今では RAG 向けのファイルローダーは langchain、LLMindex、unstructured など数多くありますが、これを選ぶ理由があるのか気になります。例えばベンチマークスコアで上回っている、といった根拠があるのでしょうか
ただ、PDF 解析用途でそうした RAG ツールを使ったことがありますが、出力品質はかなり低かったです。LLM が問題をある程度回避してくれるので RAG としてはそれなりに動きますが、適切な参照付きのより高品質な回答が欲しいなら、ルールベースのパーサーを自分で使うのが最善だと思います。結局私もそうしました。ただし Tika ではなく MuPDF ベースでした
このツールの作者たちも似た考えだったのかもしれません
RAG のプロトタイプを回すには十分でしたが、信頼できるものを作るには不十分でした。このプロジェクトは、はるかに実運用で検証された実装のように見えます
素晴らしい仕事で、とても興味深いです。ただ GitHub に行くと “This organization has no public members” と表示され、あなたたちが誰なのかまったく分からず、非公開のままこの中に他に何が含まれ得るのかも分かりません
全体として、「名前のない隠れたグループが $CORP のセキュリティサイトに置いたもの」と、従来の紹介・信頼構築の方法との間に、時間をかけて識別と信頼を築ける中間地点が必要だと思います
LLM/RAG プロジェクトで最適なチャンクを得るには、このサーバーを llmsherpa LayoutPDFReader と組み合わせて使えばよいです: https://github.com/nlmatics/llmsherpa
リポジトリの例とノートブックを見るとよいです
サンプルの入力・出力ペアがどこかにあるのか気になります
ノートブック付きの例はこちらにあります: https://github.com/nlmatics/llmsherpa
リポジトリ内の別のサンプルノートブックはこちらです: https://github.com/nlmatics/nlm-ingestor/blob/main/notebooks...
これで数百個の PDF を解析してみましたが、結果はかなり良かったです。Julia で開発されていれば、少なくとも10倍は速かったと思います
これが Azure Document Intelligence とどう違うのか、あるいは実質的に同じものなのか気になります
このサーバーと llmsherpa ライブラリ(https://github.com/nlmatics/llmsherpa)を一緒に使うと、LLM/RAG プロジェクトに適したレイアウトに配慮したチャンクを得られます
このライブラリや fitz/pymupdf のようなツールは、PDF からテキストを直接抽出し、解析と構造化ルールを適用できるようにします。最近の PDF の大半は OCR なしでテキスト抽出が可能です
当然ずっと安価ですが、動的なレイアウト全般にはうまくスケールしないので、通常は標準構造に合わせて設定できる場合に使うことになります。それでも科学論文のようなものでは、ルールベースのテキスト抽出がかなり動的にうまく機能するのを見てきました
ただ Tesseract OCR が潜在的な限界になるのではないかと心配です。あまりにも多くのミスをするのを見てきました
例があるのか気になります。リポジトリには PDF ファイルが1つもないように見えます
この nlm-ingestor プロジェクトは、llmsherpa と連携するバックエンドを提供します。llmsherpa ライブラリは、LLM/RAG プロジェクト向けに良いチャンクを抽出するのに非常に便利です