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


以前参加したイベントで様々なファイルのフォーマットを使用するための変換ツールを紹介していただきました。それが今回紹介する`Docling`です。

# Doclingとは？

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


https://ds4sd.github.io/docling/


![](https://cdn-ak.f.st-hatena.com/images/fotolife/u/ueponx/20250119/20250119145500.png)

**【Doclingの特徴】**

- 一般的な文書フォーマット（`PDF`、`DOCX`、`PPTX`、`XLSX`、`画像`、`HTML`、`AsciiDoc`、`Markdown`）を読み取り、`HTML`、`Markdown`、`JSON（埋め込み画像や参照画像付き）`にコンバート可能
- ページレイアウト、読み取り順序、表構造を含む高度なPDF文書理解の能力もつ
- `DoclingDocument`を使用することで、統一性と表現性を実現
- `LangChain`、`LlamaIndex`、`Crew AI`、`Haystack`など、エージェントAI向け統合機能
- スキャンした`PDF`の`OCRサポート`
- シンプルで便利なコマンドラインツール





# インストール方法

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

```sh
# 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エラー**


https://blog.jp.square-enix.com/iteng-blog/posts/00043-play-with-the-pep668/



https://uepon.hatenadiary.com/entry/2024/03/07/011738


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

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

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

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

![](https://cdn-ak.f.st-hatena.com/images/fotolife/u/ueponx/20250119/20250119160442.png)

![](https://cdn-ak.f.st-hatena.com/images/fotolife/u/ueponx/20250119/20250119160448.png)

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

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

```sh
$ docling 0022006-083_11.docx
```

![](https://cdn-ak.f.st-hatena.com/images/fotolife/u/ueponx/20250119/20250119161145.png)

![](https://cdn-ak.f.st-hatena.com/images/fotolife/u/ueponx/20250119/20250119161153.png)

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

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

**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での実行例**


https://colab.research.google.com/drive/1ft9w2mBmRmzgE0kh8lTYtGxZZLwQ5slX?usp=sharing


# LangChainでMarkdownLoaderと連携する場合

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

```python
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 | 文書内の画像出力モード（JSON、Markdown、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 | - | - | ヘルプメッセージを表示 |