我们在这篇文章中新增了和,并附上了它们在 OlmOCR 基准上的得分 🫡
摘要: 强大的视觉语言模型 (Vision-Language Models, VLMs) 的崛起,正在彻底改变文档智能 (Document AI) 的格局。每种模型都有其独特的优势,因此选择合适的模型变得棘手。相比闭源模型,开源权重的模型在成本效率和隐私保护上更具优势。为了帮助你快速上手,我们整理了这份指南。
在本指南中,你将了解到:
读完之后,你将知道如何选择合适的 OCR 模型、开始构建应用,并对文档 AI 有更深入的理解。让我们开始吧!
现代 OCR 简介 光学字符识别 (Optical Character Recognition,简称 OCR) 是计算机视觉领域最早、也是持续时间最长的研究方向之一。AI 的许多早期实际应用都集中在“将印刷文字转化为可编辑的数字文本”上。
随着的兴起,OCR 的能力迎来了飞跃式提升。如今,许多 OCR 模型都是在现有 VLM 的基础上进行微调得到的。但现代模型的能力已远超传统 OCR —— 你不仅可以识别文字,还能基于内容检索文档,甚至直接进行问答。
得益于更强大的视觉理解能力,这些模型能处理低质量扫描件、理解复杂元素 (如表格、图表、图片等) ,并将文本与视觉内容融合,以回答跨文档的开放式问题。
模型能力 文本识别 最新的模型能够将图像中的文字转录为机器可读格式。输入内容可能包括:
OCR 模型会将这些内容转换为机器可读的文本,输出格式多种多样,比如HTML、Markdown 等。
处理文档中的复杂组件 除了文字,某些模型还能识别:
部分模型能识别文档中图片的精确位置,提取其坐标,并在输出中将图片嵌入对应位置。 另一些模型还能为图片生成说明文字 (caption) ,并在适当位置插入。这对于后续将机器可读输出传入 LLM (大型语言模型) 尤为有用。
例如,和就是代表。
不同模型使用不同的输出格式,例如DocTags 、HTML 、Markdown (后文输出格式 一节有详细说明) 。 模型处理表格与图表的方式通常取决于所采用的输出格式:
有些模型则会将其转换为可解析的结构化格式,如 Markdown 表格或 JSON。 例如,下图展示了一个柱状图如何被转换成机器可读的形式: 同样地,表格中的单元格也会被解析为机器可读格式,并保留列名与标题的上下文关系:
输出格式 不同 OCR 模型采用的输出格式不同,以下是几种主流格式的简介:
DocTag: 一种类似 XML 的文档标记格式,可表达位置信息、文本样式、组件层级等。下图展示了一篇论文如何被解析为 DocTags。该格式由开源的 Docling 模型使用。HTML: 是最常见的文档解析格式之一,能较好地表达结构与层级信息。
Markdown: 人类可读性最强,格式简洁,但表达能力有限 (如无法准确表示多列表格) 。
JSON: 通常用于表示表格或图表中的结构化信息,而非完整文档。
选择合适的模型,取决于你对输出结果的用途:
数字化重建 使用保留布局的格式,如 DocTags 或 HTML LLM 输入或问答场景 使用输出 Markdown 和图像说明的模型 (更接近自然语言) 程序化处理
OCR 的位置感知 文档常常结构复杂,比如多栏文本、浮动图片、脚注等。早期的 OCR 模型通常先识别文字,再通过后处理手动推断页面布局,以恢复阅读顺序——这种方式既脆弱又易错。
现代 OCR 模型则会在输出中直接包含版面布局信息 (称为“锚点”或 “grounding” ) ,如文字的边界框 (bounding box) 。 这种“锚定”机制能有效保持阅读顺序与语义连贯性,同时减少“幻觉式识别” (即错误生成内容) 。
模型提示 OCR 模型通常接收图像输入,并可选地接受文字提示 (prompt) ,这取决于模型的架构与预训练方式。
部分模型支持基于提示的任务切换 ,例如可以通过不同提示词执行不同任务:
输入 “Convert this page to Docling” → 将整页转换为 DocTags; 输入 “Convert this formula to LaTeX” → 将页面中的公式转换为 LaTeX。 而另一些模型则只能处理整页内容,任务由系统提示固定定义。 例如,使用一个长系统提示词进行推理。OlmOCR 本质上是基于 Qwen2.5VL 微调的 OCR 模型,虽然它也能处理其他任务,但在 OCR 场景之外性能会明显下降。
前沿开源 OCR 模型 过去一年,我们见证了 OCR 模型领域的爆发式创新。由于开源生态的推动,不同团队之间可以相互借鉴、迭代,从而加速了技术进步。一个典型例子是 AllenAI 发布的OlmOCR ,它不仅开源了模型本身,还公开了训练所用的数据集,为他人提供了可复现与可扩展的基础。 这个领域正以前所未有的速度发展,但如何选择最合适的模型,仍然是一个不小的挑战。
最新模型对比 为了帮助大家更清晰地了解当前格局,以下是一些当前主流开源 OCR 模型的非完整对比。 这些模型都具备版面理解能力 (layout-aware) ,能解析表格、图表与数学公式。 各模型支持的语言范围可在其 model card 中查看。除Chandra (OpenRAIL 许可) 与Nanonets (许可证不明) 外,其余均为开源许可。
表格中展示的平均得分来自Chandra 与OlmOCR 模型卡中在OlmOCR Benchmark (仅英文) 上的测试结果。 此外,许多模型基于Qwen2.5-VL 或Qwen3-VL 微调,因此我们也附上了 Qwen3-VL 作为参考。
结构化 Markdown (含语义标注、HTML 表格等) 图片自动生成说明 可提取签名与水印 识别复选框、流程图、手写体 支持手写体与旧文档 支持提示词输入 可将表格与图表转换为 HTML 可直接提取并插入图片 支持 grounding 可提取并插入图片 支持手写体 具备 grounding 能力 优化了大规模批处理性能 支持通用视觉理解 能将图表、表格完整渲染为 HTML 识别手写体 内存高效,图像文字识别能力强 具备 grounding 能力 能原样提取并插入图片
注: Qwen3-VL 是一款强大的通用视觉语言模型,支持多种文档理解任务,但并未针对 OCR 任务进行特别优化。 其他模型多采用固定提示词进行微调,专为 OCR 任务设计。 因此若使用 Qwen3-VL,建议尝试不同提示词以获得更佳效果。
你可以通过这个体验部分最新模型并比较输出效果:
模型评估 基准测试 没有任何一款模型能在所有场景中都是“最优”。 例如: 表格应以 Markdown 还是 HTML 呈现?哪些元素需要提取?如何量化文本识别准确度?👀 这些都取决于具体任务。 目前已有多个公开评测集与工具,但仍无法覆盖所有情况。 我们推荐以下常用的评测基准:
支持多格式 (HTML 与 Markdown) 表格评测。 指标基于“编辑距离”或“树编辑距离” (表格部分) 。 标注数据部分由 SoTA VLM 或传统 OCR 生成。 与前两者相比,CC-OCR 的文档质量与多样性较低。 在不同文档类型、语言与任务场景下,模型表现差异明显。 如果你的业务领域不在现有评测集中体现,我们建议收集代表性样本,构建自定义测试集,比较不同模型在你的特定任务上的效果。
成本与效率 大多数 OCR 模型的规模在3B~7B 参数 之间,也有一些小型模型 (如 PaddleOCR-VL 仅 0.9B) 。 成本不仅与模型大小相关,还取决于是否支持高效推理框架。
例如:
OlmOCR-2 提供 vLLM 与 SGLang 实现。
若在 H100 GPU ($2.69/小时) 上运行,推理成本约为每百万页 $178 。
DeepSeek-OCR 能在一块 40GB A100 上每天处理20 万页以上 。
以此估算,其成本与 OlmOCR 大致相当 (视 GPU 供应商而定) 。
若任务对精度要求不高,还可选择量化版本 (Quantized Models) ,进一步降低成本。 总体而言,开源模型在大规模部署时几乎总比闭源方案更经济。
开源 OCR 数据集 尽管近年来开源 OCR 模型大量涌现,但公开的训练与评测数据集仍相对稀缺。 一个例外是 AllenAI 的, 截至目前,该数据集已被用于训练至少(可能更多) 。
更广泛的数据共享将极大推动开源 OCR 的进步。 以下是几种常见的数据集构建方式:
合成数据生成 (Synthetic Data Generation) 例如:利用现有 OCR 模型生成新训练数据 ,以训练更高效的领域专用模型基于人工校正语料的再利用 ,如, 其中包含大量人工修正的历史文档 OCR值得注意的是,许多此类数据集已存在但尚未“训练化” (training-ready) 。 若能系统化整理并公开,将为开源社区释放巨大潜力。
模型运行工具 我们收到许多关于“如何开始使用 OCR 模型”的问题,因此这里总结了几种简单的方式—— 包括在本地运行推理,或通过 Hugging Face 进行远程托管。
本地运行 目前大多数先进 OCR 模型都提供vLLM 支持,并可通过transformers 库直接加载推理。 你可以在各模型的 Hugging Face 页面找到具体说明。 下面我们以vLLM 推理方式 为例演示基本流程。
使用 vLLM 启动服务 vllm serve nanonets/Nanonets-OCR2-3B然后,你可以通过 OpenAI SDK 进行调用,例如:
fromopenaiimportOpenAI importbase64 client = OpenAI(base_url="http://localhost:8000/v1") model ="nanonets/Nanonets-OCR2-3B" defencode_image(image_path): withopen(image_path,"rb")asimage_file: returnbase64.b64encode(image_file.read()).decode("utf-8") definfer(img_base64): response = client.chat.completions.create( model=model, messages=[ { "role":"user", "content": [ { "type":"image_url", "image_url": {"url":f"data:image/png;base64,{img_base64}"}, }, { "type":"text", "text":"Extract the text from the above document as if you were reading it naturally.", }, ], } ], temperature=0.0, max_tokens=15000 ) returnresponse.choices[0].message.content img_base64 = encode_image(your_img_path) print(infer(img_base64))使用 Transformers 运行推理 Transformers 库提供了标准化的模型定义与接口,可轻松进行推理或微调。 模型可能有两种加载方式:
remote code 实现 (由模型作者定义,允许 transformers 自动加载)以下示例展示了如何用 transformers 调用Nanonets OCR 模型 :
# 安装依赖: flash-attn 和 transformers fromtransformersimportAutoProcessor, AutoModelForImageTextToText model = AutoModelForImageTextToText.from_pretrained( "nanonets/Nanonets-OCR2-3B", torch_dtype="auto", device_map="auto", attn_implementation="flash_attention_2" ) model.eval() processor = AutoProcessor.from_pretrained("nanonets/Nanonets-OCR2-3B") definfer(image_url, model, processor, max_new_tokens=4096): prompt ="""Extract the text from the above document as if you were reading it naturally. Return the tables in html format. Return the equations in LaTeX representation. If there is an image in the document and image caption is not present, add a small description of the image inside the <img></img> tag; otherwise, add the image caption inside <img></img>. Watermarks should be wrapped in brackets. Ex: <watermark>OFFICIAL COPY</watermark>. Page numbers should be wrapped in brackets. Ex: <page_number>14</page_number> or <page_number>9/22</page_number>. Prefer using ☐ and ☑ for check boxes.""" image = Image.open(image_path) messages = [ {"role":"system","content":"You are a helpful assistant."}, {"role":"user","content": [ {"type":"image","image": image_url}, {"type":"text","text": prompt}, ]}, ] text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) inputs = processor(text=[text], images=[image], padding=True, return_tensors="pt").to(model.device) output_ids = model.generate(**inputs, max_new_tokens=max_new_tokens, do_sample=False) generated_ids = [output_ids[len(input_ids):]forinput_ids, output_idsinzip(inputs.input_ids, output_ids)] output_text = processor.batch_decode(generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=True) returnoutput_text[0] result = infer(image_path, model, processor, max_new_tokens=15000) print(result)使用 MLX (适用于 Apple 芯片) MLX 是苹果推出的机器学习框架,专为Apple Silicon (M 系列) 设计。 在此基础上构建的能轻松运行视觉语言模型。 你可以在搜索所有支持 MLX 的 OCR 模型 (包括量化版本) 。
安装 MLX-VLM:
pip install -U mlx-vlm示例运行:
wget https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/throughput_smolvlm.png python -m mlx_vlm.generate \ --model ibm-granite/granite-docling-258M-mlx \ --max-tokens 4096 \ --temperature 0.0 \ --prompt"Convert this chart to JSON."\ --image throughput_smolvlm.png远程运行 使用 Inference Endpoints 部署模型 (托管推理服务) 你可以通过Hugging Face Inference Endpoints 在托管环境中部署兼容 vLLM 或 SGLang 的 OCR 模型。 该服务提供 GPU 加速、自动伸缩、监控与安全托管,无需自行维护基础设施。
部署步骤如下:
点击页面上的“Deploy” 按钮,选择“HF Inference Endpoints”
在弹出的窗口中配置部署参数 (GPU 类型、实例数量等) 部署完成后,你可以直接通过上文示例中的 OpenAI 客户端脚本调用该 Endpoint。 更多信息可参阅官方文档: 👉
使用 Hugging Face Jobs 进行批量推理 对于 OCR 场景,往往需要批量处理成千上万张图像 。 这类任务可通过vLLM 的离线推理模式 实现高效并行。
为了简化流程,我们创建了, 它是一组适配 Hugging Face Jobs 的可直接运行脚本,能实现:
将 OCR 结果以 Markdown 形式新增为新列 例如,处理 100 张图片的命令如下:
hfjobsuv run --flavor l4x1 \ https://huggingface.co/datasets/uv-scripts/ocr/raw/main/nanonets-ocr.py \ your-input-dataset your-output-dataset \ --max-samples 100这些脚本会自动处理所有 vLLM 配置与批次推理逻辑, 让批量 OCR 变得无需 GPU 或复杂部署。
超越 OCR 如果你对文档智能 (Document AI) 感兴趣,不仅仅局限于文字识别 (OCR) ,以下是我们的一些推荐方向。
视觉文档检索 视觉文档检索 (Visual Document Retrieval) 指的是: 当你输入一条文本查询时,系统能够从大量 PDF 文档中直接检索出最相关的前k 篇。
与传统文本检索模型不同,视觉文档检索器直接在“文档图像”层面进行搜索。 除了独立使用外,你还可以将它与视觉语言模型结合,构建多模态 RAG (Retrieval-Augmented Generation) 管线。 相关示例可参考:。
你可以在找到所有可用的视觉文档检索模型。
目前主流的视觉检索器分为两类:
单向量模型 (Single-vector Models) 多向量模型 (Multi-vector Models)
大多数此类模型都支持vLLM 和transformers ,因此你可以很方便地用它们进行向量索引,然后结合向量数据库 (vector DB) 执行高效搜索。
基于视觉语言模型的文档问答 (Document Question Answering) 如果你的任务目标是基于文档回答问题 (而不是仅仅提取文字) , 你可以直接使用经过文档任务训练的视觉语言模型 (VLM) 。
许多用户习惯于:
这种方式虽然可行,但存在明显缺陷:
一旦文档布局复杂 (如多栏结构、图表、图片说明等) ,转换后的文本就可能丢失关键信息; 图表被转为 HTML、图片说明生成错误时,LLM 就会误判或忽略内容。 因此,更好的做法是: 直接将原始文档图像 + 用户问题 一起输入支持多模态理解的模型, 例如。 这样模型就能同时利用视觉与文本信息,不会错过任何上下文细节。
总结 在这篇文章中,我们为你概览了现代 OCR 技术的核心要点,包括:
如果你希望进一步深入了解 OCR 与视觉语言模型 (VLM) , 以下是我们推荐的延伸阅读与教程资源 👇
延伸阅读与资源 🧩—— 实践指南,教你如何让模型具备“锚定式”识别能力。 总结一句话: 开源视觉语言模型正在重新定义 OCR 的边界。 从纯文本识别到多模态理解、从图像到语义、从离线推理到大规模部署 —— 如今的开源生态为每一个开发者和研究者提供了前所未有的自由度与创新空间。
无论你是在构建下一代文档智能系统,还是仅想更高效地解析 PDF, 希望这篇指南能帮助你找到最合适的起点 🚀