作者:Buse Şenol
文档理解和转换技术,已经成为当前数字化流程中最关键的组成部分之一。SmolDocling,是这个领域的一个新突破,它是一个超紧凑的视觉模型,专为端到端文档转换而设计。
这个模型的论文是由 HuggingFace 和 IBM 联合发布的,于 3 月 14 日发表。如果你现在准备好了,我们就一起来看看这篇论文里写了什么,它又是怎么实现的。
什么是 SmolDocling?
SmolDocling 是一个从 Hugging Face 的 SmolVLM-256M 模型衍生出来的超紧凑模型,比其他视觉模型小了 5 到 10 倍。这个模型只有 2.56 亿个参数,但它的表现可以和比它大 27 倍的视觉模型相媲美。
SmolDocling 的一个重要特点是它可以完整地表达文档页面的内容和结构。这个模型不仅能抓住内容,还能理解文档的结构,以及页面中各个元素的定位。
DocTags 格式
SmolDocling 使用一种叫做 "DocTags" 的格式来进行文档转换。DocTags 是一种类似 XML 的标记语言,用来定义文档元素的关键属性。这个格式包括以下几个关键特征:
DocTags 的基本结构
DocTags 定义了文档元素的三个基本属性。元素类型(Element type)指的是文本、图片、表格、代码、标题、脚注等内容成分的种类。页面上的位置(Position on page)表示该元素在页面上的具体放置位置,说明它在哪儿。内容(Content)表示该元素的文本或结构性内容,也就是它实际包含的信息。
DocTags 的工作原理
表示文档内容的基本元素被 XML 风格的标签包围。
每个元素还可以包含额外的位置标签,用于编码它在页面上的位置。这些位置信息表示该元素的边界框,格式如下:
<loc_x1><loc_y1><loc_x2><loc_y2>。这里:
• x1, y1:边界框左上角的坐标
• x2, y2:边界框右下角的坐标
嵌套结构
DocTags 还通过嵌套标签提供更多信息。图片和表格可以包含自己的标题,通过 caption 标签来表示。表格结构通过 OTSL 标签表示,用于定义表格数据的组织形式。列表可以嵌套列表项,实现信息的层级组织。代码块和图片可以带有分类信息,比如编程语言或内容类型,提供图像或代码内容的上下文。
DocTags 的优势
DocTags 格式相比标准 HTML 或 Markdown 有显著优势。
消除歧义:明确的标签结构可以清晰定义文档元素,减少不确定性。
结构与内容分离:清楚地区分文档的组织框架和文字信息。
页面布局保留:通过位置标签捕捉空间关系,保留原始文档外观。
Token 优化:减少总 token 数量,提高处理效率。
建模性能提升:为图像转序列模型提供结构清晰、数据一致的输入,有助于更好的学习和生成输出。
架构结构
SmolDocling 的架构包含一个完整的流程,用于将文档图像转换成 DocTags 格式。
输入阶段:输入的是页面图像,也就是待处理的文档页面,以及转换指令,比如"Convert to Docling."
视觉处理阶段:使用视觉编码器将页面图像转化为视觉嵌入向量,接着通过投影和池化操作把这些视觉嵌入转为更紧凑的格式。
嵌入集成阶段:将投影后的视觉嵌入(视觉信息的结构化表示)与由文本指令生成的文本嵌入结合。这两种嵌入合并后作为模型输入。
输出生成阶段:使用 LLM(语言模型)处理嵌入,输出 DocTags 格式的数据,这是一种类似 XML 的标记语言,用于表达文档的结构与内容。
这个架构把图像理解与文本生成能力结合起来,实现了文档从头到尾内容和结构的还原。特别是由于 LLM 的自回归特性,它可以非常准确地将复杂文档结构转换成 DocTags 格式。
应用场景
SmolDocling 可用于多种文档理解任务。它支持文档分类,能自动将不同类型的文档进行归类。系统可以进行 OCR(光学字符识别),将图片上的印刷或手写文字转换成机器编码文本。布局分析能力可以理解文档的结构组织,识别各个部分及其关系。表格识别可以提取和解析表格数据,并保留其结构和关系。
SmolDocling 在关键值提取方面也很出色,能识别文档中重要的信息对。系统还具备图形理解功能,解释数据的可视化表示及其含义。公式识别能力让它能处理并转换数学公式为结构化格式。该模型在提取代码列表、表格、图形和公式等复杂文档元素方面表现尤为突出,使其适合处理高复杂度文档结构。
训练与数据集
在开发 SmolDocling 的过程中,团队使用了很多现有数据集,并在不够用的地方创建了自有数据并开放共享。训练中使用了数据增强技术,还特别准备了用于理解代码列表、公式和图形的专门数据集。
与众不同的特性
SmolDocling 有几个与其他文档理解模型不同的关键特点:
阅读顺序保留:文档中的阅读顺序至关重要,尤其是包含表格和图形等元素的内容。SmolDocling 能保持这种语义完整性。
整体式方法:其他系统通过将转换问题分为多个子任务来取得成功,但这种方式难以调试和泛化。SmolDocling 通过提供端到端的方案解决了这个问题。
位置感知:模型能通过边界框的形式对文档元素的页面位置进行编码,保留页面布局信息。
性能评估
SmolDocling 在 DocLayNet 上进行了测试,使用了多种指标,比如编辑距离、F1 分数、精确度、召回率、BLEU 和 METEOR 来衡量文本准确性,取得了优秀成绩。下表展示了模型和其他模型的对比表现:
根据 DocLayNet 的评估,SmolDocling 模型在整页转换中取得了最低编辑距离(0.48)和最高 F1 分数(0.80)。它在精确度、召回率、BLEU 和 METEOR 指标上也超过了其他模型。
在代码列表任务中,SmolDocling 表现极佳,编辑距离为 0.11,F1 分数为 0.92。在公式识别任务中,它与 GOT 模型表现相当(0.11 编辑距离,0.95 F1 分数,0.96 精确度)。
尤其值得注意的是,SmolDocling 的结果甚至比很多更大的模型(比如 Qwen2.5 VL,7B 参数)还要好。这证明了该模型架构的高效性,以及 DocTags 格式在结构化文档识别任务中的成功。
SmolDocling 的集成与使用
在应用部分,我们将运行开发者分享的示例代码。我这里插一句:确保你的 PIL 库是最新版的,不然你会像我一样折腾一整天都不知道问题出在哪儿 :D
/// script
requires-python = ">=3.12"
dependencies = [
"docling-core",
"mlx-vlm",
"pillow",
]
///
from io import BytesIO
from pathlib import Path
from urllib.parse import urlparse
import requests
from PIL import Image
from docling_core.types.doc import ImageRefMode
from docling_core.types.doc.document import DocTagsDocument, DoclingDocument
from mlx_vlm import load, generate
from mlx_vlm.prompt_utils import apply_chat_template
from mlx_vlm.utils import load_config, stream_generate
设置
SHOW_IN_BROWSER = True # 导出输出为 HTML 并在浏览器中打开。
加载模型
model_path = "ds4sd/SmolDocling-256M-preview-mlx-bf16"
model, processor = load(model_path)
config = load_config(model_path)
准备输入
prompt = "Convert this page to docling."
image = "sample.png"
加载图像资源
if urlparse(image).scheme != "":
response = requests.get(image, stream=True, timeout=10)
response.raise_for_status()
pil_image = Image.open(BytesIO(response.content))
else:
pil_image = Image.open(image)
应用对话模板
formatted_prompt = apply_chat_template(processor, config, prompt, num_images=1)
生成输出
print("DocTags: \n\n")
output = ""
for token in stream_generate(
model, processor, formatted_prompt, [image], max_tokens=4096, verbose=False
):
output += token.text
print(token.text, end="")
if "" in token.text:
break
print("\n\n")
构建文档
doctags_doc = DocTagsDocument.from_doctags_and_image_pairs([output], [pil_image])
doc = DoclingDocument(name="SampleDocument")
doc.load_from_doctags(doctags_doc)
导出各种格式
Markdown
print("Markdown: \n\n")
print(doc.export_to_markdown())
HTML
if SHOW_IN_BROWSER:
import webbrowser
out_path = Path("./output.html")
doc.save_as_html(out_path, image_mode=ImageRefMode.EMBEDDED)
webbrowser.open(f"file:///{str(out_path.resolve())}")
这段代码会分析图像内容,并用 DocTags 生成结构化说明。接着使用这些标签创建文档,并导出为 Markdown 或 HTML 格式。
导入的库:
- requests:用于从 URL 下载图像
- PIL (Pillow):用于打开和处理图像
- docling_core:用于使用 DocTags 创建和导出文档
- mlx_vlm:用于图像处理模型
设置与模型加载
- SHOW_IN_BROWSER:是否自动打开 HTML 输出
- load() 和 load_config():加载模型和配置文件
准备输入数据
- prompt:模型如何处理图像的文本提示
- image:要分析的图像 URL 或路径
下载与打开图像
- 检查 URL 是否有效
- requests.get():下载图像
- Image.open():打开图像
- convert("RGB"):转换为 RGB,避免透明图像问题
应用提示模板
- apply_chat_template():格式化提示语
- num_images=1:只使用一张图像
生成 DocTags(模型输出)
- stream_generate():逐步生成模型输出
- token.text:模型生成的文本
- output += token.text:拼接输出
- print(token.text, end=""):打印输出
- 如果检测到 就停止生成
用 DocTags 构建文档
- DocTagsDocument.from_doctags_and_image_pairs():将 DocTags 与图像匹配
- DoclingDocument():创建新文档
- load_from_doctags():加载 DocTags 内容到文档
导出为 Markdown 和 HTML
- export_to_markdown():导出为 Markdown 并打印
- save_as_html():生成 HTML 文件
- webbrowser.open():在浏览器中打开
下面是文档示例:
SmolDocling 的输出如下:
特别从表格的角度来看,这个结果还不错。由于原始文档中模拟器级别(Simulator Level)的值是居中的,所以有些数据有些偏移,但整体结构还是保留下来了。
结语
SmolDocling 是一个创新型模型,在文档转换领域凭借其紧凑的体积和强大的性能脱颖而出。多亏了 DocTags 格式和端到端架构,它可以非常准确地表达文档的内容和结构特征。这个模型尤其适用于资源受限的环境或需要高扩展性的应用。
在性能评估中得到的结果显示,SmolDocling 在整页转换、代码列表和公式识别方面表现尤为强劲。仅凭 2.56 亿参数就能在多个任务上与更大的模型竞争,证明了该模型设计和 DocTags 格式的高效性。
像 SmolDocling 这样紧凑高效的模型,在现代文档处理系统的开发中,将通过在性能和资源使用之间实现优化,推动数字化流程更广泛的应用。