/ Модель

Характеристики

Контекст
8 192 токена
Параметры
106 млн
Лицензия
MIT
Архитектура
modernbert · dense
Базовая модель
bekko-embedding-v1-a8m-pt
Библиотека
sentence-transformers
Опубликована
7 июл 2026

bekko-embedding-v1-a8m

ЭмбеддингиТекст → embedding9 профессий

Компактная многоязычная модель hotchpotch создаёт текстовые эмбеддинги для семантического поиска, извлечения релевантных документов и сравнения предложений.

7 427скачиваний за 30 дней21лайквеса обновлены5 авг 2026

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Тесты пользователейпока нет

Никто ещё не опубликовал тест этой модели. Соберите бенчмарк из своих задач — результат появится здесь.

  1. Добавьте модель в бенчмарк

    Вместе с другими моделями категории «Эмбеддинги» — сравнение идёт внутри одной категории.

  2. Опишите свои задачи

    Напишите запросы, при необходимости приложите файлы и эталонные ответы.

  3. Запустите и опубликуйте

    Модели ответят на каждую задачу, судья оценит ответы. Опубликованный результат появится на этой странице.

Публичные оценки34

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

  • CUREv1

    main_score

    Результат

    0,4151

    Общий результат 0,456
    MTEB

    Публичная таблицадругая ревизия

  • MLQARetrieval

    main_score

    Результат

    0,5195

    MTEB

    Публичная таблицадругая ревизия

  • MassiveIntentClassification

    main_score

    Результат

    0,4817

    Общий результат 0,5842Общий результат 0,5546Общий результат 0,4678
    MTEB

    Публичная таблицадругая ревизия

  • STS22.v2

    main_score

    Результат

    0,6972

    MTEB

    Публичная таблицадругая ревизия

  • SIB200ClusteringS2S

    main_score

    Результат

    0,0404

    Общий результат 0,3026Общий результат 0,1982Общий результат 0,1919
    MTEB

    Публичная таблицадругая ревизия

  • PubChemWikiPairClassification

    main_score

    Результат

    0,9826

    MTEB

    Публичная таблицадругая ревизия

  • MultilingualNanoFEVERRetrieval

    main_score

    Результат

    0,7818

    MTEB

    Публичная таблицадругая ревизия

  • NusaX-senti

    main_score

    Результат

    0,607

    MTEB

    Публичная таблицадругая ревизия

  • BQ

    main_score

    Результат

    0,427

    MTEB

    Публичная таблицадругая ревизия

  • AppsRetrieval

    main_score

    Результат

    0,3667

    MTEB

    Публичная таблицадругая ревизия

  • MIRACLReranking

    main_score

    Результат

    0,5333

    MTEB

    Публичная таблицадругая ревизия

  • MemBench

    main_score

    Результат

    0,7611

    MTEB

    Публичная таблицадругая ревизия

  • PoemSentimentClassification

    main_score

    Результат

    0,481

    MTEB

    Публичная таблицадругая ревизия

  • SIB200Classification

    main_score

    Результат

    0,7

    MTEB

    Публичная таблицадругая ревизия

  • IndicGenBenchFloresBitextMining

    main_score

    Результат

    0,9779

    Общий результат 1Общий результат 0,9948Общий результат 0,9886
    MTEB

    Публичная таблицадругая ревизия

  • SICKNLPairClassification

    main_score

    Результат

    0,6637

    MTEB

    Публичная таблицадругая ревизия

  • MultilingualNanoDBPediaRetrieval

    main_score

    Результат

    0,6065

    Общий результат 0,5088
    MTEB

    Публичная таблицадругая ревизия

  • DS1000Retrieval

    main_score

    Результат

    0,3975

    MTEB

    Публичная таблицадругая ревизия

  • MultilingualNanoHotpotQARetrieval

    main_score

    Результат

    0,7208

    MTEB

    Публичная таблицадругая ревизия

  • ToxicConversationsClassification

    main_score

    Результат

    0,6825

    MTEB

    Публичная таблицадругая ревизия

  • DanishPoliticalCommentsClassification

    main_score

    Результат

    0,3497

    MTEB

    Публичная таблицадругая ревизия

  • ATEC

    main_score

    Результат

    0,2685

    MTEB

    Публичная таблицадругая ревизия

  • CQADupstackProgrammersRetrieval

    main_score

    Результат

    0,3877

    MTEB

    Публичная таблицадругая ревизия

  • MultiLongDocRetrieval

    main_score

    Результат

    0,676

    MTEB

    Публичная таблицадругая ревизия

  • Ko-StrategyQA

    main_score

    Результат

    0,7416

    MTEB

    Публичная таблицадругая ревизия

  • CQADupstackWordpressRetrieval

    main_score

    Результат

    0,2907

    MTEB

    Публичная таблицадругая ревизия

  • MassiveScenarioClassification

    main_score

    Результат

    0,6189

    MTEB

    Публичная таблицадругая ревизия

  • SemRel24STS

    main_score

    Результат

    0,472

    MTEB

    Публичная таблицадругая ревизия

  • MultilingualNanoQuoraRetrieval

    main_score

    Результат

    0,8542

    MTEB

    Публичная таблицадругая ревизия

  • SentimentAnalysisHindi

    main_score

    Результат

    0,559

    MTEB

    Публичная таблицадругая ревизия

  • Tatoeba

    main_score

    Результат

    0,5117

    Общий результат 0,394
    MTEB

    Публичная таблицадругая ревизия

  • MultilingualNanoNFCorpusRetrieval

    main_score

    Результат

    0,2568

    MTEB

    Публичная таблицадругая ревизия

  • CDSC-E

    main_score

    Результат

    0,6962

    MTEB

    Публичная таблицадругая ревизия

  • WikipediaTheoreticalAppliedClassification

    main_score

    Результат

    0,6179

    MTEB

    Публичная таблицадругая ревизия

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

