DHEIVER commited on
Commit
20a9402
1 Parent(s): 0ee930b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +151 -159
app.py CHANGED
@@ -2,176 +2,168 @@ 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
  import json
8
  from datetime import datetime
9
  import random
 
 
 
 
 
 
 
 
10
  warnings.filterwarnings('ignore')
11
 
12
- # [O código das constantes BIBLICAL_PASSAGES permanece o mesmo]
13
- # [A classe BiblicalCounselorModel permanece a mesma]
14
-
15
- def create_enhanced_interface():
16
- qa_model = BiblicalCounselorModel()
17
-
18
- def get_verse_of_day():
19
- """Retorna um versículo diário aleatório"""
20
- all_verses = []
21
- for theme_verses in BIBLICAL_PASSAGES.values():
22
- all_verses.extend(theme_verses)
23
- verse = random.choice(all_verses)
24
- return f"📖 {verse['passagem']}\n\n{verse['texto']}"
25
-
26
- def get_theme_summary(theme: str) -> str:
27
- """Retorna um resumo das passagens bíblicas do tema"""
28
- if theme in BIBLICAL_PASSAGES:
29
- passages = BIBLICAL_PASSAGES[theme]
30
- summary = f"📚 Principais passagens sobre {theme.replace('_', ' ').title()}:\n\n"
31
- for p in passages:
32
- summary += f"• {p['passagem']}: {p['texto'][:100]}...\n\n"
33
- return summary
34
- return "Tema não encontrado."
35
-
36
- def save_testimony(testimony: str) -> str:
37
- """Salva um testemunho compartilhado"""
38
- if testimony.strip():
39
- timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
40
- with open("testimonies.txt", "a", encoding="utf-8") as f:
41
- f.write(f"\n[{timestamp}] {testimony}\n")
42
- return "🙏 Obrigado por compartilhar seu testemunho! Que ele possa edificar outros irmãos."
43
- return "Por favor, escreva seu testemunho antes de enviar."
44
-
45
- def process_counseling(theme: str, question: str) -> Tuple[str, str]:
 
 
 
 
46
  try:
47
- answer, metadata = qa_model.answer_question(theme, question)
48
- return (
49
- answer,
50
- f"📖 Tema: {metadata['tema'].replace('_', ' ').title()}\n"
51
- f"✝️ Passagem: {metadata['passagem']}\n"
52
- f"🕊️ Contexto: {metadata['contexto_completo']}"
53
- )
54
  except Exception as e:
55
- logger.error(f"Erro ao processar pergunta: {str(e)}")
56
- return "Perdoe-nos, houve uma dificuldade em processar sua pergunta. Vamos orar e tentar novamente.", "N/A"
57
 
58
- with gr.Blocks(theme=gr.themes.Soft()) as demo:
59
- gr.Markdown(
60
- """
61
- # 🕊️ Conselheiro Bíblico Virtual
62
- ### Centro de Aconselhamento e Edificação
63
 
64
- _"Toda a Escritura é inspirada por Deus e útil para o ensino, para a repreensão,
65
- para a correção e para a instrução na justiça." - 2 Timóteo 3:16_
66
- """
67
- )
 
 
 
 
 
 
 
 
68
 
