Update app.py
Browse files
app.py
CHANGED
@@ -17,7 +17,7 @@ load_dotenv()
|
|
17 |
|
18 |
# Configura il logging
|
19 |
logging.basicConfig(
|
20 |
-
level=logging.
|
21 |
format="%(asctime)s - %(levelname)s - %(message)s",
|
22 |
handlers=[logging.FileHandler("app.log"), logging.StreamHandler()]
|
23 |
)
|
@@ -35,7 +35,7 @@ client = InferenceClient(token=API_KEY)
|
|
35 |
# Definisci i percorsi dei file
|
36 |
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
37 |
RDF_FILE = os.path.join(BASE_DIR, "Ontologia.rdf")
|
38 |
-
HF_MODEL = "Qwen/Qwen2.5-72B-Instruct"
|
39 |
|
40 |
MAX_CLASSES = 30
|
41 |
MAX_PROPERTIES = 30
|
@@ -171,7 +171,7 @@ def prepare_retrieval():
|
|
171 |
else:
|
172 |
logger.info(f"File RDF trovato: {RDF_FILE}")
|
173 |
|
174 |
-
# Verifica se documents.json esiste, altrimenti
|
175 |
if not os.path.exists(DOCUMENTS_FILE):
|
176 |
logger.info(f"File {DOCUMENTS_FILE} non trovato. Estrazione dell'ontologia.")
|
177 |
try:
|
@@ -182,7 +182,7 @@ def prepare_retrieval():
|
|
182 |
else:
|
183 |
logger.info(f"File {DOCUMENTS_FILE} trovato.")
|
184 |
|
185 |
-
# Verifica se faiss.index esiste, altrimenti
|
186 |
if not os.path.exists(FAISS_INDEX_FILE):
|
187 |
logger.info(f"File {FAISS_INDEX_FILE} non trovato. Creazione dell'indice FAISS.")
|
188 |
try:
|
@@ -307,11 +307,11 @@ REGOLE STRINGENTI:
|
|
307 |
4) Se la domanda è generica (tipo 'Ciao, come stai?'), rispondi breve.
|
308 |
5) Se trovi risultati, la risposta finale deve essere la query SPARQL (una sola riga).
|
309 |
6) Se non trovi nulla, rispondi con 'Nessuna info.'
|
310 |
-
7) Non multiline. Esempio: PREFIX base: <...> SELECT ?x WHERE {
|
311 |
|
312 |
Esempio:
|
313 |
Utente: Chi ha creato l'opera 'Amore e Psiche'?
|
314 |
-
Risposta: PREFIX base: <http://www.semanticweb.org/lucreziamosca/ontologies/progettoMuseo#> SELECT ?creatore WHERE {
|
315 |
|
316 |
FINE REGOLE
|
317 |
"""
|
@@ -324,7 +324,7 @@ Ho ottenuto questi risultati SPARQL:
|
|
324 |
Ora fornisci una breve spiegazione museale (massimo ~10 righe), senza inventare oltre i risultati.
|
325 |
"""
|
326 |
|
327 |
-
async def call_hf_model(prompt: str, temperature=0.5, max_tokens=1024) -> str:
|
328 |
"""Chiama il modello Hugging Face e gestisce la risposta."""
|
329 |
logger.debug("Chiamo HF con il seguente prompt:")
|
330 |
content_preview = (prompt[:300] + '...') if len(prompt) > 300 else prompt
|
@@ -332,15 +332,17 @@ async def call_hf_model(prompt: str, temperature=0.5, max_tokens=1024) -> str:
|
|
332 |
try:
|
333 |
resp = client.text_generation(
|
334 |
model=HF_MODEL,
|
335 |
-
|
336 |
parameters={
|
337 |
"temperature": temperature,
|
338 |
"max_new_tokens": max_tokens,
|
339 |
"top_p": 0.9
|
340 |
}
|
341 |
)
|
342 |
-
# La struttura della risposta
|
343 |
-
raw = resp
|
|
|
|
|
344 |
# Forza la risposta su una singola linea se multilinea
|
345 |
single_line = " ".join(raw.splitlines())
|
346 |
logger.debug(f"Risposta HF single-line: {single_line}")
|
|
|
17 |
|
18 |
# Configura il logging
|
19 |
logging.basicConfig(
|
20 |
+
level=logging.INFO, # Riduci il livello di logging per migliorare le prestazioni
|
21 |
format="%(asctime)s - %(levelname)s - %(message)s",
|
22 |
handlers=[logging.FileHandler("app.log"), logging.StreamHandler()]
|
23 |
)
|
|
|
35 |
# Definisci i percorsi dei file
|
36 |
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
37 |
RDF_FILE = os.path.join(BASE_DIR, "Ontologia.rdf")
|
38 |
+
HF_MODEL = "Qwen/Qwen2.5-72B-Instruct" # Assicurati che il modello sia supportato
|
39 |
|
40 |
MAX_CLASSES = 30
|
41 |
MAX_PROPERTIES = 30
|
|
|
171 |
else:
|
172 |
logger.info(f"File RDF trovato: {RDF_FILE}")
|
173 |
|
174 |
+
# Verifica se documents.json esiste, altrimenti generarlo
|
175 |
if not os.path.exists(DOCUMENTS_FILE):
|
176 |
logger.info(f"File {DOCUMENTS_FILE} non trovato. Estrazione dell'ontologia.")
|
177 |
try:
|
|
|
182 |
else:
|
183 |
logger.info(f"File {DOCUMENTS_FILE} trovato.")
|
184 |
|
185 |
+
# Verifica se faiss.index esiste, altrimenti crearlo
|
186 |
if not os.path.exists(FAISS_INDEX_FILE):
|
187 |
logger.info(f"File {FAISS_INDEX_FILE} non trovato. Creazione dell'indice FAISS.")
|
188 |
try:
|
|
|
307 |
4) Se la domanda è generica (tipo 'Ciao, come stai?'), rispondi breve.
|
308 |
5) Se trovi risultati, la risposta finale deve essere la query SPARQL (una sola riga).
|
309 |
6) Se non trovi nulla, rispondi con 'Nessuna info.'
|
310 |
+
7) Non multiline. Esempio: PREFIX base: <...> SELECT ?x WHERE { ... }.
|
311 |
|
312 |
Esempio:
|
313 |
Utente: Chi ha creato l'opera 'Amore e Psiche'?
|
314 |
+
Risposta: PREFIX base: <http://www.semanticweb.org/lucreziamosca/ontologies/progettoMuseo#> SELECT ?creatore WHERE { ?opera base:hasName "Amore e Psiche" . ?opera base:creatoDa ?creatore . }
|
315 |
|
316 |
FINE REGOLE
|
317 |
"""
|
|
|
324 |
Ora fornisci una breve spiegazione museale (massimo ~10 righe), senza inventare oltre i risultati.
|
325 |
"""
|
326 |
|
327 |
+
async def call_hf_model(prompt: str, temperature: float = 0.5, max_tokens: int = 1024) -> str:
|
328 |
"""Chiama il modello Hugging Face e gestisce la risposta."""
|
329 |
logger.debug("Chiamo HF con il seguente prompt:")
|
330 |
content_preview = (prompt[:300] + '...') if len(prompt) > 300 else prompt
|
|
|
332 |
try:
|
333 |
resp = client.text_generation(
|
334 |
model=HF_MODEL,
|
335 |
+
prompt, # Passa il prompt come argomento posizionale
|
336 |
parameters={
|
337 |
"temperature": temperature,
|
338 |
"max_new_tokens": max_tokens,
|
339 |
"top_p": 0.9
|
340 |
}
|
341 |
)
|
342 |
+
# La struttura della risposta potrebbe variare; verifica il campo corretto
|
343 |
+
raw = resp.get("generated_text", "")
|
344 |
+
if not raw:
|
345 |
+
raise ValueError("Nessun testo generato dal modello.")
|
346 |
# Forza la risposta su una singola linea se multilinea
|
347 |
single_line = " ".join(raw.splitlines())
|
348 |
logger.debug(f"Risposta HF single-line: {single_line}")
|