RAGのためのDocling

文書から検索対応チャンクへ。チャンカー選択、正トークナイザ計量、表・引用保持、フレームワーク適合、ベクターストアの選定を収録。公式チャンキング概念シリアライズ解説で検証済み。

1
Step 1

1. どのRAG経路が適合か

状況経路理由
LangChain利用済みlangchain-docling DoclingLoader公式ローダー。DOC_CHUNKS形式は ネイティブ チャンク、MARKDOWN形式 + 見出し スプリッター が代替。
LlamaIndex利用済みDoclingReader + Docling Node ParserReaderは無損失JSONか損失Markdown読込。ParserがNodes化。
Haystack利用済みdocling-haystack変換器Haystack変換コンポーネントとしてのDocling。
フレームワークなし・自前ストアHybridChunker直接完全管理: チャンキング・文脈化・埋め込み・任意のストア (Qdrant・Milvus・Chroma・Pinecone…)。
チャンクファイルが即要CLI --to chunksPythonなし。 hybrid か階層チャンクを端末から。
大量取り込みData Prep Kit + Docling大集団用チャンク + トークン化管路。
2
Step 2

2. RAG中のDocling位置

RAG管路は6段階。Doclingは初の三段階を所有。埋め込み存在以前の回答品質を定める。チャンキングの2つの考え方: Markdown出力後の再チャンク (例LangChain MarkdownHeaderTextSplitter) か、DoclingDocument上の ネイティブ チャンクか。 ネイティブ は表・見出し・由来情報を保持し、Markdown再チャンクが黙って失う。理由なき限り ネイティブ 推奨。

  • 解析 — 配置・読順・表・式・画像 → 構造化DoclingDocument
  • シリアライズ・チャンク — 見出し・ caption・由来情報付き構造チャンク (またはMarkdown/HTML/JSON出力後の再チャンク)。
  • 文脈付与contextualize()が見出し文脈を前置し各断片を自立化。
  • 埋め込み→ストア→検索→生成 — 自前の埋め込みモデル・ベクターストア・フレームワーク。Docling中立。
3
Step 3

3. 変換: DoclingDocument保持

計画管路ではPython変換しドキュメントオブジェクトを保持。チャンカーはドキュメントオブジェクトに作用し文書に非ず:

docling convert report.pdf --to md
from docling.document_converter import DocumentConverter

converter = DocumentConverter()
result = converter.convert("report.pdf")
document = result.document
4
Step 4

4. 出力選択: Markdown・JSON・HTML・DocTags

出力はシリアライザーの略称 (MarkdownDocSerializer等)。RAG上は選択が要点。結合見出しセルが回答を定める場合、MarkdownよりHTMLかJSON推奨。またはMarkdown維持しチャンク時に表見出し反復 (7節)。シリアライザーはカスタマイズ可: BaseTableSerializer等を下位分類し完全管理 (高度なチャンキング・シリアライズ例参照)。

出力表 spanRAG用途
export_to_markdown()平坦化。 span 書式なし。結合セルは空白描画既定文路。結合見出し無関係なら可。
export_to_html()保持。 ネイティブ rowspan/colspan結合セルが重要な場合の最良文出力。
export_to_dict() / JSON無損失保持。完全TableData span 含む無損失路 (LlamaIndexリーダーJSON形式)。最重量。
DocTags / Docling Language保持。OTSL継続タグDocling ネイティブ ツール用緻密構造保持形式。
5
Step 5

5. チャンカー比較

全 ネイティブ チャンカーはBaseChunker実装 (chunk() → 断片流、contextualize() → 拡張テキスト)。LlamaIndex式統合は内蔵・自作・第三者を同じインターフェースで受け入れ。

チャンカー方策選択時
HybridChunker (既定)階層構造 + トークン量の考慮の過大な場合のチャンク + 過小な場合の結合RAG既定。均衡・見出し意識・表意識。
HierarchicalChunker要素毎一断片。列挙項目併合 (merge_list_itemsで解除可)微細要素単位・完全メタデータ。
LineBasedTokenChunker行境界保持。単独超過行のみ切断表・コード・ログ・列挙等行構造物。
TrivialChunker最小限の基準チャンクデバッグとベンチマーク。商用検索非用。
Markdown後にチャンクMarkdown出力後にチャンク (例MarkdownHeaderTextSplitter)後段コンポーネントがMarkdown入力を要する場合のみ。
6
Step 6

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
Step 7

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
Step 8

8. メタデータ情報と引用 (DocMeta)

各断片はdl_meta携帯。ベクターペイロードに保持。「一回答」を「出典付き回答」に変える。由来情報は項目毎頁数と囲み枠を含む。「3頁」引用や源域 highlight に十分 (視覚接地参照)。「省スペース」名目でメタデータを削除しない。無ければ引用不能。

