Italian Retrieval LLM Adapters
Collection
6 items
•
Updated
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.
Benchmark Results on MIRACL-ita-ArgosTranslate 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 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 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 |
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-argos', torch_dtype=torch.bfloat16).to('cuda')
tokenizer = AutoTokenizer.from_pretrained('yuri-no/qwen-argos')
# 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())
# [[49.75, 25.375, 15.25],
# [20.75, 56.75, 13.5625]]