AshenClock commited on
Commit
10352ef
·
verified ·
1 Parent(s): cf9b229

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +46 -30
app.py CHANGED
@@ -47,7 +47,12 @@ except Exception as e:
47
  raise e
48
 
49
  # Inizializza il client di Hugging Face
50
- client = InferenceClient(api_key=HF_API_KEY)
 
 
 
 
 
51
 
52
  def create_data_directory():
53
  """Crea la directory 'data/' se non esiste."""
@@ -207,38 +212,49 @@ def create_explanation_prompt(results_str: str) -> str:
207
  Ora fornisci una breve spiegazione museale (massimo ~10 righe), senza inventare oltre i risultati.
208
  """
209
 
210
- async def call_hf_model(prompt: str, temperature: float = 0.5, max_tokens: int = 150) -> str:
211
  """Chiama il modello Hugging Face tramite InferenceClient e gestisce la risposta."""
212
  logger.debug("Chiamo HF con il seguente prompt:")
213
  content_preview = (prompt[:300] + '...') if len(prompt) > 300 else prompt
214
  logger.debug(f"PROMPT => {content_preview}")
215
 
216
  try:
217
- # Utilizza il metodo chat.completions.create per interagire con il modello
218
- response = client.chat.completions.create(
219
- model=HF_MODEL,
220
- messages=[
221
- {"role": "user", "content": prompt}
222
- ],
223
- temperature=temperature,
 
 
224
  max_tokens=max_tokens,
 
225
  top_p=0.7,
226
- stream=False # Imposta su True se desideri gestire lo stream
227
  )
228
- logger.debug(f"Risposta completa dal modello: {response}")
229
 
230
- # Estrai il testo generato
231
- if isinstance(response, list) and len(response) > 0 and "generated_text" in response[0]:
232
- raw = response[0]["generated_text"]
233
- elif "generated_text" in response:
234
- raw = response["generated_text"]
 
 
 
235
  else:
236
- raise ValueError("Nessun campo 'generated_text' nella risposta.")
 
 
 
 
 
 
237
 
238
- # Forza la risposta su una singola linea se multilinea
239
- single_line = " ".join(raw.splitlines())
240
- logger.debug(f"Risposta HF single-line: {single_line}")
241
- return single_line.strip()
242
  except Exception as e:
243
  logger.error(f"Errore nella chiamata all'API Hugging Face tramite InferenceClient: {e}")
244
  raise HTTPException(status_code=500, detail=str(e))
@@ -290,9 +306,9 @@ async def generate_response(req: QueryRequest):
290
 
291
  if not is_ontology_related(user_input):
292
  # Prompt generico per domande non pertinenti all'ontologia
293
- generic_prompt = f"Utente: {user_input}\nAssistente: Rispondi cortesemente, anche se la domanda non è legata all'ontologia."
294
  try:
295
- response = await call_hf_model(generic_prompt, req.temperature, req.max_tokens)
296
  return {
297
  "type": "NATURAL",
298
  "response": response.strip()
@@ -312,11 +328,11 @@ async def generate_response(req: QueryRequest):
312
  return {"type": "ERROR", "response": f"Errore nel recupero delle linee: {e}"}
313
 
314
  sys_msg = create_system_message(retrieved_docs)
315
- prompt = f"{sys_msg}\nUtente: {user_input}\nAssistente:"
316
 
317
  # Primo tentativo
318
  try:
319
- r1 = await call_hf_model(prompt, req.temperature, req.max_tokens)
320
  logger.info(f"PRIMA RISPOSTA:\n{r1}")
321
  except Exception as e:
322
  logger.error(f"Errore nella chiamata al modello Hugging Face: {e}")
@@ -325,9 +341,9 @@ async def generate_response(req: QueryRequest):
325
  # Se non parte con "PREFIX base:"
326
  if not r1.startswith("PREFIX base:"):
327
  sc = f"Non hai risposto con query SPARQL su una sola riga. Riprova. Domanda: {user_input}"
328
- fallback_prompt = f"{sys_msg}\nAssistente: {r1}\nUtente: {sc}\nAssistente:"
329
  try:
330
- r2 = await call_hf_model(fallback_prompt, req.temperature, req.max_tokens)
331
  logger.info(f"SECONDA RISPOSTA:\n{r2}")
332
  if r2.startswith("PREFIX base:"):
333
  sparql_query = r2
@@ -353,9 +369,9 @@ async def generate_response(req: QueryRequest):
353
  logger.info(f"Query SPARQL eseguita con successo. Risultati: {len(results)}")
354
  except Exception as e:
355
  fallback = f"La query SPARQL ha fallito. Riprova. Domanda: {user_input}"
356
- fallback_prompt = f"{sys_msg}\nAssistente: {sparql_query}\nUtente: {fallback}\nAssistente:"
357
  try:
358
- r3 = await call_hf_model(fallback_prompt, req.temperature, req.max_tokens)
359
  logger.info(f"TERZA RISPOSTA (fallback):\n{r3}")
360
  if r3.startswith("PREFIX base:"):
361
  sparql_query = r3
@@ -386,7 +402,7 @@ async def generate_response(req: QueryRequest):
386
  # Spiegazione
387
  exp_prompt = create_explanation_prompt(results_str)
388
  try:
389
- explanation = await call_hf_model(exp_prompt, req.temperature, req.max_tokens)
390
  except Exception as e:
391
  logger.error(f"Errore nella generazione della spiegazione: {e}")
392
  return {"type": "ERROR", "response": f"Errore nella generazione della spiegazione: {e}"}
 
47
  raise e
48
 
49
  # Inizializza il client di Hugging Face
50
+ try:
51
+ client = InferenceClient(HF_MODEL, token=HF_API_KEY)
52
+ logger.info("InferenceClient inizializzato correttamente.")
53
+ except Exception as e:
54
+ logger.error(f"Errore nell'inizializzazione di InferenceClient: {e}")
55
+ raise e
56
 
57
  def create_data_directory():
58
  """Crea la directory 'data/' se non esiste."""
 
212
  Ora fornisci una breve spiegazione museale (massimo ~10 righe), senza inventare oltre i risultati.
213
  """