項目内容用途
headings見出し経路 (例["3.2 AI models"])節ラベル・文脈の接見出し辞・フィルター。
originMimetype・文書名・二進 hash文書同じ・重複排除・源 link。
doc_items自己参照・ラベル・由来情報: page_no・bbox・charspan頁引用・囲み highlight・視覚接地。
9
Step 9

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
Step 10

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を変換コンポーネント提供 (統合文書)。三大外: txtaiKotaemonDocETLVectaraSemanticaHectorhaiku.ragBeeCrewAILangflowOpen WebUIspaCyNVIDIAGranite cookbook RAGData Prep KitははすべてDoclingと統合。公式統合索引を参照。

pip install langchain-docling langchain-huggingface langchain_milvus
pip install llama-index-readers-docling llama-index-node-parser-docling
pip install docling-haystack
from 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
Step 11

11. ベクターストア: 実例

ストアはDoclingに無影響。断片 + 埋め込みは随処 upsert。公式実例:

ストア備考
MilvusMilvus RAGLangChain例のストアも (ローカルdocling.db・FLATインデックス)。
WeaviateWeaviate RAG ネイティブベクター + ハイブリッド検索選択。
QdrantQdrant検索検索特化レシピ。
OpenSearchOpenSearch RAG1つのエンジンで検索 + ベクター。
MongoDB + VoyageAIMongoDB RAGAtlas Vector Search + VoyageAI埋め込み。
Azure AI SearchAzure AI Search RAGAzureマネージド検索。
Chroma / Pinecone / 他公式レシピなし。同じ型: contextualize(chunk)埋め込み、文 + DocMeta upsert。
12
Step 12

12. CLIからチャンク (Pythonなし)

--chunks-typehybrid (既定) かhierarchical。トークナイザ既定はsentence-transformers/all-MiniLM-L6-v2。遠隔変換 (docling convert-remote / docling-serve) も同チャンクオプションをサービス側対応。命令検索参照。

docling convert report.pdf --to chunks --chunks-type hybrid
docling convert report.pdf --to chunks --chunks-type hybrid --chunks-max-tokens 512 --chunks-tokenizer sentence-transformers/all-MiniLM-L6-v2
13
Step 13

13. 商用取り込み チェックリスト

  • トークナイザ == 埋め込みモデル。 常に。模型入替毎に再確認。
  • 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
Step 14

14. RAG取り込み対処

  • 文脈欠き回答・「孤立した」チャンクchunk.text埋め込みが原因。contextualize()に切り替えて見出しを確認。
  • 表回答誤りrepeat_table_header有効化。結合セル確認 (Markdownは span 平坦化→HTML/JSON利用)。
  • transformers長警告 — 文書化済み誤警報。無視可 (公式FAQ)。
  • 模型に大小不適合 — トークナイザ不一致。模型トークナイザに固定しmax_tokens調整。
  • 引用不能 — upsert時メタデータ欠落。dl_meta (頁・見出し・由来情報) 永続化。
  • 取り込み低速変換低速参照。不要なOCR/エンリッチメント停止、GPU利用、 batch 化。
15
Step 15

15. RAG FAQ

最初のチャンカーは?
埋め込みモデルトークナイザ付きHybridChunker。既定の理由: 構造意識・サイズ管理・見出し付与・表意識。要素単位のHierarchicalか行構造のLineBasedへは具体要でのみ移行。
chunk.textとcontextualize()どちらを埋め込む?
埋め込みは常にchunker.contextualize(chunk)。見出し経路前置で断片自足。表示用にchunk.text保持。
LangChain / LlamaIndex / Haystack要否?
不要。便利な仲介層: 同じチャンカー周りのローダー・リーダー・変換器。HybridChunker十数行 + 自前の埋め込み呼び出し + 任意のストアで管路完成。
Markdown出力 + スプリッター と ネイティブ チャンクどちら?
ネイティブ は表・見出し・由来情報・ span 保持。Markdown出力は平坦化・欠落。Markdown入力を要する後段コンポーネント時のみ後にチャンク。
表構造は検索にどのように残る?
見出し反復 (repeat_table_header)、溢れ配慮 (omit_header_on_overflow)。結合セル有意時はHTML/JSON源。行指向資料の専門はLineBasedTokenChunker。
回答はどのように頁引用?
各断片dl_meta (見出し・page_no・bbox・由来情報) をベクターペイロードに永続化し命中と返却。由来情報は頁引用から囲み highlight まで担持。
Docling対応ベクターストアは?
どれでも構いません。Doclingは断片 + メタデータ生成。ストアはベクター保持のみ。公式レシピはMilvus・Weaviate・Qdrant・OpenSearch・MongoDB・Azure AI Search網羅。Chroma・Pinecone他は同じ型。
取り込み規模化は?
batch 変換・模型事前取得・配置/OCR用GPU・不要なエンリッチメントなし。加えて集団はData Prep Kitチャンク化 + トークン化管路、サービスはキュー後段のdocling-serveチャンク出力。

Docling v2.129.0で検証 · 最終確認 2026-09-22 · 公式ソース