Repository files navigation

ViDoRe Pipeline Evaluation Framework 🔍

arXivGitHubHugging Face

TestVersionDownloads


Important

🔄 Repository Focus Change

This repository is now focused on pipeline evaluation for visual document retrieval tasks.

All other functionalities (vision retriever evaluation, legacy benchmarks) are kept for reproducibility purposes but are deprecated and no longer actively maintained.


Evaluating single-model retrievers on ViDoRe v1–v3 with MTEB

We shifted from in-house evaluations to the general MTEB evaluation framework for retrieval models by moving to MTEB.

Here are the main steps to evaluate and submit your retriever to the ViDoRe V1-V3 leaderboards ; see the MTEB official documentation for full details. This section covers mteb leaderboards only; for our in-house pipeline leaderboard, see the section below.

  1. Create your model implementation file (if it does not exist already) here, then open a PR to the MTEB repository with your changes; examples for Colpali-like models can be found in this file.

  2. Evaluate your model:

importmtebfrommteb.models.model_implementations.my_custom_modelimportMyCustomModelmy_model=MyCustomModel(my_args)
tasks=mteb.get_tasks(["ViDoRe (v3)"])
results=mteb.evaluate(my_model, tasks=tasks)
  1. Open a PR on the mteb_results_repo with the generated results file to submit your results to the leaderboard

  2. To evaluate on private sets, once all this is done you can ask the MTEB team to evaluate your model on private ViDoRe v3 sets by opening a dedicated issue on their repo

Evaluating a complex pipeline

Pipeline evaluation allows you to evaluate complete end-to-end retrieval systems on the ViDoRe v3 benchmark datasets. Unlike traditional retriever evaluation that focuses on individual model components, pipeline evaluation lets you test:

  • Multi-stage retrieval systems (e.g., retrieve + rerank)
  • Hybrid approaches (e.g., dense + sparse retrieval fusion)
  • Custom preprocessing pipelines (e.g., OCR → chunking → embedding)
  • Arbitrary retrieval logic that goes beyond standard dense/sparse retrievers

📊 Results Repository & Submission Guidelines

This repository serves as the primary community results repository for visual document retrieval benchmarks using complex pipelines. We encourage researchers and practitioners to submit their pipeline evaluation results to create a centralized location where the community can compare different approaches and track progress on ViDoRe v3 datasets.

How to Submit Your Results

To contribute your pipeline results to the leaderboard:

  1. Run evaluations using this framework on the ViDoRe v3 datasets english splits (--language english in cli). It tracks raw scores as well as indexing and search computing times.

  2. Open a Pull Request with the following:

    • Results files: Add your JSON result files to the results/metrics folder, organized as:
      results/metrics/your_pipeline_name/
      ├── vidore_v3_hr.json
      ├── vidore_v3_finance_en.json
      ├── vidore_v3_industrial.json
      └── ... (other datasets)
      
    • Pipeline description: Include a description.json file in the same PR that describes the architecture used. A pipeline is represented as a graph of a set of modules (OCR, retriever, reranker, mcp server... linked together via edges) Some pipeline descriptions files example are written in results/pipeline_descriptions

    We encourage adding as much hardware information as possible in the description to enable the community to get a feel about the latency of each pipeline.

Installation

pip install vidore-benchmark

List Available Datasets

List all ViDoRe v3 datasets:

vidore-benchmark pipeline list-datasets

Available datasets:

  • vidore/vidore_v3_hr - Human Resources documents
  • vidore/vidore_v3_finance_en - Financial documents (English)
  • vidore/vidore_v3_industrial - Industrial documents
  • vidore/vidore_v3_pharmaceuticals - Pharmaceutical documents
  • vidore/vidore_v3_computer_science - Computer Science documents
  • vidore/vidore_v3_energy - Energy sector documents
  • vidore/vidore_v3_physics - Physics documents
  • vidore/vidore_v3_finance_fr - Financial documents (French)

Evaluate a Pipeline

You can evaluate any pipeline that inherits from BasePipeline:

Some pipelines are already implemented in the pipeline_implementations folder.

Custom Pipeline

Evaluate your own pipeline implementation:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--module-path path/to/my_pipeline.py \
--class-name MyCustomPipeline \
--language english \
--pipeline-args '{"model_name": "my-model"}'

Your pipeline file (my_pipeline.py):

fromvidore_benchmark.pipeline_evaluationimportBasePipelineclassMyCustomPipeline(BasePipeline):
def__init__(self, model_name):
self.model_name=model_name# Initialize your model heredefindex(self, corpus_ids, corpus_images, corpus_texts, dataset_name: str=None):
# Indexing function to process corpus, should store anything# relevant as class attributesself.corpus_ids=corpus_ids
...
defsearch(self, query_ids, queries):
# Your search logic, returns scores dict (see BasePipeline file for description)return {query_id: {corpus_id: score}}

Language Filtering

Some datasets contain multilingual queries. You can filter by language:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--pipeline-type random \
--language english

Evaluate on All Datasets

Evaluate your pipeline on all ViDoRe v3 datasets:

With built-in pipeline:

vidore-benchmark pipeline evaluate-all \
--pipeline-type random \
--pipeline-args '{"seed": 42}' \
--output-dir results/

With custom pipeline:

vidore-benchmark pipeline evaluate-all \
--module-path my_pipeline.py \
--class-name MyCustomPipeline \
--output-dir results/

Python API

Implementing Your Own Pipeline

To evaluate a custom pipeline, inherit from BasePipeline and implement the index() and search() methods:

Running Evaluation

frompath_to_pipelineimportMyCustomPipelinefromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
evaluate_retrieval,
aggregate_results,
)
# Load datasetquery_ids, queries, corpus_ids, corpus_images, corpus_texts, qrels=load_vidore_dataset(
dataset_name="vidore/vidore_v3_hr",
split="test"
)
# Initialize your pipelinepipeline=MyCustomPipeline(retriever=my_retriever, reranker=my_reranker)
# Run evaluationresults=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus_images=corpus_images,
corpus_texts=corpus_texts,
qrels=qrels,
metrics=["ndcg_cut_10", "recall_10"]
)
# Get aggregate scoresaggregated=aggregate_results(results)
print(f"NDCG@10: {aggregated['ndcg_cut_10']:.4f}")

Some examples of pipeline implementations can be found in the pipeline_implementations folder

Advanced Usage

Tracking Additional Metrics (Optional)

Pipelines can optionally return additional tracking information alongside retrieval results. This is useful for monitoring costs, timing, resource usage, or other custom metrics:

fromtypingimportDict, List, Any, Optional, TupleclassPipelineWithMetrics(BasePipeline):
defindex(
self,
corpus_ids: List[str],
corpus_images: List[Any],
corpus_texts: List[str],
) ->None:
# Indexing logic
...
defsearch(
self,
query_ids: List[str],
queries: List[str],
) ->Tuple[Dict[str, Dict[str, float]], Optional[Dict[str, Any]]]:
""" Return both retrieval results and optional tracking metrics. Returns: Tuple of (results, infos) where infos can contain: - Cost tracking (e.g., API costs, GPU hours) - Granular timing information - Resource usage (num_gpus, memory, etc.) - Model-specific metadata """# Your retrieval logic hereresults= {...}
# Optional: track additional metricsinfos= {
"estimated_cost_usd": 0.05,
"num_gpus": 1,
"total_time_ms": 1234.5,
"model_name": "my-model-v1",
}
returnresults, infos

The infos dictionary will be stored in the evaluation results under the _infos key. This is completely optional - pipelines can still return just the results dictionary for backward compatibility:

classSimplePipeline(BasePipeline):
defsearch(...) ->Dict[str, Dict[str, float]]:
# Just return results, no tracking neededreturnresults

See example_pipelines/pipeline_with_metrics.py for a complete example.

Dataset Information

fromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
print_dataset_info,
get_available_datasets,
)
# List available datasetsdatasets=get_available_datasets()
print(datasets)
# Load and inspect a datasetquery_ids, queries, corpus_ids, corpus, qrels=load_vidore_dataset(
"vidore/vidore_v3_industrial"
)
print_dataset_info(
dataset_name="vidore/vidore_v3_industrial",
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
)

Custom Metrics

You can specify custom metrics to evaluate if you want to:

results=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
metrics=[
"ndcg_cut_5",
"ndcg_cut_10",
"recall_5",
"recall_10",
"map",
]
)

All metrics supported by pytrec_eval are available.

Architecture

The pipeline evaluation framework consists of:

  1. BasePipeline: Abstract base class for implementing custom pipelines
  2. Dataset Loaders: Functions to load ViDoRe v3 datasets from HuggingFace
  3. Evaluator: Uses pytrec_eval to compute retrieval metrics
  4. CLI: Commands for evaluating any custom pipeline
vidore_benchmark/
├── pipeline_evaluation/
│ ├── base_pipeline.py # BasePipeline abstract class
│ ├── dataset_loader.py # ViDoRe v3 dataset loading
│ ├── evaluator.py # Evaluation orchestration
│ ├── utils.py # Helper utilities
└── cli/
└── pipeline_evaluation.py # CLI for pipeline evaluation

Reproducibility & Legacy Features

This repository previously focused on evaluating vision retrievers on the ViDoRe benchmarks v1 and v2. All code related to these functionalities is still available but deprecated:

  • Vision Retriever Evaluation: See README_OLD.md
  • ViDoRe Benchmarks v1/v2: Now maintained in MTEB
  • Model Implementations: Available in src/vidore_benchmark/retrievers/ (for reference only)

⚠️ For new projects, we recommend:

  • Using MTEB for vision retriever evaluation on ViDoRe v1/v2
  • Using this framework for pipeline evaluation on ViDoRe v3

For reproducibility of published results, see REPRODUCIBILITY.md.

Contributing

We welcome contributions for:

  • New example pipelines
  • Additional evaluation results
  • Dataset utilities
  • Documentation improvements

Please open an issue or PR on GitHub.

Citation

If you use this framework or the ViDoRe benchmark in your research, please cite:

ColPali: Efficient Document Retrieval with Vision Language Models

@misc{faysse2024colpaliefficientdocumentretrieval,
title={ColPali: Efficient Document Retrieval with Vision Language Models}, author={Manuel Faysse and Hugues Sibille and Tony Wu and Bilel Omrani and Gautier Viaud and Céline Hudelot and Pierre Colombo},
year={2024},
eprint={2407.01449},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2407.01449}, }

ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval

@misc{macé2025vidorebenchmarkv2raising,
title={ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval}, author={Quentin Macé and António Loison and Manuel Faysse},
year={2025},
eprint={2505.17166},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2505.17166}, }

ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios

@misc{loison2026vidore,
title={ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios},
author={Loison, Ant{\'o}nio and Mac{\'e}, Quentin and Edy, Antoine and Xing, Victor and Balough, Tom and Moreira, Gabriel and Liu, Bo and Faysse, Manuel and Hudelot, C{\'e}line and Viaud, Gautier},
journal={arXiv preprint arXiv:2601.08620},
year={2026}
}

License

This project is licensed under the MIT License - see the LICENSE file for details.

Links

About

Vision Document Retrieval (ViDoRe): Benchmark. Evaluation code for the ColPali paper.

Topics

Resources

Stars

278 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

ViDoRe Pipeline Evaluation Framework 🔍

arXivGitHubHugging Face

TestVersionDownloads


Important

🔄 Repository Focus Change

This repository is now focused on pipeline evaluation for visual document retrieval tasks.

All other functionalities (vision retriever evaluation, legacy benchmarks) are kept for reproducibility purposes but are deprecated and no longer actively maintained.


Evaluating single-model retrievers on ViDoRe v1–v3 with MTEB

We shifted from in-house evaluations to the general MTEB evaluation framework for retrieval models by moving to MTEB.

Here are the main steps to evaluate and submit your retriever to the ViDoRe V1-V3 leaderboards ; see the MTEB official documentation for full details. This section covers mteb leaderboards only; for our in-house pipeline leaderboard, see the section below.

  1. Create your model implementation file (if it does not exist already) here, then open a PR to the MTEB repository with your changes; examples for Colpali-like models can be found in this file.

  2. Evaluate your model:

importmtebfrommteb.models.model_implementations.my_custom_modelimportMyCustomModelmy_model=MyCustomModel(my_args)
tasks=mteb.get_tasks(["ViDoRe (v3)"])
results=mteb.evaluate(my_model, tasks=tasks)
  1. Open a PR on the mteb_results_repo with the generated results file to submit your results to the leaderboard

  2. To evaluate on private sets, once all this is done you can ask the MTEB team to evaluate your model on private ViDoRe v3 sets by opening a dedicated issue on their repo

Evaluating a complex pipeline

Pipeline evaluation allows you to evaluate complete end-to-end retrieval systems on the ViDoRe v3 benchmark datasets. Unlike traditional retriever evaluation that focuses on individual model components, pipeline evaluation lets you test:

  • Multi-stage retrieval systems (e.g., retrieve + rerank)
  • Hybrid approaches (e.g., dense + sparse retrieval fusion)
  • Custom preprocessing pipelines (e.g., OCR → chunking → embedding)
  • Arbitrary retrieval logic that goes beyond standard dense/sparse retrievers

📊 Results Repository & Submission Guidelines

This repository serves as the primary community results repository for visual document retrieval benchmarks using complex pipelines. We encourage researchers and practitioners to submit their pipeline evaluation results to create a centralized location where the community can compare different approaches and track progress on ViDoRe v3 datasets.

How to Submit Your Results

To contribute your pipeline results to the leaderboard:

  1. Run evaluations using this framework on the ViDoRe v3 datasets english splits (--language english in cli). It tracks raw scores as well as indexing and search computing times.

  2. Open a Pull Request with the following:

    • Results files: Add your JSON result files to the results/metrics folder, organized as:
      results/metrics/your_pipeline_name/
      ├── vidore_v3_hr.json
      ├── vidore_v3_finance_en.json
      ├── vidore_v3_industrial.json
      └── ... (other datasets)
      
    • Pipeline description: Include a description.json file in the same PR that describes the architecture used. A pipeline is represented as a graph of a set of modules (OCR, retriever, reranker, mcp server... linked together via edges) Some pipeline descriptions files example are written in results/pipeline_descriptions

    We encourage adding as much hardware information as possible in the description to enable the community to get a feel about the latency of each pipeline.

Installation

pip install vidore-benchmark

List Available Datasets

List all ViDoRe v3 datasets:

vidore-benchmark pipeline list-datasets

Available datasets:

  • vidore/vidore_v3_hr - Human Resources documents
  • vidore/vidore_v3_finance_en - Financial documents (English)
  • vidore/vidore_v3_industrial - Industrial documents
  • vidore/vidore_v3_pharmaceuticals - Pharmaceutical documents
  • vidore/vidore_v3_computer_science - Computer Science documents
  • vidore/vidore_v3_energy - Energy sector documents
  • vidore/vidore_v3_physics - Physics documents
  • vidore/vidore_v3_finance_fr - Financial documents (French)

Evaluate a Pipeline

You can evaluate any pipeline that inherits from BasePipeline:

Some pipelines are already implemented in the pipeline_implementations folder.

Custom Pipeline

Evaluate your own pipeline implementation:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--module-path path/to/my_pipeline.py \
--class-name MyCustomPipeline \
--language english \
--pipeline-args '{"model_name": "my-model"}'

Your pipeline file (my_pipeline.py):

fromvidore_benchmark.pipeline_evaluationimportBasePipelineclassMyCustomPipeline(BasePipeline):
def__init__(self, model_name):
self.model_name=model_name# Initialize your model heredefindex(self, corpus_ids, corpus_images, corpus_texts, dataset_name: str=None):
# Indexing function to process corpus, should store anything# relevant as class attributesself.corpus_ids=corpus_ids
...
defsearch(self, query_ids, queries):
# Your search logic, returns scores dict (see BasePipeline file for description)return {query_id: {corpus_id: score}}

Language Filtering

Some datasets contain multilingual queries. You can filter by language:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--pipeline-type random \
--language english

Evaluate on All Datasets

Evaluate your pipeline on all ViDoRe v3 datasets:

With built-in pipeline:

vidore-benchmark pipeline evaluate-all \
--pipeline-type random \
--pipeline-args '{"seed": 42}' \
--output-dir results/

With custom pipeline:

vidore-benchmark pipeline evaluate-all \
--module-path my_pipeline.py \
--class-name MyCustomPipeline \
--output-dir results/

Python API

Implementing Your Own Pipeline

To evaluate a custom pipeline, inherit from BasePipeline and implement the index() and search() methods:

Running Evaluation

frompath_to_pipelineimportMyCustomPipelinefromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
evaluate_retrieval,
aggregate_results,
)
# Load datasetquery_ids, queries, corpus_ids, corpus_images, corpus_texts, qrels=load_vidore_dataset(
dataset_name="vidore/vidore_v3_hr",
split="test"
)
# Initialize your pipelinepipeline=MyCustomPipeline(retriever=my_retriever, reranker=my_reranker)
# Run evaluationresults=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus_images=corpus_images,
corpus_texts=corpus_texts,
qrels=qrels,
metrics=["ndcg_cut_10", "recall_10"]
)
# Get aggregate scoresaggregated=aggregate_results(results)
print(f"NDCG@10: {aggregated['ndcg_cut_10']:.4f}")

Some examples of pipeline implementations can be found in the pipeline_implementations folder

Advanced Usage

Tracking Additional Metrics (Optional)

Pipelines can optionally return additional tracking information alongside retrieval results. This is useful for monitoring costs, timing, resource usage, or other custom metrics:

fromtypingimportDict, List, Any, Optional, TupleclassPipelineWithMetrics(BasePipeline):
defindex(
self,
corpus_ids: List[str],
corpus_images: List[Any],
corpus_texts: List[str],
) ->None:
# Indexing logic
...
defsearch(
self,
query_ids: List[str],
queries: List[str],
) ->Tuple[Dict[str, Dict[str, float]], Optional[Dict[str, Any]]]:
""" Return both retrieval results and optional tracking metrics. Returns: Tuple of (results, infos) where infos can contain: - Cost tracking (e.g., API costs, GPU hours) - Granular timing information - Resource usage (num_gpus, memory, etc.) - Model-specific metadata """# Your retrieval logic hereresults= {...}
# Optional: track additional metricsinfos= {
"estimated_cost_usd": 0.05,
"num_gpus": 1,
"total_time_ms": 1234.5,
"model_name": "my-model-v1",
}
returnresults, infos

The infos dictionary will be stored in the evaluation results under the _infos key. This is completely optional - pipelines can still return just the results dictionary for backward compatibility:

classSimplePipeline(BasePipeline):
defsearch(...) ->Dict[str, Dict[str, float]]:
# Just return results, no tracking neededreturnresults

See example_pipelines/pipeline_with_metrics.py for a complete example.

Dataset Information

fromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
print_dataset_info,
get_available_datasets,
)
# List available datasetsdatasets=get_available_datasets()
print(datasets)
# Load and inspect a datasetquery_ids, queries, corpus_ids, corpus, qrels=load_vidore_dataset(
"vidore/vidore_v3_industrial"
)
print_dataset_info(
dataset_name="vidore/vidore_v3_industrial",
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
)

Custom Metrics

You can specify custom metrics to evaluate if you want to:

results=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
metrics=[
"ndcg_cut_5",
"ndcg_cut_10",
"recall_5",
"recall_10",
"map",
]
)

All metrics supported by pytrec_eval are available.

Architecture

The pipeline evaluation framework consists of:

  1. BasePipeline: Abstract base class for implementing custom pipelines
  2. Dataset Loaders: Functions to load ViDoRe v3 datasets from HuggingFace
  3. Evaluator: Uses pytrec_eval to compute retrieval metrics
  4. CLI: Commands for evaluating any custom pipeline
vidore_benchmark/
├── pipeline_evaluation/
│ ├── base_pipeline.py # BasePipeline abstract class
│ ├── dataset_loader.py # ViDoRe v3 dataset loading
│ ├── evaluator.py # Evaluation orchestration
│ ├── utils.py # Helper utilities
└── cli/
└── pipeline_evaluation.py # CLI for pipeline evaluation

Reproducibility & Legacy Features

This repository previously focused on evaluating vision retrievers on the ViDoRe benchmarks v1 and v2. All code related to these functionalities is still available but deprecated:

  • Vision Retriever Evaluation: See README_OLD.md
  • ViDoRe Benchmarks v1/v2: Now maintained in MTEB
  • Model Implementations: Available in src/vidore_benchmark/retrievers/ (for reference only)

⚠️ For new projects, we recommend:

  • Using MTEB for vision retriever evaluation on ViDoRe v1/v2
  • Using this framework for pipeline evaluation on ViDoRe v3

For reproducibility of published results, see REPRODUCIBILITY.md.

Contributing

We welcome contributions for:

  • New example pipelines
  • Additional evaluation results
  • Dataset utilities
  • Documentation improvements

Please open an issue or PR on GitHub.

Citation

If you use this framework or the ViDoRe benchmark in your research, please cite:

ColPali: Efficient Document Retrieval with Vision Language Models

@misc{faysse2024colpaliefficientdocumentretrieval,
title={ColPali: Efficient Document Retrieval with Vision Language Models}, author={Manuel Faysse and Hugues Sibille and Tony Wu and Bilel Omrani and Gautier Viaud and Céline Hudelot and Pierre Colombo},
year={2024},
eprint={2407.01449},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2407.01449}, }

ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval

@misc{macé2025vidorebenchmarkv2raising,
title={ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval}, author={Quentin Macé and António Loison and Manuel Faysse},
year={2025},
eprint={2505.17166},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2505.17166}, }

ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios

@misc{loison2026vidore,
title={ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios},
author={Loison, Ant{\'o}nio and Mac{\'e}, Quentin and Edy, Antoine and Xing, Victor and Balough, Tom and Moreira, Gabriel and Liu, Bo and Faysse, Manuel and Hudelot, C{\'e}line and Viaud, Gautier},
journal={arXiv preprint arXiv:2601.08620},
year={2026}
}

License

This project is licensed under the MIT License - see the LICENSE file for details.

Links

About

Vision Document Retrieval (ViDoRe): Benchmark. Evaluation code for the ColPali paper.

Topics

Resources

Stars

278 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ViDoRe Pipeline Evaluation Framework 🔍

arXivGitHubHugging Face

TestVersionDownloads


Important

🔄 Repository Focus Change

This repository is now focused on pipeline evaluation for visual document retrieval tasks.

All other functionalities (vision retriever evaluation, legacy benchmarks) are kept for reproducibility purposes but are deprecated and no longer actively maintained.


Evaluating single-model retrievers on ViDoRe v1–v3 with MTEB

We shifted from in-house evaluations to the general MTEB evaluation framework for retrieval models by moving to MTEB.

Here are the main steps to evaluate and submit your retriever to the ViDoRe V1-V3 leaderboards ; see the MTEB official documentation for full details. This section covers mteb leaderboards only; for our in-house pipeline leaderboard, see the section below.

  1. Create your model implementation file (if it does not exist already) here, then open a PR to the MTEB repository with your changes; examples for Colpali-like models can be found in this file.

  2. Evaluate your model:

importmtebfrommteb.models.model_implementations.my_custom_modelimportMyCustomModelmy_model=MyCustomModel(my_args)
tasks=mteb.get_tasks(["ViDoRe (v3)"])
results=mteb.evaluate(my_model, tasks=tasks)
  1. Open a PR on the mteb_results_repo with the generated results file to submit your results to the leaderboard

  2. To evaluate on private sets, once all this is done you can ask the MTEB team to evaluate your model on private ViDoRe v3 sets by opening a dedicated issue on their repo

Evaluating a complex pipeline

Pipeline evaluation allows you to evaluate complete end-to-end retrieval systems on the ViDoRe v3 benchmark datasets. Unlike traditional retriever evaluation that focuses on individual model components, pipeline evaluation lets you test:

  • Multi-stage retrieval systems (e.g., retrieve + rerank)
  • Hybrid approaches (e.g., dense + sparse retrieval fusion)
  • Custom preprocessing pipelines (e.g., OCR → chunking → embedding)
  • Arbitrary retrieval logic that goes beyond standard dense/sparse retrievers

📊 Results Repository & Submission Guidelines

This repository serves as the primary community results repository for visual document retrieval benchmarks using complex pipelines. We encourage researchers and practitioners to submit their pipeline evaluation results to create a centralized location where the community can compare different approaches and track progress on ViDoRe v3 datasets.

How to Submit Your Results

To contribute your pipeline results to the leaderboard:

  1. Run evaluations using this framework on the ViDoRe v3 datasets english splits (--language english in cli). It tracks raw scores as well as indexing and search computing times.

  2. Open a Pull Request with the following:

    • Results files: Add your JSON result files to the results/metrics folder, organized as:
      results/metrics/your_pipeline_name/
      ├── vidore_v3_hr.json
      ├── vidore_v3_finance_en.json
      ├── vidore_v3_industrial.json
      └── ... (other datasets)
      
    • Pipeline description: Include a description.json file in the same PR that describes the architecture used. A pipeline is represented as a graph of a set of modules (OCR, retriever, reranker, mcp server... linked together via edges) Some pipeline descriptions files example are written in results/pipeline_descriptions

    We encourage adding as much hardware information as possible in the description to enable the community to get a feel about the latency of each pipeline.

Installation

pip install vidore-benchmark

List Available Datasets

List all ViDoRe v3 datasets:

vidore-benchmark pipeline list-datasets

Available datasets:

  • vidore/vidore_v3_hr - Human Resources documents
  • vidore/vidore_v3_finance_en - Financial documents (English)
  • vidore/vidore_v3_industrial - Industrial documents
  • vidore/vidore_v3_pharmaceuticals - Pharmaceutical documents
  • vidore/vidore_v3_computer_science - Computer Science documents
  • vidore/vidore_v3_energy - Energy sector documents
  • vidore/vidore_v3_physics - Physics documents
  • vidore/vidore_v3_finance_fr - Financial documents (French)

Evaluate a Pipeline

You can evaluate any pipeline that inherits from BasePipeline:

Some pipelines are already implemented in the pipeline_implementations folder.

Custom Pipeline

Evaluate your own pipeline implementation:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--module-path path/to/my_pipeline.py \
--class-name MyCustomPipeline \
--language english \
--pipeline-args '{"model_name": "my-model"}'

Your pipeline file (my_pipeline.py):

fromvidore_benchmark.pipeline_evaluationimportBasePipelineclassMyCustomPipeline(BasePipeline):
def__init__(self, model_name):
self.model_name=model_name# Initialize your model heredefindex(self, corpus_ids, corpus_images, corpus_texts, dataset_name: str=None):
# Indexing function to process corpus, should store anything# relevant as class attributesself.corpus_ids=corpus_ids
...
defsearch(self, query_ids, queries):
# Your search logic, returns scores dict (see BasePipeline file for description)return {query_id: {corpus_id: score}}

Language Filtering

Some datasets contain multilingual queries. You can filter by language:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--pipeline-type random \
--language english

Evaluate on All Datasets

Evaluate your pipeline on all ViDoRe v3 datasets:

With built-in pipeline:

vidore-benchmark pipeline evaluate-all \
--pipeline-type random \
--pipeline-args '{"seed": 42}' \
--output-dir results/

With custom pipeline:

vidore-benchmark pipeline evaluate-all \
--module-path my_pipeline.py \
--class-name MyCustomPipeline \
--output-dir results/

Python API

Implementing Your Own Pipeline

To evaluate a custom pipeline, inherit from BasePipeline and implement the index() and search() methods:

Running Evaluation

frompath_to_pipelineimportMyCustomPipelinefromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
evaluate_retrieval,
aggregate_results,
)
# Load datasetquery_ids, queries, corpus_ids, corpus_images, corpus_texts, qrels=load_vidore_dataset(
dataset_name="vidore/vidore_v3_hr",
split="test"
)
# Initialize your pipelinepipeline=MyCustomPipeline(retriever=my_retriever, reranker=my_reranker)
# Run evaluationresults=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus_images=corpus_images,
corpus_texts=corpus_texts,
qrels=qrels,
metrics=["ndcg_cut_10", "recall_10"]
)
# Get aggregate scoresaggregated=aggregate_results(results)
print(f"NDCG@10: {aggregated['ndcg_cut_10']:.4f}")

Some examples of pipeline implementations can be found in the pipeline_implementations folder

Advanced Usage

Tracking Additional Metrics (Optional)

Pipelines can optionally return additional tracking information alongside retrieval results. This is useful for monitoring costs, timing, resource usage, or other custom metrics:

fromtypingimportDict, List, Any, Optional, TupleclassPipelineWithMetrics(BasePipeline):
defindex(
self,
corpus_ids: List[str],
corpus_images: List[Any],
corpus_texts: List[str],
) ->None:
# Indexing logic
...
defsearch(
self,
query_ids: List[str],
queries: List[str],
) ->Tuple[Dict[str, Dict[str, float]], Optional[Dict[str, Any]]]:
""" Return both retrieval results and optional tracking metrics. Returns: Tuple of (results, infos) where infos can contain: - Cost tracking (e.g., API costs, GPU hours) - Granular timing information - Resource usage (num_gpus, memory, etc.) - Model-specific metadata """# Your retrieval logic hereresults= {...}
# Optional: track additional metricsinfos= {
"estimated_cost_usd": 0.05,
"num_gpus": 1,
"total_time_ms": 1234.5,
"model_name": "my-model-v1",
}
returnresults, infos

The infos dictionary will be stored in the evaluation results under the _infos key. This is completely optional - pipelines can still return just the results dictionary for backward compatibility:

classSimplePipeline(BasePipeline):
defsearch(...) ->Dict[str, Dict[str, float]]:
# Just return results, no tracking neededreturnresults

See example_pipelines/pipeline_with_metrics.py for a complete example.

Dataset Information

fromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
print_dataset_info,
get_available_datasets,
)
# List available datasetsdatasets=get_available_datasets()
print(datasets)
# Load and inspect a datasetquery_ids, queries, corpus_ids, corpus, qrels=load_vidore_dataset(
"vidore/vidore_v3_industrial"
)
print_dataset_info(
dataset_name="vidore/vidore_v3_industrial",
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
)

Custom Metrics

You can specify custom metrics to evaluate if you want to:

results=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
metrics=[
"ndcg_cut_5",
"ndcg_cut_10",
"recall_5",
"recall_10",
"map",
]
)

All metrics supported by pytrec_eval are available.

Architecture

The pipeline evaluation framework consists of:

  1. BasePipeline: Abstract base class for implementing custom pipelines
  2. Dataset Loaders: Functions to load ViDoRe v3 datasets from HuggingFace
  3. Evaluator: Uses pytrec_eval to compute retrieval metrics
  4. CLI: Commands for evaluating any custom pipeline
vidore_benchmark/
├── pipeline_evaluation/
│ ├── base_pipeline.py # BasePipeline abstract class
│ ├── dataset_loader.py # ViDoRe v3 dataset loading
│ ├── evaluator.py # Evaluation orchestration
│ ├── utils.py # Helper utilities
└── cli/
└── pipeline_evaluation.py # CLI for pipeline evaluation

Reproducibility & Legacy Features

This repository previously focused on evaluating vision retrievers on the ViDoRe benchmarks v1 and v2. All code related to these functionalities is still available but deprecated:

  • Vision Retriever Evaluation: See README_OLD.md
  • ViDoRe Benchmarks v1/v2: Now maintained in MTEB
  • Model Implementations: Available in src/vidore_benchmark/retrievers/ (for reference only)

⚠️ For new projects, we recommend:

  • Using MTEB for vision retriever evaluation on ViDoRe v1/v2
  • Using this framework for pipeline evaluation on ViDoRe v3

For reproducibility of published results, see REPRODUCIBILITY.md.

Contributing

We welcome contributions for:

  • New example pipelines
  • Additional evaluation results
  • Dataset utilities
  • Documentation improvements

Please open an issue or PR on GitHub.

Citation

If you use this framework or the ViDoRe benchmark in your research, please cite:

ColPali: Efficient Document Retrieval with Vision Language Models

@misc{faysse2024colpaliefficientdocumentretrieval,
title={ColPali: Efficient Document Retrieval with Vision Language Models}, author={Manuel Faysse and Hugues Sibille and Tony Wu and Bilel Omrani and Gautier Viaud and Céline Hudelot and Pierre Colombo},
year={2024},
eprint={2407.01449},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2407.01449}, }

ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval

@misc{macé2025vidorebenchmarkv2raising,
title={ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval}, author={Quentin Macé and António Loison and Manuel Faysse},
year={2025},
eprint={2505.17166},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2505.17166}, }

ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios

@misc{loison2026vidore,
title={ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios},
author={Loison, Ant{\'o}nio and Mac{\'e}, Quentin and Edy, Antoine and Xing, Victor and Balough, Tom and Moreira, Gabriel and Liu, Bo and Faysse, Manuel and Hudelot, C{\'e}line and Viaud, Gautier},
journal={arXiv preprint arXiv:2601.08620},
year={2026}
}

License

This project is licensed under the MIT License - see the LICENSE file for details.

Links

About

Vision Document Retrieval (ViDoRe): Benchmark. Evaluation code for the ColPali paper.

Topics

Resources

Stars

278 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ViDoRe Pipeline Evaluation Framework 🔍

arXivGitHubHugging Face

TestVersionDownloads


Important

🔄 Repository Focus Change

This repository is now focused on pipeline evaluation for visual document retrieval tasks.

All other functionalities (vision retriever evaluation, legacy benchmarks) are kept for reproducibility purposes but are deprecated and no longer actively maintained.


Evaluating single-model retrievers on ViDoRe v1–v3 with MTEB

We shifted from in-house evaluations to the general MTEB evaluation framework for retrieval models by moving to MTEB.

Here are the main steps to evaluate and submit your retriever to the ViDoRe V1-V3 leaderboards ; see the MTEB official documentation for full details. This section covers mteb leaderboards only; for our in-house pipeline leaderboard, see the section below.

  1. Create your model implementation file (if it does not exist already) here, then open a PR to the MTEB repository with your changes; examples for Colpali-like models can be found in this file.

  2. Evaluate your model:

importmtebfrommteb.models.model_implementations.my_custom_modelimportMyCustomModelmy_model=MyCustomModel(my_args)
tasks=mteb.get_tasks(["ViDoRe (v3)"])
results=mteb.evaluate(my_model, tasks=tasks)
  1. Open a PR on the mteb_results_repo with the generated results file to submit your results to the leaderboard

  2. To evaluate on private sets, once all this is done you can ask the MTEB team to evaluate your model on private ViDoRe v3 sets by opening a dedicated issue on their repo

Evaluating a complex pipeline

Pipeline evaluation allows you to evaluate complete end-to-end retrieval systems on the ViDoRe v3 benchmark datasets. Unlike traditional retriever evaluation that focuses on individual model components, pipeline evaluation lets you test:

  • Multi-stage retrieval systems (e.g., retrieve + rerank)
  • Hybrid approaches (e.g., dense + sparse retrieval fusion)
  • Custom preprocessing pipelines (e.g., OCR → chunking → embedding)
  • Arbitrary retrieval logic that goes beyond standard dense/sparse retrievers

📊 Results Repository & Submission Guidelines

This repository serves as the primary community results repository for visual document retrieval benchmarks using complex pipelines. We encourage researchers and practitioners to submit their pipeline evaluation results to create a centralized location where the community can compare different approaches and track progress on ViDoRe v3 datasets.

How to Submit Your Results

To contribute your pipeline results to the leaderboard:

  1. Run evaluations using this framework on the ViDoRe v3 datasets english splits (--language english in cli). It tracks raw scores as well as indexing and search computing times.

  2. Open a Pull Request with the following:

    • Results files: Add your JSON result files to the results/metrics folder, organized as:
      results/metrics/your_pipeline_name/
      ├── vidore_v3_hr.json
      ├── vidore_v3_finance_en.json
      ├── vidore_v3_industrial.json
      └── ... (other datasets)
      
    • Pipeline description: Include a description.json file in the same PR that describes the architecture used. A pipeline is represented as a graph of a set of modules (OCR, retriever, reranker, mcp server... linked together via edges) Some pipeline descriptions files example are written in results/pipeline_descriptions

    We encourage adding as much hardware information as possible in the description to enable the community to get a feel about the latency of each pipeline.

Installation

pip install vidore-benchmark

List Available Datasets

List all ViDoRe v3 datasets:

vidore-benchmark pipeline list-datasets

Available datasets:

  • vidore/vidore_v3_hr - Human Resources documents
  • vidore/vidore_v3_finance_en - Financial documents (English)
  • vidore/vidore_v3_industrial - Industrial documents
  • vidore/vidore_v3_pharmaceuticals - Pharmaceutical documents
  • vidore/vidore_v3_computer_science - Computer Science documents
  • vidore/vidore_v3_energy - Energy sector documents
  • vidore/vidore_v3_physics - Physics documents
  • vidore/vidore_v3_finance_fr - Financial documents (French)

Evaluate a Pipeline

You can evaluate any pipeline that inherits from BasePipeline:

Some pipelines are already implemented in the pipeline_implementations folder.

Custom Pipeline

Evaluate your own pipeline implementation:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--module-path path/to/my_pipeline.py \
--class-name MyCustomPipeline \
--language english \
--pipeline-args '{"model_name": "my-model"}'

Your pipeline file (my_pipeline.py):

fromvidore_benchmark.pipeline_evaluationimportBasePipelineclassMyCustomPipeline(BasePipeline):
def__init__(self, model_name):
self.model_name=model_name# Initialize your model heredefindex(self, corpus_ids, corpus_images, corpus_texts, dataset_name: str=None):
# Indexing function to process corpus, should store anything# relevant as class attributesself.corpus_ids=corpus_ids
...
defsearch(self, query_ids, queries):
# Your search logic, returns scores dict (see BasePipeline file for description)return {query_id: {corpus_id: score}}

Language Filtering

Some datasets contain multilingual queries. You can filter by language:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--pipeline-type random \
--language english

Evaluate on All Datasets

Evaluate your pipeline on all ViDoRe v3 datasets:

With built-in pipeline:

vidore-benchmark pipeline evaluate-all \
--pipeline-type random \
--pipeline-args '{"seed": 42}' \
--output-dir results/

With custom pipeline:

vidore-benchmark pipeline evaluate-all \
--module-path my_pipeline.py \
--class-name MyCustomPipeline \
--output-dir results/

Python API

Implementing Your Own Pipeline

To evaluate a custom pipeline, inherit from BasePipeline and implement the index() and search() methods:

Running Evaluation

frompath_to_pipelineimportMyCustomPipelinefromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
evaluate_retrieval,
aggregate_results,
)
# Load datasetquery_ids, queries, corpus_ids, corpus_images, corpus_texts, qrels=load_vidore_dataset(
dataset_name="vidore/vidore_v3_hr",
split="test"
)
# Initialize your pipelinepipeline=MyCustomPipeline(retriever=my_retriever, reranker=my_reranker)
# Run evaluationresults=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus_images=corpus_images,
corpus_texts=corpus_texts,
qrels=qrels,
metrics=["ndcg_cut_10", "recall_10"]
)
# Get aggregate scoresaggregated=aggregate_results(results)
print(f"NDCG@10: {aggregated['ndcg_cut_10']:.4f}")

Some examples of pipeline implementations can be found in the pipeline_implementations folder

Advanced Usage

Tracking Additional Metrics (Optional)

Pipelines can optionally return additional tracking information alongside retrieval results. This is useful for monitoring costs, timing, resource usage, or other custom metrics:

fromtypingimportDict, List, Any, Optional, TupleclassPipelineWithMetrics(BasePipeline):
defindex(
self,
corpus_ids: List[str],
corpus_images: List[Any],
corpus_texts: List[str],
) ->None:
# Indexing logic
...
defsearch(
self,
query_ids: List[str],
queries: List[str],
) ->Tuple[Dict[str, Dict[str, float]], Optional[Dict[str, Any]]]:
""" Return both retrieval results and optional tracking metrics. Returns: Tuple of (results, infos) where infos can contain: - Cost tracking (e.g., API costs, GPU hours) - Granular timing information - Resource usage (num_gpus, memory, etc.) - Model-specific metadata """# Your retrieval logic hereresults= {...}
# Optional: track additional metricsinfos= {
"estimated_cost_usd": 0.05,
"num_gpus": 1,
"total_time_ms": 1234.5,
"model_name": "my-model-v1",
}
returnresults, infos

The infos dictionary will be stored in the evaluation results under the _infos key. This is completely optional - pipelines can still return just the results dictionary for backward compatibility:

classSimplePipeline(BasePipeline):
defsearch(...) ->Dict[str, Dict[str, float]]:
# Just return results, no tracking neededreturnresults

See example_pipelines/pipeline_with_metrics.py for a complete example.

Dataset Information

fromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
print_dataset_info,
get_available_datasets,
)
# List available datasetsdatasets=get_available_datasets()
print(datasets)
# Load and inspect a datasetquery_ids, queries, corpus_ids, corpus, qrels=load_vidore_dataset(
"vidore/vidore_v3_industrial"
)
print_dataset_info(
dataset_name="vidore/vidore_v3_industrial",
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
)

Custom Metrics

You can specify custom metrics to evaluate if you want to:

results=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
metrics=[
"ndcg_cut_5",
"ndcg_cut_10",
"recall_5",
"recall_10",
"map",
]
)

All metrics supported by pytrec_eval are available.

Architecture

The pipeline evaluation framework consists of:

  1. BasePipeline: Abstract base class for implementing custom pipelines
  2. Dataset Loaders: Functions to load ViDoRe v3 datasets from HuggingFace
  3. Evaluator: Uses pytrec_eval to compute retrieval metrics
  4. CLI: Commands for evaluating any custom pipeline
vidore_benchmark/
├── pipeline_evaluation/
│ ├── base_pipeline.py # BasePipeline abstract class
│ ├── dataset_loader.py # ViDoRe v3 dataset loading
│ ├── evaluator.py # Evaluation orchestration
│ ├── utils.py # Helper utilities
└── cli/
└── pipeline_evaluation.py # CLI for pipeline evaluation

Reproducibility & Legacy Features

This repository previously focused on evaluating vision retrievers on the ViDoRe benchmarks v1 and v2. All code related to these functionalities is still available but deprecated:

  • Vision Retriever Evaluation: See README_OLD.md
  • ViDoRe Benchmarks v1/v2: Now maintained in MTEB
  • Model Implementations: Available in src/vidore_benchmark/retrievers/ (for reference only)

⚠️ For new projects, we recommend:

  • Using MTEB for vision retriever evaluation on ViDoRe v1/v2
  • Using this framework for pipeline evaluation on ViDoRe v3

For reproducibility of published results, see REPRODUCIBILITY.md.

Contributing

We welcome contributions for:

  • New example pipelines
  • Additional evaluation results
  • Dataset utilities
  • Documentation improvements

Please open an issue or PR on GitHub.

Citation

If you use this framework or the ViDoRe benchmark in your research, please cite:

ColPali: Efficient Document Retrieval with Vision Language Models

@misc{faysse2024colpaliefficientdocumentretrieval,
title={ColPali: Efficient Document Retrieval with Vision Language Models}, author={Manuel Faysse and Hugues Sibille and Tony Wu and Bilel Omrani and Gautier Viaud and Céline Hudelot and Pierre Colombo},
year={2024},
eprint={2407.01449},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2407.01449}, }

ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval

@misc{macé2025vidorebenchmarkv2raising,
title={ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval}, author={Quentin Macé and António Loison and Manuel Faysse},
year={2025},
eprint={2505.17166},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2505.17166}, }

ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios

@misc{loison2026vidore,
title={ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios},
author={Loison, Ant{\'o}nio and Mac{\'e}, Quentin and Edy, Antoine and Xing, Victor and Balough, Tom and Moreira, Gabriel and Liu, Bo and Faysse, Manuel and Hudelot, C{\'e}line and Viaud, Gautier},
journal={arXiv preprint arXiv:2601.08620},
year={2026}
}

License

This project is licensed under the MIT License - see the LICENSE file for details.

Links

About

Vision Document Retrieval (ViDoRe): Benchmark. Evaluation code for the ColPali paper.

Topics

Resources

Stars

278 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

ViDoRe Pipeline Evaluation Framework 🔍

arXivGitHubHugging Face

TestVersionDownloads


Important

🔄 Repository Focus Change

This repository is now focused on pipeline evaluation for visual document retrieval tasks.

All other functionalities (vision retriever evaluation, legacy benchmarks) are kept for reproducibility purposes but are deprecated and no longer actively maintained.


Evaluating single-model retrievers on ViDoRe v1–v3 with MTEB

We shifted from in-house evaluations to the general MTEB evaluation framework for retrieval models by moving to MTEB.

Here are the main steps to evaluate and submit your retriever to the ViDoRe V1-V3 leaderboards ; see the MTEB official documentation for full details. This section covers mteb leaderboards only; for our in-house pipeline leaderboard, see the section below.

  1. Create your model implementation file (if it does not exist already) here, then open a PR to the MTEB repository with your changes; examples for Colpali-like models can be found in this file.

  2. Evaluate your model:

importmtebfrommteb.models.model_implementations.my_custom_modelimportMyCustomModelmy_model=MyCustomModel(my_args)
tasks=mteb.get_tasks(["ViDoRe (v3)"])
results=mteb.evaluate(my_model, tasks=tasks)
  1. Open a PR on the mteb_results_repo with the generated results file to submit your results to the leaderboard

  2. To evaluate on private sets, once all this is done you can ask the MTEB team to evaluate your model on private ViDoRe v3 sets by opening a dedicated issue on their repo

Evaluating a complex pipeline

Pipeline evaluation allows you to evaluate complete end-to-end retrieval systems on the ViDoRe v3 benchmark datasets. Unlike traditional retriever evaluation that focuses on individual model components, pipeline evaluation lets you test:

  • Multi-stage retrieval systems (e.g., retrieve + rerank)
  • Hybrid approaches (e.g., dense + sparse retrieval fusion)
  • Custom preprocessing pipelines (e.g., OCR → chunking → embedding)
  • Arbitrary retrieval logic that goes beyond standard dense/sparse retrievers

📊 Results Repository & Submission Guidelines

This repository serves as the primary community results repository for visual document retrieval benchmarks using complex pipelines. We encourage researchers and practitioners to submit their pipeline evaluation results to create a centralized location where the community can compare different approaches and track progress on ViDoRe v3 datasets.

How to Submit Your Results

To contribute your pipeline results to the leaderboard:

  1. Run evaluations using this framework on the ViDoRe v3 datasets english splits (--language english in cli). It tracks raw scores as well as indexing and search computing times.

  2. Open a Pull Request with the following:

    • Results files: Add your JSON result files to the results/metrics folder, organized as:
      results/metrics/your_pipeline_name/
      ├── vidore_v3_hr.json
      ├── vidore_v3_finance_en.json
      ├── vidore_v3_industrial.json
      └── ... (other datasets)
      
    • Pipeline description: Include a description.json file in the same PR that describes the architecture used. A pipeline is represented as a graph of a set of modules (OCR, retriever, reranker, mcp server... linked together via edges) Some pipeline descriptions files example are written in results/pipeline_descriptions

    We encourage adding as much hardware information as possible in the description to enable the community to get a feel about the latency of each pipeline.

Installation

pip install vidore-benchmark

List Available Datasets

List all ViDoRe v3 datasets:

vidore-benchmark pipeline list-datasets

Available datasets:

  • vidore/vidore_v3_hr - Human Resources documents
  • vidore/vidore_v3_finance_en - Financial documents (English)
  • vidore/vidore_v3_industrial - Industrial documents
  • vidore/vidore_v3_pharmaceuticals - Pharmaceutical documents
  • vidore/vidore_v3_computer_science - Computer Science documents
  • vidore/vidore_v3_energy - Energy sector documents
  • vidore/vidore_v3_physics - Physics documents
  • vidore/vidore_v3_finance_fr - Financial documents (French)

Evaluate a Pipeline

You can evaluate any pipeline that inherits from BasePipeline:

Some pipelines are already implemented in the pipeline_implementations folder.

Custom Pipeline

Evaluate your own pipeline implementation:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--module-path path/to/my_pipeline.py \
--class-name MyCustomPipeline \
--language english \
--pipeline-args '{"model_name": "my-model"}'

Your pipeline file (my_pipeline.py):

fromvidore_benchmark.pipeline_evaluationimportBasePipelineclassMyCustomPipeline(BasePipeline):
def__init__(self, model_name):
self.model_name=model_name# Initialize your model heredefindex(self, corpus_ids, corpus_images, corpus_texts, dataset_name: str=None):
# Indexing function to process corpus, should store anything# relevant as class attributesself.corpus_ids=corpus_ids
...
defsearch(self, query_ids, queries):
# Your search logic, returns scores dict (see BasePipeline file for description)return {query_id: {corpus_id: score}}

Language Filtering

Some datasets contain multilingual queries. You can filter by language:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--pipeline-type random \
--language english

Evaluate on All Datasets

Evaluate your pipeline on all ViDoRe v3 datasets:

With built-in pipeline:

vidore-benchmark pipeline evaluate-all \
--pipeline-type random \
--pipeline-args '{"seed": 42}' \
--output-dir results/

With custom pipeline:

vidore-benchmark pipeline evaluate-all \
--module-path my_pipeline.py \
--class-name MyCustomPipeline \
--output-dir results/

Python API

Implementing Your Own Pipeline

To evaluate a custom pipeline, inherit from BasePipeline and implement the index() and search() methods:

Running Evaluation

frompath_to_pipelineimportMyCustomPipelinefromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
evaluate_retrieval,
aggregate_results,
)
# Load datasetquery_ids, queries, corpus_ids, corpus_images, corpus_texts, qrels=load_vidore_dataset(
dataset_name="vidore/vidore_v3_hr",
split="test"
)
# Initialize your pipelinepipeline=MyCustomPipeline(retriever=my_retriever, reranker=my_reranker)
# Run evaluationresults=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus_images=corpus_images,
corpus_texts=corpus_texts,
qrels=qrels,
metrics=["ndcg_cut_10", "recall_10"]
)
# Get aggregate scoresaggregated=aggregate_results(results)
print(f"NDCG@10: {aggregated['ndcg_cut_10']:.4f}")

Some examples of pipeline implementations can be found in the pipeline_implementations folder

Advanced Usage

Tracking Additional Metrics (Optional)

Pipelines can optionally return additional tracking information alongside retrieval results. This is useful for monitoring costs, timing, resource usage, or other custom metrics:

fromtypingimportDict, List, Any, Optional, TupleclassPipelineWithMetrics(BasePipeline):
defindex(
self,
corpus_ids: List[str],
corpus_images: List[Any],
corpus_texts: List[str],
) ->None:
# Indexing logic
...
defsearch(
self,
query_ids: List[str],
queries: List[str],
) ->Tuple[Dict[str, Dict[str, float]], Optional[Dict[str, Any]]]:
""" Return both retrieval results and optional tracking metrics. Returns: Tuple of (results, infos) where infos can contain: - Cost tracking (e.g., API costs, GPU hours) - Granular timing information - Resource usage (num_gpus, memory, etc.) - Model-specific metadata """# Your retrieval logic hereresults= {...}
# Optional: track additional metricsinfos= {
"estimated_cost_usd": 0.05,
"num_gpus": 1,
"total_time_ms": 1234.5,
"model_name": "my-model-v1",
}
returnresults, infos

The infos dictionary will be stored in the evaluation results under the _infos key. This is completely optional - pipelines can still return just the results dictionary for backward compatibility:

classSimplePipeline(BasePipeline):
defsearch(...) ->Dict[str, Dict[str, float]]:
# Just return results, no tracking neededreturnresults

See example_pipelines/pipeline_with_metrics.py for a complete example.

Dataset Information

fromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
print_dataset_info,
get_available_datasets,
)
# List available datasetsdatasets=get_available_datasets()
print(datasets)
# Load and inspect a datasetquery_ids, queries, corpus_ids, corpus, qrels=load_vidore_dataset(
"vidore/vidore_v3_industrial"
)
print_dataset_info(
dataset_name="vidore/vidore_v3_industrial",
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
)

Custom Metrics

You can specify custom metrics to evaluate if you want to:

results=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
metrics=[
"ndcg_cut_5",
"ndcg_cut_10",
"recall_5",
"recall_10",
"map",
]
)

All metrics supported by pytrec_eval are available.

Architecture

The pipeline evaluation framework consists of:

  1. BasePipeline: Abstract base class for implementing custom pipelines
  2. Dataset Loaders: Functions to load ViDoRe v3 datasets from HuggingFace
  3. Evaluator: Uses pytrec_eval to compute retrieval metrics
  4. CLI: Commands for evaluating any custom pipeline
vidore_benchmark/
├── pipeline_evaluation/
│ ├── base_pipeline.py # BasePipeline abstract class
│ ├── dataset_loader.py # ViDoRe v3 dataset loading
│ ├── evaluator.py # Evaluation orchestration
│ ├── utils.py # Helper utilities
└── cli/
└── pipeline_evaluation.py # CLI for pipeline evaluation

Reproducibility & Legacy Features

This repository previously focused on evaluating vision retrievers on the ViDoRe benchmarks v1 and v2. All code related to these functionalities is still available but deprecated:

  • Vision Retriever Evaluation: See README_OLD.md
  • ViDoRe Benchmarks v1/v2: Now maintained in MTEB
  • Model Implementations: Available in src/vidore_benchmark/retrievers/ (for reference only)

⚠️ For new projects, we recommend:

  • Using MTEB for vision retriever evaluation on ViDoRe v1/v2
  • Using this framework for pipeline evaluation on ViDoRe v3

For reproducibility of published results, see REPRODUCIBILITY.md.

Contributing

We welcome contributions for:

  • New example pipelines
  • Additional evaluation results
  • Dataset utilities
  • Documentation improvements

Please open an issue or PR on GitHub.

Citation

If you use this framework or the ViDoRe benchmark in your research, please cite:

ColPali: Efficient Document Retrieval with Vision Language Models

@misc{faysse2024colpaliefficientdocumentretrieval,
title={ColPali: Efficient Document Retrieval with Vision Language Models}, author={Manuel Faysse and Hugues Sibille and Tony Wu and Bilel Omrani and Gautier Viaud and Céline Hudelot and Pierre Colombo},
year={2024},
eprint={2407.01449},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2407.01449}, }

ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval

@misc{macé2025vidorebenchmarkv2raising,
title={ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval}, author={Quentin Macé and António Loison and Manuel Faysse},
year={2025},
eprint={2505.17166},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2505.17166}, }

ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios

@misc{loison2026vidore,
title={ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios},
author={Loison, Ant{\'o}nio and Mac{\'e}, Quentin and Edy, Antoine and Xing, Victor and Balough, Tom and Moreira, Gabriel and Liu, Bo and Faysse, Manuel and Hudelot, C{\'e}line and Viaud, Gautier},
journal={arXiv preprint arXiv:2601.08620},
year={2026}
}

License

This project is licensed under the MIT License - see the LICENSE file for details.

Links

About

Vision Document Retrieval (ViDoRe): Benchmark. Evaluation code for the ColPali paper.

Topics

Resources

Stars

278 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ViDoRe Pipeline Evaluation Framework 🔍

arXivGitHubHugging Face

TestVersionDownloads


Important

🔄 Repository Focus Change

This repository is now focused on pipeline evaluation for visual document retrieval tasks.

All other functionalities (vision retriever evaluation, legacy benchmarks) are kept for reproducibility purposes but are deprecated and no longer actively maintained.


Evaluating single-model retrievers on ViDoRe v1–v3 with MTEB

We shifted from in-house evaluations to the general MTEB evaluation framework for retrieval models by moving to MTEB.

Here are the main steps to evaluate and submit your retriever to the ViDoRe V1-V3 leaderboards ; see the MTEB official documentation for full details. This section covers mteb leaderboards only; for our in-house pipeline leaderboard, see the section below.

  1. Create your model implementation file (if it does not exist already) here, then open a PR to the MTEB repository with your changes; examples for Colpali-like models can be found in this file.

  2. Evaluate your model:

importmtebfrommteb.models.model_implementations.my_custom_modelimportMyCustomModelmy_model=MyCustomModel(my_args)
tasks=mteb.get_tasks(["ViDoRe (v3)"])
results=mteb.evaluate(my_model, tasks=tasks)
  1. Open a PR on the mteb_results_repo with the generated results file to submit your results to the leaderboard

  2. To evaluate on private sets, once all this is done you can ask the MTEB team to evaluate your model on private ViDoRe v3 sets by opening a dedicated issue on their repo

Evaluating a complex pipeline

Pipeline evaluation allows you to evaluate complete end-to-end retrieval systems on the ViDoRe v3 benchmark datasets. Unlike traditional retriever evaluation that focuses on individual model components, pipeline evaluation lets you test:

  • Multi-stage retrieval systems (e.g., retrieve + rerank)
  • Hybrid approaches (e.g., dense + sparse retrieval fusion)
  • Custom preprocessing pipelines (e.g., OCR → chunking → embedding)
  • Arbitrary retrieval logic that goes beyond standard dense/sparse retrievers

📊 Results Repository & Submission Guidelines

This repository serves as the primary community results repository for visual document retrieval benchmarks using complex pipelines. We encourage researchers and practitioners to submit their pipeline evaluation results to create a centralized location where the community can compare different approaches and track progress on ViDoRe v3 datasets.

How to Submit Your Results

To contribute your pipeline results to the leaderboard:

  1. Run evaluations using this framework on the ViDoRe v3 datasets english splits (--language english in cli). It tracks raw scores as well as indexing and search computing times.

  2. Open a Pull Request with the following:

    • Results files: Add your JSON result files to the results/metrics folder, organized as:
      results/metrics/your_pipeline_name/
      ├── vidore_v3_hr.json
      ├── vidore_v3_finance_en.json
      ├── vidore_v3_industrial.json
      └── ... (other datasets)
      
    • Pipeline description: Include a description.json file in the same PR that describes the architecture used. A pipeline is represented as a graph of a set of modules (OCR, retriever, reranker, mcp server... linked together via edges) Some pipeline descriptions files example are written in results/pipeline_descriptions

    We encourage adding as much hardware information as possible in the description to enable the community to get a feel about the latency of each pipeline.

Installation

pip install vidore-benchmark

List Available Datasets

List all ViDoRe v3 datasets:

vidore-benchmark pipeline list-datasets

Available datasets:

  • vidore/vidore_v3_hr - Human Resources documents
  • vidore/vidore_v3_finance_en - Financial documents (English)
  • vidore/vidore_v3_industrial - Industrial documents
  • vidore/vidore_v3_pharmaceuticals - Pharmaceutical documents
  • vidore/vidore_v3_computer_science - Computer Science documents
  • vidore/vidore_v3_energy - Energy sector documents
  • vidore/vidore_v3_physics - Physics documents
  • vidore/vidore_v3_finance_fr - Financial documents (French)

Evaluate a Pipeline

You can evaluate any pipeline that inherits from BasePipeline:

Some pipelines are already implemented in the pipeline_implementations folder.

Custom Pipeline

Evaluate your own pipeline implementation:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--module-path path/to/my_pipeline.py \
--class-name MyCustomPipeline \
--language english \
--pipeline-args '{"model_name": "my-model"}'

Your pipeline file (my_pipeline.py):

fromvidore_benchmark.pipeline_evaluationimportBasePipelineclassMyCustomPipeline(BasePipeline):
def__init__(self, model_name):
self.model_name=model_name# Initialize your model heredefindex(self, corpus_ids, corpus_images, corpus_texts, dataset_name: str=None):
# Indexing function to process corpus, should store anything# relevant as class attributesself.corpus_ids=corpus_ids
...
defsearch(self, query_ids, queries):
# Your search logic, returns scores dict (see BasePipeline file for description)return {query_id: {corpus_id: score}}

Language Filtering

Some datasets contain multilingual queries. You can filter by language:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--pipeline-type random \
--language english

Evaluate on All Datasets

Evaluate your pipeline on all ViDoRe v3 datasets:

With built-in pipeline:

vidore-benchmark pipeline evaluate-all \
--pipeline-type random \
--pipeline-args '{"seed": 42}' \
--output-dir results/

With custom pipeline:

vidore-benchmark pipeline evaluate-all \
--module-path my_pipeline.py \
--class-name MyCustomPipeline \
--output-dir results/

Python API

Implementing Your Own Pipeline

To evaluate a custom pipeline, inherit from BasePipeline and implement the index() and search() methods:

Running Evaluation

frompath_to_pipelineimportMyCustomPipelinefromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
evaluate_retrieval,
aggregate_results,
)
# Load datasetquery_ids, queries, corpus_ids, corpus_images, corpus_texts, qrels=load_vidore_dataset(
dataset_name="vidore/vidore_v3_hr",
split="test"
)
# Initialize your pipelinepipeline=MyCustomPipeline(retriever=my_retriever, reranker=my_reranker)
# Run evaluationresults=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus_images=corpus_images,
corpus_texts=corpus_texts,
qrels=qrels,
metrics=["ndcg_cut_10", "recall_10"]
)
# Get aggregate scoresaggregated=aggregate_results(results)
print(f"NDCG@10: {aggregated['ndcg_cut_10']:.4f}")

Some examples of pipeline implementations can be found in the pipeline_implementations folder

Advanced Usage

Tracking Additional Metrics (Optional)

Pipelines can optionally return additional tracking information alongside retrieval results. This is useful for monitoring costs, timing, resource usage, or other custom metrics:

fromtypingimportDict, List, Any, Optional, TupleclassPipelineWithMetrics(BasePipeline):
defindex(
self,
corpus_ids: List[str],
corpus_images: List[Any],
corpus_texts: List[str],
) ->None:
# Indexing logic
...
defsearch(
self,
query_ids: List[str],
queries: List[str],
) ->Tuple[Dict[str, Dict[str, float]], Optional[Dict[str, Any]]]:
""" Return both retrieval results and optional tracking metrics. Returns: Tuple of (results, infos) where infos can contain: - Cost tracking (e.g., API costs, GPU hours) - Granular timing information - Resource usage (num_gpus, memory, etc.) - Model-specific metadata """# Your retrieval logic hereresults= {...}
# Optional: track additional metricsinfos= {
"estimated_cost_usd": 0.05,
"num_gpus": 1,
"total_time_ms": 1234.5,
"model_name": "my-model-v1",
}
returnresults, infos

The infos dictionary will be stored in the evaluation results under the _infos key. This is completely optional - pipelines can still return just the results dictionary for backward compatibility:

classSimplePipeline(BasePipeline):
defsearch(...) ->Dict[str, Dict[str, float]]:
# Just return results, no tracking neededreturnresults

See example_pipelines/pipeline_with_metrics.py for a complete example.

Dataset Information

fromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
print_dataset_info,
get_available_datasets,
)
# List available datasetsdatasets=get_available_datasets()
print(datasets)
# Load and inspect a datasetquery_ids, queries, corpus_ids, corpus, qrels=load_vidore_dataset(
"vidore/vidore_v3_industrial"
)
print_dataset_info(
dataset_name="vidore/vidore_v3_industrial",
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
)

Custom Metrics

You can specify custom metrics to evaluate if you want to:

results=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
metrics=[
"ndcg_cut_5",
"ndcg_cut_10",
"recall_5",
"recall_10",
"map",
]
)

All metrics supported by pytrec_eval are available.

Architecture

The pipeline evaluation framework consists of:

  1. BasePipeline: Abstract base class for implementing custom pipelines
  2. Dataset Loaders: Functions to load ViDoRe v3 datasets from HuggingFace
  3. Evaluator: Uses pytrec_eval to compute retrieval metrics
  4. CLI: Commands for evaluating any custom pipeline
vidore_benchmark/
├── pipeline_evaluation/
│ ├── base_pipeline.py # BasePipeline abstract class
│ ├── dataset_loader.py # ViDoRe v3 dataset loading
│ ├── evaluator.py # Evaluation orchestration
│ ├── utils.py # Helper utilities
└── cli/
└── pipeline_evaluation.py # CLI for pipeline evaluation

Reproducibility & Legacy Features

This repository previously focused on evaluating vision retrievers on the ViDoRe benchmarks v1 and v2. All code related to these functionalities is still available but deprecated:

  • Vision Retriever Evaluation: See README_OLD.md
  • ViDoRe Benchmarks v1/v2: Now maintained in MTEB
  • Model Implementations: Available in src/vidore_benchmark/retrievers/ (for reference only)

⚠️ For new projects, we recommend:

  • Using MTEB for vision retriever evaluation on ViDoRe v1/v2
  • Using this framework for pipeline evaluation on ViDoRe v3

For reproducibility of published results, see REPRODUCIBILITY.md.

Contributing

We welcome contributions for:

  • New example pipelines
  • Additional evaluation results
  • Dataset utilities
  • Documentation improvements

Please open an issue or PR on GitHub.

Citation

If you use this framework or the ViDoRe benchmark in your research, please cite:

ColPali: Efficient Document Retrieval with Vision Language Models

@misc{faysse2024colpaliefficientdocumentretrieval,
title={ColPali: Efficient Document Retrieval with Vision Language Models}, author={Manuel Faysse and Hugues Sibille and Tony Wu and Bilel Omrani and Gautier Viaud and Céline Hudelot and Pierre Colombo},
year={2024},
eprint={2407.01449},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2407.01449}, }

ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval

@misc{macé2025vidorebenchmarkv2raising,
title={ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval}, author={Quentin Macé and António Loison and Manuel Faysse},
year={2025},
eprint={2505.17166},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2505.17166}, }

ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios

@misc{loison2026vidore,
title={ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios},
author={Loison, Ant{\'o}nio and Mac{\'e}, Quentin and Edy, Antoine and Xing, Victor and Balough, Tom and Moreira, Gabriel and Liu, Bo and Faysse, Manuel and Hudelot, C{\'e}line and Viaud, Gautier},
journal={arXiv preprint arXiv:2601.08620},
year={2026}
}

License

This project is licensed under the MIT License - see the LICENSE file for details.

Links

About

Vision Document Retrieval (ViDoRe): Benchmark. Evaluation code for the ColPali paper.

Topics

Resources

Stars

278 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ViDoRe Pipeline Evaluation Framework 🔍

arXivGitHubHugging Face

TestVersionDownloads


Important

🔄 Repository Focus Change

This repository is now focused on pipeline evaluation for visual document retrieval tasks.

All other functionalities (vision retriever evaluation, legacy benchmarks) are kept for reproducibility purposes but are deprecated and no longer actively maintained.


Evaluating single-model retrievers on ViDoRe v1–v3 with MTEB

We shifted from in-house evaluations to the general MTEB evaluation framework for retrieval models by moving to MTEB.

Here are the main steps to evaluate and submit your retriever to the ViDoRe V1-V3 leaderboards ; see the MTEB official documentation for full details. This section covers mteb leaderboards only; for our in-house pipeline leaderboard, see the section below.

  1. Create your model implementation file (if it does not exist already) here, then open a PR to the MTEB repository with your changes; examples for Colpali-like models can be found in this file.

  2. Evaluate your model:

importmtebfrommteb.models.model_implementations.my_custom_modelimportMyCustomModelmy_model=MyCustomModel(my_args)
tasks=mteb.get_tasks(["ViDoRe (v3)"])
results=mteb.evaluate(my_model, tasks=tasks)
  1. Open a PR on the mteb_results_repo with the generated results file to submit your results to the leaderboard

  2. To evaluate on private sets, once all this is done you can ask the MTEB team to evaluate your model on private ViDoRe v3 sets by opening a dedicated issue on their repo

Evaluating a complex pipeline

Pipeline evaluation allows you to evaluate complete end-to-end retrieval systems on the ViDoRe v3 benchmark datasets. Unlike traditional retriever evaluation that focuses on individual model components, pipeline evaluation lets you test:

  • Multi-stage retrieval systems (e.g., retrieve + rerank)
  • Hybrid approaches (e.g., dense + sparse retrieval fusion)
  • Custom preprocessing pipelines (e.g., OCR → chunking → embedding)
  • Arbitrary retrieval logic that goes beyond standard dense/sparse retrievers

📊 Results Repository & Submission Guidelines

This repository serves as the primary community results repository for visual document retrieval benchmarks using complex pipelines. We encourage researchers and practitioners to submit their pipeline evaluation results to create a centralized location where the community can compare different approaches and track progress on ViDoRe v3 datasets.

How to Submit Your Results

To contribute your pipeline results to the leaderboard:

  1. Run evaluations using this framework on the ViDoRe v3 datasets english splits (--language english in cli). It tracks raw scores as well as indexing and search computing times.

  2. Open a Pull Request with the following:

    • Results files: Add your JSON result files to the results/metrics folder, organized as:
      results/metrics/your_pipeline_name/
      ├── vidore_v3_hr.json
      ├── vidore_v3_finance_en.json
      ├── vidore_v3_industrial.json
      └── ... (other datasets)
      
    • Pipeline description: Include a description.json file in the same PR that describes the architecture used. A pipeline is represented as a graph of a set of modules (OCR, retriever, reranker, mcp server... linked together via edges) Some pipeline descriptions files example are written in results/pipeline_descriptions

    We encourage adding as much hardware information as possible in the description to enable the community to get a feel about the latency of each pipeline.

Installation

pip install vidore-benchmark

List Available Datasets

List all ViDoRe v3 datasets:

vidore-benchmark pipeline list-datasets

Available datasets:

  • vidore/vidore_v3_hr - Human Resources documents
  • vidore/vidore_v3_finance_en - Financial documents (English)
  • vidore/vidore_v3_industrial - Industrial documents
  • vidore/vidore_v3_pharmaceuticals - Pharmaceutical documents
  • vidore/vidore_v3_computer_science - Computer Science documents
  • vidore/vidore_v3_energy - Energy sector documents
  • vidore/vidore_v3_physics - Physics documents
  • vidore/vidore_v3_finance_fr - Financial documents (French)

Evaluate a Pipeline

You can evaluate any pipeline that inherits from BasePipeline:

Some pipelines are already implemented in the pipeline_implementations folder.

Custom Pipeline

Evaluate your own pipeline implementation:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--module-path path/to/my_pipeline.py \
--class-name MyCustomPipeline \
--language english \
--pipeline-args '{"model_name": "my-model"}'

Your pipeline file (my_pipeline.py):

fromvidore_benchmark.pipeline_evaluationimportBasePipelineclassMyCustomPipeline(BasePipeline):
def__init__(self, model_name):
self.model_name=model_name# Initialize your model heredefindex(self, corpus_ids, corpus_images, corpus_texts, dataset_name: str=None):
# Indexing function to process corpus, should store anything# relevant as class attributesself.corpus_ids=corpus_ids
...
defsearch(self, query_ids, queries):
# Your search logic, returns scores dict (see BasePipeline file for description)return {query_id: {corpus_id: score}}

Language Filtering

Some datasets contain multilingual queries. You can filter by language:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--pipeline-type random \
--language english

Evaluate on All Datasets

Evaluate your pipeline on all ViDoRe v3 datasets:

With built-in pipeline:

vidore-benchmark pipeline evaluate-all \
--pipeline-type random \
--pipeline-args '{"seed": 42}' \
--output-dir results/

With custom pipeline:

vidore-benchmark pipeline evaluate-all \
--module-path my_pipeline.py \
--class-name MyCustomPipeline \
--output-dir results/

Python API

Implementing Your Own Pipeline

To evaluate a custom pipeline, inherit from BasePipeline and implement the index() and search() methods:

Running Evaluation

frompath_to_pipelineimportMyCustomPipelinefromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
evaluate_retrieval,
aggregate_results,
)
# Load datasetquery_ids, queries, corpus_ids, corpus_images, corpus_texts, qrels=load_vidore_dataset(
dataset_name="vidore/vidore_v3_hr",
split="test"
)
# Initialize your pipelinepipeline=MyCustomPipeline(retriever=my_retriever, reranker=my_reranker)
# Run evaluationresults=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus_images=corpus_images,
corpus_texts=corpus_texts,
qrels=qrels,
metrics=["ndcg_cut_10", "recall_10"]
)
# Get aggregate scoresaggregated=aggregate_results(results)
print(f"NDCG@10: {aggregated['ndcg_cut_10']:.4f}")

Some examples of pipeline implementations can be found in the pipeline_implementations folder

Advanced Usage

Tracking Additional Metrics (Optional)

Pipelines can optionally return additional tracking information alongside retrieval results. This is useful for monitoring costs, timing, resource usage, or other custom metrics:

fromtypingimportDict, List, Any, Optional, TupleclassPipelineWithMetrics(BasePipeline):
defindex(
self,
corpus_ids: List[str],
corpus_images: List[Any],
corpus_texts: List[str],
) ->None:
# Indexing logic
...
defsearch(
self,
query_ids: List[str],
queries: List[str],
) ->Tuple[Dict[str, Dict[str, float]], Optional[Dict[str, Any]]]:
""" Return both retrieval results and optional tracking metrics. Returns: Tuple of (results, infos) where infos can contain: - Cost tracking (e.g., API costs, GPU hours) - Granular timing information - Resource usage (num_gpus, memory, etc.) - Model-specific metadata """# Your retrieval logic hereresults= {...}
# Optional: track additional metricsinfos= {
"estimated_cost_usd": 0.05,
"num_gpus": 1,
"total_time_ms": 1234.5,
"model_name": "my-model-v1",
}
returnresults, infos

The infos dictionary will be stored in the evaluation results under the _infos key. This is completely optional - pipelines can still return just the results dictionary for backward compatibility:

classSimplePipeline(BasePipeline):
defsearch(...) ->Dict[str, Dict[str, float]]:
# Just return results, no tracking neededreturnresults

See example_pipelines/pipeline_with_metrics.py for a complete example.

Dataset Information

fromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
print_dataset_info,
get_available_datasets,
)
# List available datasetsdatasets=get_available_datasets()
print(datasets)
# Load and inspect a datasetquery_ids, queries, corpus_ids, corpus, qrels=load_vidore_dataset(
"vidore/vidore_v3_industrial"
)
print_dataset_info(
dataset_name="vidore/vidore_v3_industrial",
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
)

Custom Metrics

You can specify custom metrics to evaluate if you want to:

results=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
metrics=[
"ndcg_cut_5",
"ndcg_cut_10",
"recall_5",
"recall_10",
"map",
]
)

All metrics supported by pytrec_eval are available.

Architecture

The pipeline evaluation framework consists of:

  1. BasePipeline: Abstract base class for implementing custom pipelines
  2. Dataset Loaders: Functions to load ViDoRe v3 datasets from HuggingFace
  3. Evaluator: Uses pytrec_eval to compute retrieval metrics
  4. CLI: Commands for evaluating any custom pipeline
vidore_benchmark/
├── pipeline_evaluation/
│ ├── base_pipeline.py # BasePipeline abstract class
│ ├── dataset_loader.py # ViDoRe v3 dataset loading
│ ├── evaluator.py # Evaluation orchestration
│ ├── utils.py # Helper utilities
└── cli/
└── pipeline_evaluation.py # CLI for pipeline evaluation

Reproducibility & Legacy Features

This repository previously focused on evaluating vision retrievers on the ViDoRe benchmarks v1 and v2. All code related to these functionalities is still available but deprecated:

  • Vision Retriever Evaluation: See README_OLD.md
  • ViDoRe Benchmarks v1/v2: Now maintained in MTEB
  • Model Implementations: Available in src/vidore_benchmark/retrievers/ (for reference only)

⚠️ For new projects, we recommend:

  • Using MTEB for vision retriever evaluation on ViDoRe v1/v2
  • Using this framework for pipeline evaluation on ViDoRe v3

For reproducibility of published results, see REPRODUCIBILITY.md.

Contributing

We welcome contributions for:

  • New example pipelines
  • Additional evaluation results
  • Dataset utilities
  • Documentation improvements

Please open an issue or PR on GitHub.

Citation

If you use this framework or the ViDoRe benchmark in your research, please cite:

ColPali: Efficient Document Retrieval with Vision Language Models

@misc{faysse2024colpaliefficientdocumentretrieval,
title={ColPali: Efficient Document Retrieval with Vision Language Models}, author={Manuel Faysse and Hugues Sibille and Tony Wu and Bilel Omrani and Gautier Viaud and Céline Hudelot and Pierre Colombo},
year={2024},
eprint={2407.01449},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2407.01449}, }

ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval

@misc{macé2025vidorebenchmarkv2raising,
title={ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval}, author={Quentin Macé and António Loison and Manuel Faysse},
year={2025},
eprint={2505.17166},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2505.17166}, }

ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios

@misc{loison2026vidore,
title={ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios},
author={Loison, Ant{\'o}nio and Mac{\'e}, Quentin and Edy, Antoine and Xing, Victor and Balough, Tom and Moreira, Gabriel and Liu, Bo and Faysse, Manuel and Hudelot, C{\'e}line and Viaud, Gautier},
journal={arXiv preprint arXiv:2601.08620},
year={2026}
}

License

This project is licensed under the MIT License - see the LICENSE file for details.

Links

About

Vision Document Retrieval (ViDoRe): Benchmark. Evaluation code for the ColPali paper.

Topics

Resources

Stars

278 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

ViDoRe Pipeline Evaluation Framework 🔍

arXivGitHubHugging Face

TestVersionDownloads


Important

🔄 Repository Focus Change

This repository is now focused on pipeline evaluation for visual document retrieval tasks.

All other functionalities (vision retriever evaluation, legacy benchmarks) are kept for reproducibility purposes but are deprecated and no longer actively maintained.


Evaluating single-model retrievers on ViDoRe v1–v3 with MTEB

We shifted from in-house evaluations to the general MTEB evaluation framework for retrieval models by moving to MTEB.

Here are the main steps to evaluate and submit your retriever to the ViDoRe V1-V3 leaderboards ; see the MTEB official documentation for full details. This section covers mteb leaderboards only; for our in-house pipeline leaderboard, see the section below.

  1. Create your model implementation file (if it does not exist already) here, then open a PR to the MTEB repository with your changes; examples for Colpali-like models can be found in this file.

  2. Evaluate your model:

importmtebfrommteb.models.model_implementations.my_custom_modelimportMyCustomModelmy_model=MyCustomModel(my_args)
tasks=mteb.get_tasks(["ViDoRe (v3)"])
results=mteb.evaluate(my_model, tasks=tasks)
  1. Open a PR on the mteb_results_repo with the generated results file to submit your results to the leaderboard

  2. To evaluate on private sets, once all this is done you can ask the MTEB team to evaluate your model on private ViDoRe v3 sets by opening a dedicated issue on their repo

Evaluating a complex pipeline

Pipeline evaluation allows you to evaluate complete end-to-end retrieval systems on the ViDoRe v3 benchmark datasets. Unlike traditional retriever evaluation that focuses on individual model components, pipeline evaluation lets you test:

  • Multi-stage retrieval systems (e.g., retrieve + rerank)
  • Hybrid approaches (e.g., dense + sparse retrieval fusion)
  • Custom preprocessing pipelines (e.g., OCR → chunking → embedding)
  • Arbitrary retrieval logic that goes beyond standard dense/sparse retrievers

📊 Results Repository & Submission Guidelines

This repository serves as the primary community results repository for visual document retrieval benchmarks using complex pipelines. We encourage researchers and practitioners to submit their pipeline evaluation results to create a centralized location where the community can compare different approaches and track progress on ViDoRe v3 datasets.

How to Submit Your Results

To contribute your pipeline results to the leaderboard:

  1. Run evaluations using this framework on the ViDoRe v3 datasets english splits (--language english in cli). It tracks raw scores as well as indexing and search computing times.

  2. Open a Pull Request with the following:

    • Results files: Add your JSON result files to the results/metrics folder, organized as:
      results/metrics/your_pipeline_name/
      ├── vidore_v3_hr.json
      ├── vidore_v3_finance_en.json
      ├── vidore_v3_industrial.json
      └── ... (other datasets)
      
    • Pipeline description: Include a description.json file in the same PR that describes the architecture used. A pipeline is represented as a graph of a set of modules (OCR, retriever, reranker, mcp server... linked together via edges) Some pipeline descriptions files example are written in results/pipeline_descriptions

    We encourage adding as much hardware information as possible in the description to enable the community to get a feel about the latency of each pipeline.

Installation

pip install vidore-benchmark

List Available Datasets

List all ViDoRe v3 datasets:

vidore-benchmark pipeline list-datasets

Available datasets:

  • vidore/vidore_v3_hr - Human Resources documents
  • vidore/vidore_v3_finance_en - Financial documents (English)
  • vidore/vidore_v3_industrial - Industrial documents
  • vidore/vidore_v3_pharmaceuticals - Pharmaceutical documents
  • vidore/vidore_v3_computer_science - Computer Science documents
  • vidore/vidore_v3_energy - Energy sector documents
  • vidore/vidore_v3_physics - Physics documents
  • vidore/vidore_v3_finance_fr - Financial documents (French)

Evaluate a Pipeline

You can evaluate any pipeline that inherits from BasePipeline:

Some pipelines are already implemented in the pipeline_implementations folder.

Custom Pipeline

Evaluate your own pipeline implementation:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--module-path path/to/my_pipeline.py \
--class-name MyCustomPipeline \
--language english \
--pipeline-args '{"model_name": "my-model"}'

Your pipeline file (my_pipeline.py):

fromvidore_benchmark.pipeline_evaluationimportBasePipelineclassMyCustomPipeline(BasePipeline):
def__init__(self, model_name):
self.model_name=model_name# Initialize your model heredefindex(self, corpus_ids, corpus_images, corpus_texts, dataset_name: str=None):
# Indexing function to process corpus, should store anything# relevant as class attributesself.corpus_ids=corpus_ids
...
defsearch(self, query_ids, queries):
# Your search logic, returns scores dict (see BasePipeline file for description)return {query_id: {corpus_id: score}}

Language Filtering

Some datasets contain multilingual queries. You can filter by language:

vidore-benchmark pipeline evaluate \
--dataset-name vidore/vidore_v3_hr \
--pipeline-type random \
--language english

Evaluate on All Datasets

Evaluate your pipeline on all ViDoRe v3 datasets:

With built-in pipeline:

vidore-benchmark pipeline evaluate-all \
--pipeline-type random \
--pipeline-args '{"seed": 42}' \
--output-dir results/

With custom pipeline:

vidore-benchmark pipeline evaluate-all \
--module-path my_pipeline.py \
--class-name MyCustomPipeline \
--output-dir results/

Python API

Implementing Your Own Pipeline

To evaluate a custom pipeline, inherit from BasePipeline and implement the index() and search() methods:

Running Evaluation

frompath_to_pipelineimportMyCustomPipelinefromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
evaluate_retrieval,
aggregate_results,
)
# Load datasetquery_ids, queries, corpus_ids, corpus_images, corpus_texts, qrels=load_vidore_dataset(
dataset_name="vidore/vidore_v3_hr",
split="test"
)
# Initialize your pipelinepipeline=MyCustomPipeline(retriever=my_retriever, reranker=my_reranker)
# Run evaluationresults=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus_images=corpus_images,
corpus_texts=corpus_texts,
qrels=qrels,
metrics=["ndcg_cut_10", "recall_10"]
)
# Get aggregate scoresaggregated=aggregate_results(results)
print(f"NDCG@10: {aggregated['ndcg_cut_10']:.4f}")

Some examples of pipeline implementations can be found in the pipeline_implementations folder

Advanced Usage

Tracking Additional Metrics (Optional)

Pipelines can optionally return additional tracking information alongside retrieval results. This is useful for monitoring costs, timing, resource usage, or other custom metrics:

fromtypingimportDict, List, Any, Optional, TupleclassPipelineWithMetrics(BasePipeline):
defindex(
self,
corpus_ids: List[str],
corpus_images: List[Any],
corpus_texts: List[str],
) ->None:
# Indexing logic
...
defsearch(
self,
query_ids: List[str],
queries: List[str],
) ->Tuple[Dict[str, Dict[str, float]], Optional[Dict[str, Any]]]:
""" Return both retrieval results and optional tracking metrics. Returns: Tuple of (results, infos) where infos can contain: - Cost tracking (e.g., API costs, GPU hours) - Granular timing information - Resource usage (num_gpus, memory, etc.) - Model-specific metadata """# Your retrieval logic hereresults= {...}
# Optional: track additional metricsinfos= {
"estimated_cost_usd": 0.05,
"num_gpus": 1,
"total_time_ms": 1234.5,
"model_name": "my-model-v1",
}
returnresults, infos

The infos dictionary will be stored in the evaluation results under the _infos key. This is completely optional - pipelines can still return just the results dictionary for backward compatibility:

classSimplePipeline(BasePipeline):
defsearch(...) ->Dict[str, Dict[str, float]]:
# Just return results, no tracking neededreturnresults

See example_pipelines/pipeline_with_metrics.py for a complete example.

Dataset Information

fromvidore_benchmark.pipeline_evaluationimport (
load_vidore_dataset,
print_dataset_info,
get_available_datasets,
)
# List available datasetsdatasets=get_available_datasets()
print(datasets)
# Load and inspect a datasetquery_ids, queries, corpus_ids, corpus, qrels=load_vidore_dataset(
"vidore/vidore_v3_industrial"
)
print_dataset_info(
dataset_name="vidore/vidore_v3_industrial",
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
)

Custom Metrics

You can specify custom metrics to evaluate if you want to:

results=evaluate_retrieval(
pipeline=pipeline,
query_ids=query_ids,
queries=queries,
corpus_ids=corpus_ids,
corpus=corpus,
qrels=qrels,
metrics=[
"ndcg_cut_5",
"ndcg_cut_10",
"recall_5",
"recall_10",
"map",
]
)

All metrics supported by pytrec_eval are available.

Architecture

The pipeline evaluation framework consists of:

  1. BasePipeline: Abstract base class for implementing custom pipelines
  2. Dataset Loaders: Functions to load ViDoRe v3 datasets from HuggingFace
  3. Evaluator: Uses pytrec_eval to compute retrieval metrics
  4. CLI: Commands for evaluating any custom pipeline
vidore_benchmark/
├── pipeline_evaluation/
│ ├── base_pipeline.py # BasePipeline abstract class
│ ├── dataset_loader.py # ViDoRe v3 dataset loading
│ ├── evaluator.py # Evaluation orchestration
│ ├── utils.py # Helper utilities
└── cli/
└── pipeline_evaluation.py # CLI for pipeline evaluation

Reproducibility & Legacy Features

This repository previously focused on evaluating vision retrievers on the ViDoRe benchmarks v1 and v2. All code related to these functionalities is still available but deprecated:

  • Vision Retriever Evaluation: See README_OLD.md
  • ViDoRe Benchmarks v1/v2: Now maintained in MTEB
  • Model Implementations: Available in src/vidore_benchmark/retrievers/ (for reference only)

⚠️ For new projects, we recommend:

  • Using MTEB for vision retriever evaluation on ViDoRe v1/v2
  • Using this framework for pipeline evaluation on ViDoRe v3

For reproducibility of published results, see REPRODUCIBILITY.md.

Contributing

We welcome contributions for:

  • New example pipelines
  • Additional evaluation results
  • Dataset utilities
  • Documentation improvements

Please open an issue or PR on GitHub.

Citation

If you use this framework or the ViDoRe benchmark in your research, please cite:

ColPali: Efficient Document Retrieval with Vision Language Models

@misc{faysse2024colpaliefficientdocumentretrieval,
title={ColPali: Efficient Document Retrieval with Vision Language Models}, author={Manuel Faysse and Hugues Sibille and Tony Wu and Bilel Omrani and Gautier Viaud and Céline Hudelot and Pierre Colombo},
year={2024},
eprint={2407.01449},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2407.01449}, }

ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval

@misc{macé2025vidorebenchmarkv2raising,
title={ViDoRe Benchmark V2: Raising the Bar for Visual Retrieval}, author={Quentin Macé and António Loison and Manuel Faysse},
year={2025},
eprint={2505.17166},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2505.17166}, }

ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios

@misc{loison2026vidore,
title={ViDoRe V3: A Comprehensive Evaluation of Retrieval Augmented Generation in Complex Real-World Scenarios},
author={Loison, Ant{\'o}nio and Mac{\'e}, Quentin and Edy, Antoine and Xing, Victor and Balough, Tom and Moreira, Gabriel and Liu, Bo and Faysse, Manuel and Hudelot, C{\'e}line and Viaud, Gautier},
journal={arXiv preprint arXiv:2601.08620},
year={2026}
}

License

This project is licensed under the MIT License - see the LICENSE file for details.

Links

About

Vision Document Retrieval (ViDoRe): Benchmark. Evaluation code for the ColPali paper.

Topics

Resources

Stars

278 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages