DHEIVER commited on
Commit
302b740
·
verified ·
1 Parent(s): b8f9c6f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +58 -137
app.py CHANGED
@@ -184,124 +184,59 @@ def upload_file(file_obj):
184
  list_file_path.append(file_path)
185
  return list_file_path
186
 
187
- # CSS personalizado para ocultar elementos da interface
188
- custom_css = """
189
- #banner {
190
- display: none !important;
191
- }
192
- footer {
193
- display: none !important;
194
- }
195
- """
196
-
197
- import gradio as gr
198
-
199
- # Funções fictícias para os eventos
200
- def initialize_database(document, chunk_size, chunk_overlap):
201
- # Lógica para inicializar o banco de dados vetorial
202
- vector_db = "Banco de Dados Vetorial Inicializado"
203
- collection_name = "Coleção 1"
204
- db_progress = "Banco de Dados Inicializado"
205
- return vector_db, collection_name, db_progress
206
-
207
- def initialize_LLM(llm_model, temperature, max_tokens, top_k, vector_db):
208
- # Lógica para inicializar a cadeia LLM
209
- qa_chain = "Cadeia de QA Inicializada"
210
- llm_progress = "Cadeia LLM Inicializada"
211
- return qa_chain, llm_progress
212
-
213
- def conversation(qa_chain, message, chatbot):
214
- # Lógica de processamento de mensagem do chatbot
215
- response = f"Resposta para: {message}"
216
- doc_source1 = "Fonte 1"
217
- source1_page = 1
218
- doc_source2 = "Fonte 2"
219
- source2_page = 2
220
- doc_source3 = "Fonte 3"
221
- source3_page = 3
222
- chatbot.append((message, response))
223
- return qa_chain, message, chatbot, doc_source1, source1_page, doc_source2, source2_page, doc_source3, source3_page
224
-
225
- # Interface Gradio
226
  def demo():
227
- with gr.Blocks(theme=gr.themes.Default(primary_hue="blue", secondary_hue="gray"), css=None) as demo:
228
- # Barra superior personalizada
229
- with gr.Row(visible=True, elem_id="top_bar"):
230
- gr.Image(value="https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
231
- interactive=False, show_label=False, elem_classes="logo")
232
- gr.Markdown(
233
- """
234
- <div style="text-align:right; padding-right: 15px;">
235
- <a href="https://huggingface.co/" target="_blank" style="text-decoration:none;">
236
- <b>Voltar à Web HuggingCode</b>
237
- </a>
238
- </div>
239
- """
240
- )
241
 
242
- # Cabeçalho
243
  gr.Markdown(
244
- """
245
- <center><h2>Chatbot baseado em PDF</h2></center>
246
- <h3>Faça perguntas sobre seus documentos PDF</h3>
247
- """
248
- )
249
  gr.Markdown(
250
- """
251
- <b>Nota:</b> Este assistente AI, usando Langchain e LLMs de código aberto, realiza geração aumentada por recuperação (RAG) a partir de seus documentos PDF. \
252
- A interface do usuário explicitamente mostra múltiplos passos para ajudar a entender o fluxo de trabalho do RAG.
253
- Este chatbot leva em consideração perguntas anteriores ao gerar respostas (via memória conversacional) e inclui referências de documentos para maior clareza.<br>
254
- <br><b>Aviso:</b> Este espaço usa o hardware básico gratuito da Hugging Face. Alguns passos e modelos LLM usados abaixo (endpoints de inferência gratuitos) podem levar algum tempo para gerar uma resposta.
255
- """
256
- )
257
-
258
- # Passo 1 - Upload do PDF
259
- with gr.Tab("Passo 1 - Carregar PDF"):
260
  with gr.Row():
261
- document = gr.Files(height=100, file_count="multiple", file_types=["pdf"], interactive=True,
262
- label="Carregue seus documentos PDF (único ou múltiplos)")
263
-
264
- # Passo 2 - Processamento do documento
265
- with gr.Tab("Passo 2 - Processar documento"):
266
  with gr.Row():
