File size: 5,352 Bytes
39eb6ea
7582414
bca1e4e
7582414
 
b8a59fd
7582414
21b5774
7582414
 
 
 
 
 
 
 
946662e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39eb6ea
41adbb1
946662e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142

import gradio as gr
import numpy as np
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from transformers import MarianMTModel, MarianTokenizer
from openai import OpenAI
import faiss
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.")


client = OpenAI(api_key=api_key)
# Configura MarianMT per la traduzione multilingua
model_name = "Helsinki-NLP/opus-mt-it-en"
translator_tokenizer = MarianTokenizer.from_pretrained(model_name)
translator_model = MarianMTModel.from_pretrained(model_name)

# Percorsi dei file
faiss_index_path = "manual_embeddings.index"  # Percorso del file FAISS
chunk_file_path = "manual_chunks.txt"         # Percorso del file con i chunk

# Carica l'indice FAISS
index = faiss.read_index(faiss_index_path)

# Carica i chunk dal file
with open(chunk_file_path, "r", encoding="utf-8") as f:
    chunks = f.read().split("\n\n")  # Ogni chunk è separato da due newline

# Funzione per tradurre testo
def translate_text(text, source_lang="it", target_lang="en"):
    
    if source_lang == target_lang:
        return text  # Nessuna traduzione necessaria

    model_name = f"Helsinki-NLP/opus-mt-{source_lang}-{target_lang}"
    tokenizer = MarianTokenizer.from_pretrained(model_name)
    model = MarianMTModel.from_pretrained(model_name)
    inputs = tokenizer(text, return_tensors="pt", padding=True)
    translated = model.generate(**inputs)
    return tokenizer.decode(translated[0], skip_special_tokens=True)

# Funzione per generare l'embedding della query usando OpenAI
def get_query_embedding(query, model="text-embedding-ada-002"):
    response = client.embeddings.create(model=model, input=[query])
    embedding = response.data[0].embedding
    return np.array(embedding)  # Restituisce l'embedding come array NumPy


# Funzione per cercare nel database FAISS
def search_in_faiss(query_embedding, k=3):
    query_embedding = np.expand_dims(query_embedding, axis=0)  # Assicura una matrice 2D
    distances, indices = index.search(query_embedding, k)
    return distances, indices

# Funzione per recuperare i chunk associati agli indici di FAISS
def get_chunks_from_indices(indices):
    retrieved_chunks = []
    for i in indices[0]:
        if 0 <= i < len(chunks):
            retrieved_chunks.append(chunks[i])
        else:
            retrieved_chunks.append(f"[Chunk non trovato per indice {i}]")
    return retrieved_chunks

# Funzione per rispondere alla domanda usando GPT-3
def generate_response(query, context, max_tokens=550):
    try:
        response = client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": (
                    "Sei un tecnico specializzato in macchine tessili da taglio. Rispondi in italiano alla domanda in modo chiaro, "
                    "usando un tono professionale ma accessibile. Se il testo non contiene informazioni sufficienti per rispondere, dillo in modo esplicito."
                )},
                {"role": "user", "content": (
                    f"Domanda: {query}\n"
                    f"Testo: {context}\n"
                    "Rispondi in modo chiaro e operativo per un tecnico che deve svolgere la mansione."
                )}
            ],
            max_tokens=max_tokens,
            temperature=0.5,
        )
        return response.choices[0].message.content
    except Exception as e:
        print(f"Errore durante la generazione della risposta: {e}")
        return "Errore nell'elaborazione della risposta."

# Funzione principale per ricerca e risposta
def search_and_answer(query, source_lang="it", target_lang="en"):
    # Traduci la query in inglese
    translated_query = translate_text(query, source_lang, target_lang)

    # Ottieni l'embedding della query
    query_embedding = get_query_embedding(translated_query)

    # Esegui la ricerca in FAISS
    distances, indices = search_in_faiss(query_embedding)

    # Recupera i chunk associati agli indici
    retrieved_chunks = get_chunks_from_indices(indices)
    context = "\n".join(retrieved_chunks)

    # Ottieni la risposta da GPT-3
    response = generate_response(query, context)

    # Traduci la risposta nella lingua originale
    #translated_response = translate_text(response, target_lang, source_lang)

    return context, response  #translated_response

# Interfaccia Gradio
examples = [
    ["Come cambio la lama della macchina?"],
    ["Quali sono le precauzioni di sicurezza per usare la macchina?"],
    ["Chi contattare in caso di problemi?"]
]

iface = gr.Interface(
    fn=search_and_answer,
    inputs=gr.Textbox(lines=2, placeholder="Inserisci la tua domanda qui..."),
    outputs=[
        gr.Textbox(label="Risultati della Ricerca"),
        gr.Textbox(label="Risposta Generata")
    ],
    examples=examples,
    title="Sistema RAG con Traduzione Multilingua",
    description=(
        "Inserisci una domanda in qualsiasi lingua supportata. Il sistema tradurrà la query, "
        "eseguirà la ricerca e genererà una risposta nella lingua originale."
    )
)

# Avvia l'app
iface.launch()