RAGのためのDocling
文書から検索対応チャンクへ。チャンカー選択、正トークナイザ計量、表・引用保持、フレームワーク適合、ベクターストアの選定を収録。公式チャンキング概念とシリアライズ解説で検証済み。
1. どのRAG経路が適合か
| 状況 | 経路 | 理由 |
|---|---|---|
| LangChain利用済み | langchain-docling DoclingLoader | 公式ローダー。DOC_CHUNKS形式は ネイティブ チャンク、MARKDOWN形式 + 見出し スプリッター が代替。 |
| LlamaIndex利用済み | DoclingReader + Docling Node Parser | Readerは無損失JSONか損失Markdown読込。ParserがNodes化。 |
| Haystack利用済み | docling-haystack変換器 | Haystack変換コンポーネントとしてのDocling。 |
| フレームワークなし・自前ストア | HybridChunker直接 | 完全管理: チャンキング・文脈化・埋め込み・任意のストア (Qdrant・Milvus・Chroma・Pinecone…)。 |
| チャンクファイルが即要 | CLI --to chunks | Pythonなし。 hybrid か階層チャンクを端末から。 |
| 大量取り込み | Data Prep Kit + Docling | 大集団用チャンク + トークン化管路。 |
2. RAG中のDocling位置
RAG管路は6段階。Doclingは初の三段階を所有。埋め込み存在以前の回答品質を定める。チャンキングの2つの考え方: Markdown出力後の再チャンク (例LangChain MarkdownHeaderTextSplitter) か、DoclingDocument上の ネイティブ チャンクか。 ネイティブ は表・見出し・由来情報を保持し、Markdown再チャンクが黙って失う。理由なき限り ネイティブ 推奨。
- 解析 — 配置・読順・表・式・画像 → 構造化DoclingDocument。
- シリアライズ・チャンク — 見出し・ caption・由来情報付き構造チャンク (またはMarkdown/HTML/JSON出力後の再チャンク)。
- 文脈付与 —
contextualize()が見出し文脈を前置し各断片を自立化。 - 埋め込み→ストア→検索→生成 — 自前の埋め込みモデル・ベクターストア・フレームワーク。Docling中立。
3. 変換: DoclingDocument保持
計画管路ではPython変換しドキュメントオブジェクトを保持。チャンカーはドキュメントオブジェクトに作用し文書に非ず:
docling convert report.pdf --to mdfrom docling.document_converter import DocumentConverter
converter = DocumentConverter()
result = converter.convert("report.pdf")
document = result.document
4. 出力選択: Markdown・JSON・HTML・DocTags
出力はシリアライザーの略称 (MarkdownDocSerializer等)。RAG上は表選択が要点。結合見出しセルが回答を定める場合、MarkdownよりHTMLかJSON推奨。またはMarkdown維持しチャンク時に表見出し反復 (7節)。シリアライザーはカスタマイズ可: BaseTableSerializer等を下位分類し完全管理 (高度なチャンキング・シリアライズ例参照)。
| 出力 | 表 span | RAG用途 |
|---|---|---|
| export_to_markdown() | 平坦化。 span 書式なし。結合セルは空白描画 | 既定文路。結合見出し無関係なら可。 |
| export_to_html() | 保持。 ネイティブ rowspan/colspan | 結合セルが重要な場合の最良文出力。 |
| export_to_dict() / JSON | 無損失保持。完全TableData span 含む | 無損失路 (LlamaIndexリーダーJSON形式)。最重量。 |
| DocTags / Docling Language | 保持。OTSL継続タグ | Docling ネイティブ ツール用緻密構造保持形式。 |
5. チャンカー比較
全 ネイティブ チャンカーはBaseChunker実装 (chunk() → 断片流、contextualize() → 拡張テキスト)。LlamaIndex式統合は内蔵・自作・第三者を同じインターフェースで受け入れ。
| チャンカー | 方策 | 選択時 |
|---|---|---|
| HybridChunker (既定) | 階層構造 + トークン量の考慮の過大な場合のチャンク + 過小な場合の結合 | RAG既定。均衡・見出し意識・表意識。 |
| HierarchicalChunker | 要素毎一断片。列挙項目併合 (merge_list_itemsで解除可) | 微細要素単位・完全メタデータ。 |
| LineBasedTokenChunker | 行境界保持。単独超過行のみ切断 | 表・コード・ログ・列挙等行構造物。 |
| TrivialChunker | 最小限の基準チャンク | デバッグとベンチマーク。商用検索非用。 |
| Markdown後にチャンク | Markdown出力後にチャンク (例MarkdownHeaderTextSplitter) | 後段コンポーネントがMarkdown入力を要する場合のみ。 |
6. HybridChunker詳解 (既定)
動作: 階層断片開始。トークン量の考慮で過大のみ切断する一走査と、同見出し・ caption の過小連続 peer のみ併合する一走査。要参数:
埋め込むのは文脈化文でありchunk.textに非ず:
運用二記: チャンク時の transformers「Token indices sequence length …」警告は文書化済み誤警報 (公式FAQ参照)。サービスではTOKENIZERS_PARALLELISM=false設定で fork 警告を抑制。
tokenizer— 埋め込みモデルトークナイザに整合 (9節)。既定はトークナイザから限度導出。max_tokens— 断片毎上限。文脈化形が収まること。merge_peers=True— 過小 peer 併合。厳格切断はFalse。repeat_table_header=True— 表断片毎に見出し行開始 (7節)。omit_header_on_overflow=False— 見出しなしで収まり見出しありで溢れる行の見出し省略 (広表・厳格予算)。serializer_provider— 例ChunkingSerializerProvider経由Markdown表で断片文形管理。
from docling.chunking import HybridChunker
chunker = HybridChunker()
chunks = list(chunker.chunk(document))
print(len(chunks), chunks[0].text[:120])
for chunk in chunker.chunk(document):
enriched = chunker.contextualize(chunk) # 見出し前置。埋め込むのは本形
vector = embed(enriched)
7. RAG中の表: 見出し・ span・形式
解決実演: ハイブリッドチャンキング (広CSV見出し反復含む)、行ベースチャンキング、表抽出。
docling convert data.csv --to md- 見出し反復 (
repeat_table_header=True、既定): チャンク対象表の各断片は見出し行開始。各断片が模型に自己記述。 - 溢れ逃し (
omit_header_on_overflow=True): 広表で見出しなし収容・見出しあり溢れの行は見出し省略。行保持でトークン効率。 - 結合セル: Markdownは span 平坦化。結合見出しセルが重要ならHTML/JSONシリアライズか独自表シリアライザーからチャンク。
- 行別代替:
LineBasedTokenChunker反復接見出しでCSV式行保持。omit_prefix_on_overflowで同溢れ論理。
8. メタデータ情報と引用 (DocMeta)
各断片はdl_meta携帯。ベクターペイロードに保持。「一回答」を「出典付き回答」に変える。由来情報は項目毎頁数と囲み枠を含む。「3頁」引用や源域 highlight に十分 (視覚接地参照)。「省スペース」名目でメタデータを削除しない。無ければ引用不能。
| 項目 | 内容 | 用途 |
|---|---|---|
| headings | 見出し経路 (例["3.2 AI models"]) | 節ラベル・文脈の接見出し辞・フィルター。 |
| origin | Mimetype・文書名・二進 hash | 文書同じ・重複排除・源 link。 |
| doc_items | 自己参照・ラベル・由来情報: page_no・bbox・charspan | 頁引用・囲み highlight・視覚接地。 |
9. トークナイザ: 埋め込みモデルに合わせる
則は絶対: 埋め込みモデルのトークナイザで断片計量。不一致トークナイザは黙って誤計量し併合・切断判断を破壊。大規模ではData Prep Kitチャンク化 + トークン化管路が同じ原則を batch 適用。
| トークナイザ | 導入 | 備考 |
|---|---|---|
HuggingFace (HuggingFaceTokenizer) | pip install "docling-core[chunking]" | 既定路。max_tokens任意。トークナイザから導出。例: sentence-transformers/all-MiniLM-L6-v2 (CLI既定も)。 |
OpenAI / tiktoken (OpenAITokenizer) | pip install "docling-core[chunking-openai]" | 明示max_tokens要 (文脈窓。例gpt-4oは128 * 1024)。 |
from transformers import AutoTokenizer
from docling_core.transforms.chunker.tokenizer.huggingface import HuggingFaceTokenizer
from docling.chunking import HybridChunker
EMBED_MODEL_ID = "sentence-transformers/all-MiniLM-L6-v2"
tokenizer = HuggingFaceTokenizer(
tokenizer=AutoTokenizer.from_pretrained(EMBED_MODEL_ID),
max_tokens=512,
)
chunker = HybridChunker(tokenizer=tokenizer, merge_peers=True)
10. フレームワーク統合
LangChain — langchain-docling: 二形式。DOC_CHUNKS (既定。 ネイティブ 断片毎にLangChain文書1、メタデータ保持) とMARKDOWN (文書毎1。後段チャンク。例MarkdownHeaderTextSplitterの#/##/###)。全体の流れは公式LangChain RAG例 (Milvus + Mixtral) とLangChainガイド参照。
LlamaIndex — リーダー + 節解析器: DoclingReaderはLlamaIndexドキュメントの生成 (無損失JSONか損失Markdown)。Docling Node Parserは形式知識でNodes化。任意BaseChunker実装は同じインターフェースに接続。公式LlamaIndex RAG例参照。
Haystackと残余: HaystackはDoclingを変換コンポーネント提供 (例・統合文書)。三大外: txtai・Kotaemon・DocETL・Vectara・Semantica・Hector・haiku.rag・Bee・CrewAI・Langflow・Open WebUI・spaCy・NVIDIA・Granite cookbook RAG・Data Prep KitははすべてDoclingと統合。公式統合索引を参照。
pip install langchain-docling langchain-huggingface langchain_milvuspip install llama-index-readers-docling llama-index-node-parser-doclingpip install docling-haystackfrom transformers import AutoTokenizer
from docling_core.transforms.chunker.tokenizer.huggingface import HuggingFaceTokenizer
from docling.chunking import HybridChunker
from langchain_docling import DoclingLoader
from langchain_docling.loader import ExportType
tokenizer = HuggingFaceTokenizer(
tokenizer=AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")
)
loader = DoclingLoader(
file_path=["https://arxiv.org/pdf/2408.09869"],
export_type=ExportType.DOC_CHUNKS, # ネイティブ 断片 (既定)
chunker=HybridChunker(tokenizer=tokenizer),
)
docs = loader.load() # 断片毎LangChain文書1。dl_metaは metadata 内
from llama_index.readers.docling import DoclingReader
reader = DoclingReader(export_type="json") # 無損失。「markdown」は損失
documents = reader.load_data("report.pdf")
11. ベクターストア: 実例
ストアはDoclingに無影響。断片 + 埋め込みは随処 upsert。公式実例:
| ストア | 例 | 備考 |
|---|---|---|
| Milvus | Milvus RAG | LangChain例のストアも (ローカルdocling.db・FLATインデックス)。 |
| Weaviate | Weaviate RAG | ネイティブベクター + ハイブリッド検索選択。 |
| Qdrant | Qdrant検索 | 検索特化レシピ。 |
| OpenSearch | OpenSearch RAG | 1つのエンジンで検索 + ベクター。 |
| MongoDB + VoyageAI | MongoDB RAG | Atlas Vector Search + VoyageAI埋め込み。 |
| Azure AI Search | Azure AI Search RAG | Azureマネージド検索。 |
| Chroma / Pinecone / 他 | — | 公式レシピなし。同じ型: contextualize(chunk)埋め込み、文 + DocMeta upsert。 |
12. CLIからチャンク (Pythonなし)
--chunks-typeはhybrid (既定) かhierarchical。トークナイザ既定はsentence-transformers/all-MiniLM-L6-v2。遠隔変換 (docling convert-remote / docling-serve) も同チャンクオプションをサービス側対応。命令検索参照。
docling convert report.pdf --to chunks --chunks-type hybriddocling convert report.pdf --to chunks --chunks-type hybrid --chunks-max-tokens 512 --chunks-tokenizer sentence-transformers/all-MiniLM-L6-v213. 商用取り込み チェックリスト
- トークナイザ == 埋め込みモデル。 常に。模型入替毎に再確認。
contextualize()出力を埋め込み、chunk.textは表示用に別保。- DocMeta保持 (見出し・頁・bbox・由来情報) を荷に。引用用。
- 表見出し反復。結合セル表はHTML/JSON源利用。
- 変換費圧縮: デジタルPDFは
--no-ocr、不要なエンリッチメント省略、 batch 変換、模型事前取得 (docling-tools models download --all)。 - 規模拡大: 集団はData Prep Kitチャンク化 + トークン化。サービスはキュー後段の
--to chunks付き/v1/convert/source。 - PII先行: 埋め込み前にPII検出・難読化 (PII例参照)。漏洩は取り消せません。
14. RAG取り込み対処
- 文脈欠き回答・「孤立した」チャンク —
chunk.text埋め込みが原因。contextualize()に切り替えて見出しを確認。 - 表回答誤り —
repeat_table_header有効化。結合セル確認 (Markdownは span 平坦化→HTML/JSON利用)。 - transformers長警告 — 文書化済み誤警報。無視可 (公式FAQ)。
- 模型に大小不適合 — トークナイザ不一致。模型トークナイザに固定し
max_tokens調整。 - 引用不能 — upsert時メタデータ欠落。
dl_meta(頁・見出し・由来情報) 永続化。 - 取り込み低速 — 変換低速参照。不要なOCR/エンリッチメント停止、GPU利用、 batch 化。
15. RAG FAQ
最初のチャンカーは?
chunk.textとcontextualize()どちらを埋め込む?
chunker.contextualize(chunk)。見出し経路前置で断片自足。表示用にchunk.text保持。LangChain / LlamaIndex / Haystack要否?
Markdown出力 + スプリッター と ネイティブ チャンクどちら?
表構造は検索にどのように残る?
repeat_table_header)、溢れ配慮 (omit_header_on_overflow)。結合セル有意時はHTML/JSON源。行指向資料の専門はLineBasedTokenChunker。回答はどのように頁引用?
dl_meta (見出し・page_no・bbox・由来情報) をベクターペイロードに永続化し命中と返却。由来情報は頁引用から囲み highlight まで担持。Docling対応ベクターストアは?
取り込み規模化は?
Docling v2.129.0で検証 · 最終確認 2026-09-22 · 公式ソース