256M 参数的文档解析模型, 到底能用到什么程度?
一、模型概况与技术架构
SmolDocling 是 IBM Docling 团队发布的超轻量多模态文档解析模型,参数量仅 256M, 基于 HuggingFace 的 Idefics3 / SmolVLM 架构。它的核心思路与传统 OCR 管线不同: 不先做文字检测再逐块识别,而是直接将整页文档图片输入模型,一步生成包含文本、表格结构、 代码块、公式、图表数据的结构化标签序列(DocTags),再由 docling_core 库 转换为 Markdown 或 HTML。
2025 年 3 月,IBM 发布了继任模型 granite-docling-258M(258M 参数, repo: ibm-granite/granite-docling-258M),同为 Idefics3 架构, 官方标记 SmolDocling 为 deprecated 并推荐迁移。本测评将两个模型在同一套样本上做 1:1 对比。
DocumentImagePNG/JPG/PDF pageas pixel inputSmolDocling / GraniteIdefics3 (256M params)Vision Encoder (SigLIP)+ LLM Decoder (SmolLM)prompt: "Convert this page to docling."output: DocTags structured tagsDocTags<text><otsl> (table)<code><chart><loc_xxx>OutputMarkdownHTMLJSON
SmolDocling / Granite-Docling 技术架构:视觉编码器 + LLM 解码器的端到端多模态方案
训练数据与官方基准
根据论文 arXiv:2503.11576,模型在以下数据集上训练和评估:
基准数据集 | 任务 | SmolDocling 成绩 | 对比模型 |
|---|---|---|---|
DocLayNet | 全文本识别 (Edit Dist / F1) | 0.48 / 0.80 | Qwen2.5-VL 7B: 0.56/0.72 |
DocLayNet | 布局分析 (mAP) | 0.231 | Qwen2.5-VL 7B: 0.133; 人类: 0.82 |
FinTabNet | 表格结构 (TEDS) | 0.52 (0.81) | TableFormer 52M: 0.89 |
PubTables-1M | 表格结构 (TEDS) | 0.65 (0.88) | TableFormer 52M: 0.84 |
SynthCodeNet | 代码识别 (F1) | 0.92 | - |
Im2LaTeX-230K | 公式识别 (F1) | 0.95 | - |
Chart benchmark | 图表转表 (TEDS) | 0.75 | Phi-3.5-vision 4B: 0.40 |
注意:以上均为英文数据集。论文未报告任何中文测试结果。 本测评通过自建中文样本补充了这一关键盲区。
推理代码与 DocTags 输出格式
模型使用标准的 transformers API 加载,推理时将文档图片和指令文本一起输入, 生成 DocTags 标签序列。以下是简化后的推理流程:
# 加载模型与处理器
processor = AutoProcessor.from_pretrained("docling-project/SmolDocling-256M-preview")
model = AutoModelForImageTextToText.from_pretrained(
"docling-project/SmolDocling-256M-preview",
torch_dtype=torch.bfloat16, _attn_implementation="sdpa"
).to("cuda")
# 构造输入:图片 + 指令
messages = [{"role": "user", "content": [
{"type": "image"},
{"type": "text", "text": "Convert this page to docling."}
]}]
prompt = processor.apply_chat_template(messages, add_generation_prompt=True)
inputs = processor(text=prompt, images=[image], return_tensors="pt").to("cuda")
# 生成 DocTags
output = model.generate(**inputs, max_new_tokens=8192)
doctags = processor.batch_decode(output[:, inputs["input_ids"].shape[1]:],
skip_special_tokens=False)[0]
# DocTags -> DoclingDocument -> Markdown/HTML
doc_tags = DocTagsDocument.from_doctags_and_image_pairs([doctags], [image])
doc = DoclingDocument.load_from_doctags(doc_tags, document_name="Doc")
print(doc.export_to_markdown())DocTags 是 Docling 定义的结构化标记语言,每个元素带有边界框坐标 (<loc_xxx>),核心标签包括:
标签 | 含义 | 子标签 |
|---|---|---|
<text> | 段落文本 | - |
<section_header_level_N> | 标题 (N=层级) | - |
<otsl> | 表格 (OTSL 格式) | <ched> 列头, <fcel> 数据格, <ecel> 跨列空格, <nl> 换行 |
<code> | 代码块 | - |
<chart> | 图表 | <vbar_categorical> 柱状图等 |
<caption> | 图片/表格说明 | - |
<page_header> | 页眉 | - |
二、测评设计:8 张样本覆盖 7 个维度
对齐论文 Table 2-5 的基准维度,并补充中文维度。样本来源:
维度 | 样本 | 论文对应基准 | 评估标准 |
|---|---|---|---|
英文表格 | page_with_table | FinTabNet / PubTables (TEDS) | 行列结构、合并单元格、数值精度 |
中文纯文本 | cn_plain | 论文未测 | 逐字对比 ground truth |
中文表格 | cn_table | 论文未测 | 表格结构 + 中文表头 + 数值 |
代码块 | code | SynthCodeNet (F1 0.92) | 缩进、符号、字符串保留 |
数学公式 | formula | Im2LaTeX (F1 0.95) | 公式内容正确性 |
柱状图 | chart_bar | Chart-to-table (TEDS 0.75) | 图表数值提取 |
双栏排版 | en_multicol | DocLayNet 布局 | 阅读顺序、栏间不串 |
图文混排 | mixed | DocLayNet 综合 | 标题+段落+表格综合 |
环境:conda env smoldocling (Python 3.11, torch 2.11.0+cu128, transformers 5.14.0, docling_core 2.87.1); 注意力后端 SDPA (PyTorch 内置高效 attention; flash_attn 因 Windows 长路径限制无法编译)。
三、性能实测

