File size: 3,856 Bytes
784a1cb
 
7a6c415
c71745c
f30b648
fff96e7
784a1cb
f30b648
7a6c415
 
 
 
d0c774c
 
ece1514
b62b49f
 
 
 
 
 
 
 
 
 
f30b648
784a1cb
 
c71745c
 
 
 
aa32ce9
c71745c
ece1514
 
aa32ce9
ece1514
aa32ce9
d0c774c
c3bd22b
c71745c
784a1cb
c71745c
784a1cb
 
 
 
d54767c
 
 
aa32ce9
d54767c
96114f2
d0c774c
aa32ce9
 
 
 
 
9ec48a8
045801f
96114f2
 
9ec48a8
 
 
 
 
 
 
96114f2
9ec48a8
16f21ed
d59e0e8
96114f2
 
9ec48a8
 
aa32ce9
 
 
 
 
 
96114f2
d59e0e8
9ec48a8
 
 
 
ec6b9dd
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import gradio as gr
import spaces
import torch
import os
from huggingface_hub import snapshot_download
from utils import read_file_pdf, fix_type, extract_content_in_pdf, doc_converter, EXTENSIONS_FILES, EXTENSIONS_IMG_FILES
from rag_utils import create_split_doc, store_docs, create_rag_chain
import config

zero = torch.Tensor([0]).cuda()
print(zero.device) # <-- 'cpu' 🤔

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 "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 "Não foi possível extrair o texto."
    
    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 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) 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 Enter ou 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()