

Rilasciamo jina-ocr-v1, un parser di documenti da 3,4 miliardi di parametri con circa 570 milioni di parametri attivi nel decoder per token. Ottiene un punteggio di 91,14 su OmniDocBench v1.6 e 83,4 su olmOCR-Bench e, con 2,57 pagine al secondo, ha il throughput di pagine più elevato tra i quattordici sistemi che abbiamo misurato. Su una NVIDIA L4, la sua testina di decodifica speculativa quasi raddoppia la velocità di decodifica mantenendo la decodifica lossless.
Il modello si basa sull'encoder di visione compresso e sul decoder mixture-of-experts di DeepSeek-OCR, aggiungendo due elementi. Una testina di bozza FastMTP applica un blocco in modo ricorsivo per tre passaggi di predizione, in modo che i parametri di bozza non crescano con la profondità. Il post-addestramento viene eseguito con ricompense dense verificabili, dove ogni controllo è un codice deterministico rispetto a un riferimento e ogni controllo viene valutato. Rispetto alla struttura base, il post-addestramento aggiunge 7,4 punti su olmOCR-Bench e migliora ogni colonna di OmniDocBench.


tagModello e addestramento
Gli output lunghi sono ciò che rende il parsing di documenti costoso da decodificare. DeepSeek-OCR ha eliminato gran parte di tale costo con un encoder di visione compresso e un decoder mixture-of-experts compatto; jina-ocr-v1 eredita entrambi e punta al collo di bottiglia autoregressivo rimanente.

