

Nous publions jina-ocr-v1, un analyseur de documents à 3,4 milliards de paramètres avec environ 570 millions de paramètres de décodeur actifs par 词元. Il obtient un score de 91,14 sur OmniDocBench v1.6 et 83,4 sur olmOCR-Bench, et avec 2,57 pages par seconde, il présente le débit de pages le plus élevé parmi les quatorze systèmes que nous avons mesurés. Sur un NVIDIA L4, sa tête de décodage spéculatif double presque la vitesse de décodage tout en conservant un décodage sans perte.
Le modèle s'appuie sur l'encodeur de vision compressé et le décodeur "mixture-of-experts" de DeepSeek-OCR et ajoute deux éléments. Une tête de brouillon FastMTP applique un bloc de manière récursive pour trois étapes de prédiction, de sorte que les paramètres de brouillon ne croissent pas avec la profondeur. Le post-entraînement est effectué sous des récompenses vérifiables denses, où chaque contrôle est un code déterministe par rapport à une référence et chaque contrôle est noté. Par rapport à cette base, le post-entraînement ajoute 7,4 points sur olmOCR-Bench et améliore chaque colonne d'OmniDocBench.


tagModèle et entraînement
Les sorties longues sont ce qui rend l'analyse de documents coûteuse à décoder. DeepSeek-OCR a supprimé la majeure partie de ce coût avec un encodeur de vision compressé et un décodeur "mixture-of-experts" compact, et jina-ocr-v1 hérite des deux et cible le goulot d'étranglement autorégressif qui subsiste.

