Limba1.0 / app.py
FPll's picture
Update app.py
89b4666 verified
Raw
History Blame Contribute Delete
5.76 kB
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)