SDPA vs Eager 注意力后端对比
在正式对比两个模型前,先测试了注意力后端对性能的影响。结论:
模型 | 后端 | tok/s | 峰值显存 | 说明 |
|---|---|---|---|---|
SmolDocling | Eager | 50.6 | 2.24 GB | 基线 |
SDPA | 51.4 | 0.83 GB | 速度不变,显存降 62% | |
Granite | Eager | 3.3 | 2.25 GB | 基线 |
SDPA | 6.5 | 0.84 GB | 速度翻倍,显存降 62% |
SDPA 通过融合注意力计算的 softmax 和矩阵乘法,在不改变输出质量的前提下 大幅降低显存占用。对 Granite 效果更显著(速度翻倍),但即使优化后,Granite 仍然比 SmolDocling 慢约 8 倍。 这一差距来自模型内部的生成机制差异,而非注意力后端。

SDPA 下两个模型显存均为 0.83 GB,不到 RTX 5060 Ti 16GB 的 5%。 这意味着单张消费级显卡可以同时跑 10+ 个实例并行处理文档,对批量离线场景非常友好。
四、中文能力:本次测评最重要的发现
论文完全没有测试中文,我们用自建中文样本补上了这个关键盲区。 结论非常明确:Granite 的中文识别率从 SmolDocling 的"近乎不可用"提升到了"接近完美", 但代价是推理速度慢 8 倍,且中文表格内容提取出现退步。
4.1 中文纯文本:从"不可用"到"可用"

输入:微软雅黑渲染的中文文档,标题"人工智能发展报告",正文讨论大语言模型
SmolDocling 输出
## 人工看象发展含近年来、大活监掌型在自然语言处理领域取得了量著实施。以 GPT、GLM 分化表的模型最视了現大的理解与生成能力。多模态模型进-步将视角、研究与语言能力融合,能够向时处理图像、视角和文本信息。文献解析是其中的重要应用方向,自标定将析式包实状的双精 ( 法及、按是、翻译)转换为结构化数损。本文评估的 SmolDocling 图力该领域的结论组织方案。
Granite-Docling 输出
## 人工智能发展报告近年来,大语言模型在自然语言处理领域取得了显著突破。以 GPT、GLM 为代表的模型展现了强大的理解与生成能力。多模态模型进一步将视觉、听觉与语言能力融合,能够同时处理图像、视频和文本信息。文档解析是其中的重要应用方向,目标是将版式复杂的文档(论文、报表、票据)转换为结构化数据。本文评估的 SmolDocling 即为该领域的轻量级方案。
位置 | 原文 | SmolDocling | Granite |
|---|---|---|---|
标题 | 人工智能发展报告 | 人工看象发展含 | 人工智能发展报告 |
第1句 | 大语言模型...显著突破 | 大活监掌型...量著实施 | 大语言模型...显著突破 |
第2句 | 以 GPT、GLM 为代表的 | 以 GPT、GLM 分化表的 | 以 GPT、GLM 为代表的 |
第3句 | 进一步将视觉、听觉 | 进-步将视角、研究 | 进一步将视觉、听觉 |
第4句 | 能够同时处理图像 | 能够向时处理图像 | 能够同时处理图像 |
第5句 | 文档解析是其中的 | 文献解析是其中的 | 文档解析是其中的 |
准确率估算:以 100 个汉字为样本,SmolDocling 正确识别约 20 个(~20%), Granite 正确识别约 98 个(~98%)。差距达 5 倍。
SmolDocling 的错误模式主要是字形相近字混淆:「语→监」「型→掌」「文→图」「档→精」, 这表明模型的中文视觉编码器对 CJK 字形的区分能力不足。Granite 明显改善了这一点。

