Kotaemon 集成 Docling:基于结构感知的多模态文档解析器实践指南
【免费下载链接】kotaemonAn open-source RAG-based tool for chatting with your documents.项目地址: https://gitcode.com/GitHub_Trending/kot/kotaemon
导读
本文讲解 Kotaemon 如何通过内置的 Docling Reader 实现本地文档的结构感知解析,覆盖文本、表格与图片三类元素的完整提取流程。读者将掌握 Docling 依赖的安装方式、VLM 端点配置下的图片标题生成机制,以及如何在 Kotaemon 界面中启用Docling (figure+table extraction)加载器,并理解其底层将解析结果转换为Document对象的源码实现原理。
Docling 集成概览
Kotaemon 是一个开源的、基于 RAG(检索增强生成)的文档问答工具。其文档解析层(loader)支持多种后端,其中 Docling 以“结构感知(structure-aware)”解析见长——它不只抽取纯文本,还能识别文档的版面结构,把正文、表格(table)和图片(figure)分别提取出来。
在 Kotaemon 仓库中,Docling 集成位于libs/kotaemon/kotaemon/loaders/docling_loader.py,核心类是DoclingReader。它继承自libs/kotaemon/kotaemon/loaders/base.py中定义的BaseReader,并在libs/kotaemon/kotaemon/loaders/__init__.py中以DoclingReader名称导出,统一纳入 Kotaemon 的加载器体系。启用 Docling 后,Kotaemon 会在文档索引(indexing)阶段调用它,把解析出的文本、表格、图片元素分别构造成Document对象,供后续切分、向量化与检索问答使用。
前置条件:安装 Docling 依赖
Docling 并非 Kotaemon 的默认依赖,需要显式安装。Kotaemon 在libs/kotaemon/pyproject.toml的[project.optional-dependencies]中声明了docling可选依赖组,其版本约束为docling<=2.5.2:
uv pip install -e "libs/kotaemon[docling]"使用uv时,-e表示以可编辑(editable)模式安装libs/kotaemon包,[docling]会同时拉取docling<=2.5.2及其依赖。若使用 pip,等价命令为:
pip install -e "libs/kotaemon[docling]"安装完成后,DoclingReader的converter_参数(见docling_loader.py第 44-51 行)会惰性导入docling.document_converter.DocumentConverter并缓存为转换器实例;如果未安装 docling,该处会抛出ImportError: Please install docling: 'pip install docling'。从源码结构看,converter_使用了@Param.auto(cache=True)装饰,说明其实例创建与缓存由 Kotaemon 的参数机制托管,每次读取文档时直接复用。
配置可选能力:VLM 端点与图片标题生成
Docling 本身会为图片输出“抽取式标题(extractive caption,即文档原文中已存在的图注文字)”。若要生成“生成式标题(generative caption,即由多模态模型看图生成的摘要)”,则需要一个可用的 VLM(视觉语言模型)端点。
在.env文件或应用设置中配置:
KH_VLM_ENDPOINT=http://your-vlm-endpoint这个环境变量的读取链如下:
libs/kotaemon/kotaemon/indices/ingests/files.py第 41 行:docling_reader.vlm_endpoint = getattr(flowsettings, "KH_VLM_ENDPOINT", "")——将配置值注入DoclingReader.vlm_endpoint参数;- 同样地,该值也同步赋给
adobe_reader.vlm_endpoint与azure_reader.vlm_endpoint,即 Adobe 与 Azure AI Document Intelligence 加载器共用同一个 VLM 端点; - 在
libs/kotaemon/kotaemon/indices/qa/citation_qa.py第 99 行,vlm_endpoint也被引用,用于问答阶段的多模态支持。
需要注意:如果KH_VLM_ENDPOINT未设置,Docling 仍然会正常提取文本、表格和图片元数据,只是跳过生成式图片标题,只保留抽取式标题(甚至无标题)。这一行为在docling_loader.py第 74-76 行有直接体现:
for figure_obj in result_dict.get("pictures", []): if not self.vlm_endpoint: continueDoclingReader 参数详解
DoclingReader在docling_loader.py中定义了三个核心参数(均使用 Kotaemon 的Param声明):
| 参数 | 默认值 | 说明 |
|---|---|---|
vlm_endpoint | 空字符串 | 用于生成式图片标题的 VLM 端点;为空则跳过图片标题生成 |
max_figure_to_caption | 100 | 最多为前 N 张图片生成生成式标题,其余图片照常索引但不带生成标题 |
figure_friendly_filetypes | [".pdf", ".jpeg", ".jpg", ".png", ".bmp", ".tiff", ".heif", ".tif"] | 可可靠打开并裁剪出图片的文件类型;.docx、.html等格式在不同工具中视觉布局可能不一致,无法使用版面坐标可靠裁剪图片 |
关于max_figure_to_caption的语义,源码第 122-128 行给出了精确行为:当已生成的标题数量达到上限后,后续图片的gen_caption置为空字符串,但图片本身仍会被裁剪、转码并写入Document。
figure_friendly_filetypes的裁剪逻辑复用自libs/kotaemon/kotaemon/loaders/azureai_document_intelligence_loader.py中的crop_image函数:PDF 通过 PyMuPDF(fitz)按页码渲染页面并裁剪;TIFF 等多帧图片按页码 seek;普通图片直接打开裁剪。裁剪坐标来自 Docling 输出的版面边界框(bbox),若坐标原点为BOTTOMLEFT,则通过_convert_bbox_bl_tl(docling_loader.py第 211-221 行)换算为左上原点百分比坐标。
界面配置:在 Kotaemon 中启用 Docling
按照官方文档的指引,在 Kotaemon 界面中启用 Docling 的步骤如下:
- 启动 Kotaemon,打开应用界面;
- 进入Settings(设置)→ Retrieval Settings(检索设置)→ File loader(文件加载器);
- 选择
Docling (figure+table extraction); - 保存设置,随后上传或导入文档。Kotaemon 将在索引期间使用 Docling,并把提取出的内容转换为
Document对象。
从代码层面看,加载器的选择最终会体现在DocumentIngestor(libs/kotaemon/kotaemon/indices/ingests/files.py)的文件提取器映射中:override_file_extractors允许按文件扩展名覆盖默认提取器(默认映射见该文件第 48-64 行的KH_DEFAULT_FILE_EXTRACTORS)。选中 Docling 加载器后,相应扩展名的解析会被替换为DoclingReader,随后由DirectoryReader统一调度。
底层原理:Docling 解析结果如何转换为 Document
DoclingReader.load_data(docling_loader.py第 58-209 行)是整个集成的核心,其处理链路可以拆解为四步:
调用 Docling 转换:
self.converter_.convert(file_path)解析文档,随后result.document.export_to_dict()把结构化结果导出为字典(result_dict),其中包含texts、tables、pictures、pages等键。图片提取与标题拼接(第 72-148 行):
- 遍历
result_dict["pictures"],若未配置 VLM 端点或文件类型不受支持则跳过; - 通过
$ref引用从result_dict["texts"]中取回 Docling 提供的抽取式标题; - 依据
prov[0]中的页码与 bbox 调用crop_image裁剪图片,转成data:image/png;base64,...格式; - 调用
generate_single_figure_caption(实现在libs/kotaemon/kotaemon/loaders/utils/adobe.py第 205-221 行,内部走generate_gpt4v,提示词为 “Provide a short 2 sentence summary of this image?”)生成两句话的图片摘要; - 将抽取式标题与生成式标题用换行拼接,作为图片
Document的text,并写入image_origin(base64 图片)、type: "image"、page_label等元数据。
- 遍历
表格提取与 Markdown 化(第 150-186 行):
- 遍历
result_dict["tables"],通过_parse_table(第 223-232 行)读取table_obj["data"]["grid"]二维网格,再交给make_markdown_table(libs/kotaemon/kotaemon/loaders/utils/adobe.py第 113-145 行)转换为标准 Markdown 表格; - 表格的抽取式标题会拼接到 Markdown 表格上方,元数据包含
type: "table"、table_origin、page_label等。
- 遍历
正文按页聚合(第 188-207 行):遍历
result_dict["texts"],按page_no分组合并文本,每页生成一个Document,元数据记录page_label、file_name、file_path。
最终返回值顺序为texts + tables + figures,即每页正文在前、表格居中、图片殿后。这些Document随后进入 Kotaemon 的TokenSplitter(默认chunk_size=1024, chunk_overlap=256,见files.py第 88-93 行)切分为节点,再交由文档解析器与向量索引流程处理。
仓库中的相关测试也印证了这一设计:libs/kotaemon/tests/_test_multimodal_reader.py依据doc.metadata.get("type", "")区分table与image类型的文档;libs/kotaemon/tests/test_table_reader.py与libs/kotaemon/tests/test_paddleocr_loader.py则验证了表格类Document的table_origin、page_label等元数据完整性。这从测试侧确认了 Kotaemon 对多模态解析结果按类型分发处理的约定。
常见问题与注意事项
- 未安装 docling 时如何报错:
converter_惰性导入会抛出ImportError,提示先执行pip install docling。官方推荐用uv pip install -e "libs/kotaemon[docling]"一并安装。 - 图片没有标题:检查两处——一是
KH_VLM_ENDPOINT是否已配置且端点可达(未配置则完全跳过生成式标题);二是图片数量是否超过max_figure_to_caption(默认 100),超出部分只有抽取式标题或空标题。 - 图片未被提取:确认文件扩展名是否在
figure_friendly_filetypes列表中;.docx、.html等格式因版面坐标在不同工具间不可靠,被设计为不参与图片裁剪。 - VLM 端点错误或响应被拒:
generate_single_figure_caption内部捕获异常并打印错误,若输出文本包含 “sorry” 字样也会被置空,避免把无效标题写入文档。
总结
Docling 集成为 Kotaemon 提供了本地的、无需云服务的结构感知文档解析能力,文本、表格、图片三类元素被分别提取并封装为带类型元数据的Document,配合可选的 VLM 端点还能自动生成图片摘要。通过uv pip install -e "libs/kotaemon[docling]"安装依赖、配置KH_VLM_ENDPOINT、在 Retrieval Settings 中选择Docling (figure+table extraction),即可让 Kotaemon 的索引管线获得更精细的多模态文档理解能力,为后续的 RAG 问答提供更高质量的结构化上下文。
相关资源
- 加载器实现:libs/kotaemon/kotaemon/loaders/docling_loader.py
- 文件摄取与加载器注册:libs/kotaemon/kotaemon/indices/ingests/files.py
- VLM 图片标题生成工具:libs/kotaemon/kotaemon/loaders/utils/adobe.py
- 图片裁剪实现:libs/kotaemon/kotaemon/loaders/azureai_document_intelligence_loader.py
- 加载器基类:libs/kotaemon/kotaemon/loaders/base.py
- 依赖声明(
docling可选组):libs/kotaemon/pyproject.toml - 相关测试:libs/kotaemon/tests/test_table_reader.py、libs/kotaemon/tests/_test_multimodal_reader.py
【免费下载链接】kotaemonAn open-source RAG-based tool for chatting with your documents.项目地址: https://gitcode.com/GitHub_Trending/kot/kotaemon
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考