Instructions to use flower-computer/bekko-static-v1-slim-50k with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- sentence-transformers
How to use flower-computer/bekko-static-v1-slim-50k with sentence-transformers:
from sentence_transformers import SentenceTransformer model = SentenceTransformer("flower-computer/bekko-static-v1-slim-50k") sentences = [ "That is a happy person", "That is a happy dog", "That is a very happy person", "Today is a sunny day" ] embeddings = model.encode(sentences) similarities = model.similarity(embeddings, embeddings) print(similarities.shape) # [4, 4] - Notebooks
- Google Colab
- Kaggle
bekko-static-v1-slim-50k
A vocabulary-pruned derivative of hotchpotch/bekko-static-embedding-v1, a static embedding model (token lookup + mean pooling, 1024-d, Matryoshka 32–1024, no transformer). Same architecture, same embedding space, but 50,000 of the original 200,000 WordPiece tokens — the ones most useful for the 25 languages covered by the multilingual retrieval benchmarks the source model reports on (MNanoBEIR, NanoMIRACL, NanoMLDR, plus Dutch):
English, Arabic, Bengali, German, Spanish, Persian, Finnish, French, Hindi, Indonesian, Italian, Japanese, Korean, Dutch, Norwegian, Portuguese, Russian, Serbian, Swedish, Swahili, Telugu, Thai, Vietnamese, Yoruba, Chinese.
Text in other languages is not supported: their script-specific tokens were removed and will tokenize to characters or [UNK].
Usage
sentence-transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("flower-computer/bekko-static-v1-slim-50k") # add truncate_dim=256 etc. for Matryoshka sizes
emb = model.encode(["What is the capital of France?", "Paris is the capital of France."])
print(model.similarity(emb[0:1], emb[1:2]))
Queries and documents use no prompts/prefixes, as in the source model.
Rust: encoders
encoders (github.com/flowercomputers/encoders) compiles a static embedding model into your binary at build time — no runtime download, no Python. Select this model with its cargo feature (it is the crate's default model, so a plain cargo add encoders also selects it):
$ cargo add encoders --features='bekko-static-v1-slim-50k'
let one = encoders::encode_single("What is the capital of France?");
let batch = encoders::encode(["Paris is the capital of France.", "Tokyo is the capital of Japan."]);
Optional features: mrl-512 … mrl-32 truncate to a Matryoshka width (native 1024 otherwise); int8 / int16 (default) / float32 pick the table type — int16 is practically indistinguishable from f32 at half the size, int8 a quarter; rayon parallelises batches. Output matches sentence-transformers' StaticEmbedding (same tokenization, mean pooling); the crate's tests check its embeddings against the reference implementation.
The family
All members: huggingface.co/collections/flower-computer/bekko-static-v1-slim
| model | vocab · fp16 size | langs | NanoBEIR-en | MNanoBEIR | NanoMIRACL |
|---|---|---|---|---|---|
| hotchpotch/bekko-static-embedding-v1 | 200k · 410 MB | 40 | 53.71 | 43.71 | 68.03 |
| bekko-static-v1-slim-100k | 100k · 205 MB | 25 | 52.91 | 42.98 | 66.53 |
| bekko-static-v1-slim-75k | 75k · 154 MB | 25 | 52.09 | 42.15 | 64.51 |
| bekko-static-v1-slim-50k (this model) | 50k · 102 MB | 25 | 50.22 | 40.37 | 61.35 |
| bekko-static-v1-slim-32k | 32k · 66 MB | 14 | 49.31 | 39.86 | 49.25 |
Vocabulary size × embedding width
NanoBEIR-en — rows: vocabulary, columns: dims
| vocab \ dims | 1024 | 512 | 256 | 128 | 64 |
|---|---|---|---|---|---|
| 200k (source) | 53.71 | 52.84 | 50.84 | 47.82 | 43.96 |
| 100k | 52.91 | 52.13 | 50.05 | 47.03 | 42.84 |
| 75k | 52.09 | 51.62 | 48.72 | 46.36 | 40.78 |
| 50k | 50.22 | 49.39 | 47.12 | 44.44 | 38.03 |
| 32k | 49.31 | 48.39 | 46.16 | 42.53 | 36.51 |
MNanoBEIR — rows: vocabulary, columns: dims
| vocab \ dims | 1024 | 512 | 256 | 128 | 64 |
|---|---|---|---|---|---|
| 200k (source) | 43.71 | 42.83 | 41.03 | 38.03 | 32.87 |
| 100k | 42.98 | 42.07 | 40.39 | 37.08 | 32.13 |
| 75k | 42.15 | 41.28 | 39.28 | 36.04 | 30.87 |
| 50k | 40.37 | 39.35 | 37.60 | 34.26 | 28.49 |
| 32k | 39.86 | 38.88 | 36.85 | 33.12 | 27.50 |
NanoMIRACL — rows: vocabulary, columns: dims
| vocab \ dims | 1024 | 512 | 256 | 128 | 64 |
|---|---|---|---|---|---|
| 200k (source) | 68.03 | 67.67 | 66.47 | 63.99 | 58.33 |
| 100k | 66.53 | 66.01 | 64.76 | 62.09 | 55.75 |
| 75k | 64.51 | 63.96 | 62.42 | 59.59 | 53.07 |
| 50k | 61.35 | 60.73 | 59.41 | 55.70 | 48.19 |
| 32k | 49.25 | 48.60 | 47.19 | 44.10 | 36.47 |
The 50k+ members keep 25 languages; the 32k member keeps the 14 MNanoBEIR languages (en ar de es fr it ja ko no pt sr sv th vi), because 25 languages do not fit in 32k pieces without the long-word scripts (te/th/bn) shattering into characters. Scores are nDCG@10 × 100 at 1024 dims; NanoMIRACL includes languages the 32k model drops.
How the vocabulary was chosen
The source model's quality lives in its 200k-token table, and in a static model the tokenizer's pieces are exactly the vectors that get averaged, so removing a token is not free: every word that used it is re-tokenized into shorter pieces whose vectors were trained for other contexts. Tokens were therefore ordered by expected damage from removal:
usefulness(t) = corpus frequency of t × ‖ E[t] − Σ E[pieces t falls back to when t is removed] ‖
computed in rounds (drop the least useful 10 %, re-tokenize, re-score the tokens whose fallback changed), then truncated at the target size. Frequencies are a per-language mix of WebFAQ-v2 and Wikipedia text (equal weight per language, English ×3). Special tokens and every single-character piece that occurs in the corpus are always kept, so covered-language text never degrades to [UNK]. After truncation, the surviving rows were gently fine-tuned by self-distillation: cosine loss at 1024/256/64 dims against the full model's sentence embeddings, on WebFAQ-v2 and Wikipedia paragraphs of the covered languages (lr 0.03, 3000 steps, batch 1024, sparse Adam on touched rows only). This is a nudge, not a retrain — the median row moves ~10 % of its norm — and it recovers roughly 1–2 nDCG points at small vocabularies; larger learning rates reduce the distillation loss further but hurt retrieval.
Because the vocabulary is smaller, covered-language text tokenizes into ≈18 % more tokens than with the source tokenizer (measured on Wikipedia paragraphs); embedding cost scales with that.
Evaluation
| model | vocab · fp16 size | langs | NanoBEIR-en | MNanoBEIR | NanoMIRACL |
|---|---|---|---|---|---|
| hotchpotch/bekko-static-embedding-v1 | 200k · 410 MB | 40 | 53.71 | 43.71 | 68.03 |
| this vocabulary, no recovery | 50k · 102 MB | 25 | 49.77 | 39.77 | 60.25 |
| bekko-static-v1-slim-50k | 50k · 102 MB | 25 | 50.22 | 40.37 | 61.35 |
Measured with a local cosine-retrieval harness on the HAKARI-Bench Nano datasets, which reproduces the source card's NanoBEIR-en 53.71 and NanoMIRACL 68.03 exactly. NanoBEIR-en = 13 tasks; MNanoBEIR = 14 languages × 13 tasks (182); NanoMIRACL = 18 languages. All numbers are nDCG@10 × 100, equal weight per task.
Matryoshka truncation
| dims | 1024 | 512 | 256 | 128 | 64 |
|---|---|---|---|---|---|
| NanoBEIR-en | 50.22 | 49.39 | 47.12 | 44.44 | 38.03 |
| MNanoBEIR | 40.37 | 39.35 | 37.60 | 34.26 | 28.49 |
| NanoMIRACL | 61.35 | 60.73 | 59.41 | 55.70 | 48.19 |
Matryoshka sizes
| dims | 1024 | 512 | 256 | 128 | 64 | 32 |
|---|---|---|---|---|---|---|
| fp16 MB | 102 | 51 | 26 | 13 | 6 | 3 |
Caveats
- Losses concentrate in lexically specific tasks (entity names, scientific/biomedical terms) and, at small vocabularies, in languages with long agglutinative words (Telugu, Thai, Bengali), where words fragment into characters.
- Uncased, like the source. Only
model.safetensors(fp16) is provided — no ONNX/OpenVINO/int8 exports.
License and credit
MIT, same as the source. All credit for the model and its training goes to the source author (hotchpotch); this repository only removes rows from its table.
Model tree for flower-computer/bekko-static-v1-slim-50k
Base model
hotchpotch/bekko-static-embedding-v1