La sortie OCR est quasi-déterministe et localement structurée, ce qui en fait une charge de travail favorable pour le décodage spéculatif. La construction habituelle attache une tête de brouillon par profondeur de prédiction, de sorte que les paramètres de brouillon augmentent avec la portée de la prédiction du modèle. FastMTP utilise un seul bloc dense appliqué de manière récursive pour K = 3 étapes. Le vérificateur vérifie chaque proposition de manière gloutonne et accepte le préfixe le plus long sur lequel le brouillon et le vérificateur s'accordent, de sorte que la séquence validée est égale à la séquence gloutonne du vérificateur et que la spéculation ne fait que modifier la durée de la sortie.
| Composant | Spécification |
|---|---|
| Encodeur de vision | DeepEncoder (~380M) : SAM (80M) → 16x conv → CLIP-L (300M) |
| 词元 visuels | 256 @ 1024x1024 (Base) ; 256+100n, n ≤ 9 (Gundam, ≤ 1 156/page) |
| Décodeur | DeepSeek-3B-MoE : 12 couches, d = 1280, 64 routées + 2 partagées, top-6 |
| Paramètres actifs / totaux | ~570M / ~3B (décodeur) ; < 1B / ~3,4B (modèle complet) |
| Vocabulaire | 129 280 |
| Limite de position | 32 768 (RoPE, θ = 106) |
| Tête MTP | 1 bloc dense partagé, K = 3 étapes récursives (FastMTP) |
Spécification du modèle. Le décodeur émet du Markdown, avec des tableaux en HTML et des formules en LaTeX.
Les données d'entraînement s'appuient sur des corpus publics d'OCR incluant olmOCR-mix, FinePDFs, LightOnOCR, MMTab et UniMER, ainsi que des sources délibérément difficiles telles que les journaux Europeana, les transcriptions de la Bibliothèque du Congrès et les dossiers de pension NARA. Un filtre basé sur des règles supprime les boucles de dégénérescence et les doublons, et un passage vision-langage réétiquette les sources difficiles. Nous synthétisons également des pages pour une raison spécifique : sur les pages naturelles, les termes de récompense des formules et des tableaux s'appliquent à très peu d'échantillons, de sorte que la plupart des déploiements ne portent aucun signal structurel. JinaOCRSynth remplit chaque page avec des formules et des tableaux évaluables et les accompagne de tests unitaires.
Le post-entraînement effectue un alignement supervisé, un réglage fin de la robustesse sur des pages dégradées, et du GRPO, répétés au cours des cycles d'une boucle externe. La récompense GRPO est un produit de termes vérifiables, chacun calculé par un code déterministe par rapport à une transcription de référence.
| Composant | Signal | Rôle |
|---|---|---|
| Contenu | Distance d'édition normalisée sur mélange LaTeX/HTML | Fidélité textuelle |
| Formule | Correspondance de chaîne de formule | Exactitude des formules |
| Tableau | TEDS, TEDS-S, distance d'édition de tableau | Récupération de structure |
| Validité structurelle | Équilibre des accolades, fermeture des balises, intégrité du tableau | Bonne formation |
| Tests unitaires | Fraction des tests de présence, d'ordre, mathématiques et de tableau de style olmOCR réussis | Feedback dense |
| Répétition et format | Pénalité de répétition, conformité HTML | Contrôle de la dégénérescence |
Composition de récompense multiplicative. La plupart des termes comportent un seuil minimal, car dans un produit, un contrôle échoué supprimerait le gradient d'une page par ailleurs correcte. Le terme de répétition n'en a pas, car les boucles dégénérées sont le mode de défaillance qui gonfle le plus facilement le score de contenu.
Chaque cycle laisse un pool de points de contrôle candidats. Un agent recherche des configurations de fusion sous un budget d'évaluation fixe et les évalue avec des tests unitaires et des contrôles de distance d'édition, et les erreurs dans la fusion sélectionnée pilotent le cycle de collecte suivant. La tête de brouillon est ajustée en dernier, sur le vérificateur sélectionné par la boucle.
tagRésultats
| Modèle | Paramètres | ArXiv | OldScans-Math | Tableaux | OldScans | Multi-col | LongTiny | Hdr/Ftr | Base | Global |
|---|---|---|---|---|---|---|---|---|---|---|
| Gemini 3 Flash | – | 80,1 | 73,6 | 64,6 | 45,8 | 75,3 | 90,3 | 27,4 | – | – |
| Qwen3-VL-235B | 235B/22B | 88,4 | 81,2 | 86,7 | 49,6 | 85,9 | 88,9 | 33,6 | – | – |
| DeepSeek-OCR | 3B/570M | 77,5 | 74,5 | 77,3 | 33,1 | 67,3 | 83,0 | 96,1 | 99,3 | 76,0 |
| dots.mocr | 3B | 85,9 | 85,5 | 90,7 | 48,2 | 85,3 | 81,6 | 94,0 | 99,7 | 83,9 |
| olmOCR-2 | 8B | 82,9 | 82,1 | 84,3 | 48,3 | 84,3 | 81,4 | – | 99,7 | 82,4 |
| LightOnOCR-2 | 1B | 89,6 | 85,6 | 89,0 | 42,2 | 84,8 | 91,4 | 19,7 | 99,6 | 83,2 |
| chandra-ocr-2 | 4B | 86,9 | 89,1 | 92,1 | 51,1 | 82,1 | 93,7 | 91,4 | 99,9 | 85,8 |
| jina-ocr-v1 | 3B/570M | 86,1 | 82,3 | 88,8 | 42,6 | 85,5 | 93,2 | 88,7 | 99,9 | 83,4 |
olmOCR-Bench. jina-ocr-v1 atteint un score global de 83,4, soit 7,4 points au-dessus du modèle DeepSeek-OCR sur lequel il est post-entraîné, et devance le modèle olmOCR-2 de 8B. La colonne Hdr/Ftr teste l'absence de texte et récompense l'omission des en-têtes et pieds de page ; par conséquent, la transcription fidèle d'une page complète obtient un score faible sur ce point.
| Méthode | Paramètres | Global ↑ | TexteEdit ↓ | FormuleCDM ↑ | TableauTEDS ↑ | TableauTEDS-S ↑ | ROEdit ↓ |
|---|---|---|---|---|---|---|---|
| Gemini 3 Flash | – | 92,62 | 0,066 | 95,16 | 89,29 | 93,51 | 0,172 |
| Qwen3-VL-235B | 235B/22B | 89,78 | 0,063 | 92,55 | 83,07 | 86,75 | 0,166 |
| DeepSeek-OCR-2 | 3B/570M | 90,25 | 0,050 | 91,84 | 83,89 | 87,75 | 0,144 |
| HunyuanOCR-1.5 | 1B | 94,74 | 0,039 | 94,50 | 93,67 | 94,71 | 0,129 |
| PaddleOCR-VL-1.6 | 0,9B | 96,34 | 0,033 | 97,53 | 94,76 | 97,10 | 0,128 |
| jina-ocr-v1 | 3B/570M | 91,14 | 0,046 | 93,28 | 84,68 | 89,01 | 0,142 |
OmniDocBench v1.6. jina-ocr-v1 atteint 91,14 avec 570M de paramètres actifs, surpassant DeepSeek-OCR-2 sur chaque colonne et devançant le modèle Qwen3-VL-235B, beaucoup plus volumineux.
tagDécodage spéculatif sur un L4
| Mode | k | Sortie tok/s ↑ | Accélération S ↑ | Taux d'acceptation | τ | c ↓ |
|---|---|---|---|---|---|---|
| Eager | 0 | 42,7 | 1,00x | – | – | 1,00 |
| Eager | 1 | 64,0 | 1,50x | 82,6 % | 1,83 | 1,22 |
| Eager | 2 | 77,9 | 1,82x | 69,1 % | 2,38 | 1,30 |
| Eager | 3 | 83,1 | 1,95x | 57,6 % | 2,73 | 1,40 |
| Graph | 0 | 158,3 | 1,00x | – | – | 1,00 |
| Graph | 1 | 185,6 | 1,17x | 82,9 % | 1,83 | 1,56 |
| Graph | 2 | 183,8 | 1,16x | 69,3 % | 2,38 | 2,05 |
| Graph | 3 | 172,9 | 1,09x | 57,9 % | 2,74 | 2,51 |
FastMTP sur olmOCR-Bench, NVIDIA L4, vLLM 0.20.1, taille de lot 1. τ est le nombre moyen de 词元 (tokens) validés par étape spéculative, incluant le 词元 bonus, et c = τ/S représente le coût d'une étape spéculative en unités d'étape autorégressive. Mesuré sur un appareil différent des chiffres ci-dessus.
La qualité du brouillon ne dépend pas du mode d'exécution, puisque τ est de 2,73 en mode eager et 2,74 avec les graphes CUDA à k = 3. La ligne de base, elle, en dépend. Les graphes CUDA font passer le décodage autorégressif de 42,7 à 158,3 词元 par seconde tandis que le surcoût d'une étape spéculative reste proche de 9 ms, son coût augmente donc de 1,40 à 2,51 étapes autorégressives. Le gain suit le coût de l'étape de vérification qu'il remplace, ce qui place la profondeur optimale à k = 3 en mode eager et k = 1 avec les graphes.
tagPour commencer
Le moyen le plus rapide de l'exécuter est Jina Reader. Pointez r.jina.ai vers une URL et ajoutez un en-tête : Reader récupère la page ou le PDF, le rend, exécute jina-ocr-v1 sur le résultat et renvoie du Markdown. Rien à déployer, aucune gestion d'image à écrire, et la même clé API que pour le reste de la plateforme.
curl "https://r.jina.ai/https://example.com/document.pdf" \
-H "Authorization: Bearer $JINA_API_KEY" \
-H "X-Respond-With: jina-ocr-v1"Ajoutez X-Page pour transcrire une seule page d'un document multipage. Les deux paramètres sont disponibles dans l'éditeur d'API Reader, où le bouton bascule écrit l'en-tête pour vous.
Pour un accès direct au modèle, le point de terminaison hébergé est compatible avec OpenAI et ne nécessite qu'une clé API de jina.ai.
curl https://api.jina.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ***" \
-d '{
"model": "jina-ocr-v1",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "Transcribe the provided document image into a clean Markdown format, preserving the natural reading order."},
{"type": "image_url", "image_url": {"url": "https://example.com/document.png"}}
]
}]
}'
Pour l'héberger vous-même, les poids et le code de modélisation personnalisé sont fournis dans un dépôt Hugging Face chargé avec trust_remote_code=True. FastMTP nécessite vLLM 0.21 ou ultérieur et un enregistrement d'architecture unique avant le démarrage du moteur.
import sys
from huggingface_hub import snapshot_download
from PIL import Image
from vllm import LLM
sys.path.insert(0, snapshot_download('jinaai/jina-ocr-v1'))
from deepseek_ocr_mtp import DEFAULT_OCR_PROMPT, register, vllm_llm_kwargs, vllm_sampling_params
register()
llm = LLM(**vllm_llm_kwargs('jinaai/jina-ocr-v1',
num_speculative_tokens=3,
mtp_heads=1,
mtp_recursive=True))
image = Image.open('document.png').convert('RGB')
outputs = llm.chat(
[{'role': 'user', 'content': [{'type': 'image_pil', 'image_pil': image},
{'type': 'text', 'text': DEFAULT_OCR_PROMPT}]}],
sampling_params=vllm_sampling_params(max_tokens=4096),
)
print(outputs[0].outputs[0].text)
Un détail détermine si l'accélération se produit. L'assistant enregistre la tête avec method="eagle", car FastMTP est entraîné avec un retour d'état caché récursif et la méthode par défaut method="mtp" réinitialise chaque étape de brouillon sur la cible. Le chemin Transformers exécute seul le décodeur MoE et ignore les poids MTP.
Le modèle gère également la transcription au niveau des éléments des tableaux et des formules, le sous-titrage, le VQA de documents et l'extraction d'informations clés, en anglais et en chinois. Les poids sont publiés sous licence CC BY-NC 4.0.
tagConclusion
Avec 570M de paramètres actifs, jina-ocr-v1 se situe à la frontière précision-par-paramètre des deux benchmarks et possède le débit de pages le plus élevé des systèmes que nous avons mesurés. Deux leviers accomplissent ce travail sans nécessiter de modèle plus grand : une récompense graduée à chaque vérification confirmable, et une tête de brouillon entraînée par rapport au vérificateur final.
La longueur de la sortie mérite une attention particulière. Le débit de 词元 et le débit de pages classent les systèmes différemment, et la longueur de sortie est indépendante de la qualité de l'analyse, la concision peut donc être optimisée séparément. jina-ocr-v1 propose les sorties les plus courtes parmi tous les systèmes ayant un score supérieur à 83.






