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_length 256.
  • Objective: CachedMultipleNegativesRankingLossMatryoshkaLoss 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.
Downloads last month
116
Safetensors
Model size
0.4B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for mayflowergmbh/Boldt-Embed-DE-350M

Finetuned
(1)
this model