214
 
215
+ async def call_hf_model(prompt: str, temperature: float = 0.5, max_tokens: int = 150, stream: bool = False) -> str:
216
  """Chiama il modello Hugging Face tramite InferenceClient e gestisce la risposta."""
217
  logger.debug("Chiamo HF con il seguente prompt:")
218
  content_preview = (prompt[:300] + '...') if len(prompt) > 300 else prompt
219
  logger.debug(f"PROMPT => {content_preview}")
220
 
221
  try:
222
+ # Costruisci i messaggi per il modello
223
+ messages = [
224
+ {"role": "system", "content": "You are a helpful assistant."},
225
+ {"role": "user", "content": prompt}
226
+ ]
227
+
228
+ # Esegui la chat_completion
229
+ response = client.chat_completion(
230
+ messages=messages,
231
  max_tokens=max_tokens,
232
+ temperature=temperature,
233
  top_p=0.7,
234
+ stream=stream
235
  )
 
236
 
237
+ if stream:
238
+ # Gestisci lo stream
239
+ generated_text = ""
240
+ async for token in response:
241
+ if token.choices and token.choices[0].delta.get("content"):
242
+ generated_text += token.choices[0].delta["content"]
243
+ print(token.choices[0].delta["content"], end="")
244
+ return generated_text.strip()
245
  else:
246
+ # Risposta non in streaming
247
+ if isinstance(response, list) and len(response) > 0 and "generated_text" in response[0]:
248
+ raw = response[0]["generated_text"]
249
+ elif "generated_text" in response:
250
+ raw = response["generated_text"]
251
+ else:
252
+ raise ValueError("Nessun campo 'generated_text' nella risposta.")
253
 
254
+ # Forza la risposta su una singola linea se multilinea
255
+ single_line = " ".join(raw.splitlines())
256
+ logger.debug(f"Risposta HF single-line: {single_line}")
257
+ return single_line.strip()
258
  except Exception as e:
259
  logger.error(f"Errore nella chiamata all'API Hugging Face tramite InferenceClient: {e}")
260
  raise HTTPException(status_code=500, detail=str(e))
 
306
 
307
  if not is_ontology_related(user_input):
308
  # Prompt generico per domande non pertinenti all'ontologia
309
+ generic_prompt = f"{user_input}"
310
  try:
311
+ response = await call_hf_model(generic_prompt, req.temperature, req.max_tokens, stream=False)
312
  return {
313
  "type": "NATURAL",
314
  "response": response.strip()
 
328
  return {"type": "ERROR", "response": f"Errore nel recupero delle linee: {e}"}
329
 
330
  sys_msg = create_system_message(retrieved_docs)
331
+ prompt = sys_msg + f"\nUtente: {user_input}\nAssistente:"
332
 
333
  # Primo tentativo
334
  try:
335
+ r1 = await call_hf_model(prompt, req.temperature, req.max_tokens, stream=False)
336
  logger.info(f"PRIMA RISPOSTA:\n{r1}")
337
  except Exception as e:
338
  logger.error(f"Errore nella chiamata al modello Hugging Face: {e}")
 
341
  # Se non parte con "PREFIX base:"
342
  if not r1.startswith("PREFIX base:"):
343
  sc = f"Non hai risposto con query SPARQL su una sola riga. Riprova. Domanda: {user_input}"
344
+ fallback_prompt = sys_msg + f"\nAssistente: {r1}\nUtente: {sc}\nAssistente:"
345
  try:
346
+ r2 = await call_hf_model(fallback_prompt, req.temperature, req.max_tokens, stream=False)
347
  logger.info(f"SECONDA RISPOSTA:\n{r2}")
348
  if r2.startswith("PREFIX base:"):
349
  sparql_query = r2
 
369
  logger.info(f"Query SPARQL eseguita con successo. Risultati: {len(results)}")
370
  except Exception as e:
371
  fallback = f"La query SPARQL ha fallito. Riprova. Domanda: {user_input}"
372
+ fallback_prompt = sys_msg + f"\nAssistente: {sparql_query}\nUtente: {fallback}\nAssistente:"
373
  try:
374
+ r3 = await call_hf_model(fallback_prompt, req.temperature, req.max_tokens, stream=False)
375
  logger.info(f"TERZA RISPOSTA (fallback):\n{r3}")
376
  if r3.startswith("PREFIX base:"):
377
  sparql_query = r3
 
402
  # Spiegazione
403
  exp_prompt = create_explanation_prompt(results_str)
404
  try:
405
+ explanation = await call_hf_model(exp_prompt, req.temperature, req.max_tokens, stream=False)
406
  except Exception as e:
407
  logger.error(f"Errore nella generazione della spiegazione: {e}")
408
  return {"type": "ERROR", "response": f"Errore nella generazione della spiegazione: {e}"}