Spaces:
Sleeping
Sleeping
| 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 <details>), 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) |