1. 哪条 RAG 路线适合你?
| 情形 | 路线 | 原因 |
|---|---|---|
| 已在用 LangChain | langchain-docling DoclingLoader | 官方加载器;DOC_CHUNKS 模式原生分块,MARKDOWN 模式加标题切分器兜底。 |
| 已在用 LlamaIndex | DoclingReader + Docling Node Parser | Reader 无损读 JSON 或有损读 Markdown;Parser 转为 Nodes。 |
| 已在用 Haystack | docling-haystack 转换器 | Docling 作为 Haystack 转换组件。 |
| 无框架 / 自有存储 | 直接 HybridChunker | 完全掌控:分块、上下文化、嵌入、任意入库(Qdrant、Milvus、Chroma、Pinecone…)。 |
| 急需分块文件 | CLI --to chunks | 无需 Python:终端直出混合或层级分块。 |
| 大规模摄取 | Data Prep Kit + Docling | 面向大语料的分块 + 分词流水线。 |
2. Docling 在 RAG 中的位置
RAG 流水线共六段,Docling 拥有前三段——它们在任何嵌入存在之前决定答案质量。两种分块哲学:导出 Markdown 再切(如 LangChain 的 MarkdownHeaderTextSplitter),或在 DoclingDocument 上原生分块。原生分块保留 Markdown 再切悄悄丢掉的表格、标题与出处,除有理由一律优先原生。
- 解析——版式、阅读顺序、表格、公式、图片 → 结构化 DoclingDocument。
- 序列化 / 分块——带标题、表题与出处的结构化分块(或导出 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 而言选择关键在表格。若合并表头格决定答案,请选 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. 分块器对比
全部原生分块器实现 BaseChunker(chunk() 输出分块流,contextualize() 输出增强文本),故 LlamaIndex 类集成经同一接口接纳内置、自研或第三方分块器。
| 分块器 | 策略 | 选用 |
|---|---|---|
| HybridChunker(默认) | 层级结构 + 按词元感知的超限切分 + 不足合并 | RAG 默认。均衡,懂标题懂表格。 |
| HierarchicalChunker | 每元素一块;合并列表项(以 merge_list_items 退出) | 细粒度逐元素,元数据完整。 |
| LineBasedTokenChunker | 保行界;仅当单行自身超限才切行 | 表格、代码、日志、列表等行结构内容。 |
| TrivialChunker | 最小基线分块 | 调试与基准,不做生产检索。 |
| Markdown 后切 | 导出 Markdown 再切(如 MarkdownHeaderTextSplitter) | 仅下游组件要求 Markdown 输入时。 |
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. 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. 元数据与引用(DocMeta)
每块携带 dl_meta,请保留在向量载荷中,它把「一个答案」变成「有出处的答案」。出处含逐项页码与边框,足以支撑「第 3 页」引用或源区高亮(见视觉定位)。切勿为「省空间」丢元数据,否则引用无从谈起。
| 字段 | 内容 | 用途 |
|---|---|---|
| headings | 标题路径,如 ["3.2 AI models"] | 章节标签、上下文前缀、过滤。 |
| origin | Mimetype、文件名、二进制哈希 | 文档身份、去重、来源链接。 |
| doc_items | 自引用、标签、出处:page_no、bbox、charspan | 页码引用、边框高亮、视觉定位。 |
9. 分词器:对齐嵌入模型
铁律:以嵌入模型的分词器度量分块。分词器错配悄悄量错尺寸,破坏合并切分决策。大规模下 Data Prep Kit 分块 + 分词流水线批量贯彻同一原则。
| 分词器 | 安装 | 说明 |
|---|---|---|
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 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 为转换器组件(示例、集成文档)。三巨头之外: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 Document,dl_meta 在 metadata
from llama_index.readers.docling import DoclingReader
reader = DoclingReader(export_type="json") # 无损;"markdown" 有损
documents = reader.load_data("report.pdf")
11. 向量存储:实例集
存储从不影响 Docling,分块加嵌入哪里都可入库。官方实例覆盖:
| 存储 | 示例 | 说明 |
|---|---|---|
| Milvus | Milvus RAG | 亦 LangChain 示例所用存储(本地 docling.db,FLAT 索引)。 |
| Weaviate | Weaviate RAG | 原生向量 + 混合检索。 |
| Qdrant | Qdrant 检索 | 检索导向实例。 |
| OpenSearch | OpenSearch RAG | 搜索与向量同一引擎。 |
| MongoDB + VoyageAI | MongoDB RAG | Atlas Vector Search + VoyageAI 嵌入。 |
| Azure AI Search | Azure AI Search RAG | Azure 托管检索。 |
| Chroma / Pinecone / 其他 | — | 无官方实例,模式相同:嵌入 contextualize(chunk),入库文本 + DocMeta。 |
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(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. RAG 摄取排错
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(headings、page_no、bbox、origin)持久化于向量载荷,随命中返回。出处支撑页码引用乃至边框高亮。哪种向量存储搭配 Docling?
如何扩展摄取?
已按 Docling v2.129.0 验证 · 最近检查 2026-09-22 · 官方来源