bekko-embedding-v1-a8m — компактная многоязычная модель плотных текстовых эмбеддингов от hotchpotch, построенная на энкодере mmBERT в стиле ModernBERT и реализованная как Sentence Transformer. По README, модель содержит 7,7 млн активных параметров, имеет 4 слоя и размер скрытого состояния 384; метаданные указывают 106 млн параметров. Модель преобразует текст в векторы размерностью 384, которые можно усекать до 256, 128 или 64 измерений благодаря Matryoshka-представлениям. Контекст — до 8192 токенов.

Модель предназначена прежде всего для многоязычного поиска по смыслу и извлечения релевантных текстов; также подходит для сравнения сходства предложений, переранжирования и поиска по длинным документам или коду. Автор заявляет поддержку более 100 языков и приводит результаты на мультиязычных бенчмарках, где качество поиска сопоставимо с более крупными моделями. Компактный размер и наличие артефактов ONNX и OpenVINO рассчитаны на быстрый запуск на CPU, в том числе на маломощных устройствах.

Модель основана на hotchpotch/bekko-embedding-v1-a8m-pt. Доступна по лицензии MIT. Векторные представления сами по себе не генерируют ответы: для прикладного поиска обычно требуется отдельно организовать индексирование и поиск по эмбеддингам. Приведённые в README оценки относятся к указанным бенчмаркам и не гарантируют качество на конкретных данных.

Сценарии применения

  • семантический поиск по многоязычной базе документов
  • поиск ответов и фрагментов в длинных текстах
  • сравнение сходства предложений
  • переранжирование результатов поиска
  • поиск по исходному коду
  • извлечение релевантных текстов для RAG

Ограничения

Модель выдаёт эмбеддинги, а не готовые ответы; для поиска по коллекции нужны отдельные индекс и поисковая система. Заявленные результаты бенчмарков не гарантируют аналогичного качества на конкретных данных.

Для каких профессий подходит9

Разделы каталога профессий, в задачах которых используется эта модель

Все профессии

Также подходит для

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

bekko-embedding-v1-a8m

bekko-embedding-v1-a8m is an ultra-compact multilingual text embedding model. It has just 8M active parameters — light enough to run comfortably even on low-spec CPUs — yet its retrieval quality is comparable to models with 3–10x more active parameters.

For higher retrieval quality, see the larger bekko-embedding-v1-a25m (25M active parameters).

You can also try bekko right in your browser: the bekko-embedding-web demo runs the model fully client-side with Transformers.js — no server involved.

[!NOTE] For a guided overview of the models, training recipe, and results, read Bekko Embedding: how small can a multilingual retrieval model be?.

Highlights

  • Ultra-compact: just 8M active parameters, with retrieval quality on par with models 3–10x its active-parameter count
  • 100+ languages, context up to 8k tokens
  • 384-dim embeddings that truncate cleanly to 256 / 128 / 64 (Matryoshka)
  • Runs well on CPU — even a Raspberry Pi 5 — with ONNX and OpenVINO artifacts included
  • Fast on GPU too, with SDPA or Flash Attention 2
  • MIT license

a8m or a25m?

a8m (this model)a25m
Active parameters7.7M24.9M
HAKARI-Bench overall0.5450.570
MMTEB Retrieval56.257.5
CPU docs/s (Ryzen 9 7950X, OpenVINO)364134
CPU docs/s (Raspberry Pi 5, OpenVINO)3310.5
GPU docs/s (RTX 5090, Flash Attention 2)5,5614,006

Rule of thumb: a8m is the speed pick — the fastest model we measured on every device. If you can spare about 2.7x CPU throughput, a25m buys a solid quality bump.

Quickstart

We recommend Sentence Transformers 5.0+ and Transformers 5.12+:

pip install -U "sentence-transformers>=5.0" "transformers>=5.12"

Queries and documents go through the same encode() call — no prefixes or task instructions needed. Pass normalize_embeddings=True when you plan to search with cosine similarity or dot product.

On GPU, SDPA works out of the box with PyTorch and CUDA. Flash Attention 2 requires pip install flash-attn --no-build-isolation; on our RTX 5090 it was about 18% faster, and can be enabled by replacing "sdpa" below with "flash_attention_2". Sentence Transformers selects CUDA automatically, so device is normally unnecessary; to force it, use device="cuda", not "gpu".