69
- with gr.Tabs():
70
- # Aba de Aconselhamento
71
- with gr.Tab("📚 Aconselhamento Bíblico"):
72
- with gr.Row():
73
- with gr.Column():
74
- theme = gr.Dropdown(
75
- choices=[
76
- "casamento",
77
- "criacao_filhos",
78
- "papel_mulher",
79
- "papel_homem",
80
- "financas",
81
- "trabalho"
82
- ],
83
- label="Tema de Aconselhamento",
84
- value="casamento"
85
- )
86
- question = gr.Textbox(
87
- label="Sua Pergunta",
88
- placeholder="Qual sua dúvida sobre este tema?",
89
- lines=2
90
- )
91
- submit_btn = gr.Button("🙏 Buscar Orientação Bíblica", variant="primary")
92
-
93
- with gr.Column():
94
- theme_info = gr.Textbox(
95
- label="Passagens Relacionadas ao Tema",
96
- lines=5
97
- )
98
- theme.change(fn=get_theme_summary, inputs=[theme], outputs=[theme_info])
99
-
100
- counseling_output = gr.Textbox(label="Conselho Bíblico", lines=5)
101
- references = gr.Textbox(label="Referências Bíblicas", lines=3)
102
-
103
- submit_btn.click(
104
- fn=process_counseling,
105
- inputs=[theme, question],
106
- outputs=[counseling_output, references]
107
- )
108
-
109
- # Aba de Versículo do Dia
110
- with gr.Tab("✨ Versículo do Dia"):
111
- gr.Markdown("### Palavra para Reflexão")
112
- verse_output = gr.Textbox(label="", lines=4)
113
- refresh_btn = gr.Button("🔄 Novo Versículo")
114
- refresh_btn.click(fn=get_verse_of_day, inputs=[], outputs=[verse_output])
115
-
116
- # Aba de Testemunhos
117
- with gr.Tab("💝 Compartilhe seu Testemunho"):
118
- gr.Markdown("""
119
- ### Compartilhe sua Experiência
120
- Conte como a Palavra de Deus tem transformado sua vida
121
- """)
122
- testimony_input = gr.Textbox(
123
- label="Seu Testemunho",
124
- placeholder="Compartilhe aqui sua experiência...",
125
- lines=5
126
- )
127
- share_btn = gr.Button("❤️ Compartilhar Testemunho")
128
- testimony_output = gr.Textbox(label="Status")
129
- share_btn.click(
130
- fn=save_testimony,
131
- inputs=[testimony_input],
132
- outputs=[testimony_output]
133
- )
134
-
135
- # Aba de Recursos
136
- with gr.Tab("📖 Recursos"):
137
- gr.Markdown("""
138
- ### Recursos para Estudo Bíblico
139
-
140
- #### 📚 Temas Disponíveis:
141
- - Casamento e Família
142
- - Criação de Filhos
143
- - Papel da Mulher
144
- - Papel do Homem
145
- - Finanças
146
- - Trabalho e Vocação
147
-
148
- #### 🙏 Como Usar:
149
- 1. Escolha um tema de seu interesse
150
- 2. Faça sua pergunta específica
151
- 3. Receba orientação baseada nas Escrituras
152
- 4. Medite nas passagens fornecidas
153
-
154
- #### ✝️ Lembre-se:
155
- - Ore antes de buscar orientação
156
- - Leia o contexto completo das passagens
157
- - Busque aconselhamento pastoral presencial quando necessário
158
- """)
159
-
160
- # Rodapé
161
- gr.Markdown("""
162
- ---
163
- 💖 Desenvolvido para edificação do Corpo de Cristo | Versão 2.0
164
-
165
- _"Porque a palavra de Deus é viva e eficaz..." - Hebreus 4:12_
166
- """)
167
 
168
- return demo
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
169
 
170
  if __name__ == "__main__":
171
- logger.info("Iniciando ministério de aconselhamento bíblico aprimorado...")
172
- demo = create_enhanced_interface()
173
- demo.launch(
174
- server_name="0.0.0.0",
175
- share=True,
176
- show_error=True
177
- )
 
 
 
 
 
2
  from transformers import AutoTokenizer, AutoModelForQuestionAnswering
3
  import torch
4
  import logging
 
5
  import warnings
6
  import json
7
  from datetime import datetime
8
  import random
9
+ from pathlib import Path
10
+
11
+ # Configuração do logging
12
+ logging.basicConfig(
13
+ level=logging.INFO,
14
+ format='%(asctime)s - %(levelname)s - %(message)s'
15
+ )
16
+ logger = logging.getLogger(__name__)
17
  warnings.filterwarnings('ignore')
18
 
19
+ # Banco de passagens bíblicas
20
+ BIBLICAL_PASSAGES = {
21
+ "casamento": [
22
+ {
23
+ "passagem": "Efésios 5:22-33",
24
+ "texto": "Vós, mulheres, sujeitai-vos a vossos maridos, como ao Senhor; Porque o marido é a cabeça da mulher, como também Cristo é a cabeça da igreja... Assim devem os maridos amar as suas mulheres, como a seus próprios corpos.",
25
+ "contexto": "Relacionamento conjugal"
26
+ }
27
+ ],
28
+ "criacao_filhos": [
29
+ {
30
+ "passagem": "Provérbios 22:6",
31
+ "texto": "Instrui o menino no caminho em que deve andar, e até quando envelhecer não se desviará dele.",
32
+ "contexto": "Educação dos filhos"
33
+ }
34
+ ],
35
+ "papel_mulher": [
36
+ {
37
+ "passagem": "Provérbios 31:10-31",
38
+ "texto": "Mulher virtuosa, quem a achará? O seu valor muito excede o de rubis... Abre a sua boca com sabedoria, e a lei da beneficência está na sua língua.",
39
+ "contexto": "Mulher virtuosa"
40
+ }
41
+ ],
42
+ "papel_homem": [
43
+ {
44
+ "passagem": "1 Timóteo 5:8",
45
+ "texto": "Mas, se alguém não tem cuidado dos seus, e principalmente dos da sua família, negou a fé, e é pior do que o infiel.",
46
+ "contexto": "Responsabilidade familiar"
47
+ }
48
+ ]
49
+ }
50
+
51
+ class BiblicalCounselor:
52
+ def __init__(self):
53
+ logger.info("Inicializando conselheiro bíblico...")
54
+ self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
55
+ self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
56
+
57
  try:
