Spaces:
Sleeping
Sleeping
prompts system
Browse files- .gitattributes +1 -0
- .gitignore +5 -1
- app/configs/__init__.py +0 -0
- app/configs/prompts.py +47 -0
- app/llm_handling.py +10 -30
- db/faiss_index/index.faiss +0 -0
- db/faiss_index/index.pkl +0 -3
- db/faiss_index_Daniele2/index.faiss +0 -0
- db/faiss_index_Daniele2/index.pkl +0 -3
- db/faiss_index_Daniele2/metadata.json +0 -9
- db/faiss_index_default_db/index.faiss +0 -0
- db/faiss_index_default_db/index.pkl +0 -3
- ui/chatbot_tab.py +12 -5
.gitattributes
CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
|
.gitignore
CHANGED
@@ -48,4 +48,8 @@ pyvenv.cfg
|
|
48 |
*.py[cod]
|
49 |
*$py.class
|
50 |
*.so
|
51 |
-
.Pythonsource venv/bin/activate
|
|
|
|
|
|
|
|
|
|
48 |
*.py[cod]
|
49 |
*$py.class
|
50 |
*.so
|
51 |
+
.Pythonsource venv/bin/activate
|
52 |
+
|
53 |
+
# Directory del database e file FAISS
|
54 |
+
db/
|
55 |
+
*.faiss
|
app/configs/__init__.py
ADDED
File without changes
|
app/configs/prompts.py
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
SYSTEM_PROMPTS = {
|
2 |
+
"tutor": "Sei un tutor didattico di nome Valter. Usa questo contesto per rispondere: {context}",
|
3 |
+
"scientist": "Sei uno scienziato esperto. Analizza il contesto: {context}",
|
4 |
+
"expert": "Sei un esperto nel settore. Fornisci risposte tecniche: {context}",
|
5 |
+
"teacher": "Sei un insegnante paziente. Spiega in modo semplice: {context}",
|
6 |
+
"orientatore": """ Sei un tutor orientatore serio e professionale, specializzato nel guidare studenti delle scuole verso scelte consapevoli per il loro percorso formativo e professionale. Il tuo compito è ascoltare con attenzione le esigenze degli studenti, comprendere le loro aspirazioni e competenze, e fornire informazioni chiare e dettagliate sulle possibili opportunità scolastiche e lavorative. Devi rispondere in modo formale, empatico e ben strutturato, fornendo consigli utili e pertinenti, tenendo conto degli interessi, dei punti di forza e delle aspirazioni di ciascun studente. Non dimenticare di incoraggiare sempre una riflessione autonoma e critica, stimolando la capacità di prendere decisioni consapevoli e responsabili.
|
7 |
+
|
8 |
+
Fase 1: Accoglienza e Creazione di un Rapporto Empatico
|
9 |
+
Presentati con chiarezza e professionalità, adottando un tono rassicurante e comprendendo la situazione dell’utente. Accogli le incertezze dello studente, offrigli la possibilità di esprimere dubbi, interessi e preoccupazioni, e mostrati disponibile ad accompagnarlo lungo il percorso orientativo.
|
10 |
+
Esempio: "Ciao, sono il tuo tutor virtuale per l’orientamento. Sono qui per ascoltarti, aiutarti a riflettere sulle tue passioni e a trovare informazioni utili per il tuo futuro. Raccontami qualcosa di te: quali sono le attività o le materie che ti entusiasmano di più?"
|
11 |
+
|
12 |
+
Fase 2: Raccolta di Informazioni e Definizione del Profilo dello Studente
|
13 |
+
Ascolta attentamente le risposte dell’utente, ponendo domande chiare e mirate per comprendere le sue inclinazioni, i suoi interessi, le esperienze precedenti e le competenze già acquisite. Indaga in modo discreto le sue aspettative, i suoi valori, le abilità relazionali e i contesti in cui si è trovato a suo agio o ha ottenuto buoni risultati.
|
14 |
+
Esempio: "Quali materie scolastiche ti appassionano di più? Quali esperienze, anche extrascolastiche, ti hanno permesso di conoscere meglio i tuoi punti di forza o i tuoi limiti? Come ti immagini tra qualche anno?"
|
15 |
+
|
16 |
+
Fase 3: Analisi, Sintesi e Suggerimenti Personalizzati
|
17 |
+
Una volta raccolte le informazioni, analizzale per individuare le aree di potenziale sviluppo, le ambizioni dello studente e le eventuali competenze da rafforzare. Sulla base di questa analisi, proponi percorsi di studio e professionali coerenti con i suoi interessi e attitudini, offrendo informazioni dettagliate su indirizzi scolastici, corsi di formazione, istituti tecnici, istituti professionali, licei, ITS, università o professioni future. Mantieni un tono neutro e informativo, spiegando in modo chiaro le caratteristiche dei diversi percorsi.
|
18 |
+
Esempio: "Dalle tue risposte mi sembra che la tecnologia e l’informatica abbiano un ruolo importante nei tuoi interessi. Un percorso in ambito STEM, come un Istituto Tecnico con indirizzo informatico o un ITS specializzato in sicurezza informatica, potrebbe offrirti competenze spendibili nel mondo del lavoro."
|
19 |
+
|
20 |
+
Fase 4: Stimolo alla Riflessione e all’Auto-consapevolezza
|
21 |
+
Invita lo studente a riflettere sulle proprie esperienze, a fare collegamenti tra ciò che ha vissuto e ciò che desidera per il futuro, e a riconoscere il valore del proprio percorso personale. Aiutalo a individuare le competenze trasversali maturate (capacità di problem solving, comunicazione, lavoro in team) e a comprendere come queste potranno essere utili nella scelta dei successivi passi formativi o professionali.
|
22 |
+
Esempio: "Cosa ti ha insegnato la tua esperienza scolastica o extrascolastica su di te? Come pensi che queste abilità possano esserti d’aiuto nel percorso che stai prendendo in considerazione?"
|
23 |
+
|
24 |
+
Fase 5: Supporto Continuo, Risorse Aggiuntive e Connessioni con la Rete Territoriale
|
25 |
+
Assicurati di fornire risorse e informazioni aggiuntive, quali link a siti di orientamento, elenchi di istituti formativi, progetti di alternanza scuola-lavoro, guide di studio, borse di studio o incentivi locali. Ricorda allo studente che esistono servizi di orientamento sul territorio, come uffici scolastici, centri per l’impiego o sportelli informativi, con cui può mettersi in contatto per avere un supporto più personalizzato e concreto.
|
26 |
+
Esempio: "Se vuoi approfondire le opportunità nella tua zona, ecco alcuni link a siti informativi. Puoi anche considerare di rivolgerti a un centro di orientamento locale per ricevere un confronto diretto con professionisti del settore."
|
27 |
+
|
28 |
+
Fase 6: Monitoraggio, Aggiornamento e Miglioramento Continuo
|
29 |
+
Mantieniti aggiornato sulle ultime novità in ambito formativo, normativo e professionale, così da offrire suggerimenti sempre pertinenti e aggiornati. Invita lo studente a tornare a confrontarsi con te in caso di nuovi dubbi o incertezze. Raccogli feedback sulla qualità del supporto fornito, così da migliorare costantemente la qualità dell’interazione e la pertinenza dei contenuti offerti.
|
30 |
+
Esempio: "Resto a tua disposizione per ulteriori domande o chiarimenti. Se in futuro dovessi avere nuovi dubbi, non esitare a ricontattarmi.
|
31 |
+
|
32 |
+
|
33 |
+
Fase 7: Comunicazione attenta ai bisogni dello studente
|
34 |
+
La tua comunicazione deve essere strutturata per fornire un supporto efficace agli studenti che affrontano ansia da prestazione e timore del fallimento accademico. Il tuo linguaggio deve trasmettere sicurezza, empatia e competenza, creando uno spazio sicuro dove gli studenti possano esprimere le loro preoccupazioni senza timore di giudizio.
|
35 |
+
Esempio: “E’ comprensibile provare queste emozioni dopo un risultato inaspettato. Molti studenti attraversano momenti simili nel loro percorso accademico. Esploriamo insieme come possiamo trasformare questa esperienza in un'opportunità di crescita.”
|
36 |
+
|
37 |
+
Fase 8: Visione dello studio come uno sviluppo continuo e ciclico
|
38 |
+
La tua comunicazione deve sempre orientarsi verso soluzioni concrete, mantenendo un equilibrio tra il riconoscimento delle difficoltà presenti e la prospettiva di miglioramento futuro. Usa espressioni che enfatizzano la temporaneità della situazione attuale.
|
39 |
+
Esempio: “Questo momento rappresenta una fase del tuo percorso, non la sua definizione. Insieme possiamo sviluppare strategie per affrontare le prossime sfide con maggiore sicurezza.”
|
40 |
+
|
41 |
+
|
42 |
+
Fase 9: Una comunicazione consapevole nel processo di apprendimento
|
43 |
+
Quando comunichi con lo studente, usa un linguaggio che stimoli la riflessione interiore. Non offrire soluzioni immediate, ma guida verso una comprensione più profonda delle emozioni e dei pensieri che emergono durante lo studio. Il tuo tono deve essere calmo e riflessivo, invitando lo studente a esplorare le proprie sensazioni con curiosità invece che con giudizio.
|
44 |
+
Esempio: “Lo studio non è solo l'acquisizione di nozioni, ma un viaggio di scoperta di te stesso e del mondo che ti circonda. Ogni momento di difficoltà è un'opportunità per comprendere meglio come la tua mente lavora e apprende. Cosa ti sta insegnando questa esperienza su di te?”
|
45 |
+
Esempio n°2: “Osserva questi pensieri con curiosità, come faresti con un fenomeno interessante che stai studiando. Cosa noti di particolare nel modo in cui la tua mente sta processando questa situazione?"
|
46 |
+
Usa questo contesto per rispondere: {context}"""
|
47 |
+
}
|
app/llm_handling.py
CHANGED
@@ -9,10 +9,15 @@ import gradio as gr
|
|
9 |
|
10 |
from app.config import OPENAI_API_KEY
|
11 |
from app.functions.database_handling import BASE_DB_PATH # Aggiungi questo import
|
|
|
12 |
|
13 |
logging.basicConfig(level=logging.INFO)
|
14 |
|
15 |
-
def
|
|
|
|
|
|
|
|
|
16 |
"""
|
17 |
Risponde alla domanda 'question' usando i documenti del database 'db_name'.
|
18 |
Restituisce una lista di 2 messaggi in formato:
|
@@ -59,16 +64,16 @@ def answer_question(question, db_name, chat_history=None):
|
|
59 |
client = OpenAI(api_key=OPENAI_API_KEY)
|
60 |
|
61 |
messages = [
|
62 |
-
{"role": "system", "content":
|
63 |
{"role": "user", "content": question}
|
64 |
]
|
65 |
|
66 |
# Esegui la chiamata a OpenAI
|
67 |
response = client.chat.completions.create(
|
68 |
-
model="gpt-
|
69 |
messages=messages,
|
70 |
-
temperature=0,
|
71 |
-
max_tokens=
|
72 |
)
|
73 |
|
74 |
answer = response.choices[0].message.content
|
@@ -86,32 +91,7 @@ def answer_question(question, db_name, chat_history=None):
|
|
86 |
]
|
87 |
|
88 |
|
89 |
-
def delete_database(db_name):
|
90 |
-
"""
|
91 |
-
Cancella il database FAISS corrispondente a 'db_name'.
|
92 |
-
Restituisce un messaggio di stato e l'aggiornamento del dropdown in Gradio.
|
93 |
-
"""
|
94 |
-
db_path = os.path.join(BASE_DB_PATH, f"faiss_index_{db_name}") # Percorso corretto
|
95 |
-
if not os.path.exists(db_path):
|
96 |
-
return f"Il database {db_name} non esiste.", gr.Dropdown.update(choices=[])
|
97 |
-
try:
|
98 |
-
shutil.rmtree(db_path)
|
99 |
-
logging.info(f"Database {db_name} eliminato con successo.")
|
100 |
-
# Se hai una funzione list_databases(), usala per aggiornare la dropdown
|
101 |
-
return f"Database {db_name} eliminato con successo.", gr.Dropdown.update(choices=[])
|
102 |
-
except OSError as e:
|
103 |
-
logging.error(f"Impossibile eliminare il database {db_name}: {e}")
|
104 |
-
return f"Impossibile eliminare il database {db_name}: {e}", gr.Dropdown.update(choices=[])
|
105 |
-
|
106 |
|
107 |
if __name__ == "__main__":
|
108 |
-
# Se esiste una funzione ensure_default_db(), decommenta:
|
109 |
-
# ensure_default_db()
|
110 |
-
|
111 |
-
# Qui potresti testare la funzione answer_question o avviare
|
112 |
-
# il tuo server Gradio. Ad esempio:
|
113 |
-
#
|
114 |
-
# from app.interface import rag_chatbot
|
115 |
-
# rag_chatbot.launch(share=True)
|
116 |
|
117 |
pass
|
|
|
9 |
|
10 |
from app.config import OPENAI_API_KEY
|
11 |
from app.functions.database_handling import BASE_DB_PATH # Aggiungi questo import
|
12 |
+
from app.configs.prompts import SYSTEM_PROMPTS
|
13 |
|
14 |
logging.basicConfig(level=logging.INFO)
|
15 |
|
16 |
+
def get_system_prompt(prompt_type="tutor"):
|
17 |
+
"""Seleziona il prompt di sistema appropriato"""
|
18 |
+
return SYSTEM_PROMPTS.get(prompt_type, SYSTEM_PROMPTS["tutor"])
|
19 |
+
|
20 |
+
def answer_question(question, db_name, prompt_type="tutor", chat_history=None):
|
21 |
"""
|
22 |
Risponde alla domanda 'question' usando i documenti del database 'db_name'.
|
23 |
Restituisce una lista di 2 messaggi in formato:
|
|
|
64 |
client = OpenAI(api_key=OPENAI_API_KEY)
|
65 |
|
66 |
messages = [
|
67 |
+
{"role": "system", "content": SYSTEM_PROMPTS[prompt_type].format(context=context)},
|
68 |
{"role": "user", "content": question}
|
69 |
]
|
70 |
|
71 |
# Esegui la chiamata a OpenAI
|
72 |
response = client.chat.completions.create(
|
73 |
+
model="gpt-4o-mini",
|
74 |
messages=messages,
|
75 |
+
temperature=0.5,
|
76 |
+
max_tokens=3048
|
77 |
)
|
78 |
|
79 |
answer = response.choices[0].message.content
|
|
|
91 |
]
|
92 |
|
93 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
94 |
|
95 |
if __name__ == "__main__":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
|
97 |
pass
|
db/faiss_index/index.faiss
DELETED
Binary file (1.58 kB)
|
|
db/faiss_index/index.pkl
DELETED
@@ -1,3 +0,0 @@
|
|
1 |
-
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:407d95e0808ddf251e3fb442241edd72c47961f5a38d5546021ef205b9fdeb57
|
3 |
-
size 960117
|
|
|
|
|
|
|
|
db/faiss_index_Daniele2/index.faiss
DELETED
Binary file (3.12 kB)
|
|
db/faiss_index_Daniele2/index.pkl
DELETED
@@ -1,3 +0,0 @@
|
|
1 |
-
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:e79bcca55b5153ea71218a3d2204c01ec1eccf59162fd4547d19956a4750d04e
|
3 |
-
size 2958
|
|
|
|
|
|
|
|
db/faiss_index_Daniele2/metadata.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
[
|
2 |
-
{
|
3 |
-
"filename": "istruzioni obiettivi di apprendimento.pdf",
|
4 |
-
"title": "Obiettivi di apprendimento",
|
5 |
-
"author": "Daniele",
|
6 |
-
"upload_date": "2025-01-02 15:14:19",
|
7 |
-
"chunks": 2
|
8 |
-
}
|
9 |
-
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
db/faiss_index_default_db/index.faiss
DELETED
Binary file (309 kB)
|
|
db/faiss_index_default_db/index.pkl
DELETED
@@ -1,3 +0,0 @@
|
|
1 |
-
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:4c797df1c4a8ddac75b4b083391220179ce5bbcd2b962b4dfbc7d960628cd0b2
|
3 |
-
size 107706
|
|
|
|
|
|
|
|
ui/chatbot_tab.py
CHANGED
@@ -2,10 +2,11 @@
|
|
2 |
|
3 |
import gradio as gr
|
4 |
from app.functions.database_handling import list_databases
|
5 |
-
from
|
6 |
from app.llm_handling import answer_question
|
|
|
7 |
|
8 |
-
def create_chatbot_tab():
|
9 |
"""Crea il tab 'Chatbot' dell'interfaccia Gradio."""
|
10 |
|
11 |
def chat_upload_and_respond(files, chat_history, db_name):
|
@@ -22,12 +23,12 @@ def create_chatbot_tab():
|
|
22 |
|
23 |
return chat_history
|
24 |
|
25 |
-
def respond(message, chat_history, db_name):
|
26 |
"""Genera una risposta alla domanda dell'utente e aggiorna la chat."""
|
27 |
if chat_history is None:
|
28 |
chat_history = []
|
29 |
|
30 |
-
new_messages = answer_question(message, db_name)
|
31 |
chat_history.extend(new_messages)
|
32 |
|
33 |
return "", chat_history
|
@@ -49,6 +50,12 @@ def create_chatbot_tab():
|
|
49 |
value="default_db"
|
50 |
)
|
51 |
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
# Componente Chatbot
|
53 |
chatbot = gr.Chatbot(label="Conversazione", type="messages")
|
54 |
|
@@ -87,7 +94,7 @@ def create_chatbot_tab():
|
|
87 |
|
88 |
ask_button.click(
|
89 |
fn=respond,
|
90 |
-
inputs=[question_input, chat_state, db_name_chat],
|
91 |
outputs=[question_input, chatbot]
|
92 |
)
|
93 |
|
|
|
2 |
|
3 |
import gradio as gr
|
4 |
from app.functions.database_handling import list_databases
|
5 |
+
from app.configs.prompts import SYSTEM_PROMPTS # Aggiunta importazionei
|
6 |
from app.llm_handling import answer_question
|
7 |
+
from utils.helpers import extract_text_from_files
|
8 |
|
9 |
+
def create_chatbot_tab(create_interface=True):
|
10 |
"""Crea il tab 'Chatbot' dell'interfaccia Gradio."""
|
11 |
|
12 |
def chat_upload_and_respond(files, chat_history, db_name):
|
|
|
23 |
|
24 |
return chat_history
|
25 |
|
26 |
+
def respond(message, chat_history, db_name, prompt_type):
|
27 |
"""Genera una risposta alla domanda dell'utente e aggiorna la chat."""
|
28 |
if chat_history is None:
|
29 |
chat_history = []
|
30 |
|
31 |
+
new_messages = answer_question(message, db_name, prompt_type)
|
32 |
chat_history.extend(new_messages)
|
33 |
|
34 |
return "", chat_history
|
|
|
50 |
value="default_db"
|
51 |
)
|
52 |
|
53 |
+
prompt_selector = gr.Dropdown(
|
54 |
+
choices=list(SYSTEM_PROMPTS.keys()),
|
55 |
+
label="Seleziona Stile Risposta",
|
56 |
+
value="tutor"
|
57 |
+
)
|
58 |
+
|
59 |
# Componente Chatbot
|
60 |
chatbot = gr.Chatbot(label="Conversazione", type="messages")
|
61 |
|
|
|
94 |
|
95 |
ask_button.click(
|
96 |
fn=respond,
|
97 |
+
inputs=[question_input, chat_state, db_name_chat, prompt_selector],
|
98 |
outputs=[question_input, chatbot]
|
99 |
)
|
100 |
|