from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer(
    "hotchpotch/bekko-embedding-v1-a8m",
    # model_kwargs={"attn_implementation": "sdpa"},  # Optional on GPU
)

query = "What are the characteristics of sushi?"
docs = [
    "A warm noodle soup served in broth with sliced toppings.",
    "天ぷらは魚や野菜に衣をつけて揚げた料理です。",  # "Tempura is battered, deep-fried fish and vegetables."
    "Une fine crepe garnie de sucre, de beurre ou de fruits.",
    "A Japanese dish made with vinegared rice, often shaped with seafood, vegetables, or egg.",
]

query_emb = model.encode(query, normalize_embeddings=True)
doc_emb = model.encode(docs, normalize_embeddings=True)
scores = util.cos_sim(query_emb, doc_emb)[0]

print(scores)
print("best doc:", docs[int(scores.argmax())])

Output (exact scores vary slightly by backend):

tensor([0.3085, 0.2716, 0.2750, 0.4738])
best doc: A Japanese dish made with vinegared rice, often shaped with seafood, vegetables, or egg.

Queries and documents don't need to share a language. Continuing with the same model, a Japanese query finds the right English document in a mixed English / Spanish corpus:

corpus = [
    "Sushi is a Japanese dish of vinegared rice topped with seafood.",
    "The Eiffel Tower is a wrought-iron lattice tower in Paris, France.",
    "Mount Fuji is the highest mountain in Japan, at 3,776 meters.",
    "Python is a programming language known for its readability.",
    "La Sagrada Família es una basílica de Barcelona diseñada por Antoni Gaudí.",
]
corpus_emb = model.encode(corpus, normalize_embeddings=True)

for query in [
    "日本で一番高い山は?",  # "What is the highest mountain in Japan?"
    "Who designed the famous basilica in Barcelona?",
]:
    query_emb = model.encode(query, normalize_embeddings=True)
    hits = util.semantic_search(query_emb, corpus_emb, top_k=2)[0]
    print(query)
    for hit in hits:
        print(f"  {hit['score']:.3f}  {corpus[hit['corpus_id']]}")
日本で一番高い山は?
  0.609  Mount Fuji is the highest mountain in Japan, at 3,776 meters.
  0.219  Sushi is a Japanese dish of vinegared rice topped with seafood.
Who designed the famous basilica in Barcelona?
  0.489  La Sagrada Família es una basílica de Barcelona diseñada por Antoni Gaudí.
  0.152  The Eiffel Tower is a wrought-iron lattice tower in Paris, France.

That's everything you need for basic use. For more speed — OpenVINO on CPU, Flash Attention on GPU, browser inference, smaller embeddings — see Optimized Inference below.

Benchmark results

In the chart above, up and to the left is better: more retrieval quality from fewer active parameters. The step line shows the best observed score within each active-parameter budget, and outlined markers identify Pareto-efficient models. Both bekko models sit in that upper-left region, scoring at or above many models several times their size — which is the whole point of the project.

On the 131-task MMTEB Multilingual v2 suite, a8m scores 56.2 Retrieval and 56.7 Mean(Task) with 7.7M active parameters — a higher Retrieval score than multilingual-e5-small (50.9), multilingual-e5-large (53.7), and BGE-M3 (54.6), all models with 3–40x more active parameters.

Scores are ×100. Retrieval is task-macro nDCG@10, and Mean is the mean across all 131 tasks. Competitor values use the official 2026-06-28 snapshot. Bekko was evaluated over the same task set and aggregation rules.

ModelActive ParamsDimsMeanRetrievalRerankingBitextMiningSTS
bekko-embedding-v1-a8m7.7M38456.756.260.673.171.6
multilingual-e5-small21.6M38456.450.960.469.471.7
bekko-embedding-v1-a25m24.9M38458.357.561.675.473.4
granite-embedding-97m-multilingual-r228.3M38451.960.359.444.265.6
harrier-oss-v1-270m100.3M64066.666.461.981.575.4
embeddinggemma-300m106.3M76861.262.563.364.474.7
granite-embedding-311m-multilingual-r2110.3M76856.065.262.057.969.0
gte-multilingual-base113.3M76858.357.260.771.872.9
multilingual-e5-large303.9M102458.653.762.973.873.3
snowflake-arctic-embed-l-v2.0311.8M102457.058.463.764.170.1
BGE-M3311.8M102459.654.662.879.174.1

Scores are ×100. a25m is stronger than a8m on 13 of 18 tasks and on the mean. Its main regression is WinoGrande.

