test1_chat / app.py
Mauro24's picture
Update app.py
b8a59fd verified
raw
history blame
5.32 kB
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()