Docling 用于 RAG

从文档到可检索分块:选何分块器、以正确分词器度量、表格引用如何留存、框架如何适配、向量存储如何搭配,对照官方分块概念序列化说明核验。

1
Step 1

1. 哪条 RAG 路线适合你?

情形路线原因
已在用 LangChainlangchain-docling DoclingLoader官方加载器;DOC_CHUNKS 模式原生分块,MARKDOWN 模式加标题切分器兜底。
已在用 LlamaIndexDoclingReader + Docling Node ParserReader 无损读 JSON 或有损读 Markdown;Parser 转为 Nodes。
已在用 Haystackdocling-haystack 转换器Docling 作为 Haystack 转换组件。
无框架 / 自有存储直接 HybridChunker完全掌控:分块、上下文化、嵌入、任意入库(Qdrant、Milvus、Chroma、Pinecone…)。
急需分块文件CLI --to chunks无需 Python:终端直出混合或层级分块。
大规模摄取Data Prep Kit + Docling面向大语料的分块 + 分词流水线。
2
Step 2

2. Docling 在 RAG 中的位置

RAG 流水线共六段,Docling 拥有前三段——它们在任何嵌入存在之前决定答案质量。两种分块哲学:导出 Markdown 再切(如 LangChain 的 MarkdownHeaderTextSplitter),或在 DoclingDocument 上原生分块。原生分块保留 Markdown 再切悄悄丢掉的表格、标题与出处,除有理由一律优先原生。

  • 解析——版式、阅读顺序、表格、公式、图片 → 结构化 DoclingDocument
  • 序列化 / 分块——带标题、表题与出处的结构化分块(或导出 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 而言选择关键在表格。若合并表头格决定答案,请选 HTML 或 JSON 而非 Markdown,或保留 Markdown 但在分块时复述表头(第 7 节)。序列化器可定制:子类化 BaseTableSerializer 等完全掌控(见高级分块与序列化示例)。

导出表格合并格RAG 用途
export_to_markdown()拍平——无合并语法,合并格渲染为空默认文本路线;合并表头无关紧要时可用。
export_to_html()保留——原生 rowspan/colspan合并格有意义时的最佳文本导出。
export_to_dict() / JSON无损保留——完整 TableData 含合并信息无损路线(LlamaIndex Reader JSON 模式);载荷最重。
DocTags / Docling Language保留——OTSL 延续标记面向 Docling 原生工具的紧凑保结构格式。
5
Step 5

5. 分块器对比

全部原生分块器实现 BaseChunkerchunk() 输出分块流,contextualize() 输出增强文本),故 LlamaIndex 类集成经同一接口接纳内置、自研或第三方分块器。

分块器策略选用
HybridChunker(默认)层级结构 + 按词元感知的超限切分 + 不足合并RAG 默认。均衡,懂标题懂表格。
HierarchicalChunker每元素一块;合并列表项(以 merge_list_items 退出)细粒度逐元素,元数据完整。
LineBasedTokenChunker保行界;仅当单行自身超限才切行表格、代码、日志、列表等行结构内容。
TrivialChunker最小基线分块调试与基准,不做生产检索。
Markdown 后切导出 Markdown 再切(如 MarkdownHeaderTextSplitter)仅下游组件要求 Markdown 输入时。
6
Step 6

6. HybridChunker 深解(默认)

原理:从层级分块起步,一遍仅切分超限块(词元感知),另一遍仅合并同标题同表题的连续不足 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 中的表格:表头、合并格、格式

完整演示:混合分块(含宽 CSV 表头复述)、按行分块表格抽取

docling convert data.csv --to md
  • 复述表头repeat_table_header=True,默认):被切散表格的每块以表头行开头,每块对嵌入模型自描述。
  • 溢出逃生omit_header_on_overflow=True):宽表中去表头可容纳、带表头则溢出的行省略表头,省词元不断行。
  • 合并格:Markdown 拍平合并信息;若关键,请从 HTML/JSON 序列化分块或自研表格序列化器。
  • 按行备选LineBasedTokenChunker 加重复前缀保 CSV 式行完整,同经 omit_prefix_on_overflow 处理溢出。
8
Step 8

8. 元数据与引用(DocMeta)

每块携带 dl_meta,请保留在向量载荷中,它把「一个答案」变成「有出处的答案」。出处含逐项页码与边框,足以支撑「第 3 页」引用或源区高亮(见视觉定位)。切勿为「省空间」丢元数据,否则引用无从谈起。

字段内容用途
headings标题路径,如 ["3.2 AI models"]章节标签、上下文前缀、过滤。
originMimetype、文件名、二进制哈希文档身份、去重、来源链接。
doc_items自引用、标签、出处:page_no、bbox、charspan页码引用、边框高亮、视觉定位。
9
Step 9

