File size: 3,994 Bytes
f16c594
0503087
5624aa2
bbcd85b
0503087
 
 
 
 
34e5d9c
 
 
5624aa2
 
bbcd85b
 
 
 
 
 
 
 
 
 
 
5624aa2
34e5d9c
 
 
bbcd85b
 
 
 
 
 
 
 
 
 
 
34e5d9c
 
 
 
bbcd85b
 
 
cab5133
ed6732f
6144f90
ed6732f
 
 
 
 
 
 
 
bbcd85b
cab5133
 
 
 
 
ed6732f
9778ffc
6144f90
bbcd85b
 
6144f90
257f52e
cab5133
6144f90
 
bbcd85b
ed6732f
cab5133
bbcd85b
257f52e
bbcd85b
257f52e
bbcd85b
 
 
257f52e
f16c594
34e5d9c
 
 
7398145
5624aa2
34e5d9c
 
 
 
 
 
71c21c0
34e5d9c
 
 
 
 
 
 
5624aa2
f16c594
 
13ae474
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer
import fitz  # PyMuPDF
import traceback

# Carregar o tokenizer e o modelo
tokenizer = AutoTokenizer.from_pretrained("Locutusque/gpt2-xl-conversational")
model = AutoModelForCausalLM.from_pretrained("Locutusque/gpt2-xl-conversational")

# Variável global para armazenar o conteúdo do PDF
pdf_content = ""

# Função para ler o PDF
def read_pdf(file_path):
    try:
        doc = fitz.open(file_path)
        text = ""
        for page_num in range(len(doc)):
            page = doc.load_page(page_num)
            text += page.get_text()
        return text
    except Exception as e:
        print(f"Erro ao ler o PDF: {e}")
        print(traceback.format_exc())
        return ""

# Função para carregar o PDF e armazenar o conteúdo
def load_pdf(pdf_file):
    global pdf_content
    try:
        pdf_path = pdf_file.name  # Acessar o caminho do arquivo carregado
        pdf_content = read_pdf(pdf_path)
        if pdf_content:
            return "PDF carregado com sucesso!"
        else:
            return "Falha ao carregar o PDF."
    except Exception as e:
        print(f"Erro ao carregar o PDF: {e}")
        print(traceback.format_exc())
        return "Erro ao carregar o PDF."

# Função para responder perguntas com base no conteúdo do PDF
def answer_question(question, max_length=200, temperature=0.7, top_k=50, top_p=0.95):
    global pdf_content
    try:
        if not pdf_content:
            return "Por favor, carregue um PDF primeiro.", ""

        # Limitar o tamanho do conteúdo do PDF para evitar exceder o número máximo de tokens
        max_tokens = 512  # Limitar o número de tokens do conteúdo do PDF para evitar sobrecarga
        truncated_content = pdf_content[:max_tokens]

        prompt = f"Conteúdo do PDF: {truncated_content}\nPergunta: {question}\nResposta em português:"

        # Verificando o tamanho do prompt
        print(f"Prompt gerado (tamanho {len(prompt)}):\n{prompt[:500]}...")  # Imprime os primeiros 500 caracteres para depuração

        # Tokenizando o prompt
        inputs = tokenizer(prompt, return_tensors="pt")
        num_tokens = inputs.input_ids.shape[1]
        print(f"Tokens de entrada: {num_tokens} tokens")  # Verifica o número de tokens

        if num_tokens > 1024:
            return "Erro: O prompt gerado ultrapassou o limite de tokens do modelo. Tente um PDF menor.", prompt

        # Gerar a resposta com configurações ajustadas
        print(f"Gerando resposta com max_new_tokens=100 e temperature={temperature}")
        outputs = model.generate(
            inputs.input_ids,
            max_new_tokens=100,  # Gerar até 100 novos tokens (apenas a resposta)
            temperature=temperature,  # Temperatura para controlar a criatividade
            num_return_sequences=1,
            no_repeat_ngram_size=2,  # Evita repetições excessivas
            pad_token_id=tokenizer.eos_token_id,  # Adiciona um token de padding adequado
        )

        # Decodificando a resposta
        response = tokenizer.decode(outputs[0], skip_special_tokens=True)
        print(f"Resposta gerada: {response}")
        return response, prompt

    except Exception as e:
        print(f"Erro ao gerar resposta: {e}")
        print(traceback.format_exc())
        return f"Erro ao gerar resposta: {e}", ""

# Interface do Gradio para carregar PDF e fazer perguntas
pdf_loader = gr.Interface(
    fn=load_pdf,
    inputs=gr.File(label="Carregue um PDF"),
    outputs="text",
    title="Carregar PDF"
)

question_answerer = gr.Interface(
    fn=answer_question,
    inputs=gr.Textbox(lines=2, label="Pergunta"),
    outputs=[gr.Textbox(label="Resposta"), gr.Textbox(label="Prompt usado")],
    title="Perguntas sobre o PDF"
)

# Combinar as interfaces em uma aplicação
iface = gr.TabbedInterface(
    [pdf_loader, question_answerer],
    ["Carregar PDF", "Fazer Perguntas"]
)

if __name__ == "__main__":
    iface.launch()