AshenClock commited on
Commit
4d4b9ae
·
verified ·
1 Parent(s): 8c772f5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +29 -26
app.py CHANGED
@@ -38,22 +38,23 @@ app = FastAPI()
38
  # Modello di input per richieste POST
39
  class QueryRequest(BaseModel):
40
  message: str
41
- max_tokens: int = 512
42
  temperature: float = 0.7
43
 
44
  # Messaggio di sistema con RDF incluso
45
  def create_system_message(rdf_context):
46
  return f"""
47
- Sei un assistente specializzato nella generazione e spiegazione di query SPARQL basate su dati RDF.
48
  La base di conoscenza RDF è la seguente:
49
  {rdf_context}
50
- Il tuo compito principale è:
51
- 1. Analizzare lo schema RDF o i dati RDF forniti e la domanda in linguaggio naturale posta dall'utente.
52
- 2. Generare una query SPARQL valida che recuperi le informazioni richieste dai dati RDF.
53
- 3. Spiegare in modo prolisso e naturale il significato dei risultati, come farebbe una guida in un museo.
54
  Regole:
55
- - Genera solo query SPARQL in una singola riga, senza formattazioni aggiuntive.
56
- - Se la domanda non può essere soddisfatta con una query SPARQL, rispondi con: \"Non posso generare una query per questa domanda.\"
 
57
  """
58
 
59
  # Funzione per inviare la richiesta al modello Hugging Face
@@ -65,7 +66,7 @@ async def generate_response(message, max_tokens, temperature):
65
  ]
66
 
67
  try:
68
- # Usa il metodo chat.completions.create per lo streaming dei risultati
69
  stream = client.chat.completions.create(
70
  model="Qwen/Qwen2.5-72B-Instruct",
71
  messages=messages,
@@ -80,34 +81,36 @@ async def generate_response(message, max_tokens, temperature):
80
  if "choices" in chunk and len(chunk["choices"]) > 0:
81
  response += chunk["choices"][0]["delta"]["content"]
82
 
83
- return response.strip()
 
 
84
  except Exception as e:
85
  raise HTTPException(status_code=500, detail=f"Errore nell'elaborazione: {str(e)}")
86
 
87
  # Endpoint per generare query SPARQL
88
  @app.post("/generate-query/")
89
  async def generate_query(request: QueryRequest):
90
- # Genera risposta
91
  response = await generate_response(request.message, request.max_tokens, request.temperature)
92
 
93
- # Valida la query se possibile
94
- if response.startswith("SELECT") or response.startswith("ASK"):
95
- is_valid = validate_sparql_query(response, rdf_context)
96
- if not is_valid:
97
- # Log e messaggio per il client
98
- print("Query non valida rispetto al file RDF:")
99
- print(response)
100
- return {
101
- "query": response.replace("\n", " ").strip(),
102
- "explanation": "La query generata non è valida rispetto al file RDF fornito. Potrebbe essere necessario correggerla manualmente."
103
- }
104
 
105
- explanation = "La query generata è: " + response.replace("\n", " ").strip() + ". "
106
- explanation += "Questa query è stata progettata per estrarre informazioni specifiche dai dati RDF, consentendo di rispondere alla tua domanda. Risultati ottenuti da questa query possono includere dettagli come entità, relazioni o attributi collegati al contesto fornito."
 
 
 
 
107
 
108
- return {"query": response.replace("\n", " ").strip(), "explanation": explanation}
 
109
 
110
  # Endpoint per verificare se il server è attivo
111
  @app.get("/")
112
  async def root():
113
- return {"message": "Il server è attivo e pronto a generare query SPARQL!"}
 
38
  # Modello di input per richieste POST
39
  class QueryRequest(BaseModel):
40
  message: str
41
+ max_tokens: int = 2048
42
  temperature: float = 0.7
43
 
44
  # Messaggio di sistema con RDF incluso
45
  def create_system_message(rdf_context):
46
  return f"""
47
+ Sei un assistente specializzato nella generazione di query SPARQL basate su dati RDF.
48
  La base di conoscenza RDF è la seguente:
49
  {rdf_context}
50
+ Il tuo compito è:
51
+ 1. Generare una query SPARQL valida e **scritta in una sola riga** senza formattazioni aggiuntive.
52
+ 2. Rispondere **solo** a domande che possono essere soddisfatte con i dati RDF forniti.
53
+ 3. Se la domanda non può essere soddisfatta, rispondi con: "Non posso generare una query SPARQL per questa richiesta.".
54
  Regole:
55
+ - Non generare spiegazioni o commenti extra nella risposta.
56
+ - Non soddisfare richieste fuori dal contesto RDF fornito.
57
+ - Restituisci esclusivamente una query SPARQL in **una sola riga**.
58
  """
59
 
60
  # Funzione per inviare la richiesta al modello Hugging Face
 
66
  ]
67
 
68
  try:
69
+ # Invoca il modello Hugging Face
70
  stream = client.chat.completions.create(
71
  model="Qwen/Qwen2.5-72B-Instruct",
72
  messages=messages,
 
81
  if "choices" in chunk and len(chunk["choices"]) > 0:
82
  response += chunk["choices"][0]["delta"]["content"]
83
 
84
+ # Rimuovi formattazioni multilinea e restituisci in una sola riga
85
+ response = response.replace("\n", " ").strip()
86
+ return response
87
  except Exception as e:
88
  raise HTTPException(status_code=500, detail=f"Errore nell'elaborazione: {str(e)}")
89
 
90
  # Endpoint per generare query SPARQL
91
  @app.post("/generate-query/")
92
  async def generate_query(request: QueryRequest):
93
+ # Genera la query
94
  response = await generate_response(request.message, request.max_tokens, request.temperature)
95
 
96
+ # Controlla che sia una query valida
97
+ if not (response.startswith("SELECT") or response.startswith("ASK")):
98
+ return {
99
+ "query": None,
100
+ "explanation": "Non posso generare una query SPARQL per questa richiesta. Assicurati che la domanda sia coerente con i dati RDF forniti."
101
+ }
 
 
 
 
 
102
 
103
+ # Valida la query rispetto al file RDF
104
+ if not validate_sparql_query(response, rdf_context):
105
+ return {
106
+ "query": None,
107
+ "explanation": "La query generata non è valida rispetto alla base di conoscenza RDF. Assicurati di chiedere informazioni che siano presenti nell'ontologia."
108
+ }
109
 
110
+ # Risposta finale: query in una riga
111
+ return {"query": response, "explanation": "Ecco la query generata correttamente in una riga pronta per GraphDB."}
112
 
113
  # Endpoint per verificare se il server è attivo
114
  @app.get("/")
115
  async def root():
116
+ return {"message": "Il server è attivo e pronto a generare query SPARQL!"}