Keyven commited on
Commit
a79a2b8
·
verified ·
1 Parent(s): 3a89c44

Reranker 326M v2 (92,8% Acc@1) + Querverweise aktualisiert

Browse files
Files changed (1) hide show
  1. README.md +28 -28
README.md CHANGED
@@ -4,7 +4,6 @@ language:
4
  - de
5
  library_name: transformers
6
  pipeline_tag: text-classification
7
- base_model: keyvan-ai/Mankei-1B-Chat
8
  tags:
9
  - reranker
10
  - cross-encoder
@@ -14,32 +13,24 @@ tags:
14
  - on-prem
15
  datasets:
16
  - deepset/germandpr
17
- model-index:
18
- - name: Mankei-1B-Reranker
19
- results:
20
- - task:
21
- type: text-classification
22
- name: Passage Reranking
23
- dataset:
24
- type: deepset/germandpr
25
- name: GermanDPR (held-out)
26
- metrics:
27
- - type: accuracy
28
- value: 0.877
29
- name: Accuracy
30
  ---
31
 
32
  <p align="center"><img src="mankei-logo.png" width="200" alt="Mankei"></p>
33
 
34
- # Mankei-1B-Reranker (experimentell)
35
 
36
- Cross-Encoder-Reranker, abgeleitet aus **Mankei-1B**. Bewertet Query-Passage-Paare pointwise (Relevanz 0–1) und ordnet die Top-k eines Retrieval-Schritts neu. Für **souveränes RAG on-premise**.
37
 
38
- ## Wofür gebaut
39
- Zweite Stufe hinter dem [Mankei-326M-Embedder](https://huggingface.co/keyvan-ai/Mankei-326M-Embedder): Der Embedder holt die Kandidaten (hoher Durchsatz), der Reranker schärft die Reihenfolge der Top-k.
40
 
41
- ## Qualität
42
- **val_acc 0,877** auf [GermanDPR](https://huggingface.co/datasets/deepset/germandpr) (CC-BY, gehaltener Split) — unterscheidet zuverlässig relevante von hart-negativen Passagen.
 
 
 
 
 
43
 
44
  ## Verwendung
45
  ```python
@@ -47,18 +38,27 @@ from transformers import AutoModel, AutoTokenizer
47
  from huggingface_hub import hf_hub_download
48
  import torch, torch.nn as nn
49
 
50
- tok = AutoTokenizer.from_pretrained("keyvan-ai/Mankei-1B-Reranker")
51
- base = AutoModel.from_pretrained("keyvan-ai/Mankei-1B-Reranker", dtype=torch.bfloat16)
 
52
  head = nn.Linear(base.config.hidden_size, 1)
53
- head.load_state_dict(torch.load(hf_hub_download("keyvan-ai/Mankei-1B-Reranker", "head.pt")))
54
 
 
55
  def score(query, passages):
56
  x = tok([f"Frage: {query}\nPassage: {p}" for p in passages],
57
- padding=True, truncation=True, max_length=256, return_tensors="pt")
58
- with torch.no_grad(): h = base(**x).last_hidden_state
59
- idx = x.attention_mask.sum(1) - 1
60
- return torch.sigmoid(head(h[torch.arange(h.size(0)), idx].float()).squeeze(-1))
 
 
 
 
61
  ```
62
 
 
 
 
63
  ## Training
64
- Cross-Encoder-LoRA auf Mankei-1B, pointwise BCE auf GermanDPR (Positive + Hard-Negatives). Last-Token-Pooling + lineare Klassifikationsschicht (`head.pt` im Repo).
 
4
  - de
5
  library_name: transformers
6
  pipeline_tag: text-classification
 
7
  tags:
8
  - reranker
9
  - cross-encoder
 
13
  - on-prem
14
  datasets:
15
  - deepset/germandpr
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  ---
17
 
18
  <p align="center"><img src="mankei-logo.png" width="200" alt="Mankei"></p>
19
 
20
+ # Mankei-326M-Reranker
21
 
22
+ 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**.
23
 
24
+ ## Benchmark — deutsches Reranking (GermanDPR)
25
+ 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).
26
 
27
+ | Modell | Größe | Acc@1 | MRR |
28
+ |---|---:|---:|---:|
29
+ | **Mankei-326M-Reranker** | 0,33 B | **92,8 %** | **0,963** |
30
+ | bge-reranker-v2-m3 | 0,57 B | 87,2 % | — |
31
+ | cross-encoder-german (mmarco) | 0,14 B | 74,0 % | — |
32
+
33
+ Der spezialisierte deutsche Reranker liegt vor dem multilingualen SOTA-Reranker (bge-reranker-v2-m3) und dem deutschen mMARCO-Cross-Encoder.
34
 
35
  ## Verwendung
36
  ```python
 
38
  from huggingface_hub import hf_hub_download
39
  import torch, torch.nn as nn
40
 
41
+ repo = "keyvan-ai/Mankei-326M-Reranker"
42
+ tok = AutoTokenizer.from_pretrained(repo)
43
+ base = AutoModel.from_pretrained(repo, dtype=torch.bfloat16).eval()
44
  head = nn.Linear(base.config.hidden_size, 1)
45
+ head.load_state_dict(torch.load(hf_hub_download(repo, "head.pt")))
46
 
47
+ @torch.no_grad()
48
  def score(query, passages):
49
  x = tok([f"Frage: {query}\nPassage: {p}" for p in passages],
50
+ padding=True, truncation=True, max_length=192, return_tensors="pt")
51
+ h = base(**x).last_hidden_state
52
+ idx = x.attention_mask.sum(1) - 1 # Last-Token-Pooling
53
+ return head(h[torch.arange(h.size(0)), idx].float()).squeeze(-1) # höher = relevanter
54
+
55
+ # Kandidaten aus dem Embedder neu ordnen:
56
+ passages = ["Die Kündigung des Mietvertrags ...", "Der Kaufvertrag ...", "München ist ..."]
57
+ ranking = sorted(zip(score("Wie kündige ich meine Wohnung?", passages).tolist(), passages), reverse=True)
58
  ```
59
 
60
+ ## Rolle im RAG
61
+ 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.
62
+
63
  ## Training
64
+ 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.