Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,64 +1,159 @@
|
|
1 |
-
import
|
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 |
-
yield response
|
41 |
-
|
42 |
-
|
43 |
-
"""
|
44 |
-
For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface
|
45 |
-
"""
|
46 |
-
demo = gr.ChatInterface(
|
47 |
-
respond,
|
48 |
-
additional_inputs=[
|
49 |
-
gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
|
50 |
-
gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
|
51 |
-
gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
|
52 |
-
gr.Slider(
|
53 |
-
minimum=0.1,
|
54 |
-
maximum=1.0,
|
55 |
-
value=0.95,
|
56 |
-
step=0.05,
|
57 |
-
label="Top-p (nucleus sampling)",
|
58 |
-
),
|
59 |
-
],
|
60 |
)
|
61 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
if __name__ == "__main__":
|
64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import yaml
|
3 |
+
import gradio as gr # Importe o Gradio
|
4 |
+
from langchain_huggingface import ChatHuggingFace
|
5 |
+
from langchain_huggingface.llms.huggingface_endpoint import HuggingFaceEndpoint
|
6 |
+
from langchain_community.vectorstores import FAISS
|
7 |
+
from langchain.chains import RetrievalQA
|
8 |
+
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
|
9 |
+
from langchain.prompts import PromptTemplate
|
10 |
+
|
11 |
+
# --- CONFIGURAÇÕES DE MODELOS ---
|
12 |
+
# LLM_MODEL = 'google/gemma-3-4b-it'
|
13 |
+
LLM_MODEL = 'google/gemma-3-1b-it'
|
14 |
+
EMBEDDING_MODEL = "sentence-transformers/all-MiniLM-L6-v2"
|
15 |
+
|
16 |
+
# --- CONFIGURAÇÃO DO TOKEN HF ---
|
17 |
+
try:
|
18 |
+
with open("../config.yaml", "r") as file:
|
19 |
+
config = yaml.safe_load(file)
|
20 |
+
HF_TOKEN = config.get('HF_TOKEN')
|
21 |
+
except FileNotFoundError:
|
22 |
+
print("Arquivo config.yaml não encontrado. Certifique-se de que ele existe e está no diretório correto.")
|
23 |
+
HF_TOKEN = None
|
24 |
+
|
25 |
+
if not HF_TOKEN:
|
26 |
+
print("Token HF não encontrado no config.yaml ou arquivo não existe.")
|
27 |
+
if "HF_TOKEN" not in os.environ:
|
28 |
+
import getpass
|
29 |
+
os.environ["HF_TOKEN"] = getpass.getpass("Por favor, digite seu token da API Hugging Face: ")
|
30 |
+
HF_TOKEN = os.environ["HF_TOKEN"]
|
31 |
+
|
32 |
+
# --- 1. Inicializa o LLM Hugging Face ---
|
33 |
+
llm = HuggingFaceEndpoint(
|
34 |
+
repo_id=LLM_MODEL,
|
35 |
+
task="text-generation",
|
36 |
+
max_new_tokens=1024,
|
37 |
+
do_sample=False,
|
38 |
+
repetition_penalty=1.03,
|
39 |
+
huggingfacehub_api_token=HF_TOKEN,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
)
|
41 |
|
42 |
+
chat_model = ChatHuggingFace(llm=llm)
|
43 |
+
|
44 |
+
# --- 2. Inicializa os embeddings ---
|
45 |
+
embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL)
|
46 |
+
|
47 |
+
# --- 3. Carregando a vector store FAISS salva localmente ---
|
48 |
+
vector_store_path = '../vector_store/vs_base/'
|
49 |
+
try:
|
50 |
+
faiss_store = FAISS.load_local(vector_store_path, embeddings, allow_dangerous_deserialization=True)
|
51 |
+
except Exception as e:
|
52 |
+
print(f"Erro ao carregar a vector store FAISS: {e}")
|
53 |
+
print("Verifique se o caminho está correto e se o arquivo não está corrompido.")
|
54 |
+
exit()
|
55 |
+
|
56 |
+
# --- 4. Retriever a partir da vector store (usando similarity como exemplo) ---
|
57 |
+
retriever = faiss_store.as_retriever(search_type="similarity", search_kwargs={"k": 10})
|
58 |
+
|
59 |
+
retriever = faiss_store.as_retriever(
|
60 |
+
search_type="mmr",
|
61 |
+
search_kwargs={"k": 5, "fetch_k": 20, "lambda_mult": 0.7}
|
62 |
+
)
|
63 |
+
|
64 |
+
# --- 5. PromptTemplate personalizado ---
|
65 |
+
custom_prompt_template = """
|
66 |
+
You are a useful chatbot for customer service.
|
67 |
+
If you don't know the answer, just say that you don't know, don't try to make up an answer.
|
68 |
+
ALWAYS RESPONDE IN THE SAME LANGUAGE AS THE INPUT.
|
69 |
+
|
70 |
+
Use the following pieces of context to answer the user's question.
|
71 |
+
{context}
|
72 |
+
|
73 |
+
Question: {question}
|
74 |
+
Helpful Answer:"""
|
75 |
+
|
76 |
+
# Crie um objeto PromptTemplate a partir da string
|
77 |
+
QA_CHAIN_PROMPT = PromptTemplate.from_template(custom_prompt_template)
|
78 |
|
79 |
+
# --- 6. Cria uma cadeia de QA que usa o retriever e o modelo ---
|
80 |
+
qa_chain = RetrievalQA.from_chain_type(
|
81 |
+
llm=chat_model,
|
82 |
+
chain_type="stuff",
|
83 |
+
retriever=retriever,
|
84 |
+
return_source_documents=True,
|
85 |
+
chain_type_kwargs={"prompt": QA_CHAIN_PROMPT}
|
86 |
+
)
|
87 |
+
|
88 |
+
# --- 7. Função principal para a interface do Gradio ---
|
89 |
+
# Esta função será chamada pelo Gradio para gerar a resposta.
|
90 |
+
# Ela precisa retornar a resposta do chatbot como uma string.
|
91 |
+
def chat_response(question: str, history: list): # `history` é um parâmetro obrigatório para gr.ChatInterface
|
92 |
+
"""
|
93 |
+
Gera a resposta do chatbot usando o modelo de QA e formata para exibição no Gradio.
|
94 |
+
|
95 |
+
Args:
|
96 |
+
question (str): A pergunta do usuário.
|
97 |
+
history (list): Histórico de conversas (não usado diretamente aqui, mas necessário para a interface).
|
98 |
+
|
99 |
+
Returns:
|
100 |
+
str: A resposta formatada do chatbot, incluindo as fontes.
|
101 |
+
"""
|
102 |
+
print(f"Recebida pergunta: '{question}'") # Para debug no console
|
103 |
+
|
104 |
+
try:
|
105 |
+
result = qa_chain.invoke({"query": question})
|
106 |
+
answer = result["result"]
|
107 |
+
sources = result.get("source_documents", [])
|
108 |
+
|
109 |
+
response_text = f"**Resposta:** {answer}\n\n"
|
110 |
+
|
111 |
+
if sources:
|
112 |
+
response_text += "**Saiba mais em:**\n"
|
113 |
+
unique_sources = set()
|
114 |
+
source_list_for_printing = []
|
115 |
+
|
116 |
+
for doc in sources:
|
117 |
+
source_name = doc.metadata.get('source', 'Fonte desconhecida')
|
118 |
+
if source_name not in unique_sources:
|
119 |
+
unique_sources.add(source_name)
|
120 |
+
source_list_for_printing.append(source_name)
|
121 |
+
|
122 |
+
for i, source_name in enumerate(source_list_for_printing):
|
123 |
+
response_text += f"- {i+1}. '{source_name}'\n"
|
124 |
+
else:
|
125 |
+
response_text += "Nenhuma fonte específica foi utilizada para esta resposta.\n"
|
126 |
+
|
127 |
+
return response_text
|
128 |
+
|
129 |
+
except Exception as e:
|
130 |
+
error_message = f"Ocorreu um erro ao processar sua pergunta: {e}. Por favor, tente novamente."
|
131 |
+
print(error_message) # Para debug no console
|
132 |
+
return error_message
|
133 |
+
|
134 |
+
# --- 8. Criação da Interface Gradio ---
|
135 |
if __name__ == "__main__":
|
136 |
+
print("Iniciando a interface Gradio...")
|
137 |
+
|
138 |
+
# gr.ChatInterface é ideal para interfaces de chatbot
|
139 |
+
demo = gr.ChatInterface(
|
140 |
+
type="messages",
|
141 |
+
fn=chat_response, # A função que processa a pergunta e retorna a resposta
|
142 |
+
title="CloudWalk Chatbot",
|
143 |
+
description="Olá! Estou aqui para responder suas dúvidas.",
|
144 |
+
submit_btn="Enviar Pergunta",
|
145 |
+
examples=[
|
146 |
+
["What product and services InfinitePay offer ?"],
|
147 |
+
['What are the fees for the card machine?'],
|
148 |
+
['How can I order one card machine?'],
|
149 |
+
["Quais serviços a infinite pay oferece?"],
|
150 |
+
["Quais as taxas da maquininha?"],
|
151 |
+
["Como pedir uma maquininha?"],
|
152 |
+
],
|
153 |
+
chatbot=gr.Chatbot(type="messages")
|
154 |
+
)
|
155 |
+
|
156 |
+
# Inicia a interface Gradio
|
157 |
+
# `share=True` gera um link público temporário (útil para testes ou demonstrações)
|
158 |
+
# `debug=True` mostra logs detalhados no terminal
|
159 |
+
demo.launch(share=True)
|