

我們正在發布 jina-vlm,這是一個 24 億參數的視覺語言模型,在開放的 2B 規模 VLM 中,它在多語種視覺問答方面達到了最先進的水平。透過將 SigLIP2 視覺編碼器與 Qwen3 語言主幹透過 attention-pooling 連接器結合,jina-vlm 在 29 種語言中展現了強大的效能,同時保持了足夠的效率,可以在消費級硬體上運行。
| Model | Size | VQA Avg | MMMB | Multi. MMB | DocVQA | OCRBench |
|---|---|---|---|---|---|---|
| jina-vlm | 2.4B | 72.3 | 78.8 | 74.3 | 90.6 | 778 |
| Qwen2-VL-2B | 2.1B | 66.4 | 71.3 | 69.4 | 89.2 | 809 |
| Qwen3-VL-2B | 2.8B | 71.6 | 75.0 | 72.3 | 92.3 | 858 |
| InternVL3-2B | 2.2B | 69.2 | 73.6 | 71.9 | 87.4 | 835 |
| InternVL3.5-2B | 2.2B | 71.6 | 74.6 | 70.9 | 88.5 | 836 |





tag架構
有兩個挑戰限制了實際的 VLM 部署:多語種能力在視覺適應期間經常會降低,而且高品質的 VLM 在計算上仍然很昂貴。jina-vlm 透過仔細的架構選擇(我們的 attention-pooling 連接器以最小的效能影響減少了 4 倍的視覺詞元)和明確保留多語種能力的訓練方法來解決這兩個問題。
關鍵的架構創新是我們的視覺語言連接器。我們沒有將每個圖塊的所有 729 個視覺詞元傳遞給語言模型,而是應用 2×2 attention pooling,將其減少到 182 個詞元,減少了 4 倍,而資訊損失卻很小。連接器的工作方式如下:
- 多層特徵融合:我們連接來自 ViT 第 18 層和第 24 層(倒數第三層和倒數第九層)的特徵,同時擷取細緻的空間細節和高階語義。
- Attention pooling:對於每個 2×2 修補程式鄰域,我們計算一個查詢,作為鄰域特徵的平均值,然後應用交叉注意力來產生單個池化表示。
- SwiGLU 投影:池化的特徵透過閘控線性單元投影到語言模型維度。
以下描述了這種效率提升:
| Metric | No Pooling | With Pooling | Reduction |
|---|---|---|---|
| Visual tokens (12 tiles + thumbnail) | 9,477 | 2,366 | 4.0× |
| LLM prefill FLOPs | 27.2 TFLOPs | 6.9 TFLOPs | 3.9× |
| KV-cache memory | 2.12 GB | 0.53 GB | 4.0× |
由於 ViT 以相同的方式處理每個圖塊,而不管 attention pooling 如何,因此這些節省僅適用於語言模型,而語言模型是推理期間的主要成本。
tag訓練程序
VLM 訓練中常見的失敗模式是災難性遺忘:語言模型在適應視覺輸入時會失去其純文字能力。對於多語種模型而言,這尤其嚴重,因為視覺適應會降低非英語語言的效能。
我們透過一個分為兩個階段的訓練流程來解決這個問題,該流程具有明確的多語種資料和純文字保留。
階段 1:對齊訓練
第一階段側重於使用跨越多個視覺領域的標題資料集(自然場景、文件、資訊圖表和圖表)進行跨語言的語義基礎。至關重要的是,我們包含 15% 的純文字資料,以維持主幹的語言理解。連接器使用比編碼器和解碼器更高的學習率 (2e-4) 和更短的預熱時間,使其能夠快速適應,而預訓練元件則逐漸變化。
階段 2:指令微調
第二階段訓練 VQA 和推理任務的指令遵循能力。我們結合涵蓋學術 VQA、文件理解、OCR、數學和推理的公開資料集,以及純文字指令資料,以維持語言能力。
合併後的資料包含大約 500 萬個多模態樣本和 120 億個文字詞元,涵蓋 29 種語言,其中大約一半是英語,其餘涵蓋中文、阿拉伯語、德語、西班牙語、法語、義大利語、日語、韓語、葡萄牙語、俄語、土耳其語、越南語、泰語、印尼語、印地語、孟加拉語等。
tag開始使用
tag透過 Jina API
我們在 https://api-beta-vlm.jina.ai 提供一個與 OpenAI 相容的 API。
tag從 URL 取得圖片
| 格式 | 範例 |
|---|---|
| HTTP/HTTPS URL | https://example.com/image.jpg |
| Base64 data URI | data:image/jpeg;base64,/9j/4AAQ... |
curl https://api-beta-vlm.jina.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $JINA_API_KEY" \
-d '{
"model": "jina-vlm",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "Describe this image"},
{"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}}
]
}]
}'
本機圖片 (base64)
curl https://api-beta-vlm.jina.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $JINA_API_KEY" \
-d '{
"model": "jina-vlm",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "What is in this image?"},
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,'$(base64 -i image.jpg)'"}}
]
}]
}'
純文字查詢
curl https://api-beta-vlm.jina.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $JINA_API_KEY" \
-d '{
"model": "jina-vlm",
"messages": [{"role": "user", "content": "What is the capital of France?"}]
}'
串流回應
新增 "stream": true 以在產生時接收詞元:
curl https://api-beta-vlm.jina.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $JINA_API_KEY" \
-d '{
"model": "jina-vlm",
"stream": true,
"messages": [{"role": "user", "content": "Write a haiku about coding"}]
}'
當服務冷啟動時,您會收到:
{
"error": {
"message": "Model is loading, please retry in 30-60 seconds. Cold start takes ~30s after the service scales up.",
"code": 503
}
}
請在等待後重試您的請求。
tag透過 CLI
HuggingFace 儲存庫包含一個 infer.py 腳本,用於快速實驗:
# Single image
python infer.py -i image.jpg -p "What's in this image?"
# Streaming output
python infer.py -i image.jpg -p "Describe this image" --stream
# Multiple images
python infer.py -i img1.jpg -i img2.jpg -p "Compare these images"
# Text-only
python infer.py -p "What is the capital of France?"tag透過 Transformers
from transformers import AutoModelForCausalLM, AutoProcessor
import torch
from PIL import Image
# Load model and processor
model = AutoModelForCausalLM.from_pretrained(
"jinaai/jina-vlm",
torch_dtype=torch.bfloat16,
trust_remote_code=True,
device_map="auto"
)
processor = AutoProcessor.from_pretrained(
"jinaai/jina-vlm",
trust_remote_code=True
)
# Load an image
image = Image.open("document.png")
# Create the conversation
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": image},
{"type": "text", "text": "What is the main topic of this document?"}
]
}
]
# Process and generate
inputs = processor.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=True,
return_dict=True,
return_tensors="pt"
).to(model.device)
outputs = model.generate(**inputs, max_new_tokens=256, do_sample=False)
response = processor.decode(outputs[0], skip_special_tokens=True)
print(response)tag結論
jina-vlm 證明了小型 VLM 可以透過仔細的架構和訓練選擇,實現強大的跨語言視覺理解能力。注意力池化連接器提供了 4 倍的詞元縮減,且效能影響極小,並且在多模態訓練期間納入純文字資料,可保留原本會降低的語言能力。
我們注意到目前方法的幾個限制:
- 分塊處理的額外負荷:處理量隨著分塊數線性擴展。對於非常高解析度的圖像,這可能會變得非常顯著。此外,分塊可能會損害需要整體場景理解的任務,例如物件計數或跨分塊邊界的空間推理。全域縮圖在一定程度上緩解了這個問題,但原生解析度方法可能更適合此類任務。
- 多圖像推理:由於此模式下的訓練資料有限,因此在多圖像基準測試中的效能較弱。針對簡潔的視覺回應進行優化似乎與擴展的多步驟推理相衝突,MMLU-Pro 的效能下降就證明了這一點。
未來的研究可以探索更有效的解析度處理方法,針對計數和空間任務進行有針對性的改進,並研究我們的多語言訓練方法是否可以轉移到更大的模型規模。






