【メモ】RAGシステム構築の強い味方 - Doclingによるドキュメント変換入門

IBM watsonx.ai DojoRAGとして様々なファイルのフォーマットを使用するための変換ツールを紹介していただきました。 それが今回紹介するDoclingです😊

Doclingとは?

Doclingは、簡単にいうならば様々なドキュメントに対応したHTMLMarkdownJSONへのコンバートツールになります。

**URLが変わったようです(2025.05.15修正)

github.com

【Doclingの特徴】

  • 一般的な文書フォーマット(PDFDOCXPPTXXLSX画像HTMLAsciiDocMarkdown)を読み取り、HTMLMarkdownJSON(埋め込み画像や参照画像付き)にコンバート可能
  • ページレイアウト、読み取り順序、表構造を含む高度なPDF文書理解の能力もつ
  • DoclingDocumentを使用することで、統一性と表現性を実現
  • LangChainLlamaIndexCrew AIHaystackなど、エージェントAI向け統合機能
  • スキャンしたPDFOCRサポート
  • シンプルで便利なコマンドラインツール

インストール方法

インストールは以下のように行います。pipコマンドもインストールしてくれますが、Ubuntu24.04などではPEP668エラーが発生する可能性があります。また、このインストールはかなりのファイルサイズのものをダウンロードしますので、ご注意ください。

# pipでのインストール(GPU関連のライブラリもインストールされます)
$ pip install docling
# pipでのインストール(CPUバージョンのみ)
$ pip install docling --extra-index-url https://download.pytorch.org/whl/cpu
# PEP668エラーが発生した場合
$ pip install --break-system-packages --user docling --extra-index-url https://download.pytorch.org/whl/cpu

【参考】PEP668エラー

blog.jp.square-enix.com

uepon.hatenadiary.com

コマンドラインからの実行

以下のように実行することでネット上のpdfファイルmarkdownファイルにトランスポートすることができます。pdf内の画像に関してはbase64エンコードして埋め込まれるようです。

Web上にあるpdfをURL指定してトランスポート

$ docling https://arxiv.org/pdf/2206.01062

pdf論文データを使用していますが、それなりに認識されているようです。

ローカルにあるDOCXファイルのトランスポート

$ docling 0022006-083_11.docx

DOCXについては行政のデータを使用していますが、こちらも問題なさそうですね。

Pythonのコード内から変換を行う

Pythonのコード内から同様にトランスポートを行ってみます。

from docling.document_converter import DocumentConverter
source = "https://arxiv.org/pdf/2408.09869" # PDF path or URL
converter = DocumentConverter()
result = converter.convert(source)
print(result.document.export_to_markdown()) # output: "### Docling Technical Report[...]"

Google Colabでの実行例

colab.research.google.com

LangChainでMarkdownLoaderと連携する場合

先ほどは文字列の出力の例でしたが、変数に格納し、LangChainのドキュメントローダーに入力することでRAG用のデータとして使用することが容易になります。

from docling.document_converter import DocumentConverter
from langchain.document_loaders import UnstructuredMarkdownLoader #要インストール $ pip install unstructured
source = "https://arxiv.org/pdf/2408.09869" # PDF path or URL
converter = DocumentConverter()
result = converter.convert(source)
# Markdownの文字列データを格納
markdown_text = result.document.export_to_markdown() # output: "### Docling Technical Report[...]"
# UnstructuredMarkdownLoaderを使用
loader = UnstructuredMarkdownLoader.from_string(markdown_text)
documents = loader.load()

おわりに

Doclingは様々なドキュメントフォーマットを統一的に扱うための強力なコンバートツールです。単なる変換という意味にも取られそうですが、RAGの情報元として様々なフォーマットを持つ場合、その情報元をLLMで扱いやすい形式に変換できる点は、より実践的な開発において大きな価値になりそうです💪

他にも様々なツールがあるので、それらに関しても調べてみようと思います👀

【参考】DoclineのCLIオプション引数まとめ

引数

引数 説明
source 変換するローカルのファイル/ディレクトリパスまたはURLを指定可能(必須)

オプション

オプション デフォルト値 説明
--from docx, pptx, html, xml_pubmed, image, pdf, asciidoc, md, xlsx, xml_uspto なし 入力フォーマットの指定。指定しない場合は全フォーマット対応
--to md, json, html, text, doctags なし 出力フォーマットの指定。デフォルトはMarkdown
--headers TEXT なし URL入力ソースを取得する際のHTTPリクエストヘッダーをJSON形式で指定
--image-export-mode placeholder, embedded, referenced embedded 文書内の画像出力モード(JSONMarkdown、HTMLの場合のみ)。placeholderは画像位置のみマーク、embeddedはbase64エンコード文字列として埋め込み、referencedはPNG形式で出力して参照
--ocr / --no-ocr - ocr ビットマップコンテンツにOCRを適用するかどうか
--force-ocr / --no-force-ocr - no-force-ocr 既存のテキストをOCR生成テキストで置き換えるかどうか
--ocr-engine easyocr, tesseract_cli, tesseract, ocrmac, rapidocr easyocr 使用するOCRエンジン
--ocr-lang TEXT なし OCRエンジンで使用する言語をカンマ区切りで指定。エンジンによって指定可能な言語名が異なる
--pdf-backend pypdfium2, dlparse_v1, dlparse_v2 dlparse_v2 使用するPDFバックエンド
--table-mode fast, accurate fast テーブル構造モデルのモード
--artifacts-path PATH なし モデルアーティファクトの保存場所
--abort-on-error / --no-abort-on-error - no-abort-on-error エラー発生時に処理を中断するかどうか
--output PATH . 結果を保存する出力ディレクト
--verbose, -v INTEGER 0 詳細度レベル。-vは情報ログ、-vvはデバッグログ
--debug-visualize-cells - no-debug-visualize-cells PDFセルの視覚化デバッグ出力を有効化
--debug-visualize-ocr - no-debug-visualize-ocr OCRセルの視覚化デバッグ出力を有効化
--debug-visualize-layout - no-debug-visualize-layout レイアウトクラスタの視覚化デバッグ出力を有効化
--debug-visualize-tables - no-debug-visualize-tables テーブルセルの視覚化デバッグ出力を有効化
--version - - バージョン情報を表示
--document-timeout FLOAT なし 各ドキュメントの処理タイムアウト(秒)
--num-threads INTEGER 4 スレッド数
--device auto, cpu, cuda, mps auto アクセラレータデバイス
--help - - ヘルプメッセージを表示