File size: 5,984 Bytes
6ce70cd
 
f6a6ddd
 
6ce70cd
 
 
 
 
 
 
 
 
 
d7c2bbe
 
6ce70cd
 
f6a6ddd
 
 
6ce70cd
 
 
 
15d98a1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6ce70cd
f6a6ddd
6ce70cd
f6a6ddd
6ce70cd
f6a6ddd
 
 
6ce70cd
f6a6ddd
 
6ce70cd
 
f6a6ddd
 
 
 
 
 
 
 
 
6ce70cd
 
f6a6ddd
 
6ce70cd
 
 
f6a6ddd
 
6ce70cd
f6a6ddd
 
 
 
 
 
 
 
 
 
 
 
 
6ce70cd
f6a6ddd
 
 
6ce70cd
f6a6ddd
 
6ce70cd
f6a6ddd
 
 
6ce70cd
f6a6ddd
 
 
 
15d98a1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
---
library_name: transformers
language:
- it
---

# Model Card for Model ID

<!-- Provide a quick summary of what the model is/does. -->



## Model Details

This repository only contains the adapter of the fine-tuned model! You should have access to the base model in order to load it correctly.

### Model Description

- **Developed by:** Yuri Noviello
- **Language(s) (NLP):** Italian
- **Finetuned from model:** [Qwen/Qwen2-1.5B](https://huggingface.co/Qwen/Qwen2-1.5B)


## Evaluation

Benchmark Results on [MIRACL-ita-ArgosTranslate](https://huggingface.co/datasets/yuri-no/miracl-ita-argos) dev split

| **Model**     | **MRR@10** | **Recall@100** | **nDCG@10** |
|:-------------:|:----------:|:--------------:|:-----------:|
| minerva-argos | 66.45      | 94.51          | 61.77       |
| minerva-palm  | 65.32      | 94.38          | 60.74       |
|               |            |                |             |
| qwen-argos    | 73.47      | 96.98          | 69.04       |
| qwen-palm     | 73.16      | 97.21          | 69.12       |
|               |            |                |             |
| gemma-argos   | 73.05      | 96.42          | 69.05       |
| gemma-palm    | 72.56      | 96.33          | 68.87       |

Benchmark Results on [MIRACL-ita-PaLM](https://huggingface.co/datasets/yuri-no/miracl-ita-palm) dev split

| **Model**     | **MRR@10** | **Recall@100** | **nDCG@10** |
|:-------------:|:----------:|:--------------:|:-----------:|
| minerva-argos | 67.93      | 96.39          | 64.04       |
| minerva-palm  | 67.73      | 96.49          | 63.81       |
|               |            |                |             |
| qwen-argos    | 74.95      | 97.96          | 71.29       |
| qwen-palm     | 74.54      | 98.04          | 70.56       |
|               |            |                |             |
| gemma-argos   | 75.80      | 98.43          | 71.95       |
| gemma-palm    | 75.30      | 98.10          | 71.87       |


Benchmark Results on [Shitao/MLDR](https://huggingface.co/datasets/Shitao/MLDR) test split

| **Model**     | **MRR@10** | **Recall@100** | **nDCG@10** |
|:-------------:|:----------:|:--------------:|:-----------:|
| minerva-argos | 36.04      | 67.50          | 38.75       |
| minerva-palm  | 36.55      | 68.00          | 38.91       |
|               |            |                |             |
| qwen-argos    | 40.19      | 70.50          | 42.68       |
| qwen-palm     | 40.87      | 69.00          | 43.94       |
|               |            |                |             |
| gemma-argos   | 37.19      | 75.00          | 39.78       |
| gemma-palm    | 40.75      | 74.50          | 43.46       |

---

## How to Use

```python
import torch
import torch.nn.functional as F

from torch import Tensor
from transformers import AutoTokenizer, AutoModel


def last_token_pool(last_hidden_states: Tensor,
                 attention_mask: Tensor) -> Tensor:
    left_padding = (attention_mask[:, -1].sum() == attention_mask.shape[0])
    if left_padding:
        return last_hidden_states[:, -1]
    else:
        sequence_lengths = attention_mask.sum(dim=1) - 1
        batch_size = last_hidden_states.shape[0]
        return last_hidden_states[torch.arange(batch_size, device=last_hidden_states.device), sequence_lengths]


def get_detailed_instruct(task_description: str, query: str) -> str:
    return f'{task_description}\nQuery: {query}'



model = AutoModel.from_pretrained('yuri-no/qwen-palm', torch_dtype=torch.bfloat16).to('cuda')
tokenizer = AutoTokenizer.from_pretrained('yuri-no/qwen-palm')

# Each query must come with a one-sentence instruction that describes the task
task = 'Given a search query, retrieve relevant passages that answer the query'
queries = [
    get_detailed_instruct(task, 'In che anno il Napoli ha vinto il suo terzo scudetto?'),
    get_detailed_instruct(task, 'Quali sono le migliori Università italiane?'),
]
# No need to add instruction for retrieval documents
documents = [
    "Dopo un'attesa durata 33 anni, il Napoli è Campione d'Italia per la terza volta. Per la certezza aritmetica serviva che non perdesse fuori casa con l'Udinese ed è bastato un pareggio per 1-1, avvenuto con il brivido del gol bianconero firmato da Lovric e poi con il pareggio di Osimhen al 52'. La partita di giovedì 4 maggio 2023, trasmessa anche sui maxi-schermi dello Stadio Maradona, è diventata così così in una grande festa per tutto il popolo napoletano e una pagina indimenticabile nella storia del calcio italiano.",
    "L’Università di Bologna si conferma ancora una volta tra le migliori d’Italia. Stando a un’analisi delle più autorevoli classifiche universitarie i cui risultati sono stati pubblicati dalla piattaforma di apprendimento Preply, la quale ha esaminato le classifiche accademiche di U.S. News in collaborazione con l'istituto di analisi Clarivate, sono stati analizzati i dieci corsi di laurea più popolari nelle principali città universitarie italiane.",
    "Il Decreto Legislativo 7 marzo 2005 n. 82 Codice dell'Amministrazione digitale, definisce le pubblicazioni contenute su supporti informatici valide e rilevanti a tutti gli effetti di legge in quanto la riproduzione è effettuata in modo tale da garantire la conformità dei documenti agli atti originali. Cio' al fine di rendere possibile l'esonero della produzione ed esibizione del formato originale su supporto cartaceo quando richiesto ad ogni effetto di legge."
]
input_texts = queries + documents

max_length = 512
# Tokenize the input texts
batch_dict = tokenizer(input_texts, max_length=max_length, padding=True, truncation=True, return_tensors='pt').to('cuda')

outputs = model(**batch_dict)
embeddings = last_token_pool(outputs.last_hidden_state, batch_dict['attention_mask'])

# normalize embeddings
embeddings = F.normalize(embeddings, p=2, dim=1)
scores = (embeddings[:2] @ embeddings[2:].T) * 100

print(scores.tolist())
# [[55.5, 28.75, 18.0],
#  [24.75, 62.0, 19.375]]
```
---