AshenClock commited on
Commit
177b586
·
verified ·
1 Parent(s): 64a3225

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -11
app.py CHANGED
@@ -155,6 +155,73 @@ FINE ONTOLOGIA.
155
  """
156
  logger.debug("[create_system_prompt_for_sparql] Prompt generato con ESEMPI e regole SPARQL.")
157
  return prompt
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
 
159
 
160
  def create_system_prompt_for_guide() -> str:
@@ -165,11 +232,11 @@ def create_system_prompt_for_guide() -> str:
165
  - Se non c'è query o non ci sono risultati, prova comunque a dare una risposta.
166
  """
167
  prompt = (
168
- "SEI UNA GUIDA MUSEALE VIRTUALE. "
169
- "RISPONDI IN MODO BREVE (~50 PAROLE), SENZA SALUTI O INTRODUZIONI PROLISSE. "
170
- "SE HAI RISULTATI SPARQL, USALI. "
171
- "SE NON HAI RISULTATI O NON HAI UNA QUERY, RISPONDI COMUNQUE CERCANDO DI RIARRANGIARE LE TUE CONOSCENZE."
172
- )
173
  logger.debug("[create_system_prompt_for_guide] Prompt per la risposta guida museale generato.")
174
  return prompt
175
 
@@ -279,7 +346,7 @@ def assistant_endpoint(req: AssistantRequest):
279
  {"role": "user", "content": user_message}
280
  ],
281
  max_tokens=512,
282
- temperature=0.3
283
  )
284
  possible_query = gen_sparql_output["choices"][0]["message"]["content"].strip()
285
  logger.info(f"[assistant_endpoint] Query generata dal modello: {possible_query}")
@@ -327,7 +394,6 @@ def assistant_endpoint(req: AssistantRequest):
327
  )
328
  for idx, row in enumerate(results)
329
  )
330
-
331
  second_prompt = (
332
  f"{system_prompt_guide}\n\n"
333
  f"Domanda utente: {user_message}\n"
@@ -363,19 +429,19 @@ def assistant_endpoint(req: AssistantRequest):
363
  {"role": "user", "content": "Fornisci la risposta finale."}
364
  ],
365
  max_tokens=512,
366
- temperature=0.7
367
  )
368
  final_answer = final_output["choices"][0]["message"]["content"].strip()
369
  logger.info(f"[assistant_endpoint] Risposta finale generata: {final_answer}")
370
  except Exception as ex:
371
  logger.error(f"Errore nella generazione della risposta finale: {ex}")
372
  raise HTTPException(status_code=500, detail="Errore nella generazione della risposta in linguaggio naturale.")
373
-
374
  # Risposta JSON
375
  logger.debug("[assistant_endpoint] Fine elaborazione. Restituzione risposta.")
376
  return {
377
  "query": generated_query,
378
- "response": final_answer
379
  }
380
 
381
  # ---------------------------------------------------------------------------
@@ -392,4 +458,4 @@ def home():
392
  # MAIN
393
  # ---------------------------------------------------------------------------
394
  if __name__ == "__main__":
395
- logger.info("Avvio dell'applicazione FastAPI sulla porta 8000.")
 
155
  """
156
  logger.debug("[create_system_prompt_for_sparql] Prompt generato con ESEMPI e regole SPARQL.")
157
  return prompt
158
+ from huggingface_hub import InferenceClient
159
+
160
+ def classify_and_translate(question_text: str, model_answer_text: str) -> str:
161
+ """
162
+ Classifica la lingua della domanda e della risposta, quindi traduce la risposta
163
+ nella lingua della domanda se sono diverse.
164
+
165
+ Parametri:
166
+ - question_text: Testo della domanda dell'utente.
167
+ - model_answer_text: Risposta del modello (in qualsiasi lingua).
168
+
169
+ Restituisce:
170
+ - La risposta tradotta nella lingua della domanda o la risposta originale
171
+ se entrambe le lingue coincidono.
172
+ """
173
+ # Costanti
174
+ LANG_DETECT_MODEL = "papluca/xlm-roberta-base-language-detection" # Modello per rilevamento lingua
175
+ TRANSLATOR_MODEL_PREFIX = "Helsinki-NLP/opus-mt" # Prefisso dei modelli di traduzione
176
+
177
+ # Crea il client per il rilevamento delle lingue
178
+ lang_detect_client = InferenceClient(
179
+ token=HF_API_KEY,
180
+ model=LANG_DETECT_MODEL
181
+ )
182
+
183
+ # Rileva la lingua della domanda
184
+ try:
185
+ question_lang_result = lang_detect_client.text_classification(text=question_text)
186
+ question_lang = question_lang_result[0]['label']
187
+ logger.info(f"[LangDetect] Lingua della domanda: {question_lang}")
188
+ except Exception as e:
189
+ logger.error(f"Errore nel rilevamento della lingua della domanda: {e}")
190
+ question_lang = "en" # Default fallback
191
+
192
+ # Rileva la lingua della risposta
193
+ try:
194
+ answer_lang_result = lang_detect_client.text_classification(text=model_answer_text)
195
+ answer_lang = answer_lang_result[0]['label']
196
+ logger.info(f"[LangDetect] Lingua della risposta: {answer_lang}")
197
+ except Exception as e:
198
+ logger.error(f"Errore nel rilevamento della lingua della risposta: {e}")
199
+ answer_lang = "en" # Default fallback
200
+
201
+ # Se le lingue sono uguali, non tradurre
202
+ if question_lang == answer_lang:
203
+ logger.info("[Translate] Lingue uguali, nessuna traduzione necessaria.")
204
+ return model_answer_text
205
+
206
+ # Prepara il modello di traduzione
207
+ translator_model = f"{TRANSLATOR_MODEL_PREFIX}-{answer_lang}-{question_lang}"
208
+
209
+ # Crea il client per la traduzione
210
+ translator_client = InferenceClient(
211
+ token=HF_API_KEY,
212
+ model=translator_model
213
+ )
214
+
215
+ # Traduci la risposta
216
+ try:
217
+ translation_result = translator_client.translation(text=model_answer_text)
218
+ translated_answer = translation_result["translation_text"]
219
+ logger.info("[Translate] Risposta tradotta con successo.")
220
+ except Exception as e:
221
+ logger.error(f"Errore nella traduzione {answer_lang}->{question_lang}: {e}")
222
+ translated_answer = model_answer_text # Fallback alla risposta originale
223
+
224
+ return translated_answer
225
 
226
 
227
  def create_system_prompt_for_guide() -> str:
 
232
  - Se non c'è query o non ci sono risultati, prova comunque a dare una risposta.
233
  """
234
  prompt = (
235
+ "SEI UNA GUIDA MUSEALE VIRTUALE. "
236
+ "RISPONDI IN MODO BREVE (~50 PAROLE), SENZA SALUTI O INTRODUZIONI PROLISSE. "
237
+ "SE HAI RISULTATI SPARQL, USALI. "
238
+ "SE NON HAI RISULTATI O NON HAI UNA QUERY, RISPONDI COMUNQUE CERCANDO DI RIARRANGIARE LE TUE CONOSCENZE."
239
+ )
240
  logger.debug("[create_system_prompt_for_guide] Prompt per la risposta guida museale generato.")
241
  return prompt
242
 
 
346
  {"role": "user", "content": user_message}
347
  ],
348
  max_tokens=512,
349
+ temperature=0
350
  )
351
  possible_query = gen_sparql_output["choices"][0]["message"]["content"].strip()
352
  logger.info(f"[assistant_endpoint] Query generata dal modello: {possible_query}")
 
394
  )
395
  for idx, row in enumerate(results)
396
  )
 
397
  second_prompt = (
398
  f"{system_prompt_guide}\n\n"
399
  f"Domanda utente: {user_message}\n"
 
429
  {"role": "user", "content": "Fornisci la risposta finale."}
430
  ],
431
  max_tokens=512,
432
+ temperature=0.2
433
  )
434
  final_answer = final_output["choices"][0]["message"]["content"].strip()
435
  logger.info(f"[assistant_endpoint] Risposta finale generata: {final_answer}")
436
  except Exception as ex:
437
  logger.error(f"Errore nella generazione della risposta finale: {ex}")
438
  raise HTTPException(status_code=500, detail="Errore nella generazione della risposta in linguaggio naturale.")
439
+ final_ans = classify_and_translate(user_message, final_answer)
440
  # Risposta JSON
441
  logger.debug("[assistant_endpoint] Fine elaborazione. Restituzione risposta.")
442
  return {
443
  "query": generated_query,
444
+ "response": final_ans
445
  }
446
 
447
  # ---------------------------------------------------------------------------
 
458
  # MAIN
459
  # ---------------------------------------------------------------------------
460
  if __name__ == "__main__":
461
+ logger.info("Avvio dell'applicazione FastAPI.")