
1. OCR 4最重要的升级,不是把PDF变成Markdown
传统OCR的核心任务很简单。
图片里有什么字。
然后把它输出成文本。
但企业文档真正复杂的地方,从来不只是文字本身。
标题在哪里。
表格在哪里。
公式属于哪一段。
签名在哪个区域。
页眉页脚是否应该进入检索。
模型对当前识别结果有多大把握。
OCR 4真正有价值的地方,是把这些信息一起返回。
Document
↓
OCR 4
↓
Page
├── Markdown
├── Tables
├── Images
├── Blocks
│ ├── title
│ ├── text
│ ├── table
│ ├── equation
│ ├── code
│ ├── signature
│ └── footer
├── Bounding Boxes
└── Confidence Scores
这已经不是单纯"识字"。
更接近文档解析器。
2. 先跑一个最小OCR 4调用
Mistral官方SDK可以直接通过client.ocr.process调用。
import os
from mistralai.client import Mistral
client = Mistral(
api_key=os.environ["MISTRAL_API_KEY"]
)
response = client.ocr.process(
model="mistral-ocr-4-0",
document={
"type": "document_url",
"document_url": "https://arxiv.org/pdf/2201.04234",
},
table_format="html",
include_blocks=True,
confidence_scores_granularity="word",
)
for page in response.pages:
print(page.markdown)
这里最值得注意的并不是markdown字段。
而是include_blocks和confidence_scores_granularity。
前者让系统拿到结构块。
后者让系统知道哪些内容可能识别错了。
3. Bounding Box为什么会改变RAG质量
很多RAG系统今天仍然使用非常粗糙的Chunk方式。
每500个Token切一次。
或者每1000个字符切一次。
这种做法最大的问题是它完全不知道文档结构。
标题可能和正文被拆开。
表格可能从中间被切断。
公式可能脱离解释段落。
OCR 4返回的Block可以成为更自然的Chunk边界。
def build_chunks(page):
chunks = []
current = {"title": None, "content": []}
for block in page.blocks or []:
if block.type == "title":
if current["content"]:
chunks.append(current)
current = {
"title": block.content,
"content": [],
}
continue
if block.type in {
"text", "list", "table",
"equation", "code",
}:
current["content"].append({
"type": block.type,
"content": block.content,
"bbox": [
block.top_left_x,
block.top_left_y,
block.bottom_right_x,
block.bottom_right_y,
],
})
if current["content"]:
chunks.append(current)
return chunks
这时候Chunk不再只是一个字符串。
它还知道自己来自哪个标题。
属于哪种内容。
在原页面的哪个位置。
CHUNK-101|FIXED_TOKEN_SPLIT
直接按照固定Token长度切文档,会破坏标题、表格、公式和段落之间的真实语义边界。
4. Confidence Score不是装饰,它决定什么时候必须人工复核
OCR系统最危险的情况,不是完全识别失败。
而是看起来识别成功,实际上有关键数字错了。
例如发票金额。
合同日期。
银行账号。
技术参数。
OCR 4允许返回Page级和Word级Confidence。
这意味着系统可以自动做风险分流。
def review_policy(page):
scores = page.confidence_scores
if not scores:
return "auto_pass"
average = scores.average_page_confidence_score
minimum = scores.minimum_page_confidence_score
if minimum < 0.70:
return "human_review"
if average < 0.90:
return "secondary_model"
return "auto_pass"
高置信度自动流转。
中置信度二次模型检查。
低置信度进入人工审核。
CONF-202|IGNORE_CONFIDENCE
OCR已经返回置信度,但下游系统仍把所有字段当作100%正确,会把识别误差直接传入数据库和Agent。
5. OCR 4为什么特别适合作为Agent的"文档入口"
Agent要对文档采取行动,首先必须把文档变成机器可理解的数据结构。
只有全文字符串是不够的。
例如一个合同Agent需要知道哪一块是标题、哪一块是付款条款、哪一块是签名,以及风险条款来自哪一页。
PDF
↓
OCR 4
↓
Structured Blocks
↓
Document Classifier
↓
Business Agent
├── 合同审核
├── 发票校验
├── 报表分析
├── 知识库入库
└── PPT生成
从这个角度看,OCR 4真正的位置不是"工具箱里的OCR"。
而是Agent的数据入口层。
6. Structured Annotation让文档直接变成业务JSON
Mistral Document AI还支持Annotations。
这层能力特别适合发票、合同、表单和业务报表。
开发者可以先定义希望得到的结构。
from pydantic import BaseModel
class Invoice(BaseModel):
invoice_number: str
vendor_name: str
invoice_date: str
total_amount: float
currency: str
然后让Document AI按照Schema提取。
这样下游系统不需要再从一大段Markdown里二次正则解析。
Agent真正需要的往往不是"读懂这张发票"。
而是拿到字段、检查金额,再调用后续业务系统。
7. Bounding Box还能解决"答案到底来自哪"
RAG系统非常常见的一个问题是模型回答了,但用户不知道它到底从PDF哪一块读出来的。
有了Bounding Box以后,可以把检索结果反向定位到页面区域。
retrieval_result = {
"text": "付款周期为30天",
"page": 7,
"bbox": {
"x1": 0.18,
"y1": 0.42,
"x2": 0.72,
"y2": 0.48,
},
"block_type": "text",
}
前端就可以把原PDF第7页对应区域高亮。
这对于合同审核、医疗、财务和知识库系统非常重要。
因为"答案正确"之外,还需要"证据可追溯"。
8. 一个生产级文档工作流应该长这样
Upload
↓
Document Type Check
↓
OCR 4
↓
Block Extraction
↓
Confidence Gate
├── Low → Human Review
└── Pass
↓
Structured Annotation
↓
Semantic Chunking
↓
Embedding / Index
↓
Agent / RAG
↓
Business Action
↓
Audit Log
STEP 1|OCR
负责把原始PDF、图片、DOCX或PPTX转成结构化页面内容。
STEP 2|Confidence Gate
负责判断当前结果能否自动进入下一步。
STEP 3|Annotation
负责把文档内容映射成业务需要的结构化字段。
STEP 4|RAG / Agent
负责理解业务问题,并调用工具执行后续动作。
STEP 5|Audit
保存原文位置、提取结果、人工修订和最终操作。
9. 为什么"手写也能识别"不是最重要的卖点
视频热点里最容易吸引眼球的是复杂报表能识别、手写内容也能处理。
这些当然有价值。
但从开发者角度看,更关键的是结果能不能程序化消费。
Bounding Box。
Block Type。
Confidence。
Structured Annotation。
这些能力才真正决定OCR能不能进入企业自动化系统。
10. 大规模文档处理,还要考虑Batch而不是只写for循环
如果每天处理10个PDF,同步调用就够了。
如果每天处理10万页,架构就完全不同。
Mistral官方也明确建议大规模OCR使用Batch Inference。
生产系统还需要自己补上任务状态和幂等。
from dataclasses import dataclass
@dataclass
class DocumentJob:
job_id: str
source_uri: str
status: str
retry_count: int = 0
content_hash: str | None = None
result_uri: str | None = None
同一份文档不要因为用户重复点击就处理三遍。
Content Hash可以用来做幂等。
JOB-303|NO_IDEMPOTENCY
文档任务没有内容哈希或幂等Key,重复上传会重复计费、重复入库,并生成多份冲突结果。
11. OCR 4的成本为什么适合做独立路由
Mistral官方当前给OCR 4的标准价格是每1000页4美元。
带Annotations的Document AI价格是每1000页5美元。
这意味着平台完全可以把普通OCR和业务结构化抽取拆成两条路线。
def route_document_task(task):
if task.need_structured_fields:
return "document_ai_annotation"
if task.need_bbox:
return "ocr4_blocks"
return "ocr4_basic"
不是每一个PDF都需要跑最完整的处理链。
根据任务需要动态升级,才能控制长期成本。
12. 对聚合500+模型的平台来说,OCR应该处在什么位置
如果一个平台同时有文本、图片、视频、音频、智能体、无限画布、AI漫剧和AI PPT能力,OCR模型不应该只是单独放在一个工具页面里。
更合理的位置是输入层。
User Document
↓
OCR / Document AI
↓
Structured Assets
├── Markdown
├── Tables
├── Images
├── BBoxes
└── JSON Fields
↓
Model Router
├── Text Model
├── Agent
├── AI PPT
├── Knowledge Base
└── Workflow
一份PDF被解析以后,可以继续进入不同模型。
合同交给审查Agent。
报告交给AI PPT。
论文进入知识库。
表格进入数据分析模型。
这时候多模型平台的价值,才从模型数量变成工作流能力。
13. 六个文档AI系统最容易踩的坑
OCR-101|TEXT_ONLY_PIPELINE
只保存最终纯文本,丢掉Block、Bounding Box和原始页面关系,下游无法做证据定位。
CHUNK-202|FIXED_SIZE_ONLY
所有文档都按照固定Token长度切分,不利用标题、表格和结构块作为语义边界。
CONF-303|NO_CONFIDENCE_GATE
低置信度字段直接进入数据库和Agent,没有二次模型检查或人工审核。
RAG-404|NO_SOURCE_LOCATION
检索结果没有页码和坐标,模型回答以后用户无法回到原文验证。
JOB-505|NO_IDEMPOTENCY
同一文档重复上传导致多次处理、重复计费和重复索引。
ROUTE-606|FULL_PIPELINE_FOR_ALL
所有文档都跑最贵的完整Annotation流程,没有按照业务需求区分基础OCR与结构化提取。
14. 最后:OCR正在从"识字工具"变成AI系统的数据基础设施
过去我们讨论OCR,核心指标是识别率。
现在这个问题已经不够了。
真正进入Agent时代以后,还要问内容在哪里、它是什么类型、模型有多确定、能不能变成业务字段、能不能回到原文定位证据、能不能在低置信度时自动进入人工审核。
Mistral OCR 4真正值得关注的地方,就在这里。
它不只是把文档变成文字,而是在把文档变成Agent可以安全消费、检索、验证和执行的数据结构。
资料说明:
Mistral AI于2026年6月23日正式发布OCR 4,模型ID为mistral-ocr-4-0。
官方OCR文档说明OCR 4支持include_blocks、段落级Bounding Box、结构块标签、Page / Word级Confidence Score、表格格式化、页眉页脚提取等能力。
官方Document AI还提供BBox Annotation与Document Annotation,可按开发者提供的Schema输出结构化JSON。
OCR 4当前标准价格为4美元/1000页,Document AI Annotated Pages为5美元/1000页。
本文中的路由、Chunk、Review Gate、幂等和多模型工作流代码均为工程设计示例。