Taska8ma25mmE5-sG97GTEBGE-M3
Mean56.2357.4550.9160.3257.1654.59
StackOverflowQA74.9477.3581.9481.9987.0880.60
TwitterHjerne56.5663.5958.1856.7168.9237.82
AILAStatutes34.1336.2319.0128.9533.5729.04
ArguAna55.5757.6939.0953.0958.2854.04
Hagrid98.6998.6298.5598.6998.5598.77
LegalBench Lobbying92.0191.4089.4791.3690.5590.34
LEMBPasskey85.0085.0038.2582.7555.5059.00
SCIDOCS19.4320.1113.9020.3618.2616.31
SpartQA11.959.185.4367.345.297.49
TempReason L11.061.400.805.151.080.99
TRECCOVID53.1956.4672.2966.2757.6754.72
WinoGrande59.2444.2137.4656.6142.2141.72
Belebele69.7274.5666.2952.8689.2078.16
MLQA67.5071.0663.8560.5472.1974.81
StatCan Dialogue21.7325.9610.3353.6521.7421.86
Wikipedia Multi.86.0187.8988.6683.2484.0089.87
COVID72.0173.6972.8270.1080.6177.51
MIRACL HN53.5059.7760.0956.0964.1769.59

Abbreviations: mE5-s = multilingual-e5-small, G97 = Granite Embedding 97M Multilingual R2, GTE = gte-multilingual-base, MIRACL HN = MIRACL Retrieval Hard Negatives.

The following retrieval scores use multilingual Nano benchmarks measured with HAKARI-Bench. Higher is better.

What each column means:

  • Overall — HAKARI-Bench Overall, the micro-average across all the sets below
  • MNanoBEIR — multilingual NanoBEIR, general-purpose retrieval
  • NanoMMTEB-v2 — Nano subset of MMTEB v2 (massive multilingual retrieval)
  • NanoRTEB — multilingual retrieval benchmark
  • NanoLongEmbed — long-document retrieval
  • NanoCoIR — code retrieval
ModelActive ParamsOverallMNanoBEIRNanoMMTEB-v2NanoRTEBNanoLongEmbedNanoCoIR
bekko-embedding-v1-a8m7.7M0.5450.5270.5030.5500.6820.747
bekko-embedding-v1-a25m24.9M0.5700.5490.4940.5940.7060.786
multilingual-e5-small21.6M0.5170.5120.4450.4710.5010.692
granite-97m-multilingual-r228.3M0.5250.5050.5310.5670.6590.780
harrier-oss-v1-270m100.3M0.5550.5230.5220.5500.6170.789
granite-311m-multilingual-r2110.3M0.5690.5430.5770.6060.6950.814
gte-multilingual-base113.3M0.5630.5270.4860.5580.6690.753
multilingual-e5-large303.9M0.5650.5600.4840.5560.5050.747
bge-m3311.8M0.5770.5570.4850.5360.6530.692

Scores are nDCG@10. a25m scores higher than a8m on 14 of 18 tasks. Its slightly lower simple mean is mainly due to LEMBPasskey.

Taska8ma25mmE5-sG97GTEBGE-M3
Mean0.5030.4940.4450.5310.4860.485
AILAStatutes0.3380.3680.1950.2910.3360.292
ArguAna0.3930.3960.2650.3590.3960.381
Belebele0.0980.0970.1120.1190.1080.151
COVID0.6830.7260.7080.6800.7870.746
Hagrid0.9880.9890.9880.9890.9890.991
LegalBench Lobbying0.9180.9180.8950.9210.9030.909
LEMBPasskey0.8760.5520.3800.7020.4170.491
MIRACL0.7430.7850.7910.7790.8200.836
MLQA0.1390.1720.0890.1290.1440.159
SCIDOCS0.2550.2660.1950.2730.2560.216
SpartQA0.1430.1020.0690.6560.0490.074
StackOverflowQA0.8230.8390.8800.8910.9190.871
StatCan Dialogue0.1120.1490.0740.1870.1220.137
TempReason L10.0130.0230.0190.1210.0130.009
TRECCOVID0.3970.4070.4010.3940.4020.366
TwitterHjerne0.5640.6340.5840.5710.6980.717
Wikipedia Multi.0.9540.9720.9950.9410.9660.978
WinoGrande0.6070.4900.3770.5640.4300.398

Model abbreviations match the Full MMTEB Retrieval table above.

Model Details

ItemValue
Model typeSentence Transformer dense embedding model
ArchitecturemmBERT (ModernBERT-style) encoder, 4 layers, hidden size 384
Base modelhotchpotch/bekko-embedding-v1-a8m-pt
Backbonehotchpotch/mmBERT-L4H384-pruned, pruned from mmBERT-small
Active parameters7,671,168
Total parameters105,975,168
Embedding dimension384
Supported truncate dimensions256, 128, 64
Max sequence length8192 tokens
PoolingMean pooling
SimilarityCosine similarity

Why active parameters?

The "a8m" in the name counts active parameters: the attention and feed-forward weights that run on every token, which is where nearly all of a transformer encoder's inference cost lives. The token embedding table dominates the total parameter count, but at inference it's only a lookup.

That's why a model can be large on disk and still fast. bekko-embedding-v1-a8m totals ~106M parameters, but the bulk of that is the multilingual embedding table — only 8M parameters do real work per token, so latency behaves like an 8M model. The default OpenVINO / ONNX artifacts also store that static table as row-wise int8, cutting the main artifact from ~404 MiB fp32 to about 124 MiB.

