文档理解和转换技术已成为当今数字化过程中最关键的组成部分之一。HuggingFace与IBM研究院近期联合发布的SmolDocling模型(论文发布于3月14日),以其"小身材大能量"的特性,为文档处理领域带来了全新可能。
论文:https://arxiv.org/pdf/2503.11576
什么是 SmolDocling?
SmolDocling 是一种超紧凑模型,源自 Hugging Face 的 SmolVLM-256M 模型,比其他视觉模型小 5-10 倍。该模型仅包含 2.56 亿个参数,其性能可与大 27 倍的视觉模型相媲美。
SmolDocling 最重要的特性之一是它能够完整地表示文档页面的内容和结构。该模型不仅可以捕获内容,还可以捕获文档结构和页面内元素的定位。
模型亮点:轻量化设计的性能奇迹
-
极致压缩:基于SmolVLM-256M模型打造,体积仅为同类视觉模型的1/5-1/10
-
强悍表现:2.56亿参数实现27倍规模模型的处理能力
-
全能解析:同步捕获文档内容、版式结构和元素空间定位
核心技术:DocTags标记语言
这套类XML的智能标记系统,通过三层维度精准还原文档信息:
-
元素类型:智能识别文本/图像/表格/代码等12类内容组件
-
空间坐标:采用<loc_x1_y1_x2_y2>定位体系,精确到像素级
-
内容载体:完整保留原始数据与层次结构
支持:
描述 | 操作说明 | 评论 |
---|---|---|
完全转换 | 将此页转换为文档。 | DocTags 表示 |
图表 | 将图表转换为表格。 | (例如,) |
公式 | 将公式转换为 LaTeX。 | (例如,<公式>) |
代码 | 将代码转换为文本。 | (例如, |
表格 | 将表转换为 OTSL。 | (例如)OTSL:Lysak 等人,2023 年 |
DocTags 格式
SmolDocling 使用一种文档转换格式“DocTags”。DocTags 是一种类似 XML 的标记语言,用于定义文档元素的关键属性。此格式包括以下主要功能:
DocTags 的基本结构
DocTag 定义了文档元素的三个基本属性。元素类型是指文本、图像、表格、代码、标题、脚注和其他类型的内容组件。页面上的位置表示元素在页面上的确切位置并显示其所在位置。内容表示元素的文本或结构内容,并包含元素中包含的实际信息。
DocTags 的工作原理
代表文档内容的基本元素被 XML 样式的标签包围。
每个元素都可以包含额外的位置标签,用于编码其在页面上的位置。此位置信息表示元素在页面上的边界框,并以以下格式显示:<loc_x1><loc_y1><loc_x2><loc_y2>
。这里:
-
x1,y1:边界框左上角的坐标
-
x2,y2:边界框右下角的坐标
这种结构化处理方式,使得文档数字化过程既保留人类可读性,又具备机器可解析的双重优势,为后续的智能检索、内容重组等应用场景铺平道路。
嵌套式文档结构解析
DocTags采用创新的"标签套娃"设计,实现多层次文档元素表征:
-
复合元素处理:图像/表格自动关联标题标签,表格结构通过OTSL标签实现矩阵式解析
-
层级化组织:支持列表项嵌套,完美呈现项目符号、编号等多级结构
-
元数据扩展:代码块标注编程语言,图像标记内容类型,为后续处理提供语义上下文
DocTags 通过嵌套标签提供附加信息。图像和表格可以包含自己的标题,这些标题由标题标签表示。表格结构由 OTSL 标签表示,有助于定义表格数据的组织。列表可以嵌套列表项,从而实现信息的分层组织。代码块和图像可以携带分类信息,例如编程语言或内容类型,提供有关视觉或代码内容性质的背景信息。
DocTags 的优点
与传统标记语言相比,DocTags展现出五大突破性优势:
特性维度 | 传统格式 | DocTags解决方案 |
---|---|---|
结构清晰度 | 易产生二义性 | XML式严格标签定义 |
内容与样式分离 | 耦合度高 | 双通道独立编码 |
版式还原 | 仅保留基础排版 | 像素级坐标定位 |
处理效率 | 冗余标记多 | 智能标记压缩技术 |
模型适配性 | 需额外预处理 | 原生适配视觉-语言模型 |
DocTags 格式与标准 HTML 或 Markdown 等格式相比具有显著优势。通过清晰的标记结构精确定义文档元素,减少歧义可消除不确定性。结构和内容的分离明确区分了文档的组织框架和文本信息。页面布局的保留通过捕获空间关系的位置标记来保持原始文档外观。标记优化可最大限度地减少总标记数,从而提高处理效率。建模性能通过提供结构良好的一致数据来增强图像到序列模型的功能,以便更好地学习和生成输出。
技术架构
SmolDocling采用创新的多模态处理架构,实现文档图像到结构化数据的智能转换:
智能处理流水线
1. 双模态输入系统
-
视觉输入:支持300-600dpi高清文档图像
-
文本指令:接受自然语言提示(如"转换为可编辑文档并保留表格结构")
2. 视觉特征工程
-
采用分层卷积编码器提取视觉特征
-
通过空间注意力机制强化关键区域识别
-
特征压缩:使用自适应池化技术保留多尺度信息
3. 跨模态融合层
-
文本-视觉特征对齐:采用交叉注意力机制
-
动态权重调节:根据任务复杂度自动平衡模态贡献
4. 结构化输出生成
-
基于Transformer的自回归解码
-
实时语法校验确保DocTags格式规范
-
支持增量式输出,提升处理效率
SmolDocling 的架构具有将文档图像转换为 DocTags 格式的全面流程。输入阶段涉及页面图像(即要处理的文档页面)和提供转换指令(例如“Convert to Docling”)的文本提示。视觉处理阶段利用视觉编码器将页面图像转换为视觉嵌入,然后进行投影和池化操作,将这些视觉嵌入转换为更紧凑的格式。
嵌入集成阶段将投影视觉嵌入(即视觉信息的结构化表示)与从文本提示中派生的文本嵌入相结合。这两种嵌入类型合并以创建模型的输入。输出生成阶段采用 LLM(语言模型)来处理嵌入以生成 DocTags 格式的输出,这是一种类似于 XML 的标记语言,表示文档的结构和内容。
该架构有效地结合了图像理解和文本生成功能,端到端地保留了文档的内容和结构属性。特别是由于 LLM 的自回归特性,它可以准确地将复杂的文档结构转换为 DocTags 格式。
应用领域
SmolDocling 可用于各种文档理解任务。它支持文档分类,帮助自动对不同类型的文档进行分类。系统执行 OCR(光学字符识别)将图像中的印刷或手写文本转换为机器编码的文本。布局分析功能使其能够理解文档的结构组织,识别不同的部分及其关系。表格识别可以提取和解释表格数据,保留其结构和关系。
SmolDocling 还擅长键值提取,识别文档中的重要信息对。该系统提供图形理解功能,解释数据的视觉表示及其含义。方程式识别使其能够处理数学公式和表达式并将其转换为结构化格式。该模型在提取复杂文档元素(例如代码列表、表格、图形和方程式)方面表现出色,使其能够灵活处理复杂的文档结构。
训练和数据集
在 SmolDocling 的开发过程中,团队使用了许多现有数据集,并在不足之处创建了自己的数据并将其作为开源提供。在训练模型时使用了数据增强技术,并准备了特殊数据集以更好地理解代码列表、方程式和图表。
区别性特征
SmolDocling 与其他文档理解模型的区别在于以下一些关键特征:
-
阅读顺序保存:文档中的阅读顺序至关重要,尤其是对于包含表格和图形等元素的内容。SmolDocling 能够保留这种语义完整性。
-
整体方法:虽然其他系统通过将转换问题划分为几个子任务取得了巨大成功,但它们可能难以调整和推广。SmolDocling 通过提供端到端解决方案克服了这个问题。
-
位置感知:该模型能够通过以边界框的形式编码文档元素的位置来保留页面布局信息。
效果评估
SmolDocling 已在 DocLayNet 上进行了测试,使用各种指标(例如编辑距离、F1-Score、精确度、召回率、BLEU 和 METEOR)来衡量文本准确性,并取得了良好的效果。下表显示了该模型与其他模型相比的性能:
根据 DocLayNet 上的评测,SmolDocling 模型的编辑距离 (0.48) 最小,F1-Score (0.80) 最高,尤其是在全页面转换方面。在准确率、召回率、BLEU 和 METEOR 指标方面,它也优于其他模型。
SmolDocling 在代码列表中取得了非常高的成功,编辑距离为 0.11,F1-Score为 0.92。它在方程式识别任务中达到了与 GOT 模型相似的性能水平(编辑距离为 0.11,F1 分数为 0.95,精度为 0.96)。
SmolDocling 与更大的模型(例如具有 7B 参数的 Qwen2.5 VL)相比取得了更好的结果。这表明了模型架构的有效性以及 DocTags 格式在结构化文档识别任务中的成功。
SmolDocling 的集成和使用
入门
要使用 Docling,只需docling
从包管理器安装,例如 pip:
pip install docling
适用于 macOS、Linux 和 Windows 环境。x86_64 和 arm64 架构。
要使用 python 转换单个文档,请使用convert()
,例如:
from docling.document_converter import DocumentConverter
source = "https://arxiv.org/pdf/2408.09869" # document per local path or URL
converter = DocumentConverter()
result = converter.convert(source)
print(result.document.export_to_markdown()) # output: "## Docling Technical Report[...]"
更多操作可参加文档:https://docling-project.github.io/docling/usage/
进阶应用
Tips: 确保 PIL 库是最新的
# /// 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
## Settings
SHOW_IN_BROWSER = True# Export output as HTML and open in webbrowser.
## Load the model
model_path = "ds4sd/SmolDocling-256M-preview-mlx-bf16"
model, processor = load(model_path)
config = load_config(model_path)
## Prepare input
prompt = "Convert this page to docling."
image = "sample.png"
# Load image resource
if urlparse(image).scheme != "": # it is a URL
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)
# Apply chat template
formatted_prompt = apply_chat_template(processor, config, prompt, num_images=1)
## Generate output
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"</doctag>"in token.text:
break
print("\n\n")
# Populate document
doctags_doc = DocTagsDocument.from_doctags_and_image_pairs([output], [pil_image])
# create a docling document
doc = DoclingDocument(name="SampleDocument")
doc.load_from_doctags(doctags_doc)
## Export as any format
# 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:指定将使用单个图像。
生成 DocTag(模型输出)
stream_generate(): 逐步从模型生成输出。
token.text: 提供模型生成的每一段文本。
output += token.text: 合并输出。
print(token.text , end=""): 将输出打印到屏幕上。
if " </doctag>" in token.text :如果检测到</doctag> 标签,则停止该过程。
使用 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(): 在浏览器中打开生成的HTML文件。
下面提供了该文件的一个示例:
SmolDocling 输出如下:
尤其是当从表格角度检查它时,结果还不错。由于模拟器级别的值在原始文档中居中,因此存在一些偏移数据,但整体结构得以保留。
写在最后
SmolDocling 是一种创新模型,在文档转换领域以其紧凑的尺寸和强大的性能脱颖而出。由于DocTags 格式和端到端架构,它可以高精度地表示文档的内容和结构特征。该模型在资源受限的环境或需要高可扩展性的应用程序中尤其具有巨大优势。
性能评估结果表明,SmolDocling 尤其在全页转换、代码列表和公式识别方面表现出色。即使与只有 2.56 亿个参数的大型模型相比,它也能取得具有竞争力的结果,这证明了模型设计和 DocTags 格式的有效性。
在现代文档处理系统的开发中使用 SmolDocling 等紧凑高效的模型将通过在性能和资源使用方面提供优化,促进数字化流程的更广泛适用性。