mteb

embeddings-benchmarkApache-2.0活跃维护

跨语言、跨模态的嵌入模型评测基准,覆盖检索、聚类、重排序等任务,帮你选型对比不同 embedding 模型的实际效果。

MTEB: State-of-the-art evaluation of embeddings across languages and modalities

2.27.5发布于 2026-11-09 18:58 UTC3,505star +6 / 7 天766fork同步于 2026-11-10 11:40 UTC

怎么上手

由 README 提炼,执行前请确认
pip install mteb
硬件要求按 README 说明

README 未说明

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

多语言多模态的嵌入与检索系统评测工具箱,帮你统一跑分对比模型

跨语言、跨模态的嵌入模型评测基准,覆盖检索、聚类、重排序等任务,帮你选型对比不同 embedding 模型的实际效果。

核心能力

  • 用 mteb.evaluate 一行代码跑完指定任务评测
  • 通过 get_tasks 按任务名或 benchmark 灵活选取评测集
  • 支持 CLI 命令 mteb run 直接跑模型并输出结果目录
  • 内置模型注册机制,未实现的模型自动回退到 SentenceTransformer
  • 提供交互式排行榜与已有模型结果加载

容易踩的坑

首次评测会从 Hugging Face 下载模型和数据集,需保证网络与磁盘空间;示例依赖 sentence-transformers,需另行安装;CLI 需用 --output-folder 指定结果目录,否则结果无处落盘

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本2.27.5
  1. 2.27.5最新正式版2026-11-09 · 2026-11-09 18:58 UTC

    2.27.5 (2026-11-09)

    Ci

    • ci: report cited arXiv preprints that have since been published (#5722)

    • ci: report cited arXiv preprints that have since been published

    • update to use SEMANTIC_SCHOLAR_API_KEY

    • update the script to get links of published version

    • combine workflows, update allowlist and moved to scripts/tools

    • add OpenAlex fallback and move other file under scripts/tools

    • added tests

    • add citation group

    • update lock file

    • skip test

    • remove test

    • cite only confirmed published versions, and open a PR with them

    • check_preprints.py only reports a preprint when its published version has a DOI that Crossref holds under the cited title and first author; venue-only matches are dropped, and with them the preprint allowlist.
    • --update replaces each citation with the BibTeX from the ACL Anthology or doi.org, keeping its key, when that BibTeX carries the cited title and first author, and points arXiv reference links to the published version. Only entries citing the same arXiv paper are replaced, as keys are sometimes reused.
    • The monthly job opens or updates a pull request with the updates instead of an issue, after the formatter and the citation check pass.
    • bibtexparser joins the citations group.
    • Updates the 10 citations the check finds today.

    Co-Authored-By: Claude Opus 5.5 <[email protected]>

    • changes from review

    Co-authored-by: Claude Opus 5.5 <[email protected]> (5c94f55)

    Fix

    • fix: drop undecodable video from StanfordI2V tasks (#5799)

    • fix: drop undecodable video from StanfordI2V tasks

    • simplify StanfordI2V broken video filter (35847e5)

  2. 2.27.42026-11-09 · 2026-11-09 17:35 UTC
    查看更新说明

    2.27.4 (2026-11-09)

    Fix

    • fix: keep top_k results per query when ignore_identical_ids is set (#5844)

    • fix: keep top_k results per query when ignore_identical_ids is set

    With ignore_identical_ids, the query's own document is dropped only at evaluation time, after search has already kept exactly top_k documents. A query that retrieved itself (usual for ArguAna, Quora and similar tasks) was scored on top_k - 1 documents, which lowered every metric at the largest cutoff.

    Search one extra document for these tasks, and after dropping the identical id trim each query back to max(k_values), breaking ties like trec_eval. Tasks without ignore_identical_ids are unchanged.

    Co-Authored-By: Claude Opus 5.5 <[email protected]>

    • update test

    • simplify comment


    Co-authored-by: Claude Opus 5.5 <[email protected]> Co-authored-by: Roman Solomatin <[email protected]> (bde81c7)

    • fix: video frame timing (#5652)

    • fix: OmniVinci and Gemini get video files that play at the real frame spacing

    Both receive the sampled frames as a video file: OmniVinci's was written at a fixed 24 fps (32 frames of any clip spanned 1.3 s, and its time embeddings read these times) and Gemini's at 1 fps (a long clip capped at 32 frames became a 32 s video). The video collators can now return each clip's frame timing (video_metadata=True), and both files are written at the frames' real spacing, as when the models get the original video.

    • fix: Qwen3-Omni, GVE, Qwen3-VL-Embedding and BidirLM-Omni get real frame timing
    • Qwen3-Omni: its processor assumed 1 fps while mteb samples at 2 fps; it now passes the sampling rate, as qwen-omni-utils does.
    • GVE, Qwen3-VL-Embedding, BidirLM-Omni: their processors assume 24 fps without video_metadata, so a 4-minute clip was timed as under 3 s; each clip's timing is now passed, as their official code does via qwen-vl-utils.

    The Qwen3-VL reranker is left as is (sentence-transformers' cross-encoder does not forward video_metadata), and so is ColQwen2.5-Omni (colpali-engine has the same mismatch).

    • Review feedback: real per-video rate for Qwen-Omni, VideoMetadata type, drop the Gemini change
    • Qwen-Omni gets each video's real frame rate (the rate frames were sampled at is not self.fps when max_frames caps a long clip, and is unset with num_frames). Its processors take one rate per call, so video is encoded one clip at a time.
    • The collators' frame timing is a VideoMetadata TypedDict (fields of transformers' VideoMetadata), returned in a VideoInputItem.
    • Gemini is back to main: the API resamples to at most 32 frames itself, and real-length files can exceed its 120 s video limit.
    • Release notes are left untouched.
    • Qwen-Omni: compute the frame rate as qwen-omni-utils does

    sample_fps = sampled frames / source frames * source fps, instead of the frames' spacing.

    • Apply review suggestion: VideoInput.video is a tensor or a VideoInputItem

    • Always return frame timing as batch["video_metadata"]

    Review feedback: the video collators always add each video's timing (VideoMetadata) next to the frames, which stay a plain tensor, instead of an opt-in flag that changes the frames' format. Wrappers that don't use it are unchanged; GVE, OmniVinci and Qwen-Omni read the new key, and Qwen3-VL-Embedding and BidirLM-Omni join it with the frames for sentence-transformers.

    • Review feedback: resample_video always returns frame timing, no flags
    • FramesCollator.resample_video and _sample_video return (frames, timing) instead of a return_metadata flag or modifying the row in place.
    • InstructSentenceTransformerModel always passes video as sentence-transformers' {array, video_metadata} format (only Qwen3-VL-Embedding uses it with video), so its video_metadata flag is gone.
    • VideoMetadata.
  3. 2.27.32026-11-09 · 2026-11-09 16:59 UTC
    查看更新说明

    2.27.3 (2026-11-09)

    Fix

    • fix: disable KV cache for stella_en_1.5B_v5 so it runs on current transformers (#5850)

    • fix: disable KV cache for stella_en_1.5B_v5 so it runs on current transformers

    The remote modeling_qwen.py at the pinned revision calls DynamicCache.get_usable_length(), which was removed in transformers 4.54. With the mteb entry's dtype kwarg (transformers >= 4.56), the model loads but fails on the first forward pass, so it could not run on any version.

    Encoding never uses the KV cache, so pass config_kwargs={"use_cache": False} to skip that code path, as already done for gte-Qwen2-7B-instruct (#4935). Outputs are unchanged: on transformers 4.53.3 hidden states with the cache on and off are identical, and match transformers 4.57.6 with the cache off.

    Fixes #5832

    • set req group

    Co-authored-by: Aarush Shetty <[email protected]> Co-authored-by: Roman Solomatin <[email protected]> (34207fc)

    Unknown

    • model: add BrunoHays/embeddinggemma-2-nullspace-audio (#5775)

    • model: add BrunoHays/embeddinggemma-2-nullspace-audio

    • chore(models): rename file to embeddinggemma2_nullspace.py

    • refactor(models): inject null-space audio features inside model.forward


    Co-authored-by: Cursor Agent <[email protected]> (e47213f)

  4. 2.27.22026-11-09 · 2026-11-09 16:34 UTC
    查看更新说明

    2.27.2 (2026-11-09)

    Fix

    • fix: add GoogleSVQ v2 with one text per sentence (#5790)

    • fix: add GoogleSVQ v2 with one text per sentence

    • normalize SVQ transcriptions before grouping sentences

    • regenerate SVQ v2 stats after normalization

    • Use the same folding as the near-duplicate analysis for SVQ sentences

    • Build GoogleSVQ v2 splits in self.dataset (010d62f)

    Unknown

    • model: add Reza2kn/RaahNaame-Koochik-v1 (Persian embedding model) (#5851)

    • model: add Reza2kn/RaahNaame-300m

    • model: use SentenceTransformerEncoderWrapper and google_gemini import (current main)

    • model: rename to Reza2kn/RaahNaame-Koochik-v1

    • model: drop non-paper citation (review) (9242b36)

    • model: add opensearch-neural-embed-v1 and opensearch-neural-sparse-encoding-asym-v1 (#5852)

    • model: add opensearch-neural-embed-v1 and opensearch-neural-sparse-encoding-asym-v1

    • fix: avoid importing torch at module import in opensearch_neural_embed_models (50c3917)

  5. 2.27.12026-11-05 · 2026-11-05 22:11 UTC
    查看更新说明

    2.27.1 (2026-11-05)

    Fix

    • fix: Clarify documentation on output_dtypes and update in ModelMeta (#5723)

    • Clarify documentation on output_dtypes and update in ModelMeta

    • change from review (1842b7e)

    Unknown

    • model: Add mzahran1/arabic-english-e5-small-retrieval and omarelshehy/Arabic-Retrieval-v1.0 (#5846)

    Co-authored-by: Mahmoud Zahran <[email protected]> (b9ccd7a)

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Installation

    You can install mteb simply using pip or uv. For more on installation please see the documentation.

    pip install mteb
    

    For faster installation, you can also use uv:

    uv add mteb
    

    Example Usage

    Below we present a simple use-case example. For more information, see the documentation.

    import mteb
    from sentence_transformers import SentenceTransformer
    
    # Select model
    model_name = "sentence-transformers/all-MiniLM-L6-v2"
    model = mteb.get_model(
        model_name
    )  # if the model is not implemented in MTEB it will be eq. to SentenceTransformer(model_name)
    
    # Select tasks
    tasks = mteb.get_tasks(tasks=["Banking77Classification.v2"])
    
    # evaluate
    results = mteb.evaluate(model, tasks=tasks)
    

    You can also run it using the CLI:

    mteb run \
        -m sentence-transformers/all-MiniLM-L6-v2 \
        -t "Banking77Classification.v2" \
        --output-folder results
    

    For more on how to use the CLI check out the related documentation.

    Overview

    Overview
    📈 LeaderboardThe interactive leaderboard of the benchmark
    Get Started.
    🏃 Get StartedOverview of how to use mteb
    🤖 Defining ModelsHow to use existing models and define custom ones
    📋 Selecting tasksHow to select tasks, benchmarks, splits etc.
    🏭 Running EvaluationHow to run the evaluations, including cache management, speeding up evaluations etc.
    📊 Loading ResultsHow to load and work with existing model results
    Overview.
    📋 TasksOverview of available tasks
    📐 BenchmarksOverview of available benchmarks
    🤖 ModelsOverview of available Models
    Contributing
    🤖 Adding a modelHow to submit a model to MTEB and to the leaderboard
    👩‍💻 Adding a datasetHow to add a new task/dataset to MTEB
    👩‍💻 Adding a benchmarkHow to add a new benchmark to MTEB and to the leaderboard
    🤝 ContributingHow to contribute to MTEB and set it up for development

    Citing

    MTEB was introduced in "MTEB: Massive Text Embedding Benchmark", and heavily expanded in "MMTEB: Massive Multilingual Text Embedding Benchmark". When using mteb, we recommend that you cite both articles.

    @article{muennighoff2022mteb,
      author = {Muennighoff, Niklas and Tazi, Nouamane and Magne, Loïc and Reimers, Nils},
      title = {MTEB: Massive Text Embedding Benchmark},
      publisher = {arXiv},
      journal={arXiv preprint arXiv:2210.07316},
      year = {2022},
      url = {https://arxiv.org/abs/2210.07316},
      doi = {10.48550/ARXIV.2210.07316},
    }
    
    @article{enevoldsen2025mmtebmassivemultilingualtext,
      title={MMTEB: Massive Multilingual Text Embedding Benchmark},
      author={Kenneth Enevoldsen and Isaac Chung and Imene Kerboua and Márton Kardos and Ashwin Mathur and David Stap and Jay Gala and Wissam Siblini and Dominik Krzemiński and Genta Indra Winata and Saba Sturua and Saiteja Utpala and Mathieu Ciancone and Marion Schaeffer and Gabriel Sequeira and Diganta Misra and Shreeya Dhakal and Jonathan Rystrøm and Roman Solomatin and Ömer Çağatan and Akash Kundu and Martin Bernstorff and Shitao Xiao and Akshita Sukhlecha and Bhavish Pahwa and Rafał Poświata and Kranthi Kiran GV and Shawon Ashraf and Daniel Auras and Björn Plüster and Jan Philipp Harries and Loïc Magne and Isabelle Mohr and Mariya Hendriksen and Dawei Zhu and Hippolyte Gisserot-Boukhlef and Tom Aarsen and Jan Kostkan and Konrad Wojtasik and Taemin Lee and Marek Šuppa and Crystina Zhang and Roberta Rocca and Mohammed Hamdy and Andrianos Michail and John Yang and Manuel Faysse and Aleksei Vatolin and Nandan Thakur and Manan Dey and Dipam Vasani and Pranjal Chitale and Simone Tedeschi and Nguyen Tai and Artem Snegirev and Michael Günther and Mengzhou Xia and Weijia Shi and Xing Han Lù and Jordan Clive and Gayatri Krishnakumar and Anna Maksimova and Silvan Wehrli and Maria Tikhonova and Henil Panchal and Aleksandr Abramov and Malte Ostendorff and Zheng Liu and Simon Clematide and Lester James Miranda and Alena Fenogenova and Guangyu Song and Ruqiya Bin Safi and Wen-Ding Li and Alessia Borghini and Federico Cassano and Hongjin Su and Jimmy Lin and Howard Yen and Lasse Hansen and Sara Hooker and Chenghao Xiao and Vaibhav Adlakha and Orion Weller and Siva Reddy and Niklas Muennighoff},
      publisher = {arXiv},
      journal={arXiv preprint arXiv:2502.13595},
      year={2025},
      url={https://arxiv.org/abs/2502.13595},
      doi = {10.48550/arXiv.2502.13595},
    }
    

    If you use any of the specific benchmarks, we also recommend that you cite the authors of both the benchmark and its tasks:

    benchmark = mteb.get_benchmark("MTEB(eng, v2)")
    benchmark.citation  # get citation for a specific benchmark
    
    # you can also create a table of the task for the appendix using:
    benchmark.tasks.to_latex()