File size: 4,111 Bytes
034a1e6
aa07e9d
034a1e6
 
 
1575481
034a1e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ec7377b
034a1e6
 
 
 
 
8c772f5
034a1e6
 
8c772f5
 
034a1e6
 
 
1575481
 
034a1e6
 
 
4d4b9ae
034a1e6
 
 
 
 
4d4b9ae
034a1e6
 
4d4b9ae
 
 
 
034a1e6
4d4b9ae
 
 
034a1e6
 
 
3b0ec68
034a1e6
3b0ec68
 
 
 
034a1e6
 
4d4b9ae
3b0ec68
034a1e6
3b0ec68
 
 
 
 
034a1e6
3b0ec68
 
 
 
 
 
4d4b9ae
 
 
034a1e6
 
aa07e9d
034a1e6
 
 
4d4b9ae
3b0ec68
ec7377b
4d4b9ae
 
 
 
 
 
034a1e6
4d4b9ae
 
 
 
 
 
8e527d0
4d4b9ae
 
034a1e6
 
1575481
034a1e6
4d4b9ae
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import os
from fastapi import FastAPI, HTTPException
from huggingface_hub import InferenceClient
from rdflib import Graph
from pydantic import BaseModel

# Configurazione API Hugging Face
API_KEY = os.getenv("HF_API_KEY")
client = InferenceClient(api_key=API_KEY)

# File RDF
RDF_FILE = "Progetto.rdf"

# Carica il file RDF
def load_rdf():
    if os.path.exists(RDF_FILE):
        with open(RDF_FILE, "r") as f:
            return f.read()
    return ""

rdf_context = load_rdf()
print(rdf_context)
# Valida le query SPARQL
def validate_sparql_query(query, rdf_data):
    try:
        g = Graph()
        g.parse(data=rdf_data, format="xml")
        # Prova a eseguire la query
        g.query(query)
        return True
    except Exception as e:
        print(f"Errore durante la validazione della query SPARQL: {e}")
        return False

# FastAPI app
app = FastAPI()

# Modello di input per richieste POST
class QueryRequest(BaseModel):
    message: str
    max_tokens: int = 2048
    temperature: float = 0.7

# Messaggio di sistema con RDF incluso
def create_system_message(rdf_context):
    return f"""
Sei un assistente specializzato nella generazione di query SPARQL basate su dati RDF.
La base di conoscenza RDF è la seguente:
{rdf_context}
Il tuo compito è:
1. Generare una query SPARQL valida e **scritta in una sola riga** senza formattazioni aggiuntive.
2. Rispondere **solo** a domande che possono essere soddisfatte con i dati RDF forniti.
3. Se la domanda non può essere soddisfatta, rispondi con: "Non posso generare una query SPARQL per questa richiesta.".
Regole:
- Non generare spiegazioni o commenti extra nella risposta.
- Non soddisfare richieste fuori dal contesto RDF fornito.
- Restituisci esclusivamente una query SPARQL in **una sola riga**.
"""

# Funzione per inviare la richiesta al modello Hugging Face
async def generate_response(message, max_tokens, temperature):
    system_message = create_system_message(rdf_context)
    messages = [
        {"role": "system", "content": system_message},
        {"role": "user", "content": message}
    ]

    try:
        # Invoca il modello Hugging Face
        stream = client.chat.completions.create(
            model="Qwen/Qwen2.5-72B-Instruct",
            messages=messages,
            temperature=temperature,
            max_tokens=max_tokens,
            top_p=0.7,
            stream=True
        )

        response = ""
        for chunk in stream:
            if "choices" in chunk and len(chunk["choices"]) > 0:
                response += chunk["choices"][0]["delta"]["content"]

        # Rimuovi formattazioni multilinea e restituisci in una sola riga
        response = response.replace("\n", " ").strip()
        return response
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Errore nell'elaborazione: {str(e)}")

# Endpoint per generare query SPARQL
@app.post("/generate-query/")
async def generate_query(request: QueryRequest):
    # Genera la query
    response = await generate_response(request.message, request.max_tokens, request.temperature)
    print("Risposta generata dal modello:", response)  # Debug
    # Controlla che sia una query valida
    if not (response.startswith("SELECT") or response.startswith("ASK")):
        return {
            "query": None,
            "explanation": "Non posso generare una query SPARQL per questa richiesta. Assicurati che la domanda sia coerente con i dati RDF forniti."
        }

    # Valida la query rispetto al file RDF
    if not validate_sparql_query(response, rdf_context):
        return {
            "query": None,
            "explanation": "La query generata non è valida rispetto alla base di conoscenza RDF. Assicurati di chiedere informazioni che siano presenti nell'ontologia."
        }

    # Risposta finale: query in una riga
    return {"query": response, "explanation": "Ecco la query generata correttamente in una riga pronta per GraphDB."}

# Endpoint per verificare se il server è attivo
@app.get("/")
async def root():
    return {"message": "Il server è attivo e pronto a generare query SPARQL!"}