267
- db_btn = gr.Radio(["ChromaDB"], label="Tipo de banco de dados vetorial", value="ChromaDB",
268
- type="index", info="Escolha seu banco de dados vetorial")
269
  with gr.Accordion("Opções avançadas - Divisor de texto do documento", open=False):
270
  with gr.Row():
271
- slider_chunk_size = gr.Slider(minimum=100, maximum=1000, value=600, step=20,
272
- label="Tamanho do chunk", info="Tamanho do chunk", interactive=True)
273
  with gr.Row():
274
- slider_chunk_overlap = gr.Slider(minimum=10, maximum=200, value=40, step=10,
275
- label="Sobreposição do chunk", info="Sobreposição do chunk", interactive=True)
276
  with gr.Row():
277
  db_progress = gr.Textbox(label="Inicialização do banco de dados vetorial", value="Nenhum")
278
  with gr.Row():
279
- process_btn = gr.Button("Gerar banco de dados vetorial")
280
-
281
- # Passo 3 - Configuração da cadeia QA
282
- with gr.Tab("Passo 3 - Inicializar cadeia de QA"):
283
  with gr.Row():
284
- llm_btn = gr.Radio(["Model 1", "Model 2"], label="Modelos LLM", value="Model 1",
285
- type="index", info="Escolha seu modelo LLM")
286
  with gr.Accordion("Opções avançadas - Modelo LLM", open=False):
287
  with gr.Row():
288
- slider_temperature = gr.Slider(minimum=0.01, maximum=1.0, value=0.7, step=0.1,
289
- label="Temperatura", info="Temperatura do modelo", interactive=True)
290
  with gr.Row():
291
- slider_maxtokens = gr.Slider(minimum=224, maximum=4096, value=1024, step=32,
292
- label="Máximo de Tokens", info="Máximo de tokens do modelo", interactive=True)
293
  with gr.Row():
294
- slider_topk = gr.Slider(minimum=1, maximum=10, value=3, step=1,
295
- label="Amostras top-k", info="Amostras top-k do modelo", interactive=True)
296
  with gr.Row():
297
- llm_progress = gr.Textbox(value="Nenhum", label="Inicialização da cadeia de QA")
298
  with gr.Row():
299
- qa_init_btn = gr.Button("Inicializar cadeia de Perguntas e Respostas")
300
 
301
- # Passo 4 - Interface do Chatbot
302
- with gr.Tab("Passo 4 - Chatbot"):
303
  chatbot = gr.Chatbot(height=300)
304
- with gr.Accordion("Avançado - Referências de documentos", open=False):
305
  with gr.Row():
306
  doc_source1 = gr.Textbox(label="Referência 1", lines=2, container=True, scale=20)
307
  source1_page = gr.Number(label="Página", scale=1)
@@ -312,52 +247,38 @@ def demo():
312
  doc_source3 = gr.Textbox(label="Referência 3", lines=2, container=True, scale=20)
313
  source3_page = gr.Number(label="Página", scale=1)
314
  with gr.Row():
315
- msg = gr.Textbox(placeholder="Digite uma mensagem (ex: 'Sobre o que é este documento?')", container=True)
316
  with gr.Row():
317
  submit_btn = gr.Button("Enviar mensagem")
318
  clear_btn = gr.ClearButton([msg, chatbot], value="Limpar conversa")
319
-
320
  # Eventos de pré-processamento
