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
1from sentence_transformers import SentenceTransformer
2import numpy as np
3
4model = SentenceTransformer("mayflowergmbh/Boldt-Embed-DE-350M") # mean pooling, normalized
5query = "Wie hoch darf die Mietkaution sein?"
6docs = ["Die Mietkaution darf höchstens drei Nettokaltmieten betragen.",
7 "Die Maklerprovision beträgt häufig zwei Nettokaltmieten."]
8qv = model.encode(query, normalize_embeddings=True)
9dv = model.encode(docs, normalize_embeddings=True)
10scores = dv @ qv # cosine similarity (vectors are unit-norm)
11print(sorted(zip(scores.tolist(), docs), reverse=True))
12
13# Matryoshka: truncate to 256 dims, then re-normalize
14qv256 = 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_length 256.
- Objective:
CachedMultipleNegativesRankingLoss → MatryoshkaLoss over
[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_DUPLICATES batch 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.