Update app.py
Browse files
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 =
|
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
|
48 |
La base di conoscenza RDF è la seguente:
|
49 |
{rdf_context}
|
50 |
-
Il tuo compito
|
51 |
-
1.
|
52 |
-
2.
|
53 |
-
3.
|
54 |
Regole:
|
55 |
-
-
|
56 |
-
-
|
|
|
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 |
-
#
|
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 |
-
|
|
|
|
|
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
|
91 |
response = await generate_response(request.message, request.max_tokens, request.temperature)
|
92 |
|
93 |
-
#
|
94 |
-
if response.startswith("SELECT") or response.startswith("ASK"):
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
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 |
-
|
106 |
-
|
|
|
|
|
|
|
|
|
107 |
|
108 |
-
|
|
|
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!"}
|