File size: 5,085 Bytes
5e85b45
 
 
591f1e5
0a756b0
5e85b45
0a756b0
09bc8bd
 
0a756b0
 
 
 
09bc8bd
591f1e5
816a5d4
5e85b45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a79cc0c
5e85b45
 
 
20af111
5e85b45
 
 
 
 
 
 
 
 
e553ad4
691381f
0a756b0
cc1d154
591f1e5
cc1d154
 
0a756b0
cc1d154
ebc4e35
a79cc0c
 
cc1d154
 
 
 
 
 
0a756b0
cc1d154
 
0a756b0
 
cc1d154
591f1e5
cc1d154
0a756b0
 
cc1d154
5e85b45
 
 
 
 
 
b8d95ce
5e85b45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cc1d154
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
118
119
120
121
122
123
124
125
126
127
import gradio as gr
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from openai import OpenAI
import os
import zipfile

# Configura la tua chiave API in modo sicuro
api_key = os.getenv("OPENAI_API_KEY")  # Imposta la chiave come variabile d'ambiente

if not api_key:
    raise ValueError("Chiave API OpenAI non trovata. Assicurati di aver impostato OPENAI_API_KEY.")

# Crea il client utilizzando la chiave API
client = OpenAI(api_key=api_key)

# Percorsi per il primo file ZIP
zip_path_m = "faiss_manual_index.zip"  # File ZIP per l'indice manuale
faiss_manual_index = "faiss_manual_index"  # Sottocartella per estrazione manuale

# Controlla se la directory esiste già
if not os.path.exists(faiss_manual_index):
    os.makedirs(faiss_manual_index)  # Crea la directory

# Percorsi per il secondo file ZIP
zip_path_p = "faiss_problems_index.zip"  # File ZIP per l'indice problemi
faiss_problems_index = "faiss_problems_index"  # Sottocartella per estrazione problemi

# Controlla se la directory esiste già
if not os.path.exists(faiss_problems_index):
    os.makedirs(faiss_problems_index)  # Crea la directory

# Estrai il primo file ZIP se non esiste già
if os.path.exists(zip_path_m):  # Controlla che il file zip esista
    with zipfile.ZipFile(zip_path_m, 'r') as zip_ref:
        zip_ref.extractall(faiss_manual_index)
    print(f"Files estratti nella directory: {faiss_manual_index}")
else:
    print(f"File {zip_path_m} non trovato. Assicurati di caricarlo nello Space.")

# Estrai il secondo file ZIP se non esiste già
if os.path.exists(zip_path_p):  # Controlla che il file zip esista
    with zipfile.ZipFile(zip_path_p, 'r') as zip_ref:
        zip_ref.extractall(faiss_problems_index)
    print(f"Files estratti nella directory: {faiss_problems_index}")
else:
    print(f"File {zip_path_p} non trovato. Assicurati di caricarlo nello Space.")

# Carica il modello di embedding
embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/LaBSE")

# Carica i vectorstore FAISS salvati
manual_vectorstore = FAISS.load_local(faiss_manual_index, embedding_model, allow_dangerous_deserialization=True)
problems_vectorstore = FAISS.load_local(faiss_problems_index, embedding_model, allow_dangerous_deserialization=True)

# Funzione per cercare nei dati FAISS e interrogare GPT
def search_and_answer(query):
    # Cerca nei manuali
    manual_results = manual_vectorstore.similarity_search(query, k=5)
    manual_output = "\n\n".join([doc.page_content for doc in manual_results])

    # Cerca nei problemi
    problems_results = problems_vectorstore.similarity_search(query, k=1)
    problems_output = "\n\n".join([doc.page_content for doc in problems_results])

    # Costruisce una domanda combinata
    combined_text = f"Manual Results: {manual_output}\n\nProblems Results: {problems_output}"
    response = rispondi_a_domanda(query, combined_text)
    
    return manual_output, problems_output, response

# Funzione per interrogare GPT
def rispondi_a_domanda(domanda, testo, max_token_risposta=550):
    print("verifica tutto",domanda,testo)
    try:
        # Chiamata API di OpenAI

        risposta = client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": (
                    "Sei un esperto tecnico specializzato in macchine tessili da taglio.Rispondi in italiano alla domanda in modo chiaro,"
                    "Usa un tono professionale, ma accessibile per farsi capire da ogni operatore"
                    "Controlla se il testo contiene  informazioni sufficienti per rispondere, in caso contrario aiuta l'operatore a riformulare la domanda."
                )},
                {"role": "user", "content": (
                    f"Domanda: {domanda}\n"
                    f"Testo: {testo}\n"
                    "Rispondi in modo chiaro e operativo per un tecnico che deve svolgere la mansione."
                )}
            ],
            max_tokens=max_token_risposta,
            temperature=0.5,
        )

        # Estrai la risposta
        risposta_finale = risposta.choices[0].message.content
        return risposta_finale

    except Exception as e:
        print(f"Si è verificato un errore: {e}")
        return "Errore nell'elaborazione della risposta."

# Interfaccia Gradio
examples = [
    ["How to change the knife?"],
    ["What are the safety precautions for using the machine?"],
    ["Who to contact for assistance in case of problems ?"]
]

iface = gr.Interface(
    fn=search_and_answer,
    inputs=gr.Textbox(lines=2, placeholder="Enter your question here..."),
    outputs=[
        gr.Textbox(label="Manual Results"),
        gr.Textbox(label="Issues Results"),
        gr.Textbox(label="GPT-Generated Answer")
    ],
    examples=examples,
    title="Manual Querying System with GPT",
    description="Enter a question to get relevant information extracted from the manual and related issues, followed by a GPT-generated answer."
)

# Avvia l'app
iface.launch()