Speed vs other models

a8m was the fastest model we measured in every environment — x86 CPU, Raspberry Pi 5, Apple Silicon, and NVIDIA GPU. On a Ryzen 9 7950X with OpenVINO it encodes 364 docs/s (1.6x multilingual-e5-small, 17x multilingual-e5-large), and 5,561 docs/s on an RTX 5090 with Flash Attention 2.

Document throughput uses Natural Questions text, batch size 64 and max length 512 for CPU/MPS. CUDA uses NQ 100k, fp16, and Flash Attention 2. All throughput values in the table are docs/s.

ModelAPx86Pi 5M4RTX
bekko-a8m7.7M364335925,561
mE5-small21.6M226193703,746
bekko-a25m24.9M13410.53514,006
granite-97m-r228.3M12510.02863,917
EmbGemma-300m106.3M——971,678
granite-311m-r2110.3M382.91062,159
mE5-large303.9M211.5671,318
BGE-M3311.8M——781,324

Abbreviations: mE5 = multilingual-e5, granite-97m/311m-r2 = Granite Embedding Multilingual R2, EmbGemma = EmbeddingGemma. x86 = Ryzen 9 7950X + OpenVINO, Pi 5 = Raspberry Pi 5 + OpenVINO, M4 = Apple M4 Max + MPS, RTX = RTX 5090 + CUDA/Flash Attention 2. AP means active parameters.

Throughput depends on input lengths, batch size, runtime, and hardware. OpenVINO is recommended for CPU, MPS for Apple Silicon, and Flash Attention 2 for supported NVIDIA GPUs.

Optimized Inference

Choose the backend based on where you run the model:

TargetRecommended backendWhy
NVIDIA GPUSDPA, or Flash Attention 2 for maximum throughputSDPA works out of the box with PyTorch and CUDA. Flash Attention 2 requires a separate install but was about 18% faster on our RTX 5090.
Apple SiliconMPSUses the Mac GPU through PyTorch.
Native CPUOpenVINO; ONNX Runtime is not recommendedOpenVINO was about 5.5x faster than ONNX Runtime on a Ryzen 9 7950X and 1.9x faster on a Raspberry Pi 5.
BrowserONNX with Transformers.jsRuns fully client-side with WebGPU or WASM.

For native CPU inference, we do not recommend ONNX Runtime; use OpenVINO instead. Keep ONNX for browser deployment or environments that specifically require it. The default OpenVINO and ONNX artifacts both compress only the static token embedding table (~404 MiB fp32 down to about 124 MiB) and stayed within cosine similarity 0.9994 of PyTorch in release verification. The transformer-weight qint8 / quint8 files are separate experiments, not defaults.

SDPA works everywhere and is the safe default. If your GPU supports Flash Attention 2, it's worth enabling: on our RTX 5090 it was about 18% faster than SDPA for a8m (24% for a25m).

import torch
from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer(
    "hotchpotch/bekko-embedding-v1-a8m",
    device="cuda",
    model_kwargs={
        "attn_implementation": "flash_attention_2",
        "dtype": torch.float16,
    },
)

query = "What are the characteristics of sushi?"
docs = [
    "A warm noodle soup served in broth with sliced toppings.",
    "天ぷらは魚や野菜に衣をつけて揚げた料理です。",  # "Tempura is battered, deep-fried fish and vegetables."
    "Une fine crepe garnie de sucre, de beurre ou de fruits.",
    "A Japanese dish made with vinegared rice, often shaped with seafood, vegetables, or egg.",
]

scores = util.cos_sim(
    model.encode(query, normalize_embeddings=True),
    model.encode(docs, normalize_embeddings=True),
)[0]
print(scores)

If Flash Attention 2 is unavailable, use model_kwargs={"attn_implementation": "sdpa"}.

from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer(
    "hotchpotch/bekko-embedding-v1-a8m",
    device="mps",
    model_kwargs={"attn_implementation": "sdpa"},
)

query = "What are the characteristics of sushi?"
docs = [
    "A warm noodle soup served in broth with sliced toppings.",
    "天ぷらは魚や野菜に衣をつけて揚げた料理です。",  # "Tempura is battered, deep-fried fish and vegetables."
    "Une fine crepe garnie de sucre, de beurre ou de fruits.",
    "A Japanese dish made with vinegared rice, often shaped with seafood, vegetables, or egg.",
]

scores = util.cos_sim(
    model.encode(query, normalize_embeddings=True),
    model.encode(docs, normalize_embeddings=True),
)[0]
print(scores)

The default IR (openvino/openvino_model.xml + .bin) runs on Intel, AMD, and Arm CPUs, Raspberry Pi included. Only the static token embedding table is stored as int8 — the transformer layers stay fp32, so quality is essentially unchanged (cosine similarity ≥ 0.9994 to PyTorch in our release checks).