58
+ self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
59
+ self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name)
60
+ self.model.to(self.device)
61
+ logger.info(f"Modelo carregado com sucesso no dispositivo: {self.device}")
 
 
 
62
  except Exception as e:
63
+ logger.error(f"Erro ao carregar modelo: {str(e)}")
64
+ raise
65
 
66
+ def get_answer(self, theme: str, question: str) -> tuple:
67
+ try:
68
+ # Obtém o contexto bíblico para o tema
69
+ if theme not in BIBLICAL_PASSAGES:
70
+ return "Tema não encontrado em nossa base.", "Sem referências disponíveis."
71
 
72
+ passage = BIBLICAL_PASSAGES[theme][0]
73
+ context = passage["texto"]
74
+
75
+ # Tokenização
76
+ inputs = self.tokenizer.encode_plus(
77
+ question,
78
+ context,
79
+ return_tensors="pt",
80
+ max_length=512,
81
+ truncation=True,
82
+ padding="max_length"
83
+ ).to(self.device)
84
 
85
+ # Obtenção da resposta
86
+ with torch.no_grad():
87
+ outputs = self.model(**inputs)
88
+
89
+ answer_start = torch.argmax(outputs.start_logits)
90
+ answer_end = torch.argmax(outputs.end_logits)
91
+
92
+ tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
93
+ answer = tokens[answer_start:answer_end + 1]
94
+ answer = self.tokenizer.convert_tokens_to_string(answer)
95
+
96
+ # Formatação da resposta
97
+ formatted_answer = f"Com base na palavra de Deus, {answer}"
98
+ reference = f"📖 {passage['passagem']}\n✝️ Contexto: {passage['contexto']}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
 
100
+ return formatted_answer, reference
101
+
102
+ except Exception as e:
103
+ logger.error(f"Erro ao processar pergunta: {str(e)}")
104
+ return "Perdoe-nos, ocorreu um erro ao processar sua pergunta.", "Erro no processamento"
105
+
106
+ def create_interface():
107
+ try:
108
+ counselor = BiblicalCounselor()
109
+ logger.info("Interface sendo criada...")
110
+
111
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
112
+ gr.Markdown("""
113
+ # 🕊️ Conselheiro Bíblico
114
+ ### Orientação baseada nas Sagradas Escrituras
115
+ """)
116
+
117
+ with gr.Row():
118
+ with gr.Column():
119
+ theme = gr.Dropdown(
120
+ choices=list(BIBLICAL_PASSAGES.keys()),
121
+ label="Tema de Aconselhamento",
122
+ value="casamento"
123
+ )
124
+ question = gr.Textbox(
125
+ label="Sua Pergunta",
126
+ placeholder="O que gostaria de saber sobre este tema?",
127
+ lines=2
128
+ )
129
+ submit_btn = gr.Button("🙏 Buscar Orientação")
130
+
131
+ with gr.Column():
132
+ answer_output = gr.Textbox(
133
+ label="Conselho Bíblico",
134
+ lines=4
135
+ )
136
+ reference_output = gr.Textbox(
137
+ label="Referência Bíblica",
138
+ lines=2
139
+ )
140
+
141
+ submit_btn.click(
142
+ fn=lambda t, q: counselor.get_answer(t, q),
143
+ inputs=[theme, question],
144
+ outputs=[answer_output, reference_output]
145
+ )
146
+
147
+ gr.Markdown("""
148
+ ---
149
+ 💝 Desenvolvido para edificação | Baseado nas Sagradas Escrituras
150
+ """)
151
+
152
+ return demo
153
+
154
+ except Exception as e:
155
+ logger.error(f"Erro ao criar interface: {str(e)}")
156
+ raise
157
 
158
  if __name__ == "__main__":
159
+ try:
160
+ logger.info("Iniciando aplicação...")
161
+ demo = create_interface()
162
+ demo.launch(
163
+ server_name="0.0.0.0",
164
+ share=True,
165
+ show_error=True
166
+ )
167
+ except Exception as e:
168
+ logger.error(f"Erro ao iniciar aplicação: {str(e)}")
169
+ raise