Views
No views yet
| Feature | Detail |
|---|---|
| Architecture | Qwen3.5-4B vision-language model + 640-dimensional linear projection |
| Released parameters | 4,540,904,576 |
| Method | ColBERT-style late interaction with MaxSim scoring |
| Output | L2-normalized multi-vector embeddings (sequence_length, 640) |
| Modalities | Text queries and document images |
| Attention | Bidirectional full-attention layers; selectable SDPA, FlashAttention 2, or FlashAttention 3 kernel |
| Visual-token budget | 1,792 tokens per image in the released processor |
| Training | LoRA adapters and a fully trained projection layer, merged for release |
| Weights | bfloat16; language-model head removed |
bfloat16. Before MaxSim scoring, query and document
embeddings were moved to CPU and converted to float32; all reported ViDoRe
results use this FP32 scoring path. Because floating-point calculations and
kernel execution can vary across accelerator hardware, independent
evaluations may produce slightly different results. The submitted MTEB
artifacts are the canonical source for the reported scores.| Model | Final mean | Mean (Public) | Mean (Private) | Computer Science | Energy | FinanceEn | FinanceFr | HR | Industrial | Nuclear | Pharmaceuticals | Physics | Telecom |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| webAI-ColVec1.1-8b | 64.95 | 65.32 | 63.47 | 80.08 | 70.12 | 71.90 | 54.87 | 68.55 | 57.65 | 53.66 | 67.88 | 51.50 | 73.29 |
| VultronRetriever Prime | 64.26 | 64.72 | 62.43 | 79.81 | 70.26 | 69.01 | 54.51 | 66.82 | 57.41 | 53.59 | 68.19 | 51.73 | 71.27 |
| webAI-ColVec1.1-4b (this model) | 63.90 | 64.24 | 62.53 | 80.34 | 69.50 | 69.18 | 53.13 | 66.90 | 56.36 | 53.30 | 67.25 | 51.24 | 71.76 |
| VultronRetriever Core | 63.57 | 63.72 | 63.00 | 79.77 | 69.19 | 68.93 | 52.02 | 66.10 | 56.11 | 54.90 | 67.45 | 50.18 | 71.10 |
| Nemotron ColEmbed VL 8B V2 | 63.42 | 63.54 | 62.92 | 79.29 | 69.82 | 67.29 | 51.54 | 66.32 | 56.03 | 53.84 | 67.19 | 50.84 | 72.00 |
| webAI-ColVec1-9b | 63.00 | 64.45 | 57.20 | 80.92 | 69.77 | 68.28 | 53.72 | 70.04 | 57.18 | 47.66 | 67.32 | 48.38 | 66.74 |
| webAI-ColVec1-4b | 62.22 | 63.39 | 57.55 | 79.84 | 68.70 | 68.49 | 51.11 | 67.40 | 55.73 | 48.22 | 65.68 | 50.15 | 66.88 |
| Tomoro ColQwen3 Embed 8B | 61.59 | 61.60 | 61.56 | 75.35 | 68.41 | 65.08 | 49.10 | 63.98 | 54.41 | 52.65 | 66.36 | 50.13 | 70.46 |
webAI-ColVec1-4b and
webAI-ColVec1-9b refer to the previous ColVec1 release, not these ColVec1.1
checkpoints.MultiVectorEncoder, which is available from
Sentence Transformers v6.0.0:pip install "sentence-transformers[image]>=6.0.0"encode_query and encode_document apply the query and document prompt
formats, the ten query-augmentation tokens, and the L2-normalized
640-dimensional projection. similarity computes the MaxSim score matrix.1from io import BytesIO
2
3import requests
4from PIL import Image
5from sentence_transformers import MultiVectorEncoder
6
7model = MultiVectorEncoder("webAI-Official/webAI-ColVec1.1-4b", trust_remote_code=True)
8
9queries = [
10 "When was the United States Declaration of Independence proclaimed?",
11 "Who printed the edition of Romeo and Juliet?",
12]
13document_urls = [
14 "https://upload.wikimedia.org/wikipedia/commons/8/89/US-original-Declaration-1776.jpg",
15 "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Romeoandjuliet1597.jpg/500px-Romeoandjuliet1597.jpg",
16]
17documents = [
18 Image.open(BytesIO(requests.get(url, headers={"User-Agent": "Mozilla/5.0"}, timeout=30).content))
19 for url in document_urls
20]
21
22query_embeddings = model.encode_query(queries)
23document_embeddings = model.encode_document(documents)
24print(query_embeddings[0].shape, document_embeddings[0].shape)
25# (27, 640) (523, 640)
26
27scores = model.similarity(query_embeddings, document_embeddings)
28print(scores)
29# tensor([[23.3935, 5.7660],
30# [ 4.8504, 23.1851]])
31print("Best document per query:", scores.argmax(dim=1))
32# Best document per query: tensor([0, 1])PIL.Image
objects. The Wikimedia URLs above are fetched with a browser User-Agent
because Wikimedia rejects the default one. Both encode methods accept a
batch_size, and the loading options are forwarded through model_kwargs
(dtype, attn_implementation, device_map) and processor_kwargs
(max_num_visual_tokens):1model = MultiVectorEncoder(
2 "webAI-Official/webAI-ColVec1.1-4b",
3 trust_remote_code=True,
4 model_kwargs={"attn_implementation": "sdpa", "device_map": "cuda:0"},
5 processor_kwargs={"max_num_visual_tokens": 1024},
6)bfloat16 weights and SDPA. MaxSim is accumulated in float32 rather
than in the embedding dtype, matching the scoring path behind the reported
evaluation, so a bfloat16 score_retrieval call on the same embeddings
returns coarser values. The scores still move in the second decimal place
across PyTorch and Transformers builds. Text passed to encode_document
is rendered as a query, because the model defines no text-document format,
and a warning says so.process_images(images) prepares one or more document images.process_queries(texts) prepares one or more natural-language queries.score_retrieval(query_embeddings, document_embeddings) computes a MaxSim
score matrix with shape (number_of_queries, number_of_documents).1python3.12 -m venv .venv
2source .venv/bin/activate
3
4python -m pip install \
5 torch==2.9.0 torchvision==0.24.0 \
6 --index-url https://download.pytorch.org/whl/cu128
7
8python -m pip install \
9 "transformers>=5.14.1,<6.0.0" \
10 accelerate pillow requests safetensors1from io import BytesIO
2
3import requests
4import torch
5from PIL import Image
6from transformers import AutoModel, AutoProcessor
7
8MODEL_ID = "webAI-Official/webAI-ColVec1.1-4b"
9DEVICE = "cuda:0" if torch.cuda.is_available() else "cpu"
10
11# Portable default and the backend used by the published evaluation:
12ATTN_IMPLEMENTATION = "sdpa"
13
14processor = AutoProcessor.from_pretrained(
15 MODEL_ID,
16 trust_remote_code=True,
17 max_num_visual_tokens=1792,
18)
19model = AutoModel.from_pretrained(
20 MODEL_ID,
21 trust_remote_code=True,
22 dtype=torch.bfloat16,
23 attn_implementation=ATTN_IMPLEMENTATION,
24 device_map=DEVICE,
25).eval()
26
27queries = [
28 "When was the United States Declaration of Independence proclaimed?",
29 "Who printed the edition of Romeo and Juliet?",
30]
31document_urls = [
32 "https://upload.wikimedia.org/wikipedia/commons/8/89/US-original-Declaration-1776.jpg",
33 "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Romeoandjuliet1597.jpg/500px-Romeoandjuliet1597.jpg",
34]
35
36
37def load_image(url: str) -> Image.Image:
38 response = requests.get(
39 url,
40 headers={"User-Agent": "Mozilla/5.0"},
41 timeout=30,
42 )
43 response.raise_for_status()
44 return Image.open(BytesIO(response.content)).convert("RGB")
45
46
47device = next(model.parameters()).device
48query_inputs = processor.process_queries(queries)
49document_inputs = processor.process_images(
50 [load_image(url) for url in document_urls]
51)
52query_inputs = {
53 key: value.to(device) if isinstance(value, torch.Tensor) else value
54 for key, value in query_inputs.items()
55}
56document_inputs = {
57 key: value.to(device) if isinstance(value, torch.Tensor) else value
58 for key, value in document_inputs.items()
59}
60
61with torch.inference_mode():
62 query_batch = model(**query_inputs)
63 document_batch = model(**document_inputs)
64
65query_embeddings = [embedding.cpu() for embedding in query_batch]
66document_embeddings = [embedding.cpu() for embedding in document_batch]
67scores = processor.score_retrieval(
68 query_embeddings,
69 document_embeddings,
70 output_dtype=torch.float32,
71)
72
73print(scores)
74print("Best document per query:", scores.argmax(dim=1))max_num_visual_tokens value to
AutoProcessor.from_pretrained; this changes document granularity and may
change retrieval scores.flash-attn can accelerate the full-attention layers when selected.causal-conv1d and flash-linear-attention (fla) accelerate the
GatedDeltaNet layers. Transformers can fall back to PyTorch implementations
without them.tilelang provides optimized GPU kernels for some FLA operations. FLA uses
these kernels when the operation and hardware are supported and uses another
implementation otherwise. Pin apache-tvm-ffi<0.1.10 alongside it to keep
TileLang's TVM dependency compatible.causal-conv1d, flash-linear-attention, and tilelang are detected
automatically once installed, so the GatedDeltaNet layers need no configuration
change. Only the full-attention backend is selected explicitly, as a one-line
change to the model loading code in Quick start:ATTN_IMPLEMENTATION = "flash_attention_2" # or "flash_attention_3"evaluation-requirements-cu128.txt,
which reproduces the recorded Linux x86-64, CPython 3.12, CUDA 12.8, and
PyTorch 2.9 environment used for evaluation. Its pinned wheel URLs are specific
to that platform, so a different environment needs matching wheels or a source
build.uv, ensure
Git is available, and then run:1uv venv --python 3.12 .venv
2source .venv/bin/activate
3
4uv pip install \
5 torch==2.9.0 torchvision==0.24.0 \
6 --index-url https://download.pytorch.org/whl/cu128
7
8uv pip install -r evaluation-requirements-cu128.txt
9uv pip check1Python 3.12
2PyTorch 2.9.0 + CUDA 12.8
3Transformers 5.14.1
4MTEB 2.18.6 (commit d56a414b45ebad0d03495de000b4880d8b028d4a)
5Sentence Transformers 5.6.0
6causal-conv1d 1.6.2.post1
7flash-linear-attention 0.5.1
8TileLang 0.1.9
9Attention implementation: SDPANOTICES.md for upstream attribution.1@misc{webai_colvec1_1_4b,
2 title = {webAI-ColVec1.1-4b: A Bidirectional Multi-Vector Model for Visual Document Retrieval},
3 author = {webAI},
4 year = {2026},
5 url = {https://huggingface.co/webAI-Official/webAI-ColVec1.1-4b}
6}