Instructions to use mayflowergmbh/Boldt-Embed-DE-350M with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- sentence-transformers
How to use mayflowergmbh/Boldt-Embed-DE-350M with sentence-transformers:
from sentence_transformers import SentenceTransformer model = SentenceTransformer("mayflowergmbh/Boldt-Embed-DE-350M") sentences = [ "The weather is lovely today.", "It's so sunny outside!", "He drove to the stadium." ] embeddings = model.encode(sentences) similarities = model.similarity(embeddings, embeddings) print(similarities.shape) # [3, 3] - Notebooks
- Google Colab
- Kaggle
Boldt-Embed-DE-350M — German FAQ/RAG retriever
A German dense retrieval embedder built for FAQ / RAG: the first-stage retriever that finds the
passage your generator should answer from. Based on
Boldt/Boldt-DC-350M (350M parameters, hidden_size
1024); mean-pooled, normalized, and Matryoshka-trained so vectors truncate to 512 / 256 / 128 / 64
dims with little quality loss. It is tuned to pull the relevant passage into the top of the candidate
list (high Recall@50/100) on German FAQ/RAG queries.
Best for: German FAQ and RAG first-stage retrieval — that is the design target, and where it leads similar- and larger-sized multilingual embedders (see below). For general German QA corpora, a broad multilingual model may suit better.
Comparison with similar-sized multilingual embedders
All numbers measured under the same harness over the held-out WebFAQ corpus (1,381 docs, 1,576 queries) and two general German QA guardrail sets (GermanQuAD, Deutsche-Telekom DT-test). Encode the corpus, retrieve by cosine; no public-leaderboard submission.
WebFAQ (German FAQ/RAG — the target domain):
| model | params | R@10 | R@50 | R@100 | nDCG@10 | MRR@10 |
|---|---|---|---|---|---|---|
| Boldt-Embed-DE-350M (this) | 350M | 0.792 | 0.935 | 0.979 | 0.701 | 0.673 |
multilingual-e5-base |
278M | 0.730 | 0.843 | 0.933 | 0.678 | 0.661 |
multilingual-e5-large |
560M | 0.723 | 0.826 | 0.919 | 0.680 | 0.666 |
BAAI/bge-m3 |
568M | 0.711 | 0.826 | 0.904 | 0.673 | 0.661 |
On German FAQ/RAG this model leads all of them on recall — including the larger 560M/568M baselines.
General German QA (guardrails), nDCG@10:
| model | GermanQuAD | DT-test |
|---|---|---|
| Boldt-Embed-DE-350M (this) | 0.881 | 0.975 |
multilingual-e5-base |
0.924 | 0.994 |
multilingual-e5-large |
0.930 | 0.996 |
BAAI/bge-m3 |
0.924 | 0.996 |
Honest read: this model is specialized for German FAQ/RAG retrieval, where it leads. On general German QA the broad multilingual models (e5/bge-m3) are stronger — if your corpus is general German QA rather than FAQ/RAG, prefer one of those.
Matryoshka
WebFAQ nDCG@10 by truncation dim (re-normalize after truncating):
| 1024 | 512 | 256 | 128 |
|---|---|---|---|
| 0.701 | 0.703 | 0.700 | 0.689 |
256-d retains ~99.8% of full-dim nDCG@10 — use 256-d for a 4× smaller index at almost no cost. Throughput (RTX A6000, bf16, max_seq_length 256): ~405 docs/s encode, ~2,400 queries/s.
Usage
from sentence_transformers import SentenceTransformer
import numpy as np
model = SentenceTransformer("mayflowergmbh/Boldt-Embed-DE-350M") # mean pooling, normalized
query = "Wie hoch darf die Mietkaution sein?"
docs = ["Die Mietkaution darf höchstens drei Nettokaltmieten betragen.",
"Die Maklerprovision beträgt häufig zwei Nettokaltmieten."]
qv = model.encode(query, normalize_embeddings=True)
dv = model.encode(docs, normalize_embeddings=True)
scores = dv @ qv # cosine similarity (vectors are unit-norm)
print(sorted(zip(scores.tolist(), docs), reverse=True))
# Matryoshka: truncate to 256 dims, then re-normalize
qv256 = qv[:256] / np.linalg.norm(qv[:256])
No query/document prefixes are required.
Intended use
- First-stage dense retrieval over a German passage corpus for RAG (encode the corpus once, retrieve top-k by cosine).
- Semantic similarity / clustering over German text.
- Hard-negative mining and as a base for further fine-tuning.
Training
- Base:
Boldt/Boldt-DC-350M(apache-2.0), mean pooling,max_seq_length256. - Objective:
CachedMultipleNegativesRankingLoss→MatryoshkaLossover[1024, 768, 512, 256, 128, 64], plus a rank-promotion signal — contrastive training over (query, positive, hard-negative) triplets mined from the model's own near-misses (documents that previously out-ranked the positive), which pulls the positive into the top of the list. Hard negatives were teacher-vetted with a strong cross-encoder.NO_DUPLICATESbatch sampler.
Training data & attribution
Permissively-licensed, non-benchmark German data (public benchmark test sets are held out of training; train ≠ eval):
| source | license |
|---|---|
| PaDaS-Lab/webfaq (German FAQ) | CC-BY-4.0 |
| German Wikipedia / DPR-style QA passages | CC-BY-SA-4.0 |
| German web + back-translation paraphrase, German stress pairs | CC-BY-SA-4.0 |
License: the model weights are released under Apache-2.0 (the base model is Apache-2.0). As a courtesy, please credit the data sources above (German Wikipedia, WebFAQ) when redistributing derivatives.
Limitations
- German-first — evaluated on German RAG/QA; other languages are out of scope.
- FAQ/RAG-specialized — leads on WebFAQ but trails general multilingual models on general German QA (GermanQuAD/DT-test); choose accordingly.
- No public-leaderboard (MMTEB) run — numbers above are from our internal harness over the listed corpora.
- Not legal advice — relevance over German text (including legal/administrative passages) is for information retrieval only; verify against primary sources.
- Downloads last month
- 116
Model tree for mayflowergmbh/Boldt-Embed-DE-350M
Base model
Boldt/Boldt-DC-350M