9. 分词器:对齐嵌入模型

铁律:以嵌入模型的分词器度量分块。分词器错配悄悄量错尺寸,破坏合并切分决策。大规模下 Data Prep Kit 分块 + 分词流水线批量贯彻同一原则。

分词器安装说明
HuggingFaceHuggingFaceTokenizerpip install "docling-core[chunking]"默认路线。max_tokens 可选,由分词器推导。如 sentence-transformers/all-MiniLM-L6-v2(亦 CLI 默认)。
OpenAI / tiktokenOpenAITokenizerpip 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 Document,元数据完整)与 MARKDOWN(每文件一个 Document,下游再切,如以 MarkdownHeaderTextSplitter#/##/###)。完整流程见官方 LangChain RAG 示例(Milvus + Mixtral)与 LangChain 指南

LlamaIndex——Reader + Node Parser:DoclingReader 填充 LlamaIndex Document(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 Document,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,分块加嵌入哪里都可入库。官方实例覆盖:

存储示例说明
MilvusMilvus RAG亦 LangChain 示例所用存储(本地 docling.db,FLAT 索引)。
WeaviateWeaviate RAG原生向量 + 混合检索。
QdrantQdrant 检索检索导向实例。
OpenSearchOpenSearch RAG搜索与向量同一引擎。
MongoDB + VoyageAIMongoDB RAGAtlas Vector Search + VoyageAI 嵌入。
Azure AI SearchAzure AI Search RAGAzure 托管检索。
Chroma / Pinecone / 其他无官方实例,模式相同:嵌入 contextualize(chunk),入库文本 + DocMeta。
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(headings、page_no、bbox、origin)于载荷供引用。
  • 复述表格表头;合并格表格用 HTML/JSON 源。
  • 压缩转换成本:数字 PDF 用 --no-ocr,跳过无用富化,批量转换并预下载模型(docling-tools models download --all)。
  • 横向扩展:语料用 Data Prep Kit 分块 + 分词;服务用队列后的 docling-serve /v1/convert/source--to chunks
  • PII 先行:嵌入前检测脱敏 PII(见PII 示例),泄露无法反嵌入。
14
Step 14

14. RAG 摄取排错

  • 答案缺上下文 /「孤儿」块——嵌入了 chunk.text;改 contextualize() 并确认标题。
  • 表格答错——启用 repeat_table_header;检查合并格(Markdown 拍平合并信息,用 HTML/JSON)。
  • transformers 长度警告——已归档误报,可忽略(官方 FAQ)。
  • 块相对模型过大过小——分词器错配,锁定模型分词器并调 max_tokens
  • 无法引用——入库丢元数据,持久化 dl_meta(page_no、headings、origin)。
  • 摄取太慢——见转换慢:关闭多余 OCR/富化,用 GPU,批量。
15
Step 15

15. RAG FAQ

先用哪种分块器?
带嵌入模型分词器的 HybridChunker。默认有理:懂结构、控尺寸、带标题、懂表格。仅明确需要逐元素 Hierarchical 或行结构 LineBased 再换。
嵌入 chunk.text 还是 contextualize()?
嵌入一律 chunker.contextualize(chunk)。它前置标题路径,使块自足可检。chunk.text 留展示。
需要 LangChain / LlamaIndex / Haystack 吗?
不需要,皆为便利:同样分块器之上的加载器、读取器与转换器。十数行 HybridChunker 加自有嵌入调用加任意向量库即完整流水线。
Markdown 导出加切分,还是原生分块?
原生保留 Markdown 拍平或丢失的表格、标题、出处与合并信息。仅下游组件要求 Markdown 输入再后切。
表格结构如何留存检索?
复述表头(repeat_table_header),注意溢出(omit_header_on_overflow),合并格关键则以 HTML/JSON 为源。行导向数据专家是 LineBasedTokenChunker。
答案如何引用页码?
每块 dl_meta(headings、page_no、bbox、origin)持久化于向量载荷,随命中返回。出处支撑页码引用乃至边框高亮。
哪种向量存储搭配 Docling?
任意。Docling 产分块加元数据,存储只存向量。官方实例覆盖 Milvus、Weaviate、Qdrant、OpenSearch、MongoDB 与 Azure AI Search,Chroma、Pinecone 等模式相同。
如何扩展摄取?
批量转换、预下载模型、版式/OCR 用 GPU、关闭无用富化,另语料用 Data Prep Kit 分块 + 分词流水线,服务用队列后的 docling-serve 分块输出。

已按 Docling v2.129.0 验证 · 最近检查 2026-09-22 · 官方来源