1from vllm import LLM, SamplingParams
2from src.SLIMER_Prompter import SLIMER_PARALLEL_instruction_prompter
3from src.SFT_finetuning.commons.prompter import Prompter
4
5vllm_model = LLM(model="expertai/LLaMAntino-3-SLIMER-IT-PARALLEL")
6tokenizer = vllm_model.get_tokenizer()
7
8# suggested temperature 0, max_tokens hyperparam
9cutoff_len = 4096
10sampling_params = SamplingParams(temperature=0, max_tokens=1000, stop=tokenizer.eos_token)
11
12# given list of NE types and dictionary of Def and Guidelines for each --> returns instruction
13slimer_prompter = SLIMER_PARALLEL_instruction_prompter("SLIMER_PARALLEL_instruction_it", './src/templates')
14
15# create a dictionary of dictionaries, each NE_type as key should have a {Definition: str, Guidelines: str} value
16ne_types_list = ['ORGANIZZAZIONE', 'UNIVERSITÀ', 'LOCALITÀ', 'PERSONA', 'CONFERENZA']
17def_guidelines_per_NE_dict = {
18 'ORGANIZZAZIONE': {
19 'Definizione': "'organizzazione' si riferisce a gruppi strutturati, istituzioni, aziende o associazioni.",
20 '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)."
21 },
22 'UNIVERSITÀ': {
23 'Definizione': "UNIVERSITÀ rappresenta istituzioni educative che offrono programmi di istruzione superiore e ricerca accademica.",
24 '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)."
25 },
26 'LOCALITÀ': {
27 'Definizione': "LOCALITÀ si riferisce a entità geografiche specifiche come luoghi, strutture e istituzioni che rappresentano luoghi fisici con indirizzi o funzioni distintive.",
28 '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à."
29 },
30 'PERSONA': {
31 'Definizione': "PERSONA si riferisce a individui, inclusi personaggi pubblici, celebrità e personalità di rilievo.",
32 'Linee Guida': "Se una persona sta lavorando in ambito di ricerca (incluso professore, dottorando, ricercatore in aziende, ecc.), evitare di etichettarla come entità PERSONA."
33 },
34 'CONFERENZA': {
35 '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.",
36 '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."
37 }
38}
39
40instruction = slimer_prompter.generate_prompt(
41 ne_tags=", ".join(ne_types_list),
42 def_and_guidelines=json.dumps(def_guidelines_per_NE_dict, indent=2),
43 expected_json_format=json.dumps({k: [] for k in def_guidelines_per_NE_dict.keys()}, indent=2)
44)
45
46input_text = 'Gli approcci tipici dei modelli generativi includono classificatori naive Bayes, modelli a mescolanza gaussiana, autoencoder variazionali e altri.'
47
48# this promper formats the input text to analize with SLIMER instruction
49input_instruction_prompter = Prompter('LLaMA3-chat-NOheaders', template_path='./src/SFT_finetuning/templates')
50
51system_message = "Sei un utile assistente per il riconoscimento di entità nel testo, istruito per restituire JSON."
52conversation = [
53 {"role": "system", "content": system_message},
54 {"role": "user", "content": input_instruction_prompter.generate_prompt(input=input_text, instruction=instruction)}, # the input_text + instruction
55]
56prompt = tokenizer.apply_chat_template(conversation, tokenize=False, truncation=True, max_length=cutoff_len, add_generation_prompt=True)
57
58responses = vllm_model.generate(prompt, sampling_params)