321
- process_btn.click(
322
- initialize_database,
323
- inputs=[document, slider_chunk_size, slider_chunk_overlap],
324
- outputs=[db_progress]
325
- )
326
-
327
- qa_init_btn.click(
328
- initialize_LLM,
329
- inputs=[llm_btn, slider_temperature, slider_maxtokens, slider_topk, db_progress],
330
- outputs=[llm_progress]
331
- ).then(
332
- lambda: [None, "", 0, "", 0, "", 0],
333
- inputs=None,
334
- outputs=[chatbot, doc_source1, source1_page, doc_source2, source2_page, doc_source3, source3_page],
335
- queue=False
336
- )
337
-
338
- # Eventos do chatbot
339
- msg.submit(
340
- conversation,
341
- inputs=[qa_chain, msg, chatbot],
342
- outputs=[qa_chain, msg, chatbot, doc_source1, source1_page, doc_source2, source2_page, doc_source3, source3_page],
343
- queue=False
344
- )
345
-
346
- submit_btn.click(
347
- conversation,
348
- inputs=[qa_chain, msg, chatbot],
349
- outputs=[qa_chain, msg, chatbot, doc_source1, source1_page, doc_source2, source2_page, doc_source3, source3_page],
350
- queue=False
351
- )
352
-
353
- clear_btn.click(
354
- lambda: [None, "", 0, "", 0, "", 0],
355
- inputs=None,
356
- outputs=[chatbot, doc_source1, source1_page, doc_source2, source2_page, doc_source3, source3_page],
357
- queue=False
358
- )
359
 
 
 
 
 
 
 
 
 
 
 
 
 
 
360
  demo.queue().launch(debug=True)
361
 
 
362
  if __name__ == "__main__":
363
  demo()
 
184
  list_file_path.append(file_path)
185
  return list_file_path
186
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  def demo():
188
+ with gr.Blocks(theme="base") as demo:
189
+ vector_db = gr.State()
190
+ qa_chain = gr.State()
191
+ collection_name = gr.State()
 
 
 
 
 
 
 
 
 
 
192
 
 
193
  gr.Markdown(
194
+ """<center><h2>Chatbot baseado em PDF</center></h2>
195
+ <h3>Faça qualquer pergunta sobre seus documentos PDF</h3>""")
 
 
 
196
  gr.Markdown(
197
+ """<b>Nota:</b> Este assistente de IA, utilizando Langchain e LLMs de código aberto, realiza geração aumentada por recuperação (RAG) a partir de seus documentos PDF. \
198
+ A interface do usuário mostra explicitamente várias etapas para ajudar a entender o fluxo de trabalho do RAG.
199
+ Este chatbot leva em consideração perguntas anteriores ao gerar respostas (via memória conversacional), e inclui referências documentais para maior clareza.<br>
200
+ <br><b>Aviso:</b> Este espaço usa a CPU básica gratuita do Hugging Face. Algumas etapas e modelos LLM utilizados abaixo (pontos finais de inferência gratuitos) podem levar algum tempo para gerar uma resposta.
201
+ """)
202
+
203
+ with gr.Tab("Etapa 1 - Carregar PDF"):
 
 
 
204
  with gr.Row():
205
+ document = gr.Files(height=100, file_count="multiple", file_types=["pdf"], interactive=True, label="Carregue seus documentos PDF (único ou múltiplos)")
206
+ # upload_btn = gr.UploadButton("Carregando documento...", height=100, file_count="multiple", file_types=["pdf"], scale=1)
207
+
208
+ with gr.Tab("Etapa 2 - Processar documento"):
 
209
  with gr.Row():
210
+ db_btn = gr.Radio(["ChromaDB"], label="Tipo de banco de dados vetorial", value = "ChromaDB", type="index", info="Escolha o banco de dados vetorial")
 
211
  with gr.Accordion("Opções avançadas - Divisor de texto do documento", open=False):
212
  with gr.Row():
213
+ slider_chunk_size = gr.Slider(minimum = 100, maximum = 1000, value=600, step=20, label="Tamanho do bloco", info="Tamanho do bloco", interactive=True)
 
214
  with gr.Row():
215
+ slider_chunk_overlap = gr.Slider(minimum = 10, maximum = 200, value=40, step=10, label="Sobreposição do bloco", info="Sobreposição do bloco", interactive=True)
 
216
  with gr.Row():
217
  db_progress = gr.Textbox(label="Inicialização do banco de dados vetorial", value="Nenhum")
218
  with gr.Row():
219
+ db_btn = gr.Button("Gerar banco de dados vetorial")
220
+
221
+ with gr.Tab("Etapa 3 - Inicializar cadeia de QA"):
 