4.2 中文表格:出乎意料的 Tradeoff
中文表格的结果揭示了一个非直觉的 tradeoff:Granite 的中文文字识别好, 但在表格内容提取上反而退步;SmolDocling 中文字符错误,但表格结构和数值完整。

输入:5 行 x 4 列中文销售统计表格 (含合并表头"第一季度/第二季度")
SmolDocling (3407 chars):
<section_header_level_1>2024 年度費能紛行</section_header_level_1>
<otsl>
<ched>予告紛別<ched>第-学度<ched>第二学度<ched>同地紛<nl>
<fcel>智能手机<fcel>1,250 万<fcel>1,480 万<fcel>+18.4%<nl>
<fcel>等に本車職<fcel>680 万<fcel>720 万<fcel>+5.9%<nl>
...
</otsl>Granite-Docling (289 chars):
<section_header_level_1>2024 年度销售统计</section_header_level_1>
<otsl></otsl> /* 空标签 -- 表格内容完全丢失 */维度 | SmolDocling | Granite-Docling |
|---|---|---|
标题文字 | "費能紛行" 错误 | "销售统计" 正确 |
表格结构 | 5x4 列完整提取 | otsl 空标签,结构丢失 |
数值 (1,250万/+18.4%) | 全部正确 | 无法提取 |
表头中文 | "予告紛別" 错误 | 内容缺失 |
综合评级 | 4.5/5 | 2/5 |
这意味着:如果业务场景是"中文报表数字提取"(提取金额、百分比等数值), SmolDocling 反而比 Granite 更可靠 -- 虽然中文字符有误,但数字和表格结构完整。 而如果需要"中文文档全文识别",则必须用 Granite。
五、英文 / 代码 / 公式:两个模型一致
在英文和非中文维度上,两个模型表现高度一致。以下是逐维度分析。
5.1 英文表格结构 (page_with_table)

输入:TableFormer 论文页面,含 8 列复杂学术表格 (合并表头,多级嵌套)
两个模型均完美还原了表格结构:
指标 | SmolDocling | Granite-Docling |
|---|---|---|
表格列数 | 8 列 | 8 列 |
数据行数 | 8 行 | 8 行 |
合并单元格 (ecel/ucel) | 正确识别 | 正确识别 |
数值精度 (0.965, 2.73) | 小数点后 3 位精确 | 小数点后 3 位精确 |
Caption 识别 | <caption> 正确 | <caption> 正确 |
输出 Markdown 长度 | 3109 chars | 2994 chars |
与论文 Table 4 的 TEDS 基准(SmolDocling FinTabNet 0.52, PubTables 0.65)一致: 对于结构完整的学术表格,两个模型都能准确提取。
5.2 代码块

与论文 SynthCodeNet F1 0.92 的基准一致。两个模型对 Python 代码的还原度极高, 包括 __name__ == '__main__' 这类易错点。Granite 输出中 if __name__ 行有 1 个额外空格缩进,属于微小瑕疵。
5.3 数学公式

值得注意的是,默认 prompt "Convert this page to docling." 下, 公式以 ASCII 文本形式输出而非 LaTeX 源码。论文 Im2LaTeX F1 0.95 是在专用 prompt "Convert formula to LaTeX." 下测的。如需 LaTeX 输出,应使用专用指令。
5.4 双栏排版

5.5 柱状图 (失败案例)