# As of 2026-07-28, Transformers 4.x must be specified so that pip resolves
# a compatible OpenVINO dependency stack.
pip install -U \
  "sentence-transformers[openvino]>=5.0" \
  "transformers>=4.57,<5"
from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer(
    "hotchpotch/bekko-embedding-v1-a8m",
    backend="openvino",
    device="cpu",
    model_kwargs={"file_name": "openvino/openvino_model.xml", "device": "CPU"},
)

query = "What are the characteristics of sushi?"
docs = [
    "A warm noodle soup served in broth with sliced toppings.",
    "天ぷらは魚や野菜に衣をつけて揚げた料理です。",  # "Tempura is battered, deep-fried fish and vegetables."
    "Une fine crepe garnie de sucre, de beurre ou de fruits.",
    "A Japanese dish made with vinegared rice, often shaped with seafood, vegetables, or egg.",
]

scores = util.cos_sim(
    model.encode(query, normalize_embeddings=True),
    model.encode(docs, normalize_embeddings=True),
)[0]
print(scores)

The default ONNX artifact (onnx/model.onnx) keeps the tokenizer and full vocabulary unchanged and stores only the static token embedding table as int8. Use it with Transformers.js in the browser, or with ONNX Runtime. If plain CPU throughput is what you're after, OpenVINO above is faster. For a complete client-side example, see the bekko-embedding-web Space.

npm install @huggingface/transformers
import { pipeline } from "@huggingface/transformers";

// Browser: use WebGPU when available, otherwise fall back to WASM.
// Node.js: replace this line with `const device = "cpu";`.
const device = navigator.gpu ? "webgpu" : "wasm";

const extractor = await pipeline(
  "feature-extraction",
  "hotchpotch/bekko-embedding-v1-a8m",
  {
    device,
    // Transformers.js maps dtype="fp32" to onnx/model.onnx.
    // In this repo, that file is the compact static-embedding-int8 ONNX model.
    dtype: "fp32",
  },
);

const queryEmbedding = await extractor("What are the characteristics of sushi?", {
  pooling: "mean",
  normalize: true,
});

const documentEmbedding = await extractor(
  "A Japanese dish made with vinegared rice and seafood.",
  { pooling: "mean", normalize: true },
);

console.log(queryEmbedding.tolist()[0].slice(0, 8));
console.log(documentEmbedding.tolist()[0].slice(0, 8));
console.log(queryEmbedding.dims); // [1, 384]
pip install -U "sentence-transformers[onnx]>=5.0"
from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer(
    "hotchpotch/bekko-embedding-v1-a8m",
    backend="onnx",
    device="cpu",
    model_kwargs={"file_name": "onnx/model.onnx", "provider": "CPUExecutionProvider"},
)

query = "What are the characteristics of sushi?"
docs = [
    "A warm noodle soup served in broth with sliced toppings.",
    "天ぷらは魚や野菜に衣をつけて揚げた料理です。",  # "Tempura is battered, deep-fried fish and vegetables."
    "Une fine crepe garnie de sucre, de beurre ou de fruits.",
    "A Japanese dish made with vinegared rice, often shaped with seafood, vegetables, or egg.",
]
print(util.cos_sim(model.encode(query, normalize_embeddings=True), model.encode(docs, normalize_embeddings=True))[0])

These models are trained with Matryoshka representation learning, so you can shrink the 384-dim embeddings to 256, 128, or 64 dimensions by passing truncate_dim. Smaller dimensions reduce index size and speed up similarity search, at a small cost in retrieval quality (see Truncation and Quantization).

from sentence_transformers import SentenceTransformer, util

# Full embedding is 384-dim; 256 / 128 / 64 are supported.
model = SentenceTransformer(
    "hotchpotch/bekko-embedding-v1-a8m",
    truncate_dim=256,
    model_kwargs={"attn_implementation": "sdpa"},
)

query = "What are the characteristics of sushi?"
docs = [
    "A warm noodle soup served in broth with sliced toppings.",
    "天ぷらは魚や野菜に衣をつけて揚げた料理です。",  # "Tempura is battered, deep-fried fish and vegetables."
    "Une fine crepe garnie de sucre, de beurre ou de fruits.",
    "A Japanese dish made with vinegared rice, often shaped with seafood, vegetables, or egg.",
]
emb = model.encode(query, normalize_embeddings=True)
print("embedding dim:", emb.shape[-1])
print(util.cos_sim(emb, model.encode(docs, normalize_embeddings=True))[0])

Not the same as the default artifact above — this one quantizes the transformer weights too. We keep it for experimentation only: on models this small, qint8 tends to hurt retrieval quality without reliably improving latency.

from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer(
    "hotchpotch/bekko-embedding-v1-a8m",
    backend="openvino",
    device="cpu",
    model_kwargs={"file_name": "openvino/openvino_model_qint8_not_recommended.xml", "device": "CPU"},
)

