DHEIVER commited on
Commit
f69b9a6
1 Parent(s): 4284778

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +103 -91
app.py CHANGED
@@ -1,108 +1,120 @@
1
  import gradio as gr
2
- from ctransformers import AutoModelForCausalLM
3
- import textwrap
4
- import os
5
  import logging
6
- from tqdm import tqdm
 
 
7
 
8
- # Configurar logging
9
  logging.basicConfig(level=logging.INFO)
10
  logger = logging.getLogger(__name__)
11
 
12
- # Diretório para cache
13
- CACHE_DIR = os.path.join(os.path.expanduser("~"), ".bible_qa_cache")
14
- os.makedirs(CACHE_DIR, exist_ok=True)
 
 
 
 
 
 
15
 
16
- def load_model(progress=gr.Progress()):
17
- logger.info("Iniciando carregamento do modelo...")
18
- progress(0, desc="Iniciando carregamento do modelo")
19
-
20
- try:
21
- model = AutoModelForCausalLM.from_pretrained(
22
- "TheBloke/Llama-2-7B-Chat-GGML",
23
- model_file="llama-2-7b-chat.ggmlv3.q4_0.bin",
24
- model_type="llama",
25
- max_new_tokens=512,
26
- temperature=0.7,
27
- context_length=2048,
28
- cache_dir=CACHE_DIR
29
- )
30
- progress(1, desc="Modelo carregado com sucesso!")
31
- logger.info("Modelo carregado com sucesso!")
32
- return model
33
- except Exception as e:
34
- logger.error(f"Erro ao carregar o modelo: {str(e)}")
35
- raise
36
 
37
- def format_prompt(question):
38
- return f"""Você é um assistente especializado em conhecimento bíblico.
39
- Por favor, responda à seguinte pergunta com base nas escrituras bíblicas:
40
-
41
- Pergunta: {question}
42
-
43
- Resposta baseada na Bíblia:"""
44
 
45
- def generate_biblical_response(question, model):
46
- try:
47
- prompt = format_prompt(question)
48
- response = model(prompt, max_new_tokens=512)
49
- return textwrap.fill(response, width=80)
50
- except Exception as e:
51
- logger.error(f"Erro ao gerar resposta: {str(e)}")
52
- return f"Erro ao gerar resposta: {str(e)}"
53
 
54
- def create_interface():
55
- with gr.Blocks() as demo:
56
- gr.Markdown("""# Consultor Bíblico Virtual
57
- Faça perguntas sobre a Bíblia e receba respostas baseadas nas escrituras.""")
58
-
59
- # Carrega o modelo uma única vez
60
- model = load_model()
61
-
62
- with gr.Row():
63
- with gr.Column():
64
- question_input = gr.Textbox(
65
- lines=2,
66
- placeholder="Digite sua pergunta sobre a Bíblia aqui...",
67
- label="Sua Pergunta"
68
- )
69
- submit_btn = gr.Button("Enviar Pergunta")
70
-
71
- with gr.Column():
72
- answer_output = gr.Textbox(
73
- lines=10,
74
- label="Resposta"
75
- )
76
-
77
- # Exemplos sem cache
78
- gr.Examples(
79
- examples=[
80
- "O que a Bíblia diz sobre amor ao próximo?",
81
- "Como é descrita a criação do mundo no livro de Gênesis?",
82
- "Quais são os principais ensinamentos de Jesus sobre perdão?"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  ],
84
- inputs=question_input,
85
- cache_examples=False # Desativa o cache dos exemplos
86
- )
87
-
88
- def process_question(question):
89
- logger.info(f"Processando pergunta: {question}")
90
- return generate_biblical_response(question, model)
91
-
92
- submit_btn.click(
93
- fn=process_question,
94
- inputs=question_input,
95
- outputs=answer_output
96
- )
97
-
98
- return demo
99
 
100
  if __name__ == "__main__":
101
  logger.info("Iniciando aplicação...")
102
- demo = create_interface()
103
- demo.queue(concurrency_count=1).launch(
104
  server_name="0.0.0.0",
105
  share=True,
106
- show_error=True,
107
- cache_examples=False
108
  )
 
1
  import gradio as gr
2
+ from transformers import AutoTokenizer, AutoModelForQuestionAnswering
3
+ import torch
 
4
  import logging
5
+ from typing import Tuple, Dict
6
+ import warnings
7
+ warnings.filterwarnings('ignore')
8
 
9
+ # Configuração de logging
10
  logging.basicConfig(level=logging.INFO)
11
  logger = logging.getLogger(__name__)
12
 
13
+ class QAModel:
14
+ def __init__(self):
15
+ logger.info("Inicializando modelo...")
16
+ self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
17
+ self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
18
+ self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
19
+ self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name)
20
+ self.model.to(self.device)
21
+ logger.info(f"Modelo carregado no dispositivo: {self.device}")
22
 
23
+ def answer_question(self, question: str, context: str) -> Tuple[str, Dict]:
24
+ # Tokenização
25
+ inputs = self.tokenizer.encode_plus(
26
+ question, context,
27
+ add_special_tokens=True,
28
+ return_tensors="pt",
29
+ max_length=512,
30
+ truncation=True,
31
+ padding="max_length"
32
+ ).to(self.device)
 
 
 
 
 
 
 
 
 
 
33
 
34
+ # Previsão
35
+ with torch.no_grad():
36
+ outputs = self.model(**inputs)
 
 
 
 
37
 
38
+ # Processamento das respostas
39
+ answer_start = torch.argmax(outputs.start_logits)
40
+ answer_end = torch.argmax(outputs.end_logits)
 
 
 
 
 
41
 
42
+ # Convertendo para tokens e depois para texto
43
+ tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
44
+ answer = tokens[answer_start:answer_end + 1]
45
+ answer = self.tokenizer.convert_tokens_to_string(answer)
46
+
47
+ # Calculando score
48
+ confidence_start = torch.softmax(outputs.start_logits, dim=1)[0][answer_start].item()
49
+ confidence_end = torch.softmax(outputs.end_logits, dim=1)[0][answer_end].item()
50
+ confidence = (confidence_start + confidence_end) / 2
51
+
52
+ return answer, {
53
+ "confiança": f"{confidence:.2%}",
54
+ "início": answer_start.item(),
55
+ "fim": answer_end.item()
56
+ }
57
+
58
+ def create_gradio_interface():
59
+ # Instanciando o modelo
60
+ qa_model = QAModel()
61
+
62
+ def process_question(context: str, question: str) -> Tuple[str, str]:
63
+ try:
64
+ answer, metadata = qa_model.answer_question(question, context)
65
+ return (
66
+ answer,
67
+ f"Confiança: {metadata['confiança']}\n"
68
+ f"Posição da resposta: {metadata['início']} até {metadata['fim']}"
69
+ )
70
+ except Exception as e:
71
+ logger.error(f"Erro ao processar pergunta: {str(e)}")
72
+ return "Ocorreu um erro ao processar sua pergunta.", "N/A"
73
+
74
+ # Criando a interface
75
+ demo = gr.Interface(
76
+ fn=process_question,
77
+ inputs=[
78
+ gr.Textbox(
79
+ label="Contexto",
80
+ placeholder="Cole aqui o texto de contexto...",
81
+ lines=10
82
+ ),
83
+ gr.Textbox(
84
+ label="Pergunta",
85
+ placeholder="Digite sua pergunta sobre o texto acima...",
86
+ lines=2
87
+ )
88
+ ],
89
+ outputs=[
90
+ gr.Textbox(label="Resposta"),
91
+ gr.Textbox(label="Metadados")
92
+ ],
93
+ title="Perguntas e Respostas em Português",
94
+ description="""
95
+ Este aplicativo usa o modelo BERT em português para responder perguntas baseadas em um contexto fornecido.
96
+ Cole um texto no campo de contexto e faça uma pergunta sobre ele.
97
+ """,
98
+ examples=[
99
+ [
100
+ "O Brasil é o maior país da América do Sul. Sua capital é Brasília e sua maior cidade é São Paulo. O país tem uma população de mais de 200 milhões de habitantes.",
101
+ "Qual é a capital do Brasil?"
102
  ],
103
+ [
104
+ "A linguagem Python foi criada por Guido van Rossum em 1991. É uma linguagem de programação de alto nível, interpretada e orientada a objetos.",
105
+ "Quem criou a linguagem Python?"
106
+ ]
107
+ ],
108
+ theme=gr.themes.Soft()
109
+ )
110
+
111
+ return demo
 
 
 
 
 
 
112
 
113
  if __name__ == "__main__":
114
  logger.info("Iniciando aplicação...")
115
+ demo = create_gradio_interface()
116
+ demo.launch(
117
  server_name="0.0.0.0",
118
  share=True,
119
+ show_error=True
 
120
  )