L'output OCR è quasi deterministico e strutturato localmente, il che lo rende un carico di lavoro favorevole per la decodifica speculativa. La costruzione abituale collega una testina di bozza per profondità di predizione, quindi i parametri di bozza crescono in base a quanto in avanti il modello guarda. FastMTP utilizza un singolo blocco denso applicato ricorsivamente per K = 3 passaggi. Il verificatore controlla ogni proposta in modo greedy e accetta il prefisso più lungo su cui la bozza e il verificatore concordano, quindi la sequenza confermata equivale alla sequenza greedy del verificatore e la speculazione cambia solo il tempo impiegato per l'output.
| Componente | Specifica |
|---|---|
| Encoder di visione | DeepEncoder (~380M): SAM (80M) → 16x conv → CLIP-L (300M) |
| Token visivi | 256 @ 1024x1024 (Base); 256+100n, n ≤ 9 (Gundam, ≤ 1.156/pagina) |
| Decoder | DeepSeek-3B-MoE: 12 layer, d = 1280, 64 instradati + 2 condivisi, top-6 |
| Parametri attivi / totali | ~570M / ~3B (decoder); < 1B / ~3,4B (modello intero) |
| Vocabolario | 129.280 |
| Limite di posizione | 32.768 (RoPE, θ = 106) |
| Testina MTP | 1 blocco denso condiviso, K = 3 passaggi ricorsivi (FastMTP) |
Specifica del modello. Il decoder emette Markdown, con tabelle in HTML e formule in LaTeX.
I dati di addestramento attingono a corpora OCR pubblici tra cui olmOCR-mix, FinePDFs, LightOnOCR, MMTab e UniMER, oltre a fonti deliberatamente difficili come i giornali Europeana, le trascrizioni della Library of Congress e i file pensionistici NARA. Un filtro basato su regole elimina i loop di degenerazione e i duplicati, e un passaggio visione-linguaggio rietichetta le fonti difficili. Sintetizziamo anche le pagine per un motivo specifico: nelle pagine naturali i termini di ricompensa per formule e tabelle si applicano a pochissimi campioni, quindi la maggior parte dei roll-out non porta alcun segnale strutturale. JinaOCRSynth riempie ogni pagina con formule e tabelle valutabili e fornisce unit test insieme ad esse.
Il post-addestramento esegue l'allineamento supervisionato, il fine-tuning sulla robustezza per pagine degradate e il GRPO, ripetuto attraverso i round di un ciclo esterno. La ricompensa GRPO è un prodotto di termini verificabili, ciascuno calcolato da un codice deterministico rispetto a una trascrizione di riferimento.
| Componente | Segnale | Ruolo |
|---|---|---|
| Contenuto | Distanza di edit normalizzata su LaTeX/HTML misto | Fedeltà testuale |
| Formula | Corrispondenza stringa formula | Correttezza formula |
| Tabella | TEDS, TEDS-S, distanza di edit tabella | Recupero struttura |
| Validità strutturale | Bilanciamento parentesi, chiusura tag, integrità tabella | Correttezza formale |
| Unit test | Frazione di test in stile olmOCR superati (presenza, ordine, matematica, tabelle) | Feedback denso |
| Ripetizione e formato | Penalità di ripetizione, conformità HTML | Controllo degenerazione |
Composizione della ricompensa moltiplicativa. La maggior parte dei termini ha un limite minimo, poiché in un prodotto un controllo fallito rimuoverebbe il gradiente da una pagina altrimenti corretta. Il termine di ripetizione non ne ha nessuno, perché i loop degeneri sono la modalità di fallimento che più facilmente gonfia il punteggio del contenuto.
Ogni round lascia un pool di checkpoint candidati. Un agente ricerca configurazioni di merge con un budget di valutazione fisso e le valuta con controlli di unit-test e distanza di edit; gli errori nel merge selezionato guidano il round di raccolta successivo. La testina di bozza viene adattata per ultima, sul verificatore selezionato dal ciclo.
tagRisultati
| Modello | Parametri | ArXiv | OldScans-Math | Tables | OldScans | Multi-col | LongTiny | Hdr/Ftr | Base | Overall |
|---|---|---|---|---|---|---|---|---|---|---|
| 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 raggiunge un punteggio complessivo di 83,4, 7,4 punti sopra la dorsale DeepSeek-OCR su cui è stato post-addestrato e davanti al modello olmOCR-2 da 8B. La colonna Hdr/Ftr testa l'assenza di testo e premia l'omissione di intestazioni e piè di pagina, quindi la trascrizione fedele dell'intera pagina ottiene un punteggio basso in tale sezione.
| Metodo | Parametri | Overall ↑ | TextEdit ↓ | FormulaCDM ↑ | TableTEDS ↑ | TableTEDS-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 raggiunge 91,14 con 570M di parametri attivi, superando DeepSeek-OCR-2 in ogni colonna e posizionandosi davanti al molto più grande Qwen3-VL-235B.
tagSpeculative decoding su una L4
| Modalità | k | Output tok/s ↑ | Speedup S ↑ | Tasso di accettazione | τ | 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 su olmOCR-Bench, NVIDIA L4, vLLM 0.20.1, dimensione batch 1. τ è il numero medio di 词元 (tokens) confermati per ogni passaggio speculativo, incluso il 词元 bonus, e c = τ/S è il costo di un passaggio speculativo espresso in unità di un passaggio autoregressivo. Misurato su un dispositivo diverso rispetto alle figure precedenti.
La qualità della bozza non dipende dalla modalità di esecuzione, poiché τ è 2,73 in modalità eager e 2,74 con grafi CUDA a k = 3. La baseline invece varia. I grafi CUDA aumentano la decodifica autoregressiva da 42,7 a 158,3 词元 al secondo, mentre il sovraccarico di un passaggio speculativo rimane vicino a 9 ms, quindi il suo costo aumenta da 1,40 a 2,51 passaggi autoregressivi. Il guadagno segue il costo del passaggio di verifica che sostituisce, il che rende k = 3 la profondità ottimale in modalità eager e k = 1 con i grafi.
tagGuida introduttiva
Il modo più rapido per eseguirlo è Jina Reader. Punta r.jina.ai a un URL e aggiungi un'intestazione: Reader recupera la pagina o il PDF, la renderizza, esegue jina-ocr-v1 sul risultato e restituisce il Markdown. Non c'è nulla da distribuire, nessuna gestione di immagini da scrivere e utilizza la stessa chiave API del resto della piattaforma.
curl "https://r.jina.ai/https://example.com/document.pdf" \
-H "Authorization: Bearer $JINA_API_KEY" \
-H "X-Respond-With: jina-ocr-v1"Aggiungi X-Page per trascrivere una pagina di un documento multipagina. Entrambi i parametri sono presenti nell'editor API di Reader, dove l'interruttore scrive l'intestazione per te.
Per l'accesso diretto al modello, l'endpoint ospitato è compatibile con OpenAI e richiede solo una chiave API da 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"}}
]
}]
}'
Per il self-hosting, i pesi e il codice di modellazione personalizzato sono forniti in un repository di Hugging Face caricato con trust_remote_code=True. FastMTP necessita di vLLM 0.21 o versioni successive e di una registrazione dell'architettura una tantum prima dell'avvio del motore.
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 dettaglio decide se si ottiene o meno l'accelerazione. L'helper registra la testina con method="eagle", poiché FastMTP è addestrato con feedback ricorsivo dello stato nascosto e il method="mtp" predefinito ricollega ogni passaggio di bozza sul target. Il percorso Transformers esegue solo il decodificatore MoE e ignora i pesi MTP.
Il modello gestisce anche la trascrizione a livello di elementi di tabelle e formule, didascalie, VQA documentale ed estrazione di informazioni chiave, sia in inglese che in cinese. I pesi sono rilasciati sotto licenza CC BY-NC 4.0.
tagConclusione
Con 570M di parametri attivi, jina-ocr-v1 si colloca alla frontiera della precisione per parametro di entrambi i benchmark e ha il throughput di pagine più elevato tra i sistemi che abbiamo misurato. Due leve svolgono questo lavoro e nessuna delle due richiede un modello più grande: una ricompensa graduata su ogni controllo verificabile e una testina di bozza addestrata rispetto al verificatore finale.
Vale la pena osservare più da vicino la lunghezza dell'output. Il throughput dei 词元 (tokens) e quello delle pagine classificano i sistemi in modo diverso, e la lunghezza dell'output è indipendente dalla qualità dell'analisi, quindi la concisione può essere ottimizzata autonomamente. jina-ocr-v1 offre gli output più brevi tra tutti i sistemi che ottengono un punteggio superiore a 83.






