File size: 5,759 Bytes
0cbd70a
 
 
 
 
ac04cd9
f9a7324
 
 
0cbd70a
 
 
 
 
 
 
93aaa11
3020292
0cbd70a
 
3020292
ac04cd9
3020292
89b4666
3020292
 
 
 
 
89b4666
3020292
 
 
 
 
 
 
89b4666
 
 
 
 
3020292
 
 
b83a345
 
 
 
ac04cd9
39b9b12
3020292
39b9b12
 
 
 
 
3020292
93aaa11
39b9b12
3020292
 
 
 
93aaa11
39b9b12
0cbd70a
93aaa11
0cbd70a
ac04cd9
ffd2013
7ad9dee
00c684d
7ad9dee
51766b7
00c684d
 
ffd2013
 
9d6ce47
 
 
 
 
 
 
 
 
 
7ad9dee
9d6ce47
 
 
 
 
 
3ee0695
9d6ce47
 
 
 
0cbd70a
53ea27f
 
 
3ee0695
 
 
ffd2013
 
 
00c684d
 
 
51766b7
 
 
7ad9dee
 
 
0cbd70a
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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)