k3ybladewielder commited on
Commit
1768992
·
verified ·
1 Parent(s): 7cb2abd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +155 -60
app.py CHANGED
@@ -1,64 +1,159 @@
1
- import gradio as gr
2
- from huggingface_hub import InferenceClient
3
-
4
- """
5
- For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference
6
- """
7
- client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
8
-
9
-
10
- def respond(
11
- message,
12
- history: list[tuple[str, str]],
13
- system_message,
14
- max_tokens,
15
- temperature,
16
- top_p,
17
- ):
18
- messages = [{"role": "system", "content": system_message}]
19
-
20
- for val in history:
21
- if val[0]:
22
- messages.append({"role": "user", "content": val[0]})
23
- if val[1]:
24
- messages.append({"role": "assistant", "content": val[1]})
25
-
26
- messages.append({"role": "user", "content": message})
27
-
28
- response = ""
29
-
30
- for message in client.chat_completion(
31
- messages,
32
- max_tokens=max_tokens,
33
- stream=True,
34
- temperature=temperature,
35
- top_p=top_p,
36
- ):
37
- token = message.choices[0].delta.content
38
-
39
- response += token
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
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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)