Spaces:
Running
Running
import gradio as gr | |
from langchain_community.vectorstores import FAISS | |
from langchain_community.embeddings import HuggingFaceEmbeddings | |
from transformers import MarianMTModel, MarianTokenizer | |
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.") | |
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() |