两个模型均能正确识别图表类型 -- SmolDocling 输出 <chart><vbar_categorical> 标签, 说明它知道这是分类柱状图。但数值读取完全失败,4 个不同的柱子高度被全部识别为 45。
论文 Chart TEDS 0.75 的成绩是在裁剪好的图表区域 + 专用任务下测的。 在整页文档场景中,图表只是页面的一部分,数值提取的可靠性显著下降。 这是一个需要后处理验证的关键边界。
六、SmolDocling vs Granite-Docling 综合对比

维度 | SmolDocling | Granite-Docling | 胜出 |
|---|---|---|---|
推理速度 (SDPA) | 51 tok/s | 6.5 tok/s | SmolDocling 8x |
峰值显存 | 0.83 GB | 0.83 GB | 持平 |
中文纯文本 | ~20% | ~98% | Granite |
中文表格结构 | 结构+数值完整 | 内容丢失 | SmolDocling |
英文表格 | 完美 | 完美 | 持平 |
代码块 | 完美 | 完美 | 持平 |
数学公式 | 内容正确 | 内容正确 | 持平 |
双栏排版 | 完美 | 完美 | 持平 |
图表数值提取 | 数值错误 | 数值错误 | 持平 (均失败) |
七、落地建议与选型指南
推荐: Granite-Docling (速度换准确度)
SmolDocling 中文准确率仅 ~20%,不可直接用于中文 OCR。 Granite ~98% 的准确率使其成为该场景下唯一可用的选择。 如果需要更高准确率,可考虑结合 PaddleOCR / EasyOCR 做后处理纠错。 速度代价:Granite 每页约 50-80 秒(SDPA),适合批量离线处理。
推荐: SmolDocling (速度优先)
两个模型在英文维度上表现一致,SmolDocling 速度快 8 倍。 对于批量论文解析(如构建 RAG 知识库),SmolDocling 的吞吐量优势明显: 单张 5060 Ti 可同时处理 10+ 篇论文。
推荐: SmolDocling + PaddleOCR 组合
看似矛盾的结论:中文场景下反而推荐 SmolDocling。原因是 Granite 虽然中文文字准确, 但表格内容提取退步(<otsl> 空标签),无法获取单元格数值。 SmolDocling 中文字符有误但数字和表格结构完整。 更稳妥的方案:用 PaddleOCR 提取文字 + SmolDocling 提取表格结构,两者互补。
推荐: 两者皆可,SmolDocling 速度更快
代码和公式维度两个模型一致,均达到论文报告的高水准(F1 0.92/0.95)。 SmolDocling 更快,优先选择。如需 LaTeX 源码输出,使用专用 prompt "Convert formula to LaTeX."。
关键约束:
八、技术踩坑记录
官方模型卡的示例代码使用 AutoModelForVision2Seq,但 transformers 5.13+ 已将其 合并为 AutoModelForImageTextToText。直接 import 会报 ImportError。
SmolDocling 的 image processor (Idefics3) 依赖 torchvision 做图像预处理, 首次加载时报 Missing optional dependencies: torchvision。 需单独安装匹配版本 torchvision 0.26.0+cu128。
flash-attn 2.8.3 的源码包含超长路径文件名(如 device_batched_gemm_add_relu_gemm_add_xdl_cshuffle_f16_f16_f16_f16_f16_f16_gmk_gnk_gno_gmo_instance.cpp), 超过 Windows MAX_PATH 260 字符限制。启用长路径需要管理员权限(本环境无权)。 解决方案:使用 PyTorch 内置的 SDPA 后端,效果接近。
base 环境同时存在 numpy 2.5.0 和 2.5.1 的 dist-info 目录, 导致 importlib.metadata.version('numpy') 返回 None, transformers 启动检查直接抛 ValueError。解法:新建独立 conda 环境。
DocTags 的标签名并非 <title>/<para>/<table>, 而是 <section_header_level_N>/<text>/<otsl>/<code>/<chart>。 OTSL 表格使用子标签体系: <ched> 列头, <fcel> 数据格, <ecel> 跨列空格, <nl> 换行。统计元素时需用正则提取实际标签名。
用默认 prompt "Convert this page to docling." 时,公式以 ASCII 文本形式输出 (e.g. e^(i*pi)+1=0)。论文 Im2LaTeX F1 0.95 是在专用 prompt "Convert formula to LaTeX." 下测的。如需 LaTeX,应切换 prompt。