File size: 2,270 Bytes
1e84b5e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import numpy as np
import faiss
from datasets import load_dataset
from sentence_transformers import SentenceTransformer
from transformers import pipeline
import streamlit as st

# Carregar o dataset Customer Support Conversations do Hugging Face
dataset = load_dataset("bitext/Bitext-customer-support-llm-chatbot-training-dataset", split="train")
questions = []
answers = []

for i, item in enumerate(dataset):
    if i >= 1000:  # Limita a 10 amostras
        break
    questions.append(item["instruction"])
    answers.append(item["response"])

# Configuração do modelo de embeddings
embedder = SentenceTransformer('multi-qa-MiniLM-L6-cos-v1')

# Geração dos embeddings das perguntas
question_embeddings = embedder.encode(questions, convert_to_tensor=False)

# Indexação com FAISS
dimension = question_embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(np.array(question_embeddings))

# Pipeline de geração de resposta
generator = pipeline("text-generation", model="openai-community/gpt2")


# Função de recuperação de documentos
def retrieve_documents(query, top_k=2):
    query_embedding = embedder.encode([query])
    distances, indices = index.search(np.array(query_embedding), top_k)
    retrieved = [{"text": answers[idx], "score": distances[0][i]} for i, idx in enumerate(indices[0])]
    return retrieved

# Função para geração de resposta com base nos documentos recuperados
def generate_answer(query):
    # Recuperação dos documentos
    retrieved_docs = retrieve_documents(query)
    context = " ".join([doc["text"] for doc in retrieved_docs])

    # Geração da resposta com o contexto
    input_text = f"Contexto: {context} Pergunta: {query}"
    answer = generator(input_text, max_length=50, do_sample=False)
    
    # Cálculo da pontuação de confiança
    confidence_score = np.mean([doc["score"] for doc in retrieved_docs])
    return answer[0]['generated_text'], confidence_score

# Interface com Streamlit
st.title("Assistente de Suporte ao Cliente com RAG - Hugging Face")

question = st.text_input("Digite sua pergunta:")

if st.button("Obter Resposta"):
    answer, confidence = generate_answer(question)
    st.write("Resposta:", answer)
    st.write("Pontuação de Confiança:", round(confidence, 2))