45
stars
12
commits
4
repos using this model
6
linked in READMEs
Aug 31, 2026
updated
π― TL;DR: First large-scale fully pre-trained ColBERT model using only public data. Achieves 55.43 nDCG@10 on BEIR benchmark, outperforming GTE-ModernColBERT and GTE-ModernBERT trained on closed and stronger data. New SOTA on BEIR for models <150M parameters.
Late interaction (ColBERT / multi-vector) models have clear advantages in out-of-domain generalization, long-context handling, and reasoning-intensive retrieval. Yet they remain undertrained: current state-of-the-art ColBERT models (e.g, GTE-ModernColBERT and ColBERT-small) are simply built by bolting a small knowledge distillation step onto a strong dense (single-vector) model. Even recent efforts like mxbai-edge-colbert-v0 perform all early training stages in a single-vector setting, only switching to the multi-vector objective at the very end.
This leaves a lot of performance on the table. ColBERT-Zero demonstrates that performing contrastive pre-training directly in the multi-vector setting, rather than treating it as an afterthought, unlocks a significantly higher performance ceiling. Trained exclusively on public data (Nomic-embed dataset mixture), ColBERT-Zero overcomes a 2.4-point data quality disadvantage to outperform models trained on proprietary, closed-source data. For detailed results, please have a look at our blogpost and the paper. All the models (including intermediate checkpoints) as well training code are released under an Apache 2.0 license.
We deliberately trained on the public Nomic-embed data mixture for a strategic reason: Nomic has already trained a dense ModernBERT model (ModernBERT-embed) on this exact data. This lets us compare dense vs. multi-vector training with the same data, same base model (ModernBERT), and same pipeline. The only variable is whether the contrastive phases are performed in the dense or multi-vector setting.
This design reveals a striking result: the dense baseline trained on Nomic data scores 52.89, while the one trained on GTE's proprietary data scores 55.33: a 2.4-point data quality gap. Despite this disadvantage, ColBERT-Zero's full multi-vector pre-training pipeline closes and surpasses this gap, reaching 55.43 nDCG@10.
The development followed a three-phase pipeline, each providing a different type of learning signal:
We began with the nomic-embed-unsupervised-data dataset. Using PyLate's GradCache implementation to scale per-GPU batch size without VRAM constraints, combined with cross-GPU gathering of representations, we reached effective batch sizes of ~16k, required for unsupervised training to produce plausible in-batch hard negatives. Unlike dense training, the multi-vector objective allows the encoder to learn fine-grained token importance from the very first phase.
We refined the model using the nomic-embed-supervised-data. This stage introduced mined hard negatives: documents that are superficially similar to the query but not actually relevant. This allows teaching the model to handle nuance by prioritizing specific keywords and contextual tokens most indicative of a true match.
The final stage used the ms-marco-en-bge dataset. We leveraged a powerful Gemma-based model as a teacher, allowing our student models to learn to replicate complex reasoning scores via the efficient MaxSim operator.
The KD-only approach (the current industry standard) scores 54.09, lagging behind full pre-training by 1.3 points. A simple distillation step is insufficient for optimal multi-vector performance.
By running a supervised contrastive step in the multi-vector setting before distillation, we reach 55.12 nDCG@10, closing most of the gap with the fully pre-trained model (55.43). This costs ~40 GH200-hours instead of ~408: roughly 10Γ cheaper for 99.4% of the performance.
Nomic's base models are pre-trained with asymmetric prompts (search_query: and search_document:). While ColBERT has its own asymmetric mechanism via [Q] and [D] markers, we found:
Why do prompts help? Our leading hypothesis is that prompt tokens act as implicit query expansion: extra slots that don't carry specific meaning but let the model store global information about the sequence. The original ColBERT used [PAD] tokens for this purpose, but modern Flash Attention implementations broke this trick (masked tokens no longer produce usable embeddings). Explicit prompt tokens may be quietly re-enabling it.
Practical takeaway: Always align your prompts with the base model's pre-training setup. Misalignment is one of the easiest ways to silently lose performance. Note that this sensitivity decreases with stronger downstream fine-tuning: with enough training, the model can adapt to an initial mismatch.
ColBERT-Zero utilizes the full 3-phase pipeline with strict prompt alignment, achieving 55.43 nDCG@10 on BEIR, setting a new SOTA for models <150M parameters. We also provide ColBERT-Zero-noprompts, the same pipeline without asymmetric prompts, to study the impact of query expansion on multi-vector performance.
These models represent the practical sweet spot. By skipping the expensive unsupervised phase, ModernColBERT-embed-base (Supervised + KD) achieves ~97% of the flagship's performance at only ~10% of the compute cost. For reference, ModernColBERT-embed-base-kd performs only the distillation step on a supervised dense base.
For researchers studying the incremental impact of each phase and prompt alignment, we release several ablation variants: ColBERT-Zero-supervised, ColBERT-Zero-unsupervised (and their -noprompts versions), and ModernColBERT-embed-base-supervised.
| Model | Avg | FiQA | NFCorpus | TREC-COVID | Touche | ArguAna | Quora | SCIDOCS | SciFact | NQ | ClimateFEVER | HotpotQA | DBPedia | CQADupstack | FEVER | MSMARCO |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Baselines | ||||||||||||||||
| ModernBERT-embed-unsupervised | 47.05 | 42.53 | 35.33 | 68.44 | 18.58 | 48.82 | 88.63 | 19.83 | 72.30 | 46.32 | 22.97 | 60.00 | 37.97 | 42.40 | 67.39 | 34.23 |
| ModernBERT-embed-supervised | 52.89 | 40.59 | 33.40 | 84.15 | 31.91 | 48.96 | 88.85 | 18.59 | 69.63 | 62.15 | 35.67 | 67.11 | 41.50 | 42.08 | 87.35 | 41.47 |
| GTE-ModernColBERT | 54.67 | 45.28 | 37.93 | 83.59 | 31.23 | 48.51 | 86.61 | 19.06 | 76.34 | 61.80 | 30.62 | 77.32 | 48.03 | 41.00 | 87.44 | 45.32 |
| gte-modernbert-base | 55.33 | 48.81 | 36.44 | 81.95 | 21.68 | 72.68 | 88.55 | 21.29 | 77.40 | 57.62 | 37.74 | 69.47 | 41.79 | 42.63 | 91.03 | 40.90 |
| KD from dense supervised | ||||||||||||||||
| ModernColBERT-embed-base-kd-only | 54.09 | 42.51 | 37.01 | 79.52 | 34.58 | 51.75 | 87.67 | 18.15 | 75.04 | 61.45 | 28.31 | 76.70 | 47.54 | 40.68 | 84.82 | 45.57 |
| Supervised + KD from dense unsupervised | ||||||||||||||||
| ModernColBERT-embed-base-supervised | 50.72 | 40.09 | 35.56 | 71.12 | 25.53 | 44.27 | 86.96 | 18.19 | 73.78 | 58.89 | 32.95 | 71.49 | 43.23 | 42.55 | 70.51 | 45.72 |
| ModernColBERT-embed-base | 55.12 | 41.50 | 36.51 | 77.46 | 33.77 | 52.45 | 86.26 | 18.66 | 74.90 | 62.24 | 37.27 | 80.07 | 48.27 | 41.60 | 89.71 | 46.17 |
| ColBERT-Zero | ||||||||||||||||
| Unsupervised | 51.44 | 45.38 | 36.88 | 67.82 | 22.59 | 51.53 | 87.78 | 22.30 | 76.76 | 58.80 | 24.24 | 68.29 | 43.16 | 45.76 | 81.58 | 38.78 |
| Supervised | 51.81 | 42.45 | 35.60 | 74.72 | 23.83 | 41.81 | 87.19 | 19.85 | 73.71 | 61.95 | 35.01 | 71.37 | 46.20 | 45.16 | 72.61 | 45.68 |
| Distilled | 55.43 | 42.62 | 37.28 | 78.69 | 36.13 | 53.07 | 85.24 | 19.88 | 76.50 | 61.66 | 35.72 | 79.41 | 47.48 | 41.34 | 90.59 | 45.80 |
| ColBERT-Zero-noprompts | ||||||||||||||||
| Unsupervised | 51.70 | 45.31 | 34.72 | 73.55 | 23.26 | 52.56 | 88.15 | 22.63 | 76.10 | 59.18 | 24.24 | 66.66 | 42.61 | 45.56 | 81.88 | 39.15 |
| Supervised | 52.39 | 43.36 | 36.01 | 72.42 | 23.79 | 47.42 | 87.79 | 21.30 | 73.85 | 62.25 | 31.61 | 70.32 | 44.07 | 44.03 | 85.54 | 42.11 |
| Distilled | 54.61 | 43.14 | 36.60 | 78.60 | 36.36 | 49.49 | 88.05 | 19.13 | 76.42 | 61.73 | 32.70 | 76.99 | 47.69 | 40.21 | 85.97 | 46.01 |
For production deployment of ColBERT-Zero and other multi-vector models, check out NextPlaid and FastPlaid, our production-grade engines for multi-vector retrieval.
ColBERT(
(0): Transformer({'max_seq_length': 518, 'do_lower_case': False, 'architecture': 'ModernBertModel'})
(1): Dense({'in_features': 768, 'out_features': 128, 'bias': False, 'activation_function': 'torch.nn.modules.linear.Identity', 'use_residual': False})
)
This model can be used with Sentence Transformers as a multi-vector (ColBERT-style late interaction) retriever via the MultiVectorEncoder:
pip install "sentence-transformers>=6.0.1"
from sentence_transformers import MultiVectorEncoder
model = MultiVectorEncoder("lightonai/ColBERT-Zero")
query = "Which planet is known as the Red Planet?"
documents = [
"Venus is often called Earth's twin because of its similar size and proximity.",
"Mars, known for its reddish appearance, is often referred to as the Red Planet.",
"Jupiter, the largest planet in our solar system, has a prominent red spot.",
"Saturn, famous for its rings, is sometimes mistaken for the Red Planet.",
]
query_embeddings = model.encode_query(query)
document_embeddings = model.encode_document(documents)
print(query_embeddings.shape, document_embeddings[0].shape)
# torch.Size([16, 128]) torch.Size([19, 128])
# MaxSim late-interaction scoring (higher is more relevant)
scores = model.similarity(query_embeddings, document_embeddings)
print(scores)
# tensor([[11.4863, 12.8909, 12.2002, 12.5669]], device='cuda:0')
First install the PyLate library:
pip install -U pylate
[!WARNING] Prompt alignment is critical for ColBERT-Zero models. You must use
prompt_name="query"when encoding queries andprompt_name="document"when encoding documents. ColBERT-Zero was pre-trained with asymmetric prompts (search_query:/search_document:), and stripping them causes significant performance.
Use this model with PyLate to index and retrieve documents. The index uses FastPLAID for efficient similarity search.
Load the ColBERT model and initialize the PLAID index, then encode and index your documents:
from pylate import indexes, models, retrieve
# Step 1: Load the ColBERT model
model = models.ColBERT(
model_name_or_path="pylate_model_id",
)
# Step 2: Initialize the PLAID index
index = indexes.PLAID(
index_folder="pylate-index",
index_name="index",
override=True, # This overwrites the existing index if any
)
# Step 3: Encode the documents
documents_ids = ["1", "2", "3"]
documents = ["document 1 text", "document 2 text", "document 3 text"]
documents_embeddings = model.encode(
documents,
batch_size=32,
is_query=False, # Ensure that it is set to False to indicate that these are documents, not queries
prompt_name="document", # β οΈ Required for ColBERT-Zero! Do not omit.
show_progress_bar=True,
)
# Step 4: Add document embeddings to the index by providing embeddings and corresponding ids
index.add_documents(
documents_ids=documents_ids,
documents_embeddings=documents_embeddings,
)
Note that you do not have to recreate the index and encode the documents every time. Once you have created an index and added the documents, you can re-use the index later by loading it:
# To load an index, simply instantiate it with the correct folder/name and without overriding it
index = indexes.PLAID(
index_folder="pylate-index",
index_name="index",
)
Once the documents are indexed, you can retrieve the top-k most relevant documents for a given set of queries. To do so, initialize the ColBERT retriever with the index you want to search in, encode the queries and then retrieve the top-k documents to get the top matches ids and relevance scores:
[!WARNING] Always pass prompt_name="query" for queries and prompt_name="document" for documents. Omitting these prompts will silently degrade retrieval quality.
# Step 1: Initialize the ColBERT retriever
retriever = retrieve.ColBERT(index=index)
# Step 2: Encode the queries
queries_embeddings = model.encode(
["query for document 3", "query for document 1"],
batch_size=32,
is_query=True, # # Ensure that it is set to False to indicate that these are queries
prompt_name="query", # β οΈ Required for ColBERT-Zero! Do not omit.
show_progress_bar=True,
)
# Step 3: Retrieve top-k documents
scores = retriever.retrieve(
queries_embeddings=queries_embeddings,
k=10, # Retrieve the top 10 matches for each query
)
[!WARNING] Always pass
prompt_name="query"for queries andprompt_name="document"for documents. Omitting these prompts will silently degrade retrieval quality.
If you only want to use the ColBERT model to perform reranking on top of your first-stage retrieval pipeline without building an index, you can simply use rank function and pass the queries and documents to rerank:
from pylate import rank, models
queries = [
"query A",
"query B",
]
documents = [
["document A", "document B"],
["document 1", "document C", "document B"],
]
documents_ids = [
[1, 2],
[1, 3, 2],
]
model = models.ColBERT(
model_name_or_path="pylate_model_id",
)
queries_embeddings = model.encode(
queries,
is_query=True,
prompt_name="query" # β οΈ Required for ColBERT-Zero! Do not omit.
)
documents_embeddings = model.encode(
documents,
is_query=False,
prompt_name="document" # β οΈ Required for ColBERT-Zero! Do not omit.
)
reranked_documents = rank.rerank(
documents_ids=documents_ids,
queries_embeddings=queries_embeddings,
documents_embeddings=documents_embeddings,
)
['NanoClimateFEVER', 'NanoDBPedia', 'NanoFEVER', 'NanoFiQA2018', 'NanoHotpotQA', 'NanoMSMARCO', 'NanoNFCorpus', 'NanoNQ', 'NanoQuoraRetrieval', 'NanoSCIDOCS', 'NanoArguAna', 'NanoSciFact', 'NanoTouche2020']pylate.evaluation.pylate_information_retrieval_evaluator.PyLateInformationRetrievalEvaluator| Metric | NanoClimateFEVER | NanoDBPedia | NanoFEVER | NanoFiQA2018 | NanoHotpotQA | NanoMSMARCO | NanoNFCorpus | NanoNQ | NanoQuoraRetrieval | NanoSCIDOCS | NanoArguAna | NanoSciFact | NanoTouche2020 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| MaxSim_accuracy@1 | 0.36 | 0.86 | 0.96 | 0.58 | 0.98 | 0.6 | 0.58 | 0.62 | 0.92 | 0.48 | 0.24 | 0.7 | 0.8163 |
| MaxSim_accuracy@3 | 0.68 | 0.94 | 1.0 | 0.66 | 1.0 | 0.68 | 0.68 | 0.84 | 0.98 | 0.74 | 0.64 | 0.82 | 0.9796 |
| MaxSim_accuracy@5 | 0.76 | 0.94 | 1.0 | 0.72 | 1.0 | 0.78 | 0.72 | 0.88 | 1.0 | 0.76 | 0.7 | 0.88 | 0.9796 |
| MaxSim_accuracy@10 | 0.88 | 0.98 | 1.0 | 0.82 | 1.0 | 0.9 | 0.76 | 0.9 | 1.0 | 0.9 | 0.9 | 0.92 | 0.9796 |
| MaxSim_precision@1 | 0.36 | 0.86 | 0.96 | 0.58 | 0.98 | 0.6 | 0.58 | 0.62 | 0.92 | 0.48 | 0.24 | 0.7 | 0.8163 |
| MaxSim_precision@3 | 0.2867 | 0.7333 | 0.3533 | 0.3267 | 0.6 | 0.2267 | 0.4267 | 0.28 | 0.3933 | 0.4067 | 0.2133 | 0.2867 | 0.7279 |
| MaxSim_precision@5 | 0.22 | 0.66 | 0.212 | 0.248 | 0.368 | 0.156 | 0.396 | 0.176 | 0.248 | 0.304 | 0.14 | 0.196 | 0.6653 |
| MaxSim_precision@10 | 0.148 | 0.584 | 0.11 | 0.148 | 0.186 | 0.09 | 0.316 | 0.096 | 0.128 | 0.204 | 0.09 | 0.102 | 0.5388 |
| MaxSim_recall@1 | 0.18 | 0.108 | 0.8967 | 0.3526 | 0.49 | 0.6 | 0.066 | 0.59 | 0.7973 | 0.1027 | 0.24 | 0.675 | 0.0564 |
| MaxSim_recall@3 | 0.36 | 0.2161 | 0.9633 | 0.4742 | 0.9 | 0.68 | 0.1036 | 0.78 | 0.932 | 0.2507 | 0.64 | 0.79 | 0.1493 |
| MaxSim_recall@5 | 0.429 | 0.2933 | 0.9633 | 0.546 | 0.92 | 0.78 | 0.1297 | 0.81 | 0.9627 | 0.3107 | 0.7 | 0.87 | 0.2241 |
| MaxSim_recall@10 | 0.5537 | 0.4273 | 0.98 | 0.6425 | 0.93 | 0.9 | 0.1635 | 0.86 | 0.9727 | 0.4167 | 0.9 | 0.91 | 0.3475 |
| MaxSim_ndcg@10 | 0.4511 | 0.7326 | 0.9624 | 0.5786 | 0.9243 | 0.7242 | 0.4055 | 0.7475 | 0.9376 | 0.4124 | 0.562 | 0.802 | 0.6176 |
| MaxSim_mrr@10 | 0.5353 | 0.8995 | 0.9767 | 0.6434 | 0.99 | 0.671 | 0.6304 | 0.7342 | 0.954 | 0.6184 | 0.4557 | 0.7717 | 0.8776 |
| MaxSim_map@100 | 0.3571 | 0.5806 | 0.9478 | 0.5234 | 0.8945 | 0.6766 | 0.1959 | 0.7036 | 0.9156 | 0.3294 | 0.4584 | 0.7652 | 0.4571 |
NanoBEIR_meanpylate.evaluation.nano_beir_evaluator.NanoBEIREvaluator| Metric | Value |
|---|---|
| MaxSim_accuracy@1 | 0.6689 |
| MaxSim_accuracy@3 | 0.8184 |
| MaxSim_accuracy@5 | 0.8554 |
| MaxSim_accuracy@10 | 0.9184 |
| MaxSim_precision@1 | 0.6689 |
| MaxSim_precision@3 | 0.4047 |
| MaxSim_precision@5 | 0.3069 |
| MaxSim_precision@10 | 0.2108 |
| MaxSim_recall@1 | 0.3965 |
| MaxSim_recall@3 | 0.5569 |
| MaxSim_recall@5 | 0.6107 |
| MaxSim_recall@10 | 0.6926 |
| MaxSim_ndcg@10 | 0.6814 |
| MaxSim_mrr@10 | 0.7506 |
| MaxSim_map@100 | 0.6004 |
query_id, document_ids, and scores| query_id | document_ids | scores | |
|---|---|---|---|
| type | int | list | list |
| details |
|
|
|
| query_id | document_ids | scores |
|---|---|---|
685613 | [7546874, 1176459, 197677, 2306318, 8541504, ...] | [0.9999999992804947, 0.24845418756716053, 0.7594154013647826, 0.26644182105618575, 0.390668914839766, ...] |
237784 | [6366584, 4034101, 2325374, 6914618, 6042146, ...] | [0.9999999991784339, 0.42233632827946693, 0.5956354295491569, 0.12644415907455164, 0.6636713730105909, ...] |
904294 | [448408, 8743975, 49600, 7339401, 2714261, ...] | [0.9999999991841937, 0.877629062381539, 0.8330146583389045, 0.3116634796692611, 0.4633524534142185, ...] |
pylate.losses.distillation.Distillationeval_strategy: stepsper_device_train_batch_size: 4per_device_eval_batch_size: 4gradient_accumulation_steps: 2learning_rate: 1e-05num_train_epochs: 1.0bf16: Truedataloader_num_workers: 4ddp_find_unused_parameters: Falseoverwrite_output_dir: Falsedo_predict: Falseeval_strategy: stepsprediction_loss_only: Trueper_device_train_batch_size: 4per_device_eval_batch_size: 4per_gpu_train_batch_size: Noneper_gpu_eval_batch_size: Nonegradient_accumulation_steps: 2eval_accumulation_steps: Nonetorch_empty_cache_steps: Nonelearning_rate: 1e-05weight_decay: 0.0adam_beta1: 0.9adam_beta2: 0.999adam_epsilon: 1e-08max_grad_norm: 1.0num_train_epochs: 1.0max_steps: -1lr_scheduler_type: linearlr_scheduler_kwargs: {}warmup_ratio: 0.0warmup_steps: 0log_level: passivelog_level_replica: warninglog_on_each_node: Truelogging_nan_inf_filter: Truesave_safetensors: Truesave_on_each_node: Falsesave_only_model: Falserestore_callback_states_from_checkpoint: Falseno_cuda: Falseuse_cpu: Falseuse_mps_device: Falseseed: 42data_seed: Nonejit_mode_eval: Falseuse_ipex: Falsebf16: Truefp16: Falsefp16_opt_level: O1half_precision_backend: autobf16_full_eval: Falsefp16_full_eval: Falsetf32: Nonelocal_rank: 3ddp_backend: Nonetpu_num_cores: Nonetpu_metrics_debug: Falsedebug: []dataloader_drop_last: Truedataloader_num_workers: 4dataloader_prefetch_factor: Nonepast_index: -1disable_tqdm: Falseremove_unused_columns: Truelabel_names: Noneload_best_model_at_end: Falseignore_data_skip: Falsefsdp: []fsdp_min_num_params: 0fsdp_config: {'min_num_params': 0, 'xla': False, 'xla_fsdp_v2': False, 'xla_fsdp_grad_ckpt': False}fsdp_transformer_layer_cls_to_wrap: Noneaccelerator_config: {'split_batches': False, 'dispatch_batches': None, 'even_batches': True, 'use_seedable_sampler': True, 'non_blocking': False, 'gradient_accumulation_kwargs': None}deepspeed: Nonelabel_smoothing_factor: 0.0optim: adamw_torchoptim_args: Noneadafactor: Falsegroup_by_length: Falselength_column_name: lengthddp_find_unused_parameters: Falseddp_bucket_cap_mb: Noneddp_broadcast_buffers: Falsedataloader_pin_memory: Truedataloader_persistent_workers: Falseskip_memory_metrics: Trueuse_legacy_prediction_loop: Falsepush_to_hub: Falseresume_from_checkpoint: Nonehub_model_id: Nonehub_strategy: every_savehub_private_repo: Nonehub_always_push: Falsegradient_checkpointing: Falsegradient_checkpointing_kwargs: Noneinclude_inputs_for_metrics: Falseinclude_for_metrics: []eval_do_concat_batches: Truefp16_backend: autopush_to_hub_model_id: Nonepush_to_hub_organization: Nonemp_parameters:auto_find_batch_size: Falsefull_determinism: Falsetorchdynamo: Noneray_scope: lastddp_timeout: 1800torch_compile: Falsetorch_compile_backend: Nonetorch_compile_mode: Nonedispatch_batches: Nonesplit_batches: Noneinclude_tokens_per_second: Falseinclude_num_input_tokens_seen: Falseneftune_noise_alpha: Noneoptim_target_modules: Nonebatch_eval_metrics: Falseeval_on_start: Falseuse_liger_kernel: Falseeval_use_gather_object: Falseaverage_tokens_across_devices: Falseprompts: Nonebatch_sampler: batch_samplermulti_dataset_batch_sampler: proportionalrouter_mapping: {}learning_rate_mapping: {}| Epoch | Step | Training Loss | NanoClimateFEVER_MaxSim_ndcg@10 | NanoDBPedia_MaxSim_ndcg@10 | NanoFEVER_MaxSim_ndcg@10 | NanoFiQA2018_MaxSim_ndcg@10 | NanoHotpotQA_MaxSim_ndcg@10 | NanoMSMARCO_MaxSim_ndcg@10 | NanoNFCorpus_MaxSim_ndcg@10 | NanoNQ_MaxSim_ndcg@10 | NanoQuoraRetrieval_MaxSim_ndcg@10 | NanoSCIDOCS_MaxSim_ndcg@10 | NanoArguAna_MaxSim_ndcg@10 | NanoSciFact_MaxSim_ndcg@10 | NanoTouche2020_MaxSim_ndcg@10 | NanoBEIR_mean_MaxSim_ndcg@10 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0.0025 | 50 | 0.0187 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.0275 | 550 | 0.0155 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.0525 | 1050 | 0.0146 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.075 | 1500 | 0.0141 | 0.4530 | 0.7263 | 0.9670 | 0.5786 | 0.9313 | 0.7349 | 0.3994 | 0.7587 | 0.9506 | 0.4292 | 0.5152 | 0.8059 | 0.6139 | 0.6818 |
| 0.0775 | 1550 | 0.0139 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.1025 | 2050 | 0.0138 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.1275 | 2550 | 0.0132 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.15 | 3000 | 0.0132 | 0.4562 | 0.7260 | 0.9738 | 0.5756 | 0.9221 | 0.7378 | 0.4021 | 0.7555 | 0.9473 | 0.4276 | 0.5376 | 0.8082 | 0.6206 | 0.6839 |
| 0.1525 | 3050 | 0.013 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.1775 | 3550 | 0.0129 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.2025 | 4050 | 0.0129 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.225 | 4500 | 0.0126 | 0.4551 | 0.7381 | 0.9624 | 0.5890 | 0.9238 | 0.7381 | 0.3978 | 0.7522 | 0.9400 | 0.4206 | 0.5455 | 0.8141 | 0.6184 | 0.6842 |
| 0.2275 | 4550 | 0.0124 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.2525 | 5050 | 0.0126 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.2775 | 5550 | 0.0123 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.3 | 6000 | 0.012 | 0.4474 | 0.7375 | 0.9635 | 0.5908 | 0.9282 | 0.7416 | 0.4064 | 0.7551 | 0.9424 | 0.4198 | 0.5592 | 0.8074 | 0.6191 | 0.6860 |
| 0.3025 | 6050 | 0.0125 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.3275 | 6550 | 0.012 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.3525 | 7050 | 0.0122 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.375 | 7500 | 0.0123 | 0.4534 | 0.7266 | 0.9631 | 0.5875 | 0.9294 | 0.7349 | 0.4012 | 0.7459 | 0.9417 | 0.4195 | 0.5608 | 0.8060 | 0.6205 | 0.6839 |
| 0.3775 | 7550 | 0.0118 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.4025 | 8050 | 0.0118 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.4275 | 8550 | 0.0119 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.45 | 9000 | 0.0114 | 0.4537 | 0.7219 | 0.9631 | 0.5837 | 0.9290 | 0.7374 | 0.4032 | 0.7522 | 0.9496 | 0.4134 | 0.5572 | 0.8113 | 0.6190 | 0.6842 |
| 0.4525 | 9050 | 0.0117 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.4775 | 9550 | 0.0119 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.5025 | 10050 | 0.0112 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.525 | 10500 | 0.0117 | 0.4541 | 0.7325 | 0.9653 | 0.5803 | 0.9243 | 0.7357 | 0.4092 | 0.7566 | 0.9468 | 0.4169 | 0.5596 | 0.8040 | 0.6177 | 0.6849 |
| 0.5275 | 10550 | 0.0116 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.5525 | 11050 | 0.0115 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.5775 | 11550 | 0.0112 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.6 | 12000 | 0.0112 | 0.4606 | 0.7310 | 0.9624 | 0.5862 | 0.9243 | 0.7341 | 0.4085 | 0.7523 | 0.9463 | 0.4192 | 0.5708 | 0.8086 | 0.6201 | 0.6865 |
| 0.6025 | 12050 | 0.0116 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.6275 | 12550 | 0.0113 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.6525 | 13050 | 0.0115 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.675 | 13500 | 0.0111 | 0.4505 | 0.7294 | 0.9653 | 0.5796 | 0.9289 | 0.7348 | 0.4063 | 0.7553 | 0.9451 | 0.4205 | 0.5627 | 0.8034 | 0.6173 | 0.6845 |
| 0.6775 | 13550 | 0.0112 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.7025 | 14050 | 0.0112 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.7275 | 14550 | 0.0109 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.75 | 15000 | 0.0113 | 0.4544 | 0.7281 | 0.9624 | 0.5785 | 0.9227 | 0.7241 | 0.4081 | 0.7495 | 0.9391 | 0.4158 | 0.5639 | 0.8020 | 0.6195 | 0.6822 |
| 0.7525 | 15050 | 0.0112 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.7775 | 15550 | 0.011 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.8025 | 16050 | 0.0106 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.825 | 16500 | 0.0113 | 0.4520 | 0.7354 | 0.9624 | 0.5784 | 0.9279 | 0.7340 | 0.4042 | 0.7505 | 0.9388 | 0.4117 | 0.5630 | 0.8020 | 0.6204 | 0.6831 |
| 0.8275 | 16550 | 0.0107 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.8525 | 17050 | 0.0109 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.8775 | 17550 | 0.011 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.9 | 18000 | 0.0109 | 0.4548 | 0.7336 | 0.9624 | 0.5791 | 0.9243 | 0.7313 | 0.4067 | 0.7475 | 0.9376 | 0.4132 | 0.5625 | 0.8094 | 0.6214 | 0.6834 |
| 0.9025 | 18050 | 0.011 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.9275 | 18550 | 0.0109 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.9525 | 19050 | 0.0107 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.975 | 19500 | 0.0111 | 0.4511 | 0.7326 | 0.9624 | 0.5786 | 0.9243 | 0.7242 | 0.4055 | 0.7475 | 0.9376 | 0.4124 | 0.5620 | 0.8020 | 0.6176 | 0.6814 |
| 0.9775 | 19550 | 0.0112 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
@misc{chaffin2026colbertzeropretrainpretraincolbert,
title = {ColBERT-Zero: To Pre-train Or Not To Pre-train ColBERT models},
author = {Antoine Chaffin and Luca Arnaboldi and AmΓ©lie Chatelain and Florent Krzakala},
year = {2026},
eprint = {2602.16609},
archivePrefix = {arXiv},
primaryClass = {cs.CL},
url = {https://arxiv.org/abs/2602.16609},
}
@inproceedings{reimers-2019-sentence-bert,
title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
author = "Reimers, Nils and Gurevych, Iryna",
booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
month = "11",
year = "2019",
publisher = "Association for Computational Linguistics",
url = "https://arxiv.org/abs/1908.10084"
}
@inproceedings{DBLP:conf/cikm/ChaffinS25,
author = {Antoine Chaffin and
Rapha{"{e}}l Sourty},
editor = {Meeyoung Cha and
Chanyoung Park and
Noseong Park and
Carl Yang and
Senjuti Basu Roy and
Jessie Li and
Jaap Kamps and
Kijung Shin and
Bryan Hooi and
Lifang He},
title = {PyLate: Flexible Training and Retrieval for Late Interaction Models},
booktitle = {Proceedings of the 34th {ACM} International Conference on Information
and Knowledge Management, {CIKM} 2025, Seoul, Republic of Korea, November
10-14, 2025},
pages = {6334--6339},
publisher = {{ACM}},
year = {2025},
url = {https://github.com/lightonai/pylate},
doi = {10.1145/3746252.3761608},
}
@article{DBLP:journals/tmlr/NussbaumMMD25,
author = {Zach Nussbaum and
John Xavier Morris and
Andriy Mulyar and
Brandon Duderstadt},
title = {Nomic Embed: Training a Reproducible Long Context Text Embedder},
journal = {Trans. Mach. Learn. Res.},
volume = {2025},
year = {2025},
url = {https://openreview.net/forum?id=IPmzyQSiQE},
timestamp = {Fri, 20 Jun 2025 14:19:48 +0200},
biburl = {https://dblp.org/rec/journals/tmlr/NussbaumMMD25.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
45
stars
12
commits
4
repos using this model
6
linked in READMEs
Aug 31, 2026
updated
π― TL;DR: First large-scale fully pre-trained ColBERT model using only public data. Achieves 55.43 nDCG@10 on BEIR benchmark, outperforming GTE-ModernColBERT and GTE-ModernBERT trained on closed and stronger data. New SOTA on BEIR for models <150M parameters.
Late interaction (ColBERT / multi-vector) models have clear advantages in out-of-domain generalization, long-context handling, and reasoning-intensive retrieval. Yet they remain undertrained: current state-of-the-art ColBERT models (e.g, GTE-ModernColBERT and ColBERT-small) are simply built by bolting a small knowledge distillation step onto a strong dense (single-vector) model. Even recent efforts like mxbai-edge-colbert-v0 perform all early training stages in a single-vector setting, only switching to the multi-vector objective at the very end.
This leaves a lot of performance on the table. ColBERT-Zero demonstrates that performing contrastive pre-training directly in the multi-vector setting, rather than treating it as an afterthought, unlocks a significantly higher performance ceiling. Trained exclusively on public data (Nomic-embed dataset mixture), ColBERT-Zero overcomes a 2.4-point data quality disadvantage to outperform models trained on proprietary, closed-source data. For detailed results, please have a look at our blogpost and the paper. All the models (including intermediate checkpoints) as well training code are released under an Apache 2.0 license.
We deliberately trained on the public Nomic-embed data mixture for a strategic reason: Nomic has already trained a dense ModernBERT model (ModernBERT-embed) on this exact data. This lets us compare dense vs. multi-vector training with the same data, same base model (ModernBERT), and same pipeline. The only variable is whether the contrastive phases are performed in the dense or multi-vector setting.
This design reveals a striking result: the dense baseline trained on Nomic data scores 52.89, while the one trained on GTE's proprietary data scores 55.33: a 2.4-point data quality gap. Despite this disadvantage, ColBERT-Zero's full multi-vector pre-training pipeline closes and surpasses this gap, reaching 55.43 nDCG@10.
The development followed a three-phase pipeline, each providing a different type of learning signal:
We began with the nomic-embed-unsupervised-data dataset. Using PyLate's GradCache implementation to scale per-GPU batch size without VRAM constraints, combined with cross-GPU gathering of representations, we reached effective batch sizes of ~16k, required for unsupervised training to produce plausible in-batch hard negatives. Unlike dense training, the multi-vector objective allows the encoder to learn fine-grained token importance from the very first phase.
We refined the model using the nomic-embed-supervised-data. This stage introduced mined hard negatives: documents that are superficially similar to the query but not actually relevant. This allows teaching the model to handle nuance by prioritizing specific keywords and contextual tokens most indicative of a true match.
The final stage used the ms-marco-en-bge dataset. We leveraged a powerful Gemma-based model as a teacher, allowing our student models to learn to replicate complex reasoning scores via the efficient MaxSim operator.
The KD-only approach (the current industry standard) scores 54.09, lagging behind full pre-training by 1.3 points. A simple distillation step is insufficient for optimal multi-vector performance.
By running a supervised contrastive step in the multi-vector setting before distillation, we reach 55.12 nDCG@10, closing most of the gap with the fully pre-trained model (55.43). This costs ~40 GH200-hours instead of ~408: roughly 10Γ cheaper for 99.4% of the performance.
Nomic's base models are pre-trained with asymmetric prompts (search_query: and search_document:). While ColBERT has its own asymmetric mechanism via [Q] and [D] markers, we found:
Why do prompts help? Our leading hypothesis is that prompt tokens act as implicit query expansion: extra slots that don't carry specific meaning but let the model store global information about the sequence. The original ColBERT used [PAD] tokens for this purpose, but modern Flash Attention implementations broke this trick (masked tokens no longer produce usable embeddings). Explicit prompt tokens may be quietly re-enabling it.
Practical takeaway: Always align your prompts with the base model's pre-training setup. Misalignment is one of the easiest ways to silently lose performance. Note that this sensitivity decreases with stronger downstream fine-tuning: with enough training, the model can adapt to an initial mismatch.
ColBERT-Zero utilizes the full 3-phase pipeline with strict prompt alignment, achieving 55.43 nDCG@10 on BEIR, setting a new SOTA for models <150M parameters. We also provide ColBERT-Zero-noprompts, the same pipeline without asymmetric prompts, to study the impact of query expansion on multi-vector performance.
These models represent the practical sweet spot. By skipping the expensive unsupervised phase, ModernColBERT-embed-base (Supervised + KD) achieves ~97% of the flagship's performance at only ~10% of the compute cost. For reference, ModernColBERT-embed-base-kd performs only the distillation step on a supervised dense base.
For researchers studying the incremental impact of each phase and prompt alignment, we release several ablation variants: ColBERT-Zero-supervised, ColBERT-Zero-unsupervised (and their -noprompts versions), and ModernColBERT-embed-base-supervised.
| Model | Avg | FiQA | NFCorpus | TREC-COVID | Touche | ArguAna | Quora | SCIDOCS | SciFact | NQ | ClimateFEVER | HotpotQA | DBPedia | CQADupstack | FEVER | MSMARCO |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Baselines | ||||||||||||||||
| ModernBERT-embed-unsupervised | 47.05 | 42.53 | 35.33 | 68.44 | 18.58 | 48.82 | 88.63 | 19.83 | 72.30 | 46.32 | 22.97 | 60.00 | 37.97 | 42.40 | 67.39 | 34.23 |
| ModernBERT-embed-supervised | 52.89 | 40.59 | 33.40 | 84.15 | 31.91 | 48.96 | 88.85 | 18.59 | 69.63 | 62.15 | 35.67 | 67.11 | 41.50 | 42.08 | 87.35 | 41.47 |
| GTE-ModernColBERT | 54.67 | 45.28 | 37.93 | 83.59 | 31.23 | 48.51 | 86.61 | 19.06 | 76.34 | 61.80 | 30.62 | 77.32 | 48.03 | 41.00 | 87.44 | 45.32 |
| gte-modernbert-base | 55.33 | 48.81 | 36.44 | 81.95 | 21.68 | 72.68 | 88.55 | 21.29 | 77.40 | 57.62 | 37.74 | 69.47 | 41.79 | 42.63 | 91.03 | 40.90 |
| KD from dense supervised | ||||||||||||||||
| ModernColBERT-embed-base-kd-only | 54.09 | 42.51 | 37.01 | 79.52 | 34.58 | 51.75 | 87.67 | 18.15 | 75.04 | 61.45 | 28.31 | 76.70 | 47.54 | 40.68 | 84.82 | 45.57 |
| Supervised + KD from dense unsupervised | ||||||||||||||||
| ModernColBERT-embed-base-supervised | 50.72 | 40.09 | 35.56 | 71.12 | 25.53 | 44.27 | 86.96 | 18.19 | 73.78 | 58.89 | 32.95 | 71.49 | 43.23 | 42.55 | 70.51 | 45.72 |
| ModernColBERT-embed-base | 55.12 | 41.50 | 36.51 | 77.46 | 33.77 | 52.45 | 86.26 | 18.66 | 74.90 | 62.24 | 37.27 | 80.07 | 48.27 | 41.60 | 89.71 | 46.17 |
| ColBERT-Zero | ||||||||||||||||
| Unsupervised | 51.44 | 45.38 | 36.88 | 67.82 | 22.59 | 51.53 | 87.78 | 22.30 | 76.76 | 58.80 | 24.24 | 68.29 | 43.16 | 45.76 | 81.58 | 38.78 |
| Supervised | 51.81 | 42.45 | 35.60 | 74.72 | 23.83 | 41.81 | 87.19 | 19.85 | 73.71 | 61.95 | 35.01 | 71.37 | 46.20 | 45.16 | 72.61 | 45.68 |
| Distilled | 55.43 | 42.62 | 37.28 | 78.69 | 36.13 | 53.07 | 85.24 | 19.88 | 76.50 | 61.66 | 35.72 | 79.41 | 47.48 | 41.34 | 90.59 | 45.80 |
| ColBERT-Zero-noprompts | ||||||||||||||||
| Unsupervised | 51.70 | 45.31 | 34.72 | 73.55 | 23.26 | 52.56 | 88.15 | 22.63 | 76.10 | 59.18 | 24.24 | 66.66 | 42.61 | 45.56 | 81.88 | 39.15 |
| Supervised | 52.39 | 43.36 | 36.01 | 72.42 | 23.79 | 47.42 | 87.79 | 21.30 | 73.85 | 62.25 | 31.61 | 70.32 | 44.07 | 44.03 | 85.54 | 42.11 |
| Distilled | 54.61 | 43.14 | 36.60 | 78.60 | 36.36 | 49.49 | 88.05 | 19.13 | 76.42 | 61.73 | 32.70 | 76.99 | 47.69 | 40.21 | 85.97 | 46.01 |
For production deployment of ColBERT-Zero and other multi-vector models, check out NextPlaid and FastPlaid, our production-grade engines for multi-vector retrieval.
ColBERT(
(0): Transformer({'max_seq_length': 518, 'do_lower_case': False, 'architecture': 'ModernBertModel'})
(1): Dense({'in_features': 768, 'out_features': 128, 'bias': False, 'activation_function': 'torch.nn.modules.linear.Identity', 'use_residual': False})
)
This model can be used with Sentence Transformers as a multi-vector (ColBERT-style late interaction) retriever via the MultiVectorEncoder:
pip install "sentence-transformers>=6.0.1"
from sentence_transformers import MultiVectorEncoder
model = MultiVectorEncoder("lightonai/ColBERT-Zero")
query = "Which planet is known as the Red Planet?"
documents = [
"Venus is often called Earth's twin because of its similar size and proximity.",
"Mars, known for its reddish appearance, is often referred to as the Red Planet.",
"Jupiter, the largest planet in our solar system, has a prominent red spot.",
"Saturn, famous for its rings, is sometimes mistaken for the Red Planet.",
]
query_embeddings = model.encode_query(query)
document_embeddings = model.encode_document(documents)
print(query_embeddings.shape, document_embeddings[0].shape)
# torch.Size([16, 128]) torch.Size([19, 128])
# MaxSim late-interaction scoring (higher is more relevant)
scores = model.similarity(query_embeddings, document_embeddings)
print(scores)
# tensor([[11.4863, 12.8909, 12.2002, 12.5669]], device='cuda:0')
First install the PyLate library:
pip install -U pylate
[!WARNING] Prompt alignment is critical for ColBERT-Zero models. You must use
prompt_name="query"when encoding queries andprompt_name="document"when encoding documents. ColBERT-Zero was pre-trained with asymmetric prompts (search_query:/search_document:), and stripping them causes significant performance.
Use this model with PyLate to index and retrieve documents. The index uses FastPLAID for efficient similarity search.
Load the ColBERT model and initialize the PLAID index, then encode and index your documents:
from pylate import indexes, models, retrieve
# Step 1: Load the ColBERT model
model = models.ColBERT(
model_name_or_path="pylate_model_id",
)
# Step 2: Initialize the PLAID index
index = indexes.PLAID(
index_folder="pylate-index",
index_name="index",
override=True, # This overwrites the existing index if any
)
# Step 3: Encode the documents
documents_ids = ["1", "2", "3"]
documents = ["document 1 text", "document 2 text", "document 3 text"]
documents_embeddings = model.encode(
documents,
batch_size=32,
is_query=False, # Ensure that it is set to False to indicate that these are documents, not queries
prompt_name="document", # β οΈ Required for ColBERT-Zero! Do not omit.
show_progress_bar=True,
)
# Step 4: Add document embeddings to the index by providing embeddings and corresponding ids
index.add_documents(
documents_ids=documents_ids,
documents_embeddings=documents_embeddings,
)
Note that you do not have to recreate the index and encode the documents every time. Once you have created an index and added the documents, you can re-use the index later by loading it:
# To load an index, simply instantiate it with the correct folder/name and without overriding it
index = indexes.PLAID(
index_folder="pylate-index",
index_name="index",
)
Once the documents are indexed, you can retrieve the top-k most relevant documents for a given set of queries. To do so, initialize the ColBERT retriever with the index you want to search in, encode the queries and then retrieve the top-k documents to get the top matches ids and relevance scores:
[!WARNING] Always pass prompt_name="query" for queries and prompt_name="document" for documents. Omitting these prompts will silently degrade retrieval quality.
# Step 1: Initialize the ColBERT retriever
retriever = retrieve.ColBERT(index=index)
# Step 2: Encode the queries
queries_embeddings = model.encode(
["query for document 3", "query for document 1"],
batch_size=32,
is_query=True, # # Ensure that it is set to False to indicate that these are queries
prompt_name="query", # β οΈ Required for ColBERT-Zero! Do not omit.
show_progress_bar=True,
)
# Step 3: Retrieve top-k documents
scores = retriever.retrieve(
queries_embeddings=queries_embeddings,
k=10, # Retrieve the top 10 matches for each query
)
[!WARNING] Always pass
prompt_name="query"for queries andprompt_name="document"for documents. Omitting these prompts will silently degrade retrieval quality.
If you only want to use the ColBERT model to perform reranking on top of your first-stage retrieval pipeline without building an index, you can simply use rank function and pass the queries and documents to rerank:
from pylate import rank, models
queries = [
"query A",
"query B",
]
documents = [
["document A", "document B"],
["document 1", "document C", "document B"],
]
documents_ids = [
[1, 2],
[1, 3, 2],
]
model = models.ColBERT(
model_name_or_path="pylate_model_id",
)
queries_embeddings = model.encode(
queries,
is_query=True,
prompt_name="query" # β οΈ Required for ColBERT-Zero! Do not omit.
)
documents_embeddings = model.encode(
documents,
is_query=False,
prompt_name="document" # β οΈ Required for ColBERT-Zero! Do not omit.
)
reranked_documents = rank.rerank(
documents_ids=documents_ids,
queries_embeddings=queries_embeddings,
documents_embeddings=documents_embeddings,
)
['NanoClimateFEVER', 'NanoDBPedia', 'NanoFEVER', 'NanoFiQA2018', 'NanoHotpotQA', 'NanoMSMARCO', 'NanoNFCorpus', 'NanoNQ', 'NanoQuoraRetrieval', 'NanoSCIDOCS', 'NanoArguAna', 'NanoSciFact', 'NanoTouche2020']pylate.evaluation.pylate_information_retrieval_evaluator.PyLateInformationRetrievalEvaluator| Metric | NanoClimateFEVER | NanoDBPedia | NanoFEVER | NanoFiQA2018 | NanoHotpotQA | NanoMSMARCO | NanoNFCorpus | NanoNQ | NanoQuoraRetrieval | NanoSCIDOCS | NanoArguAna | NanoSciFact | NanoTouche2020 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| MaxSim_accuracy@1 | 0.36 | 0.86 | 0.96 | 0.58 | 0.98 | 0.6 | 0.58 | 0.62 | 0.92 | 0.48 | 0.24 | 0.7 | 0.8163 |
| MaxSim_accuracy@3 | 0.68 | 0.94 | 1.0 | 0.66 | 1.0 | 0.68 | 0.68 | 0.84 | 0.98 | 0.74 | 0.64 | 0.82 | 0.9796 |
| MaxSim_accuracy@5 | 0.76 | 0.94 | 1.0 | 0.72 | 1.0 | 0.78 | 0.72 | 0.88 | 1.0 | 0.76 | 0.7 | 0.88 | 0.9796 |
| MaxSim_accuracy@10 | 0.88 | 0.98 | 1.0 | 0.82 | 1.0 | 0.9 | 0.76 | 0.9 | 1.0 | 0.9 | 0.9 | 0.92 | 0.9796 |
| MaxSim_precision@1 | 0.36 | 0.86 | 0.96 | 0.58 | 0.98 | 0.6 | 0.58 | 0.62 | 0.92 | 0.48 | 0.24 | 0.7 | 0.8163 |
| MaxSim_precision@3 | 0.2867 | 0.7333 | 0.3533 | 0.3267 | 0.6 | 0.2267 | 0.4267 | 0.28 | 0.3933 | 0.4067 | 0.2133 | 0.2867 | 0.7279 |
| MaxSim_precision@5 | 0.22 | 0.66 | 0.212 | 0.248 | 0.368 | 0.156 | 0.396 | 0.176 | 0.248 | 0.304 | 0.14 | 0.196 | 0.6653 |
| MaxSim_precision@10 | 0.148 | 0.584 | 0.11 | 0.148 | 0.186 | 0.09 | 0.316 | 0.096 | 0.128 | 0.204 | 0.09 | 0.102 | 0.5388 |
| MaxSim_recall@1 | 0.18 | 0.108 | 0.8967 | 0.3526 | 0.49 | 0.6 | 0.066 | 0.59 | 0.7973 | 0.1027 | 0.24 | 0.675 | 0.0564 |
| MaxSim_recall@3 | 0.36 | 0.2161 | 0.9633 | 0.4742 | 0.9 | 0.68 | 0.1036 | 0.78 | 0.932 | 0.2507 | 0.64 | 0.79 | 0.1493 |
| MaxSim_recall@5 | 0.429 | 0.2933 | 0.9633 | 0.546 | 0.92 | 0.78 | 0.1297 | 0.81 | 0.9627 | 0.3107 | 0.7 | 0.87 | 0.2241 |
| MaxSim_recall@10 | 0.5537 | 0.4273 | 0.98 | 0.6425 | 0.93 | 0.9 | 0.1635 | 0.86 | 0.9727 | 0.4167 | 0.9 | 0.91 | 0.3475 |
| MaxSim_ndcg@10 | 0.4511 | 0.7326 | 0.9624 | 0.5786 | 0.9243 | 0.7242 | 0.4055 | 0.7475 | 0.9376 | 0.4124 | 0.562 | 0.802 | 0.6176 |
| MaxSim_mrr@10 | 0.5353 | 0.8995 | 0.9767 | 0.6434 | 0.99 | 0.671 | 0.6304 | 0.7342 | 0.954 | 0.6184 | 0.4557 | 0.7717 | 0.8776 |
| MaxSim_map@100 | 0.3571 | 0.5806 | 0.9478 | 0.5234 | 0.8945 | 0.6766 | 0.1959 | 0.7036 | 0.9156 | 0.3294 | 0.4584 | 0.7652 | 0.4571 |
NanoBEIR_meanpylate.evaluation.nano_beir_evaluator.NanoBEIREvaluator| Metric | Value |
|---|---|
| MaxSim_accuracy@1 | 0.6689 |
| MaxSim_accuracy@3 | 0.8184 |
| MaxSim_accuracy@5 | 0.8554 |
| MaxSim_accuracy@10 | 0.9184 |
| MaxSim_precision@1 | 0.6689 |
| MaxSim_precision@3 | 0.4047 |
| MaxSim_precision@5 | 0.3069 |
| MaxSim_precision@10 | 0.2108 |
| MaxSim_recall@1 | 0.3965 |
| MaxSim_recall@3 | 0.5569 |
| MaxSim_recall@5 | 0.6107 |
| MaxSim_recall@10 | 0.6926 |
| MaxSim_ndcg@10 | 0.6814 |
| MaxSim_mrr@10 | 0.7506 |
| MaxSim_map@100 | 0.6004 |
query_id, document_ids, and scores| query_id | document_ids | scores | |
|---|---|---|---|
| type | int | list | list |
| details |
|
|
|
| query_id | document_ids | scores |
|---|---|---|
685613 | [7546874, 1176459, 197677, 2306318, 8541504, ...] | [0.9999999992804947, 0.24845418756716053, 0.7594154013647826, 0.26644182105618575, 0.390668914839766, ...] |
237784 | [6366584, 4034101, 2325374, 6914618, 6042146, ...] | [0.9999999991784339, 0.42233632827946693, 0.5956354295491569, 0.12644415907455164, 0.6636713730105909, ...] |
904294 | [448408, 8743975, 49600, 7339401, 2714261, ...] | [0.9999999991841937, 0.877629062381539, 0.8330146583389045, 0.3116634796692611, 0.4633524534142185, ...] |
pylate.losses.distillation.Distillationeval_strategy: stepsper_device_train_batch_size: 4per_device_eval_batch_size: 4gradient_accumulation_steps: 2learning_rate: 1e-05num_train_epochs: 1.0bf16: Truedataloader_num_workers: 4ddp_find_unused_parameters: Falseoverwrite_output_dir: Falsedo_predict: Falseeval_strategy: stepsprediction_loss_only: Trueper_device_train_batch_size: 4per_device_eval_batch_size: 4per_gpu_train_batch_size: Noneper_gpu_eval_batch_size: Nonegradient_accumulation_steps: 2eval_accumulation_steps: Nonetorch_empty_cache_steps: Nonelearning_rate: 1e-05weight_decay: 0.0adam_beta1: 0.9adam_beta2: 0.999adam_epsilon: 1e-08max_grad_norm: 1.0num_train_epochs: 1.0max_steps: -1lr_scheduler_type: linearlr_scheduler_kwargs: {}warmup_ratio: 0.0warmup_steps: 0log_level: passivelog_level_replica: warninglog_on_each_node: Truelogging_nan_inf_filter: Truesave_safetensors: Truesave_on_each_node: Falsesave_only_model: Falserestore_callback_states_from_checkpoint: Falseno_cuda: Falseuse_cpu: Falseuse_mps_device: Falseseed: 42data_seed: Nonejit_mode_eval: Falseuse_ipex: Falsebf16: Truefp16: Falsefp16_opt_level: O1half_precision_backend: autobf16_full_eval: Falsefp16_full_eval: Falsetf32: Nonelocal_rank: 3ddp_backend: Nonetpu_num_cores: Nonetpu_metrics_debug: Falsedebug: []dataloader_drop_last: Truedataloader_num_workers: 4dataloader_prefetch_factor: Nonepast_index: -1disable_tqdm: Falseremove_unused_columns: Truelabel_names: Noneload_best_model_at_end: Falseignore_data_skip: Falsefsdp: []fsdp_min_num_params: 0fsdp_config: {'min_num_params': 0, 'xla': False, 'xla_fsdp_v2': False, 'xla_fsdp_grad_ckpt': False}fsdp_transformer_layer_cls_to_wrap: Noneaccelerator_config: {'split_batches': False, 'dispatch_batches': None, 'even_batches': True, 'use_seedable_sampler': True, 'non_blocking': False, 'gradient_accumulation_kwargs': None}deepspeed: Nonelabel_smoothing_factor: 0.0optim: adamw_torchoptim_args: Noneadafactor: Falsegroup_by_length: Falselength_column_name: lengthddp_find_unused_parameters: Falseddp_bucket_cap_mb: Noneddp_broadcast_buffers: Falsedataloader_pin_memory: Truedataloader_persistent_workers: Falseskip_memory_metrics: Trueuse_legacy_prediction_loop: Falsepush_to_hub: Falseresume_from_checkpoint: Nonehub_model_id: Nonehub_strategy: every_savehub_private_repo: Nonehub_always_push: Falsegradient_checkpointing: Falsegradient_checkpointing_kwargs: Noneinclude_inputs_for_metrics: Falseinclude_for_metrics: []eval_do_concat_batches: Truefp16_backend: autopush_to_hub_model_id: Nonepush_to_hub_organization: Nonemp_parameters:auto_find_batch_size: Falsefull_determinism: Falsetorchdynamo: Noneray_scope: lastddp_timeout: 1800torch_compile: Falsetorch_compile_backend: Nonetorch_compile_mode: Nonedispatch_batches: Nonesplit_batches: Noneinclude_tokens_per_second: Falseinclude_num_input_tokens_seen: Falseneftune_noise_alpha: Noneoptim_target_modules: Nonebatch_eval_metrics: Falseeval_on_start: Falseuse_liger_kernel: Falseeval_use_gather_object: Falseaverage_tokens_across_devices: Falseprompts: Nonebatch_sampler: batch_samplermulti_dataset_batch_sampler: proportionalrouter_mapping: {}learning_rate_mapping: {}| Epoch | Step | Training Loss | NanoClimateFEVER_MaxSim_ndcg@10 | NanoDBPedia_MaxSim_ndcg@10 | NanoFEVER_MaxSim_ndcg@10 | NanoFiQA2018_MaxSim_ndcg@10 | NanoHotpotQA_MaxSim_ndcg@10 | NanoMSMARCO_MaxSim_ndcg@10 | NanoNFCorpus_MaxSim_ndcg@10 | NanoNQ_MaxSim_ndcg@10 | NanoQuoraRetrieval_MaxSim_ndcg@10 | NanoSCIDOCS_MaxSim_ndcg@10 | NanoArguAna_MaxSim_ndcg@10 | NanoSciFact_MaxSim_ndcg@10 | NanoTouche2020_MaxSim_ndcg@10 | NanoBEIR_mean_MaxSim_ndcg@10 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0.0025 | 50 | 0.0187 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.0275 | 550 | 0.0155 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.0525 | 1050 | 0.0146 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.075 | 1500 | 0.0141 | 0.4530 | 0.7263 | 0.9670 | 0.5786 | 0.9313 | 0.7349 | 0.3994 | 0.7587 | 0.9506 | 0.4292 | 0.5152 | 0.8059 | 0.6139 | 0.6818 |
| 0.0775 | 1550 | 0.0139 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.1025 | 2050 | 0.0138 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.1275 | 2550 | 0.0132 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.15 | 3000 | 0.0132 | 0.4562 | 0.7260 | 0.9738 | 0.5756 | 0.9221 | 0.7378 | 0.4021 | 0.7555 | 0.9473 | 0.4276 | 0.5376 | 0.8082 | 0.6206 | 0.6839 |
| 0.1525 | 3050 | 0.013 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.1775 | 3550 | 0.0129 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.2025 | 4050 | 0.0129 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.225 | 4500 | 0.0126 | 0.4551 | 0.7381 | 0.9624 | 0.5890 | 0.9238 | 0.7381 | 0.3978 | 0.7522 | 0.9400 | 0.4206 | 0.5455 | 0.8141 | 0.6184 | 0.6842 |
| 0.2275 | 4550 | 0.0124 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.2525 | 5050 | 0.0126 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.2775 | 5550 | 0.0123 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.3 | 6000 | 0.012 | 0.4474 | 0.7375 | 0.9635 | 0.5908 | 0.9282 | 0.7416 | 0.4064 | 0.7551 | 0.9424 | 0.4198 | 0.5592 | 0.8074 | 0.6191 | 0.6860 |
| 0.3025 | 6050 | 0.0125 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.3275 | 6550 | 0.012 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.3525 | 7050 | 0.0122 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.375 | 7500 | 0.0123 | 0.4534 | 0.7266 | 0.9631 | 0.5875 | 0.9294 | 0.7349 | 0.4012 | 0.7459 | 0.9417 | 0.4195 | 0.5608 | 0.8060 | 0.6205 | 0.6839 |
| 0.3775 | 7550 | 0.0118 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.4025 | 8050 | 0.0118 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.4275 | 8550 | 0.0119 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.45 | 9000 | 0.0114 | 0.4537 | 0.7219 | 0.9631 | 0.5837 | 0.9290 | 0.7374 | 0.4032 | 0.7522 | 0.9496 | 0.4134 | 0.5572 | 0.8113 | 0.6190 | 0.6842 |
| 0.4525 | 9050 | 0.0117 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.4775 | 9550 | 0.0119 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.5025 | 10050 | 0.0112 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.525 | 10500 | 0.0117 | 0.4541 | 0.7325 | 0.9653 | 0.5803 | 0.9243 | 0.7357 | 0.4092 | 0.7566 | 0.9468 | 0.4169 | 0.5596 | 0.8040 | 0.6177 | 0.6849 |
| 0.5275 | 10550 | 0.0116 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.5525 | 11050 | 0.0115 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.5775 | 11550 | 0.0112 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.6 | 12000 | 0.0112 | 0.4606 | 0.7310 | 0.9624 | 0.5862 | 0.9243 | 0.7341 | 0.4085 | 0.7523 | 0.9463 | 0.4192 | 0.5708 | 0.8086 | 0.6201 | 0.6865 |
| 0.6025 | 12050 | 0.0116 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.6275 | 12550 | 0.0113 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.6525 | 13050 | 0.0115 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.675 | 13500 | 0.0111 | 0.4505 | 0.7294 | 0.9653 | 0.5796 | 0.9289 | 0.7348 | 0.4063 | 0.7553 | 0.9451 | 0.4205 | 0.5627 | 0.8034 | 0.6173 | 0.6845 |
| 0.6775 | 13550 | 0.0112 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.7025 | 14050 | 0.0112 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.7275 | 14550 | 0.0109 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.75 | 15000 | 0.0113 | 0.4544 | 0.7281 | 0.9624 | 0.5785 | 0.9227 | 0.7241 | 0.4081 | 0.7495 | 0.9391 | 0.4158 | 0.5639 | 0.8020 | 0.6195 | 0.6822 |
| 0.7525 | 15050 | 0.0112 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.7775 | 15550 | 0.011 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.8025 | 16050 | 0.0106 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.825 | 16500 | 0.0113 | 0.4520 | 0.7354 | 0.9624 | 0.5784 | 0.9279 | 0.7340 | 0.4042 | 0.7505 | 0.9388 | 0.4117 | 0.5630 | 0.8020 | 0.6204 | 0.6831 |
| 0.8275 | 16550 | 0.0107 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.8525 | 17050 | 0.0109 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.8775 | 17550 | 0.011 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.9 | 18000 | 0.0109 | 0.4548 | 0.7336 | 0.9624 | 0.5791 | 0.9243 | 0.7313 | 0.4067 | 0.7475 | 0.9376 | 0.4132 | 0.5625 | 0.8094 | 0.6214 | 0.6834 |
| 0.9025 | 18050 | 0.011 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.9275 | 18550 | 0.0109 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.9525 | 19050 | 0.0107 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| 0.975 | 19500 | 0.0111 | 0.4511 | 0.7326 | 0.9624 | 0.5786 | 0.9243 | 0.7242 | 0.4055 | 0.7475 | 0.9376 | 0.4124 | 0.5620 | 0.8020 | 0.6176 | 0.6814 |
| 0.9775 | 19550 | 0.0112 | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
@misc{chaffin2026colbertzeropretrainpretraincolbert,
title = {ColBERT-Zero: To Pre-train Or Not To Pre-train ColBERT models},
author = {Antoine Chaffin and Luca Arnaboldi and AmΓ©lie Chatelain and Florent Krzakala},
year = {2026},
eprint = {2602.16609},
archivePrefix = {arXiv},
primaryClass = {cs.CL},
url = {https://arxiv.org/abs/2602.16609},
}
@inproceedings{reimers-2019-sentence-bert,
title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
author = "Reimers, Nils and Gurevych, Iryna",
booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
month = "11",
year = "2019",
publisher = "Association for Computational Linguistics",
url = "https://arxiv.org/abs/1908.10084"
}
@inproceedings{DBLP:conf/cikm/ChaffinS25,
author = {Antoine Chaffin and
Rapha{"{e}}l Sourty},
editor = {Meeyoung Cha and
Chanyoung Park and
Noseong Park and
Carl Yang and
Senjuti Basu Roy and
Jessie Li and
Jaap Kamps and
Kijung Shin and
Bryan Hooi and
Lifang He},
title = {PyLate: Flexible Training and Retrieval for Late Interaction Models},
booktitle = {Proceedings of the 34th {ACM} International Conference on Information
and Knowledge Management, {CIKM} 2025, Seoul, Republic of Korea, November
10-14, 2025},
pages = {6334--6339},
publisher = {{ACM}},
year = {2025},
url = {https://github.com/lightonai/pylate},
doi = {10.1145/3746252.3761608},
}
@article{DBLP:journals/tmlr/NussbaumMMD25,
author = {Zach Nussbaum and
John Xavier Morris and
Andriy Mulyar and
Brandon Duderstadt},
title = {Nomic Embed: Training a Reproducible Long Context Text Embedder},
journal = {Trans. Mach. Learn. Res.},
volume = {2025},
year = {2025},
url = {https://openreview.net/forum?id=IPmzyQSiQE},
timestamp = {Fri, 20 Jun 2025 14:19:48 +0200},
biburl = {https://dblp.org/rec/journals/tmlr/NussbaumMMD25.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}