query = "What are the characteristics of sushi?"
docs = [
    "A warm noodle soup served in broth with sliced toppings.",
    "天ぷらは魚や野菜に衣をつけて揚げた料理です。",  # "Tempura is battered, deep-fried fish and vegetables."
    "Une fine crepe garnie de sucre, de beurre ou de fruits.",
    "A Japanese dish made with vinegared rice, often shaped with seafood, vegetables, or egg.",
]
print(util.cos_sim(model.encode(query, normalize_embeddings=True), model.encode(docs, normalize_embeddings=True))[0])

Same caveat as OpenVINO qint8: these files quantize the transformer weights and are platform-specific experiments. On models this small they can noticeably degrade retrieval quality, so measure on your target hardware before adopting them.

pip install -U "sentence-transformers[onnx]>=5.0"
from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer(
    "hotchpotch/bekko-embedding-v1-a8m",
    backend="onnx",
    device="cpu",
    model_kwargs={
        "file_name": "onnx/model_qint8_avx512_not_recommended.onnx",
        "provider": "CPUExecutionProvider",
    },
)

query = "What are the characteristics of sushi?"
docs = [
    "A warm noodle soup served in broth with sliced toppings.",
    "天ぷらは魚や野菜に衣をつけて揚げた料理です。",  # "Tempura is battered, deep-fried fish and vegetables."
    "Une fine crepe garnie de sucre, de beurre ou de fruits.",
    "A Japanese dish made with vinegared rice, often shaped with seafood, vegetables, or egg.",
]
print(util.cos_sim(model.encode(query, normalize_embeddings=True), model.encode(docs, normalize_embeddings=True))[0])

For portable inference with llama.cpp or Ollama, use the GGUF release in bekko-embedding-v1-a8m-GGUF. The GGUF model uses the same 8192-token context, mean pooling, and 384-dimensional L2-normalized embeddings as this model.

Use BF16 on GPUs and Apple Silicon. For CPU inference, use Q8_0; it is smaller and avoids the severe BF16 slowdown on CPUs without native BF16 arithmetic.

With llama.cpp:

llama-server \
  -hf hotchpotch/bekko-embedding-v1-a8m-GGUF:BF16 \
  --embedding --pooling mean --embd-normalize 2 --ctx-size 8192

curl http://localhost:8080/v1/embeddings \
  -H 'Content-Type: application/json' \
  -d '{"model":"bekko","input":"What is the tallest mountain in Japan?"}'

With Ollama:

# Default (BF16): recommended for GPU and Apple Silicon
ollama pull hotchpotch/bekko-embedding-v1-a8m

curl http://localhost:11434/api/embed \
  -d '{"model":"hotchpotch/bekko-embedding-v1-a8m","input":"What is the tallest mountain in Japan?"}'

# Q8_0: recommended for CPU inference
ollama pull hotchpotch/bekko-embedding-v1-a8m:q8_0

Ollama also provides explicit :bf16 and :f16 tags. The Hugging Face GGUF repository publishes BF16, F16, and Q8_0. Lower-bit variants are not published because they provided little file-size reduction for this architecture while reducing embedding fidelity or throughput. See the GGUF model card for the measurements and conversion details.

Other inference methods

Beyond the Sentence Transformers backends above, you can also serve or run the model with:

Text Embeddings Inference (TEI) is Hugging Face's Rust-based serving stack, with official Docker images, dynamic batching, and Prometheus metrics built in.

Before deploying, confirm your TEI version supports this model's encoder architecture, and pick the image tag that matches your target — a CPU image, or a GPU image for your specific architecture. See the TEI image list for current tags.

model=hotchpotch/bekko-embedding-v1-a8m
volume=$PWD/tei-data
# Replace <tag> with the current TEI image for your hardware (CPU, or your GPU arch).
# Add `--gpus all` when using a GPU image.
docker run -p 8080:80 -v "$volume:/data" --pull always \
  ghcr.io/huggingface/text-embeddings-inference:<tag> \
  --model-id "$model"
import requests
import numpy as np

query = "What are the characteristics of sushi?"
docs = [
    "A warm noodle soup served in broth with sliced toppings.",
    "天ぷらは魚や野菜に衣をつけて揚げた料理です。",  # "Tempura is battered, deep-fried fish and vegetables."
    "Une fine crepe garnie de sucre, de beurre ou de fruits.",
    "A Japanese dish made with vinegared rice, often shaped with seafood, vegetables, or egg.",
]

q = np.array(requests.post("http://127.0.0.1:8080/embed", json={"inputs": [query]}).json()[0])
d = np.array(requests.post("http://127.0.0.1:8080/embed", json={"inputs": docs}).json())
q = q / np.linalg.norm(q)
d = d / np.linalg.norm(d, axis=1, keepdims=True)
print(d @ q)

Apply mean pooling with pure Transformers.

import torch
import torch.nn.functional as F
from transformers import AutoModel, AutoTokenizer

model_id = "hotchpotch/bekko-embedding-v1-a8m"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModel.from_pretrained(model_id, attn_implementation="sdpa").eval()

