Keyven's picture
Benchmark-Grafik eingebettet
e1219e3 verified
|
Raw
History Blame Contribute Delete
2.95 kB
metadata
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. 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

Verwendung

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 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 (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.