222
  with gr.Row():
223
+ llm_btn = gr.Radio(list_llm_simple, \
224
+ label="Modelos LLM", value = list_llm_simple[0], type="index", info="Escolha seu modelo LLM")
225
  with gr.Accordion("Opções avançadas - Modelo LLM", open=False):
226
  with gr.Row():
227
+ slider_temperature = gr.Slider(minimum = 0.01, maximum = 1.0, value=0.7, step=0.1, label="Temperatura", info="Temperatura do modelo", interactive=True)
 
228
  with gr.Row():
229
+ slider_maxtokens = gr.Slider(minimum = 224, maximum = 4096, value=1024, step=32, label="Máximo de Tokens", info="Máximo de tokens do modelo", interactive=True)
 
230
  with gr.Row():
231
+ slider_topk = gr.Slider(minimum = 1, maximum = 10, value=3, step=1, label="Amostras top-k", info="Amostras top-k do modelo", interactive=True)
 
232
  with gr.Row():
233
+ llm_progress = gr.Textbox(value="Nenhum",label="Inicialização da cadeia QA")
234
  with gr.Row():
235
+ qachain_btn = gr.Button("Inicializar cadeia de Pergunta e Resposta")
236
 
237
+ with gr.Tab("Etapa 4 - Chatbot"):
 
238
  chatbot = gr.Chatbot(height=300)
239
+ with gr.Accordion("Avançado - Referências do documento", open=False):
240
  with gr.Row():
241
  doc_source1 = gr.Textbox(label="Referência 1", lines=2, container=True, scale=20)
242
  source1_page = gr.Number(label="Página", scale=1)
 
247
  doc_source3 = gr.Textbox(label="Referência 3", lines=2, container=True, scale=20)
248
  source3_page = gr.Number(label="Página", scale=1)
249
  with gr.Row():
250
+ msg = gr.Textbox(placeholder="Digite a mensagem (exemplo: 'Sobre o que é este documento?')", container=True)
251
  with gr.Row():
252
  submit_btn = gr.Button("Enviar mensagem")
253
  clear_btn = gr.ClearButton([msg, chatbot], value="Limpar conversa")
254
+
255
  # Eventos de pré-processamento
256
+ #upload_btn.upload(upload_file, inputs=[upload_btn], outputs=[document])
257
+ db_btn.click(initialize_database, \
258
+ inputs=[document, slider_chunk_size, slider_chunk_overlap], \
259
+ outputs=[vector_db, collection_name, db_progress])
260
+ qachain_btn.click(initialize_LLM, \
261
+ inputs=[llm_btn, slider_temperature, slider_maxtokens, slider_topk, vector_db], \
262
+ outputs=[qa_chain, llm_progress]).then(lambda:[None,"",0,"",0,"",0], \
263
+ inputs=None, \
264
+ outputs=[chatbot, doc_source1, source1_page, doc_source2, source2_page, doc_source3, source3_page], \
265
+ queue=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
266
 
267
+ # Eventos do Chatbot
268
+ msg.submit(conversation, \
269
+ inputs=[qa_chain, msg, chatbot], \
270
+ outputs=[qa_chain, msg, chatbot, doc_source1, source1_page, doc_source2, source2_page, doc_source3, source3_page], \
271
+ queue=False)
272
+ submit_btn.click(conversation, \
273
+ inputs=[qa_chain, msg, chatbot], \
274
+ outputs=[qa_chain, msg, chatbot, doc_source1, source1_page, doc_source2, source2_page, doc_source3, source3_page], \
275
+ queue=False)
276
+ clear_btn.click(lambda:[None,"",0,"",0,"",0], \
277
+ inputs=None, \
278
+ outputs=[chatbot, doc_source1, source1_page, doc_source2, source2_page, doc_source3, source3_page], \
279
+ queue=False)
280
  demo.queue().launch(debug=True)
281
 
282
+
283
  if __name__ == "__main__":
284
  demo()