小巧玲瓏的SmolDocling:超輕量級(jí)視覺語言模型
简单的文档易于处理。例如,如果我们有一个PDF,可以使用编程语言逐行读取并提取内容。但对于复杂的文档如简历、研究论文、成绩单或账单,情况就变得复杂了。这些文档不仅仅是纯文本,它们包含表格、品牌标志和结构化的布局,这些布局传达了更多的信息。如果是图像呢,?从这种图像中提取数据需要的不仅仅是基本的文本阅读能力。通常的方法依赖于将任务分解为子任务(OCR、布局分析、表格识别),这些方法需要手工制作的流程,难以在不同类型文档之间进行泛化。另一方面,大型视觉-语言模型(如GPT-4和Qwen-VL)提供端到端的解决方案,但伴随着高昂的计算成本和诸如生成幻觉等问题。这促使人们寻求更小、更高效的替代方案,以处理复杂的文档提取而不受这些缺点的影响。
终于轮到SmolDocling了!!
来源:作者的这张图
文档语言Docling 是一个 一个由 IBM 开发的开源工具包,设计用于解析文档(如 PDF、DOCX 等格式的文档)并将其转换为 Markdown 或 JSON 等格式,使它们更容易与生成式 AI 应用程序一起使用。它具有 命令行界面和 Python 接口,并易于设置。
但是我们现在不谈这个工具包了。如果你感兴趣,可以看看这个链接。这篇文章主要讲的是 SmolDocling VLM (一个小型文档处理工具)。
IBM与HuggingFace的合作IBM Research 与 Hugging Face 携手推出了 SmolDocling,这是一种 超紧凑型的 视觉-语言模型(VLM),旨在简化复杂文档向结构化、机器可读格式的转换过程。该模型于 2025年3月14日 正式发布,由 IBM Research 团队与 Hugging Face 联合开发。
尽管只有2.56亿参数,SmolDocling的表现与那些比其大27倍的模型相当,同时使用了更少的计算资源。它引入了一种新的DocTags(文档标签) 标记格式,增强了对文档结构的识别和处理。本文将探讨SmolDocling的架构,探讨训练所用的数据集,并看看它是否可能改变各行业的文档处理方式。
注: 该SmolDocling-256基于SmolVLM-256M。
SmolVLM-256M,这是一个小型视觉语言模型SmolVLM-256M 是世界上最小的多模态模型之一。它可以接受任意的图像和文本输入序列来生成文本输出。它被设计为高效。SmolVLM 可以回答有关图像的问题,描述图像内容,或转录文本内容。其轻量级架构使其适合于设备端应用,同时在多模态任务上保持强大的表现。仅需不到 1GB 的 GPU 内存即可对一张图像进行推理。
SmolDocling[^1][^1]: "SmolDocling" 是一个新造词或专有名词,在中文中没有直接翻译,此处保留原文。根据上下文,可能会需要进一步解释其含义。
SmolDocling 是一个基于 Hugging Face 的 SmolVLM-256M 架构的项目,包括两个关键组件:
- 视觉编码器(SigLIP,93M参数): 图像处理。
- 轻量语言模型(SmolLM-2,135M参数): 能够理解和生成结构化文本。
- DocTags 高效分词: 引入 DocTags,一种紧凑高效的文档表示形式,兼容 DoclingDocuments。
- OCR(光学字符识别): 准确地从图像中提取文本。
- 布局和定位: 保持文档结构的同时,捕获元素边界框。
- 代码识别: 识别和格式化代码块,保留缩进。
- 公式识别: 识别并处理数学表达式。
- 图表识别: 提取并解释图表中的数据。
- 表格识别: 支持表格的结构化提取,包括行和列标题。
- 图分类: 区分图形和其它图形元素。
- 图注关联: 将图注与其相关图像和图形关联起来。
- 列表分组: 组织并准确结构化列表项。
- 全页转换: 转换整页内容,包括代码、公式、表格和图表等所有元素。
- 带边界框的 OCR: 在指定的边界框内执行 OCR。
- 通用文档处理: 能够处理科学和非科学文档。
- 无缝 Docling 集成: 与 Docling 平滑集成,支持多种格式的导出。
- 使用 VLLM 进行快速推理: 提供快速处理速度,平均每页在 A100 GPU 上耗时仅 0.35 秒。
当收到一个文档图像时,SmolDocling将其转换为DocTags,这是一种新的标记格式,可以捕捉页面上的所有内容,包括文本、表格、图表和图片、代码和方程式。它甚至使用边界框来保留空间位置信息,这有助于模型理解页面上每个元素的具体位置。
- 模型会将文档的图像进行编码。
- 它将图像的压缩表示(也就是图像嵌入)进行投影和池化。
- 这些嵌入信息会和文本提示结合在一起。
- 自回归语言模型(逐步预测下一个信息片段)会生成特定的DocTags序列。
SmolDocling 设计为既 快速又高效。它采用 每4096个像素对应一个标记 的方式,意味着它可以将大范围图像区域转换为更小、更易管理的格式。通过一种特殊的 像素重组方法,它可以将 512×512 的图像块压缩成仅64个视觉标记,从而在减轻处理负担的同时保留重要细节。
来自 arXiv 的 SmolDocling/SmolVLM
该模型仅支持序列最多包含8,192个标记,并且可以同时处理三页内容,在NVIDIA A100 GPU上,每页只需0.35秒,使其成为处理复杂文档理解任务中速度最快、效率最高的模型之一。
文档标签此研究的一个关键创新是 DocTags 格式,一种受 OTSL(优化表格结构语言) 启发的结构化标记格式。与 HTML 或 Markdown 不同,这些格式在文档转换过程中可能会丢失信息或产生歧义,DocTags 明确区分内容与结构,从而减少图像到序列转换模型的混淆。
它使用 XML 风格的标签定义块类型(例如,<text>,<table>,<code>,<formula>),并嵌套位置标签(例如,<loc_x1><loc_y1><loc_x2><loc_y2>)来编码在 0-500 网格上的边界框。
特殊块,如表格,包含 OTSL 词汇表中的单元格跨度和表头,代码片段则保留其缩进和换行,例如,图像则包含分类标签(如 <pie_chart>)。
这种格式使SmolDocling能够将相关元素(如图例和图表或嵌套列表项)关联起来,同时支持整页转换和对裁剪元素的单独预测。结果是一个丰富且高度机器可读的表示,其完整性和精确度都优于传统格式。
训练用的数据集如下这个紧凑型模型是通过其庞大的训练数据集构建的,其中许多数据集是由研究团队新创建或增强以弥补公开资源中的不足。现有如IIT-CDIP和CCpdf这些数据集缺乏对各种页面元素的全面标注,从而促使团队贡献了以下内容:
- DocLayNet-PT :一个源自DocFM数据集的140万页预训练数据集,通过使用Docling解析丰富了弱标注的布局、表格、代码、公式和图表。
- SynthDocNet :从维基百科内容生成的25万张合成页面,提供可控布局和字体变化的多样性。
- SynthChartNet :从FinTabNet表格中用Matplotlib、Seaborn和Pyecharts生成的250万个图表(折线图、饼图、柱状图、堆积柱状图)。
- SynthCodeNet :涵盖56种编程语言的930万个代码片段,使用LaTeX和Pygments渲染以实现视觉多样性。
- SynthFormulaNet :从arXiv和公共数据集中提取的550万个标准化LaTeX公式,以120 dpi渲染,并采用随机样式。
这些数据集与公共语料库(如PubTables-1M和The Cauldron)结合使用,保证了SmolDocling在文档类型和任务上的灵活性。
性能和基准该性能是在多个任务领域与较大的视觉语言模型(VLMs),如Qwen2.5-VL(7B参数)、GOT(580M)和Nougat(350M)等进行了对比评估。
1) OCR 文字识别在全页文档转录(DocLayNet)任务中,SmolDocling 在 F1 评分上达到 0.80,而在 BLEU 评分上为 0.58,超过了 Qwen2.5-VL(F1 评分为 0.72,BLEU 评分为 0.46)。在代码列表上的 F1 评分为 0.92,而在方程式部分,其 F1 评分与领先者 GOT 的 0.95 相同。
2. 布局分析在DocLayNet上,SmolDocling的平均精度得分(mAP)分别为0.231,超过了Qwen2.5-VL的0.133,但都远不及人类的表现(0.82的水平)。
3) 表格结构识别根据TEDS指标,SmolDocling在FinTabNet上的得分为0.52,在PubTables-1M上的得分为0.65,尽管分辨率较低的挑战,仍与较大的模型相当。
4) 图表提取:SmolDocling在图表转表格任务中的TEDS得分为0.75,超越了Phi-3.5-vision(0.40)和SmolVLM(0.02),不过它比不上Granite Vision的表现(0.95)。
并且它擅长将文字说明与图表关联,保留代码缩进,以及避免常见于联合系统中的管道错误(这是文档处理的常规方法)。
但有时会产生错误的标签或令牌重复的问题,这是自回归模型的典型问题,也可能是因为尺寸较小。
在Google Colab上做测试
现在我们用配备T4 GPU的Google Colab Notebook来测试一下Docling。
!pip install transformers torch docling_core
注释:此命令用于安装transformers、torch和docling_core库。
import torch
from docling_core.types.doc import DoclingDocument
from docling_core.types.doc.document import DocTagsDocument
from transformers import AutoProcessor, AutoModelForVision2Seq
from transformers.image_utils import load_image
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
# 加载示例图片
image = load_image("sample.png")
# 初始化处理程序和模型
processor = AutoProcessor.from_pretrained("ds4sd/SmolDocling-256M-preview")
model = AutoModelForVision2Seq.from_pretrained(
"ds4sd/SmolDocling-256M-preview",
torch_dtype=torch.bfloat16,
_attn_implementation="eager", # 适用于不支持flash attention功能的GPU
).to(DEVICE)
# 定义消息列表
messages = [
{
"role": "user",
"content": [
{"type": "image"},
{"type": "text", "text": "your prompt"}
]
},
]
# 准备输入
prompt = processor.apply_chat_template(messages, add_generation_prompt=True)
inputs = processor(text=prompt, images=[image], return_tensors="pt")
inputs = inputs.to(DEVICE)
# 生成结果
generated_ids = model.generate(**inputs, max_new_tokens=8192)
prompt_length = inputs.input_ids.shape[1]
trimmed_generated_ids = generated_ids[:, prompt_length:]
doctags = processor.batch_decode(
trimmed_generated_ids,
skip_special_tokens=False,
)[0].lstrip()
# 使用生成的标记创建文档对象
doctags_doc = DocTagsDocument.from_doctags_and_image_pairs([doctags], [image])
print(doctags)
# 创建名为'Document'的docling文档
doc = DoclingDocument(name="Document")
doc.load_from_doctags(doctags_doc)
print(doc.export_to_markdown())
示例输入
图片来自作者
VLM 输出- 当我给出“提取包含地点的数据”的提示时,模型会生成如下内容:.
<chart><loc_0><loc_0><loc_500><loc_500><hbar_categorical><fcel>特性<fcel>OpenAI 搜索<fcel>Perplexity AI<nl><fcel>创新性<fcel>高<fcel>中等<nl><fcel>引用来源量<fcel>有限<fcel>全面<nl><fcel>回答深度<fcel>详细<fcel>简洁<nl><fcel>实时数据量<fcel>中等<fcel>优秀<nl><fcel>用户界面设计<fcel>多功能<fcel>简洁流畅<nl></chart><end_of_utterance>
提到 OCR,它就会给出
<ocr> 搜索困惑 OpenAI 搜索 搜索困惑 AI 创意 高 中等 引用来源 有限 全面 回答深度 详细 简短 实时数据流 中等 优秀 用户界面 多功能 简洁流畅 </ocr><end_of_utterance>
你也可以试试用手写的账单看看模型表现怎么样。
但在T4 GPU上运行这个模型时会碰上一个问题,因为它不支持Flash注意力机制。
快速注意力机制Flash注意力机制是一种高级算法,旨在提升 transformer 模型中注意力机制的效率,显著提升了训练和推理效率。
请参阅论文FlashAttention:快速且内存高效的确切注意力机制与IO感知以获取更多信息。
在Colab的T4 GPU上运行时遇到错误尽管原始的Hugging Face代码提到可以在else条件中启用即时执行模式,但仍然会导致错误,如下所示。
来源:作者
解决办法为了解决这个问题,你需要直接修改代码中的一行。
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章