

我们发布了 jina-vlm,这是一个24亿参数的视觉语言模型,在开放的2B规模VLM中实现了最先进的多语言视觉问答。通过将SigLIP2视觉编码器与Qwen3语言骨干通过注意力池连接器相结合,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 通过仔细的架构选择解决了这两个问题——我们的注意力池化连接器以最小的性能影响减少了4倍的视觉词元——以及明确保留多语言能力的训练方案。
关键的架构创新是我们的视觉-语言连接器。我们不是将每个图块的所有729个视觉词元传递给语言模型,而是应用2×2注意力池化,将其减少到182个词元——减少了4倍,信息损失最小。连接器的工作方式如下:
- 多层特征融合:我们连接来自ViT层18和24(倒数第三层和倒数第九层)的特征,捕获细粒度的空间细节和高级语义。
- 注意力池化:对于每个2×2 patch邻域,我们将邻域特征的平均值计算为一个查询,然后应用交叉注意力以产生单个池化表示。
- 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处理每个图块的方式相同,无论是否进行池化,因此这些节省仅适用于语言模型,而语言模型是推理期间的主要成本。
tag训练过程
VLM训练中一个常见的失败模式是灾难性遗忘:语言模型在适应视觉输入时会失去其纯文本能力。对于多语言模型来说,这一点尤其严重,因为视觉适应会降低非英语语言的性能。
我们通过一个两阶段的训练流程来解决这个问题,该流程具有明确的多语言数据和纯文本保留。
阶段1:对齐训练
第一阶段侧重于使用跨越不同视觉领域的字幕数据集进行跨语言语义基础:自然场景、文档、信息图表和图表。至关重要的是,我们包括15%的纯文本数据以保持骨干的语言理解。连接器使用更高的学习率(2e-4)和比编码器和解码器更短的预热期,使其能够快速适应,而预训练的组件则逐渐变化。
阶段2:指令微调
第二个阶段训练用于VQA和推理任务的指令遵循能力。我们将涵盖学术VQA、文档理解、OCR、数学和推理的公共数据集与纯文本指令数据相结合,以保持语言能力。
合并后的数据包含大约500万个多模态样本和29种语言的120亿个文本词元,其中大约一半是英语,其余的包括中文、阿拉伯语、德语、西班牙语、法语、意大利语、日语、韩语、葡萄牙语、俄语、土耳其语、越南语、泰语、印度尼西亚语、印地语、孟加拉语等。
tagGetting Started
tagVia Jina API
我们在https://api-beta-vlm.jina.ai提供了一个与 OpenAI 兼容的 API。
tagImage from URL
| Format | Example |
|---|---|
| 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"}}
]
}]
}'
Local image (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)'"}}
]
}]
}'
Text-only query
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?"}]
}'
Streaming response
添加 "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
}
}
只需等待后重试您的请求即可。
tagVia 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?"tagVia 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)tagConclusion
jina-vlm 证明了小型 VLM 可以通过仔细的架构和训练选择来实现强大的跨语言视觉理解。注意力池化连接器提供 4 倍的词元缩减,且性能影响最小,并且在多模态训练期间合并纯文本数据可以保留语言能力,否则这些能力会退化。
我们注意到当前方法的几个限制:
- 平铺开销:处理与平铺数量成线性比例。对于非常高分辨率的图像,这可能会变得非常重要。此外,平铺可能会损害需要整体场景理解的任务,例如对象计数或跨平铺边界的空间推理。全局缩略图部分缓解了这个问题,但原生分辨率方法可能更适合此类任务。
- 多图像推理:由于此机制中的训练数据有限,因此在多图像基准测试中的性能较弱。优化简洁的视觉响应似乎与扩展的多步骤推理相冲突,MMLU-Pro 的退化证明了这一点。
未来的工作可以探索更有效的分辨率处理、针对计数和空间任务的改进,并研究我们的多语言训练方法是否可以转移到更大的模型规模。






