news 2026/9/12 2:44:12

Kotaemon 集成 Docling:基于结构感知的多模态文档解析器实践指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kotaemon 集成 Docling:基于结构感知的多模态文档解析器实践指南

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]"

安装完成后,DoclingReaderconverter_参数(见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_endpointazure_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: continue

DoclingReader 参数详解

DoclingReaderdocling_loader.py中定义了三个核心参数(均使用 Kotaemon 的Param声明):

参数默认值说明
vlm_endpoint空字符串用于生成式图片标题的 VLM 端点;为空则跳过图片标题生成
max_figure_to_caption100最多为前 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_tldocling_loader.py第 211-221 行)换算为左上原点百分比坐标。

界面配置:在 Kotaemon 中启用 Docling

按照官方文档的指引,在 Kotaemon 界面中启用 Docling 的步骤如下:

  1. 启动 Kotaemon,打开应用界面;
  2. 进入Settings(设置)→ Retrieval Settings(检索设置)→ File loader(文件加载器)
  3. 选择Docling (figure+table extraction)
  4. 保存设置,随后上传或导入文档。Kotaemon 将在索引期间使用 Docling,并把提取出的内容转换为Document对象。

从代码层面看,加载器的选择最终会体现在DocumentIngestorlibs/kotaemon/kotaemon/indices/ingests/files.py)的文件提取器映射中:override_file_extractors允许按文件扩展名覆盖默认提取器(默认映射见该文件第 48-64 行的KH_DEFAULT_FILE_EXTRACTORS)。选中 Docling 加载器后,相应扩展名的解析会被替换为DoclingReader,随后由DirectoryReader统一调度。

底层原理:Docling 解析结果如何转换为 Document

DoclingReader.load_datadocling_loader.py第 58-209 行)是整个集成的核心,其处理链路可以拆解为四步:

  1. 调用 Docling 转换self.converter_.convert(file_path)解析文档,随后result.document.export_to_dict()把结构化结果导出为字典(result_dict),其中包含textstablespicturespages等键。

  2. 图片提取与标题拼接(第 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?”)生成两句话的图片摘要;
    • 将抽取式标题与生成式标题用换行拼接,作为图片Documenttext,并写入image_origin(base64 图片)、type: "image"page_label等元数据。
  3. 表格提取与 Markdown 化(第 150-186 行):

    • 遍历result_dict["tables"],通过_parse_table(第 223-232 行)读取table_obj["data"]["grid"]二维网格,再交给make_markdown_tablelibs/kotaemon/kotaemon/loaders/utils/adobe.py第 113-145 行)转换为标准 Markdown 表格;
    • 表格的抽取式标题会拼接到 Markdown 表格上方,元数据包含type: "table"table_originpage_label等。
  4. 正文按页聚合(第 188-207 行):遍历result_dict["texts"],按page_no分组合并文本,每页生成一个Document,元数据记录page_labelfile_namefile_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", "")区分tableimage类型的文档;libs/kotaemon/tests/test_table_reader.pylibs/kotaemon/tests/test_paddleocr_loader.py则验证了表格类Documenttable_originpage_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 2:43:43

UC3843AC反激电源方案设计实战:从原理到调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 2:42:58

微服务架构转型:从单体到可扩展系统的实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 2:42:56

二维CT图像重建原理与FBP实战指南

简介&#xff1a;本资源是一套面向医学影像处理初学者与MATLAB编程学习者的CT二维图像重建实践程序&#xff0c;聚焦傅里叶变换法与滤波反投影法&#xff08;FBP&#xff09;两大核心算法的代码实现与原理验证。资源包共3个文件&#xff08;2个MATLAB源码文件.m 1个说明文档.t…

作者头像 李华
网站建设 2026/9/12 2:42:52

DeepSeek Harness 从零搭建 AI Agent:文档自动读取与总结实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华