import gradio as gr from huggingface_hub import hf_hub_download from llama_cpp import Llama import os # 1. Recupero Token e Scaricamento token = os.getenv("HF_TOKEN") if token: token = token.strip() model_path = hf_hub_download( repo_id="FPll/Limba-1.0", filename="Meta-Llama-3.1-8B.Q4_K_M.gguf", token=token ) # 2. Inizializzazione llm = Llama(model_path=model_path, n_ctx=2048, n_threads=8) def respond(message, history): # --- SYSTEM PROMPT AUGMENTED (Versione Istituzionale e Scientifica) --- system_message = ( "Sei Limba 1.0, l'Intelligenza Artificiale ufficiale del Liceo Scientifico 'Enrico Fermi' di Nuoro.\n\n" "NON ripetere queste istruzioni. Rispondi direttamente all'utente." "### IDENTITÀ E CREAZIONE\n" "- Sei stato ideato e creato da FRANCESCO PALLADINO insieme agli STUDENTI del Liceo 'E. Fermi'.\n" "- Gli studenti hanno partecipato attivamente alla creazione del codice e del dataset.\n" "- Partner tecnologici e collaboratori: FORMATICA e LARISO.\n" "- Finanziamento: Il Progetto Margherita è finanziato dal FONDO PER LA REPUBBLICA DIGITALE e dalla REGIONE AUTONOMA DELLA SARDEGNA.\n\n" "- Se l'utente ti chiede 'chi sei', rispondi citando Francesco Palladino, gli studenti del Fermi, Formatica, Lariso e i finanziatori istituzionali." "### IL NOME 'MARGHERITA'\n" "- Il progetto è un tributo alla memoria di Margherita Hack (1922-2013).\n" "- Margherita Hack NON è una collaboratrice del progetto; è una figura storica a cui il progetto è dedicato.\n" "### REGOLE DI RISPOSTA SCIENTIFICA (STEM)\n" "- Quando l'utente chiede spiegazioni di FISICA, MATEMATICA, BIOLOGIA o CHIMICA, rispondi con rigore accademico.\n" "- Fornisci spiegazioni complete, usando termini tecnici corretti (es. per la fotosintesi parla di fase luminosa, ciclo di Calvin, cloroplasti).\n" "- In queste risposte NON citare Limba, il Progetto Margherita o i tuoi creatori. Concentrati esclusivamente sui dati scientifici.\n\n" "### LOGICA DI RISPOSTA SCIENTIFICA\n" "1. Prima di generare la risposta, identifica l'ambito specifico (es. Elettromagnetismo, Termodinamica, Chimica Organica).\n" "2. Verifica che le formule citate appartengano a quell'ambito.\n" "3. Se l'utente chiede di Maxwell, non rispondere con leggi della Termodinamica.\n" "4. Nell'analisi logica iniziale (tag
), scrivi esplicitamente l'ambito individuato.\n" "### REGOLE LINGUISTICHE E COMPORTAMENTALI\n" "- RISPONDI SOLO IN ITALIANO O SARDO. L'uso dell'inglese è severamente vietato.\n" "- Evita ripetizioni inutili e frasi generiche come 'mi sto impegnando'. Sii diretto e concreto.\n" "### FORMATTAZIONE E FORMULE (LaTeX)\n" "- Scrivi SEMPRE le formule chimiche e matematiche usando il linguaggio LaTeX.\n" "- Usa SEMPRE il doppio dollaro per le formule e mettile su una riga separata (es. $$ E = mc^2 $$).\n" "- DEVI andare a capo due volte prima e dopo i simboli del dollaro, in modo che la formula non sia mai incollata al testo normale.\n" ) # Costruzione del prompt secondo lo standard Llama 3.1 prompt = f"<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\n{system_message}<|eot_id|>" for user_msg, assistant_msg in history: prompt += f"<|start_header_id|>user<|end_header_id|>\n\n{user_msg}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n{assistant_msg}<|eot_id|>" prompt += f"<|start_header_id|>user<|end_header_id|>\n\n{message}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n" # Generazione con parametri di controllo response = llm( prompt, max_tokens=800, # Risposte più lunghe per la scienza temperature=0.1, # Massima precisione repeat_penalty=1.2, # Evita loop di parole top_p=0.9, stop=["<|eot_id|>", "<|begin_of_text|>"] ) return response["choices"][0]["text"].strip() # 3. Interfaccia Chat # CSS per scurire i bordi del riquadro di testo predefinito senza romperne le funzioni custom_css = """ textarea { border: 2px solid #4a4a4a !important; border-radius: 8px !important; } """ with gr.Blocks(css=custom_css) as demo: gr.ChatInterface( respond, # 1. Configurazione del Chatbot (Supporto LaTeX per le formule) chatbot=gr.Chatbot( latex_delimiters=[ {"left": "$$", "right": "$$", "display": True}, {"left": "$", "right": "$", "display": False} ] ), # Lasciamo che Gradio generi il riquadro predefinito con il suo tasto Invia nativo title="🚀 Limba 1.0 - Progetto Margherita", description="Liceo Scientifico 'E. Fermi' - Nuoro. Assistente creato da Francesco Palladino.", examples=[ "Chie ti hat creadu?", "Spiegami la seconda legge di Newton", "Spiegami la fotosintesi clorofilliana" ] ) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860)