def embed(texts):
    batch = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
    with torch.no_grad():
        out = model(**batch).last_hidden_state
    mask = batch["attention_mask"].unsqueeze(-1)
    pooled = (out * mask).sum(dim=1) / mask.sum(dim=1).clamp(min=1)
    return F.normalize(pooled, p=2, dim=1)

query = "What are the characteristics of sushi?"
docs = [
    "A warm noodle soup served in broth with sliced toppings.",
    "天ぷらは魚や野菜に衣をつけて揚げた料理です。",  # "Tempura is battered, deep-fried fish and vegetables."
    "Une fine crepe garnie de sucre, de beurre ou de fruits.",
    "A Japanese dish made with vinegared rice, often shaped with seafood, vegetables, or egg.",
]

scores = embed(docs) @ embed([query]).T
print(scores.squeeze(-1))

Truncation and Quantization

How much quality do you trade for a smaller index? For bekko-embedding-v1-a8m: very little at 256 dimensions (-1.8%), progressively more below that. If you quantize the output vectors to int8 or binary, add a rescoring step — it recovers nearly all of the loss.

SettingDimEncodingRescoreHAKARI overallDelta vs 384-dim floatRecommended use
Full quality384floatNo0.545-Default choice
Smaller index256floatNo0.536-1.76%Good size/quality tradeoff
Compact index128floatNo0.507-7.05%Memory-constrained indexes
Very compact index64floatNo0.450-17.51%Not for quality-sensitive retrieval
INT8 search384int8No0.515-5.48%Benchmark before using
INT8 search + rescore384int8Yes0.545-0.04%Best quantized option
Binary search384binaryNo0.475-12.93%Not recommended by default
Binary search + rescore384binaryYes0.543-0.44%Strong compression when rescoring is available

FAQ

  • Do I need a prefix like query: or passage: ? — No. bekko is trained without prefixes, so you encode raw text for both queries and documents. If you come from the multilingual-e5 family, just drop the prefixes.
  • Which languages are covered? — 100+ languages, inherited from the mmBERT base model. Coverage is broad but uneven, so evaluate on your own language and domain before deployment (see Limitations).
  • Which file should I load for my runtime? — PyTorch: the default safetensors weights. Fastest CPU inference: openvino/openvino_model.xml. Browser / ONNX Runtime: onnx/model.onnx. Files named _not_default / _not_recommended are comparison artifacts, not deployment choices.
  • Can I make the embeddings smaller? — Yes — pass truncate_dim=256 (or 128 / 64). See Truncation and Quantization for the quality cost.
  • Can it really run in a browser? — Yes. Try the bekko-embedding-web demo — the model runs fully client-side with Transformers.js.

Limitations

  • Bekko is optimized primarily for multilingual retrieval. Its strongest MMTEB results are Retrieval, Reranking, BitextMining, and STS. It is not intended to be state of the art across every embedding task category.
  • Bekko is a bi-encoder embedding model, not a cross-encoder reranker. MMTEB Reranking scores measure bi-encoder similarity scoring. Use a dedicated cross-encoder when maximum reranking accuracy is more important than throughput.
  • Support for 100+ languages reflects training-data coverage. Quality varies by language and domain, so evaluate on your target data before deployment.
  • HAKARI-Bench is maintained by the model author and should be read alongside the independently maintained MMTEB suite. Bekko's MMTEB results use the same 131-task set and aggregation rules as the referenced snapshot, but await submission through the official leaderboard pipeline.
  • Throughput varies with text lengths, batch size, backend, software versions, and hardware. Use the benchmark figures as comparative measurements, not guaranteed production latency.
  • Transformer-weight qint8 artifacts are experimental and can lose retrieval quality or behave differently across CPU architectures. The default ONNX/OpenVINO artifacts only compress the static token embedding table and are the recommended deployment files.

The name "bekko"

bekko (/ˈbek.koː/) is a coined name that joins two pieces of Japanese tradition:

  • akabeko (赤べこ) — the red ox that has been cherished in Japan for centuries as a guardian charm, believed to ward off illness and misfortune.
  • bekko-iro (鼈甲色) — a beautiful traditional Japanese color: a warm, translucent, amber-like hue.

The name pairs the protective spirit of the red ox with the quiet beauty of this classic amber tone.

Paper

For full technical details, see Bekko Embedding: Parameter-Efficient Multilingual Retrieval with Ultra-Compact Encoders.

Citation

If you use bekko-embedding in your work, please cite:

@misc{tateno2026bekkoembedding,
  title         = {Bekko Embedding: Parameter-Efficient Multilingual Retrieval with Ultra-Compact Encoders},
  author        = {Yuichi Tateno},
  year          = {2026},
  eprint        = {2607.25180},
  archivePrefix = {arXiv},
  primaryClass  = {cs.IR},
  url           = {https://arxiv.org/abs/2607.25180}
}

Training data

Both datasets built for training bekko-embedding are public:

License

MIT License.

Author

Yuichi Tateno @hotchpotch

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм · sentence-transformers

Можно запустить

Подбираем GPU…

Класс архитектуры
ModernBertModel
Ревизия весов
c721113

0 моделей