--- language: - it pipeline_tag: text-generation license: llama3 tags: - facebook - meta - pythorch - llama - llama-3 - llamantino - zero-shot NER - NER base_model: swap-uniba/LLaMAntino-3-ANITA-8B-Inst-DPO-ITA --- # 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
SLIMER-3-PARALLEL 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|>

```python 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() # suggested temperature 0, max_tokens hyperparam cutoff_len = 4096 sampling_params = SamplingParams(temperature=0, max_tokens=1000, stop=tokenizer.eos_token) # given list of NE types and dictionary of Def and Guidelines for each --> returns instruction slimer_prompter = SLIMER_PARALLEL_instruction_prompter("SLIMER_PARALLEL_instruction_it", './src/templates') # create a dictionary of dictionaries, each NE_type as key should have a {Definition: str, Guidelines: str} value 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.' # this promper formats the input text to analize with SLIMER instruction 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)}, # the input_text + 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) ```