projeto-rag / app.py
Felipe Silva
removed comments
d4f3e2b
import gradio as gr
import spaces
import torch
import os
from huggingface_hub import snapshot_download
from utils import doc_converter, MSG_NENHUM_ARQUIVO_ENVIADO, MSG_TEXTO_NAO_EXTRAIDO
from rag_utils import create_split_doc, store_docs, create_rag_chain
import config
zero = torch.Tensor([0]).cuda()
print(zero.device)
MAX_FILE_SIZE = 10 * 1024 * 1024 # 10MB
name_model = "Qwen/Qwen2.5-7B-Instruct-GPTQ-Int8"
config.local_model_path = snapshot_download(
repo_id=name_model,
cache_dir="/root/.cache/huggingface",
local_files_only=False
)
config.local_emb_path = snapshot_download(
repo_id="sentence-transformers/all-MiniLM-L6-v2",
cache_dir="/root/.cache/huggingface",
local_files_only=False
)
def process_file(file):
if file is None:
return MSG_NENHUM_ARQUIVO_ENVIADO
file_size = os.path.getsize(file)
if file_size > MAX_FILE_SIZE:
return f"O arquivo excede o limite. Por favor, realize o upload de um arquivo que contenha no máximo {MAX_FILE_SIZE/1024/1024:.1f}MB."
texto_extraido = doc_converter(file)
if texto_extraido is None:
return MSG_TEXTO_NAO_EXTRAIDO
return texto_extraido
@spaces.GPU
def ask_question(texto_extraido, question):
# RAG
docs_splitted = create_split_doc(texto_extraido)
vector_store = store_docs(docs_splitted)
rag_chain = create_rag_chain(vector_store)
# resposta = rag_chain.run(question)
response = rag_chain({"query": question})
resposta = response["result"]
docs_text = "\n\n\n===================================\n\n\n".join([doc.page_content for doc in response["source_documents"]])
return resposta, docs_text
def update_ask_button(extracted_text, question):
if extracted_text and MSG_NENHUM_ARQUIVO_ENVIADO not in extracted_text and MSG_TEXTO_NAO_EXTRAIDO not in extracted_text and question.strip():
return gr.update(interactive=True)
return gr.update(interactive=False)
def launch_app():
with gr.Blocks(title="RAG", theme=gr.themes.Soft(primary_hue="blue", secondary_hue="gray", neutral_hue="slate")) as demo:
gr.Markdown("# 🚀 Retrieval Augmented Generation - RAG")
gr.Markdown("### ⚙️ Pergunte qualquer coisa para seu arquivo.")
gr.Markdown(
"🐶 Faça o upload do seu arquivo e pergunte qualquer coisa a ele! Este código é open source e disponível [aqui](https://github.com/FelipeErmeson/General-RAG) no GitHub. 😁"
)
with gr.Row():
with gr.Column():
file_input = gr.File(label="Upload da Imagem ou PDF", file_types=[".png", ".jpg", ".jpeg", ".pdf"])
extracted_text = gr.Textbox(label="🌍 Texto extraído", lines=30)
with gr.Column():
question_input = gr.Textbox(label="📌 Faça uma pergunta ao seu documento!")
ask_button = gr.Button("🔍 Perguntar", variant="primary", size="lg", interactive=False)
answer_output = gr.Textbox(label="🎩 Resposta", lines=15)
docs_sim = gr.Textbox(label="📎 Documentos similares a sua pergunta.", lines=15)
# Conecta funções
file_input.change(fn=process_file, inputs=file_input, outputs=extracted_text)
# Sempre que o texto extraído ou a pergunta mudar, atualiza o botão
extracted_text.change(fn=update_ask_button, inputs=[extracted_text, question_input], outputs=ask_button)
question_input.change(fn=update_ask_button, inputs=[extracted_text, question_input], outputs=ask_button)
# Chama o ask_question com o botão
# question_input.submit(fn=ask_question, inputs=[extracted_text, question_input], outputs=[answer_output, docs_sim])
ask_button.click(fn=ask_question, inputs=[extracted_text, question_input], outputs=[answer_output, docs_sim])
demo.launch()
if __name__ == "__main__":
launch_app()