SLIMER-🇮🇹-PARALLEL
SLIMER-IT 🇮🇹 è un LLM specificamente istruito per il task di zero-shot NER in italiano 🇮🇹
Trainato su un numero ridotto di classi (PER, ORG, LOC), è progettato per annotare entità mai viste prima sfruttando un'istruzione arricchita con una DEFINIZIONE e LINEE GUIDA per l'entità denominata da estrarre.
Rispetto expertai/LLaMAntino-3-SLIMER-IT, questa versione permette di estrarre più tipi di entità in parallelo, con un conseguente minor costo computazionale, seppur con qualche drop a livello di prestazioni (-10 % MultiNERd).
GitHub repository: https://github.com/andrewzamai/SLIMER_IT/tree/parallel
Instruction Tuning Prompt
<|start_header_id|>user<|end_header_id|>
Ti viene fornito un input di testo (delimitato da tre virgolette) e un'istruzione.
Leggi il testo e rispondi all'istruzione alla fine.
"""
{input text}
"""
Instruction: Estrai le entità di tipo [lista_classi] dal testo che hai letto. Tieni conto che non tutte queste entità sono necessariamente presenti. Non estrarre quindi entità che non esistono nel testo, restituisci invece un elenco vuoto per quella classe. Assicurati che ogni entità sia assegnata ad una e una sola classe appropriata
Per aiutarti, ti vengono forniti una definizione e delle linee guida per ogni tipo di entità.
{
{"NE_type_1": {"Definition": "", "Guidelines": ""}
...
{"NE_type_N": {"Definition": "", "Guidelines": ""}
}
Restituisci solo un JSON. Il JSON deve seguire rigorosamente questo formato:{"NE_type_1": [], ..., "NE_type_N":[]}. Non restituire nient'altro, solo il JSON.
<|eot_id|><|start_header_id|>assistant<|end_header_id|>
from vllm import LLM, SamplingParams
from src.SLIMER_Prompter import SLIMER_PARALLEL_instruction_prompter
from src.SFT_finetuning.commons.prompter import Prompter
vllm_model = LLM(model="expertai/LLaMAntino-3-SLIMER-IT-PARALLEL")
tokenizer = vllm_model.get_tokenizer()
cutoff_len = 4096
sampling_params = SamplingParams(temperature=0, max_tokens=1000, stop=tokenizer.eos_token)
slimer_prompter = SLIMER_PARALLEL_instruction_prompter("SLIMER_PARALLEL_instruction_it", './src/templates')
ne_types_list = ['ORGANIZZAZIONE', 'UNIVERSITÀ', 'LOCALITÀ', 'PERSONA', 'CONFERENZA']
def_guidelines_per_NE_dict = {
'ORGANIZZAZIONE': {
'Definizione': "'organizzazione' si riferisce a gruppi strutturati, istituzioni, aziende o associazioni.",
'Linee Guida': "Evitare di etichettare termini generici come 'squadra' o 'gruppo'. Prestare attenzione a entità ambigue come 'Apple' (azienda vs. frutto) e 'Manchester United' (squadra sportiva vs. club di tifosi)."
},
'UNIVERSITÀ': {
'Definizione': "UNIVERSITÀ rappresenta istituzioni educative che offrono programmi di istruzione superiore e ricerca accademica.",
'Linee Guida': "Evitare di etichettare concetti generali come 'educazione' o 'accademia' come UNIVERSITÀ. Prestare attenzione a termini ambigui come 'Cambridge' (può riferirsi a diverse istituzioni) e 'Harvard' (può riferirsi a una persona)."
},
'LOCALITÀ': {
'Definizione': "LOCALITÀ si riferisce a entità geografiche specifiche come luoghi, strutture e istituzioni che rappresentano luoghi fisici con indirizzi o funzioni distintive.",
'Linee Guida': "Prestare attenzione a termini ambigui, ad esempio 'Amazon' (azienda, fiume e regione) e 'Cambridge' (città negli USA, città nel Regno Unito e università). Considerare il contesto e la specificità per classificare correttamente le località."
},
'PERSONA': {
'Definizione': "PERSONA si riferisce a individui, inclusi personaggi pubblici, celebrità e personalità di rilievo.",
'Linee Guida': "Se una persona sta lavorando in ambito di ricerca (incluso professore, dottorando, ricercatore in aziende, ecc.), evitare di etichettarla come entità PERSONA."
},
'CONFERENZA': {
'Definizione': "CONFERENZA si riferisce a eventi o raduni specifici in cui esperti, ricercatori e professionisti si riuniscono per presentare e discutere il loro lavoro in un particolare campo o disciplina.",
'Linee Guida': "Prestare attenzione quando si etichettano entità che potrebbero riferirsi a istituzioni, organizzazioni o associazioni piuttosto che a eventi specifici. Fare attenzione a termini ambigui come 'International Journal of Computer Vision', che potrebbe riferirsi a una pubblicazione piuttosto che a una conferenza."
}
}
instruction = slimer_prompter.generate_prompt(
ne_tags=", ".join(ne_types_list),
def_and_guidelines=json.dumps(def_guidelines_per_NE_dict, indent=2),
expected_json_format=json.dumps({k: [] for k in def_guidelines_per_NE_dict.keys()}, indent=2)
)
input_text = 'Gli approcci tipici dei modelli generativi includono classificatori naive Bayes, modelli a mescolanza gaussiana, autoencoder variazionali e altri.'
input_instruction_prompter = Prompter('LLaMA3-chat-NOheaders', template_path='./src/SFT_finetuning/templates')
system_message = "Sei un utile assistente per il riconoscimento di entità nel testo, istruito per restituire JSON."
conversation = [
{"role": "system", "content": system_message},
{"role": "user", "content": input_instruction_prompter.generate_prompt(input=input_text, instruction=instruction)},
]
prompt = tokenizer.apply_chat_template(conversation, tokenize=False, truncation=True, max_length=cutoff_len, add_generation_prompt=True)
responses = vllm_model.generate(prompt, sampling_params)