--- license: apache-2.0 language: - de library_name: transformers pipeline_tag: text-classification tags: - reranker - cross-encoder - german - retrieval - rag - on-prem datasets: - deepset/germandpr ---

Mankei

# Mankei-326M-Reranker Deutscher Cross-Encoder-Reranker mit **326M Parametern**. Bewertet Query-Passage-Paare und ordnet die Top-k eines Retrieval-Schritts neu — die zweite, präzise Stufe hinter dem [Mankei-326M-Embedder](https://huggingface.co/keyvan-ai/Mankei-326M-Embedder). Für **souveränes RAG on-premise**. ## Benchmark — deutsches Reranking (GermanDPR) Ausgewertet auf **250 zurückgehaltenen GermanDPR-Fragen** (je 1 relevante + 5 harte Negativ-Passagen; nicht im Training). Metriken: Trefferquote auf Rang 1 (Acc@1) und Mean Reciprocal Rank (MRR). | Modell | Größe | Acc@1 | MRR | |---|---:|---:|---:| | **Mankei-326M-Reranker** | 0,33 B | **92,8 %** | **0,963** | | bge-reranker-v2-m3 | 0,57 B | 87,2 % | — | | cross-encoder-german (mmarco) | 0,14 B | 74,0 % | — | Der spezialisierte deutsche Reranker liegt vor dem multilingualen SOTA-Reranker (bge-reranker-v2-m3) und dem deutschen mMARCO-Cross-Encoder. ![Mankei-Benchmarks — Retrieval, Reranking, Chat](benchmark.png) ## Verwendung ```python from transformers import AutoModel, AutoTokenizer from huggingface_hub import hf_hub_download import torch, torch.nn as nn repo = "keyvan-ai/Mankei-326M-Reranker" tok = AutoTokenizer.from_pretrained(repo) base = AutoModel.from_pretrained(repo, dtype=torch.bfloat16).eval() head = nn.Linear(base.config.hidden_size, 1) head.load_state_dict(torch.load(hf_hub_download(repo, "head.pt"))) @torch.no_grad() def score(query, passages): x = tok([f"Frage: {query}\nPassage: {p}" for p in passages], padding=True, truncation=True, max_length=192, return_tensors="pt") h = base(**x).last_hidden_state idx = x.attention_mask.sum(1) - 1 # Last-Token-Pooling return head(h[torch.arange(h.size(0)), idx].float()).squeeze(-1) # höher = relevanter # Kandidaten aus dem Embedder neu ordnen: passages = ["Die Kündigung des Mietvertrags ...", "Der Kaufvertrag ...", "München ist ..."] ranking = sorted(zip(score("Wie kündige ich meine Wohnung?", passages).tolist(), passages), reverse=True) ``` ## Rolle im RAG Zweistufig: der [Embedder](https://huggingface.co/keyvan-ai/Mankei-326M-Embedder) holt die Kandidaten (hoher Durchsatz), der Reranker schärft die Reihenfolge der Top-k. Beide 326M, on-premise, CPU- bis GPU-tauglich. ## Training Supervidiert auf [GermanDPR](https://huggingface.co/datasets/deepset/germandpr) (CC-BY): **Listwise-Loss** (softmax-Cross-Entropy über die relevante Passage + harte Negative), Last-Token-Pooling + lineare Relevanzschicht (`head.pt` im Repo), LoRA auf dem deutschen Mankei-Basismodell. Die 250 Benchmark-Fragen sind vom Training ausgeschlossen.