微信扫码
添加专属顾问
我要投稿
百度PaddleOCR-VL以92.6分登顶全球OCR评测榜,9亿参数小模型竟能精准解析复杂公式、表格和手写体!核心内容: 1. PaddleOCR-VL在复杂文档处理上的四大突破:公式识别、表格解析、阅读顺序还原、手写体识别 2. 模型独特优势:109种语言支持+结构化数据输出,实现真正的文档理解 3. 技术架构揭秘:PP-DocLayoutV2与0.9B参数模型的协同训练方案
当文档包含复杂表格、数学公式或多栏排版时,传统 OCR 工具往往会产出杂乱内容,需要手动整理。
就在上周,我逛 GitHub 时看到了百度新近开源的 PaddleOCR-VL-0.9B。
老实讲,看到它只有 9 亿参数时,我第一反应是:“哦,又一个小模型来凑热闹?”但出于职业好奇,我还是要问一句:它能打吗?结果完全把我震住了。
这不只是 OCR,这是文档理解的一次量子飞跃
PaddleOCR-VL 远超我的预期。它在全球权威评测榜 OmniDocBench v1.5 的综合性能中拿到 92.6 的分数,位列全球第一;推理速度相较 MinerU2.5 提升 14.2%,相较 dots.ocr 提升 253.01%。
我最直观的感受是:它非常准,甚至“准得过分”!不愧是能登顶的第一名模型。
今天我会围绕四个关键挑战来测试 PaddleOCR-VL:公式识别、表格识别、阅读顺序与结构、手写体识别。
先看公式识别。我上传了一张包含复杂数学公式的图片。可以看到,模型处理得非常好——对上标、下标以及冗长复杂的表达式都能精准解析。
接着是表格识别。这是出了名的难题,表格样式多,有的带边框,有的不带,且包含大量数字,模型非常容易误判。我用 PaddleOCR-VL 处理了多种表格样例,准确率真的很能打。
另一个大难点是文档结构与阅读顺序的理解。现代文档不仅内容更复杂,而且版式变化很大:多栏设计、图文混排、折页、彩色印刷、倾斜扫描、手写批注……这些都会让 OCR 更困难。正确的阅读顺序并不总是简单的自上而下、从左到右。
PaddleOCR-VL 的技术报告展示了它几乎“像人一样”理解复杂结构。无论是学术论文、多栏报刊,还是技术报告,它都能智能分析版面,并恢复符合人类直觉的阅读顺序。
最后,即使面对更复杂的版式,PaddleOCR-VL 依然非常稳定。比如这张手写便签:它混合了文本、数字、段落与图片,左右、上下都有分栏,这类版面通常只有人才能理清头绪。
PaddleOCR VL 不再只是简单的文本识别,而是能够真正“理解”文档结构。无论是学术论文、多栏报刊还是技术报告,PaddleOCR-VL 都能智能理解版面布局,并自动按正确的顺序组织内容。
同时,它还能准确抽取复杂内容,例如文档中的表格、数学公式、手写笔记、图表数据,并将其转换成可直接使用的结构化数据。
此外,PaddleOCR-VL 支持 109 种语言的识别,覆盖中文、英文、法语、日语、俄语、阿拉伯语、西班牙语等多语种场景,极大提升了模型在多语文档中的识别与处理能力。
PaddleOCR-VL 由两部分组成:PP-DocLayoutV2 和 PaddleOCR-VL-0.9B。
其中核心是 PaddleOCR-VL-0.9B,它将一个预训练视觉编码器(visual encoder)与动态分辨率预处理器(dynamic resolution preprocessor)、两层 MLP projector,以及一个预训练大语言模型(LLM)集成到一起。
其预处理技术使用原生动态高分辨率(native dynamic high resolution)。视觉编码器采用 NaViT 风格编码器(NaViT style encoder),支持原生分辨率输入。
这一设计减少了幻觉(hallucinations),并提升了多模态视觉语言模型 PaddleOCR-VL-0.9B 的表现。
Projector 高效地把视觉编码器的特征对接到语言模型的 embedding 空间。
在自回归语言模型(autoregressive language model)中,序列是按 token 逐个生成的。这意味着解码器的规模会直接影响整体推理时延,模型越小,解码越快。
现在我们一步步来,拆解如何搭建一个强大的推理应用。先安装模型所需的依赖库。我们用 pip 安装:
!pip uninstall -y torch paddlepaddle paddlepaddle-gpu
!pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118
!pip install paddleocr paddlepaddle
!pip install langchain langchain-community langchain-openai faiss-cpu sentence-transformers openai python-dotenv
下一步照例是导入相关库,随着我们继续,你会逐渐理解它们的作用,并进行一些基础配置。
PaddleOCR:以业界领先的准确率,将文档和图像转换为结构化、对 AI 友好的数据(如 JSON 与 Markdown),为 AI 应用提供支撑。
import torch
from paddleocr import PaddleOCR
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.docstore.document import Document
于是我构建了这个 SimpleRAG 系统:用 PaddleOCR-VL 做文本抽取,用 OpenAI 生成回答。下面我来讲讲我是怎么做的。
在初始化阶段,我配置了核心组件——使用 HuggingFace 的 BGE embeddings 做向量表示,使用 GPT-4o 作为对话模型,temperature 设为 0 以获得稳定回复。我还初始化了稍后会构建的 vectorstore 和 QA chain。
在抽取方法上,一开始我尝试了 HuggingFace transformers 版本的 PaddleOCR,结果报了一个关于 image tokens 不匹配的诡异错误;随后安装 PaddlePaddle 又把 PyTorch 搞坏了(不得不重启环境,按正确顺序重装);接着我还得一路猜 API,因为有的方法已经弃用,新的参数也不一样。
真正的突破来自我直接打印了返回结果对象的结构——原来它就是一个列表,列表里只有一个字典,而那个字典里有个键叫 rec_texts,里面就是识别到的所有文本字符串列表。
所以,与其去访问什么复杂的嵌套结构比如 .boxes.text,我只需要判断结果是不是字典,拿 rec_texts 这个键,把其中的字符串扩展进我的列表就好了。
class SimpleRAG:
def __init__(self):
self.embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-en-v1.5")
self.llm = ChatOpenAI(model="gpt-4o", temperature=0)
self.vectorstore = None
self.qa_chain = None
self.ocr = PaddleOCR(use_textline_orientation=True, lang='en')
def extract_text_from_images(self, image_paths: list):
docs = []
for path in image_paths:
result = self.ocr.predict(input=path)
text_lines = []
for res in result:
if isinstance(res, dict) and 'rec_texts' in res:
text_lines.extend(res['rec_texts'])
text = "\n".join(text_lines) if text_lines else "No text found"
docs.append(Document(page_content=text, metadata={'source': path}))
return docs
在 build_index 中,我会先从所有图片中抽取文本,再用 RecursiveCharacterTextSplitter 将文档切分为 1000 字符、重叠 200 字符的块,用 BGE embeddings 构建 FAISS vectorstore,并搭建一个基于 GPT-4o 的 RetrievalQA chain,每次检索 top-3 的相关片段。
对于 query,我只需把问题传给 QA chain,它会完成检索与生成,并返回答案。
def build_index(self, image_paths: list):
docs = self.extract_text_from_images(image_paths)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
self.vectorstore = FAISS.from_documents(splits, self.embeddings)
self.qa_chain = RetrievalQA.from_chain_type(
llm=self.llm,
retriever=self.vectorstore.as_retriever(search_kwargs={"k": 3})
)
def query(self, question: str):
return self.qa_chain.invoke(question)
# Usage
rag = SimpleRAG()
rag.build_index(["Your pic"])
answer = rag.query("extract all the table?")
print(answer)
在这个 AI 技术飞速演进的时代,我们经常被“史上最强”“颠覆性”之类的宣传包围。然而真正有价值的突破,往往来自那些解决了具体问题、让技术更易用的创新。
PaddleOCR-VL 也许不会登上大众科技头条,但对于每天都要处理文档的开发者而言,它可能正是久等的答案。
毕竟,最好的技术,是能静静融入日常工作、让你几乎察觉不到它的存在。PaddleOCR-VL 正在扎实地朝这个方向迈进。
Reference:
https://arxiv.org/abs/2510.14528
https://github.com/PaddlePaddle/PaddleOCR
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-08-21
2025-08-21
2025-08-19
2025-09-16
2025-10-02
2025-09-08
2025-09-17
2025-08-19
2025-09-29
2025-08-20