DHEIVER commited on
Commit
6ad6360
·
verified ·
1 Parent(s): 32648a9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +209 -165
app.py CHANGED
@@ -6,189 +6,233 @@ import warnings
6
  from typing import List, Tuple, Dict
7
  import random
8
  import hashlib
 
9
 
10
  logging.basicConfig(level=logging.INFO)
11
  logger = logging.getLogger(__name__)
12
  warnings.filterwarnings('ignore')
13
 
14
- # Banco de exemplos e respostas pré-definidas
15
- BIBLICAL_EXAMPLES = {
16
- "casamento": [
17
- {
18
- "pergunta": "Como resolver conflitos no casamento?",
19
- "passagem": "Efésios 4:26-32",
20
- "texto": """Não se ponha o sol sobre a vossa ira. Não deis lugar ao diabo. Toda amargura, cólera, ira, gritaria e blasfêmia sejam tiradas dentre vós, bem como toda malícia. Antes, sede bondosos uns para com os outros, compassivos, perdoando uns aos outros, como também Deus vos perdoou em Cristo.""",
21
- "resposta_base": """O princípio bíblico para resolução de conflitos no casamento envolve três aspectos fundamentais: não deixar a ira se prolongar, comunicar-se com amor e praticar o perdão mútuo. A Palavra nos ensina que devemos resolver os conflitos rapidamente, não permitindo que o sol se ponha sobre nossa ira.""",
22
- "aplicacao": "Resolução diária de conflitos, perdão e reconciliação"
23
- },
24
- {
25
- "pergunta": "Como manter um casamento forte espiritualmente?",
26
- "passagem": "Eclesiastes 4:9-12",
27
- "texto": """É melhor serem dois do que um, porque têm melhor paga do seu trabalho. Porque se um cair, o outro levanta o seu companheiro; mas ai do que estiver só; pois, caindo, não haverá outro que o levante. Também, se dois dormirem juntos, eles se aquentarão; mas um só, como se aquentará? E, se alguém prevalecer contra um, os dois lhe resistirão; e o cordão de três dobras não se quebra tão depressa.""",
28
- "resposta_base": """A força espiritual do casamento vem da união em três dimensões: o marido, a esposa e Deus. Como um cordão de três dobras, esta união proporciona apoio mútuo, fortalecimento espiritual e resistência nas adversidades.""",
29
- "aplicacao": "Desenvolvimento espiritual conjunto e oração em casal"
30
- },
31
- {
32
- "pergunta": "Qual o papel do perdão no casamento?",
33
- "passagem": "Colossenses 3:13-14",
34
- "texto": """Suportando-vos uns aos outros, e perdoando-vos uns aos outros, se alguém tiver queixa contra outro; assim como Cristo vos perdoou, assim fazei vós também. E, sobre tudo isto, revesti-vos de amor, que é o vínculo da perfeição.""",
35
- "resposta_base": """O perdão no casamento reflete o perdão que recebemos de Cristo. É um ato contínuo de amor que fortalece o vínculo conjugal e promove a cura emocional. Devemos perdoar assim como fomos perdoados.""",
36
- "aplicacao": "Prática do perdão e cultivo do amor sacrificial"
37
- },
38
- {
39
- "pergunta": "Como manter a fidelidade no casamento?",
40
- "passagem": "Hebreus 13:4",
41
- "texto": """Venerado seja entre todos o matrimônio e o leito sem mácula; porém aos que se dão à prostituição e aos adúlteros, Deus os julgará.""",
42
- "resposta_base": """A fidelidade no casamento é um mandamento divino que requer compromisso, respeito mútuo e temor a Deus. O matrimônio deve ser honrado por todos, mantendo a pureza e a santidade da união conjugal.""",
43
- "aplicacao": "Compromisso com a fidelidade e pureza conjugal"
44
- },
45
- {
46
- "pergunta": "Como lidar com diferenças no casamento?",
47
- "passagem": "1 Pedro 3:8-9",
48
- "texto": """Finalmente, sede todos de um mesmo sentimento, compassivos, amando os irmãos, entranhavelmente misericordiosos e humildes. Não tornando mal por mal, ou injúria por injúria; antes, pelo contrário, bendizendo.""",
49
- "resposta_base": """As diferenças no casamento devem ser tratadas com compreensão, humildade e respeito mútuo. A unidade não significa uniformidade, mas harmonia nas diferenças através do amor e da compaixão.""",
50
- "aplicacao": "Respeito às diferenças e busca da harmonia"
51
- }
52
- ],
53
- "criacao_filhos": [
54
- # [Exemplos similares para outros temas...]
55
- ]
56
- }
57
-
58
- class DiverseBiblicalCounselor:
59
- def __init__(self):
60
- logger.info("Inicializando conselheiro bíblico...")
61
- self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
62
- self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
63
-
64
- try:
65
- self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
66
- self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name)
67
- self.model.to(self.device)
68
- logger.info(f"Modelo carregado com sucesso no dispositivo: {self.device}")
69
- except Exception as e:
70
- logger.error(f"Erro ao carregar modelo: {str(e)}")
71
- raise
72
-
73
- def get_unique_response(self, question: str, theme: str) -> Tuple[str, Dict]:
74
- """Gera uma resposta única baseada na pergunta e tema"""
75
-
76
- # Gera um hash da pergunta para garantir consistência
77
- question_hash = hashlib.md5(question.lower().encode()).hexdigest()
78
-
79
- # Seleciona exemplo baseado no hash
80
- examples = BIBLICAL_EXAMPLES.get(theme, [])
81
- if not examples:
82
- return "Tema não encontrado", {}
83
-
84
- # Usa o hash para selecionar um exemplo de forma determinística
85
- selected_index = int(question_hash, 16) % len(examples)
86
- example = examples[selected_index]
87
-
88
- # Prepara o contexto para o modelo
89
- inputs = self.tokenizer.encode_plus(
90
- question,
91
- example["texto"],
92
- return_tensors="pt",
93
- max_length=512,
94
- truncation=True,
95
- padding="max_length"
96
- ).to(self.device)
97
-
98
- # Gera a resposta
99
- with torch.no_grad():
100
- outputs = self.model(**inputs)
101
-
102
- answer_start = torch.argmax(outputs.start_logits)
103
- answer_end = torch.argmax(outputs.end_logits)
104
-
105
- tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
106
- model_answer = tokens[answer_start:answer_end + 1]
107
- model_answer = self.tokenizer.convert_tokens_to_string(model_answer)
108
-
109
- # Formata a resposta final
110
- response = f"""
111
- 🕊️ Conselho Bíblico:
112
- {example['resposta_base']}
113
 
114
- 📖 Passagem Bíblica:
115
- {example['passagem']}: {example['texto']}
116
-
117
- ✝️ Aplicação Prática:
118
- {example['aplicacao']}
119
-
120
- 💭 Reflexão Adicional:
121
- {model_answer}
122
- """
123
-
124
- metadata = {
125
- "passagem": example['passagem'],
126
- "contexto": "Baseado em princípios bíblicos para " + theme.replace('_', ' '),
127
- "aplicacao": example['aplicacao']
128
- }
129
-
130
- return response, metadata
131
-
132
- def create_interface():
133
  counselor = DiverseBiblicalCounselor()
134
-
135
- with gr.Blocks(theme=gr.themes.Soft()) as demo:
136
- gr.Markdown("""
137
- # 🕊️ Conselheiro Bíblico
138
- ### Orientação Bíblica Personalizada
139
- """)
140
-
141
- with gr.Row():
142
- with gr.Column():
143
- theme = gr.Dropdown(
144
- choices=list(BIBLICAL_EXAMPLES.keys()),
145
- label="Tema",
146
- value="casamento"
147
- )
148
- question = gr.Textbox(
149
- label="Sua Pergunta",
150
- placeholder="Digite sua pergunta...",
151
- lines=3
152
- )
153
- submit_btn = gr.Button("🙏 Buscar Orientação")
154
-
155
- with gr.Column():
156
- answer_output = gr.Textbox(
157
- label="Resposta",
158
- lines=10
159
- )
160
- metadata_output = gr.Textbox(
161
- label="Referências",
162
- lines=3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  )
164
 
165
- # Exemplos
166
- gr.Examples(
167
- examples=[
168
- ["casamento", "Como resolver conflitos no casamento?"],
169
- ["casamento", "Como manter um casamento forte espiritualmente?"],
170
- ["casamento", "Qual o papel do perdão no casamento?"],
171
- ["casamento", "Como manter a fidelidade no casamento?"],
172
- ["casamento", "Como lidar com diferenças no casamento?"]
173
- ],
174
- inputs=[theme, question],
175
- outputs=[answer_output, metadata_output],
176
- fn=lambda t, q: counselor.get_unique_response(q, t),
177
- label="Exemplos de Perguntas"
178
- )
179
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
  submit_btn.click(
181
  fn=lambda t, q: counselor.get_unique_response(q, t),
182
  inputs=[theme, question],
183
- outputs=[answer_output, metadata_output]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
  )
185
 
186
  return demo
187
 
188
  if __name__ == "__main__":
189
  try:
190
- logger.info("Iniciando aplicação...")
191
- demo = create_interface()
192
  demo.launch(
193
  server_name="0.0.0.0",
194
  share=True,
 
6
  from typing import List, Tuple, Dict
7
  import random
8
  import hashlib
9
+ from datetime import datetime
10
 
11
  logging.basicConfig(level=logging.INFO)
12
  logger = logging.getLogger(__name__)
13
  warnings.filterwarnings('ignore')
14
 
15
+ # [BIBLICAL_EXAMPLES permanece o mesmo]
16
+ # [DiverseBiblicalCounselor permanece o mesmo]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
+ def create_enhanced_interface():
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  counselor = DiverseBiblicalCounselor()
20
+
21
+ # Temas organizados com ícones
22
+ THEMES = {
23
+ "casamento": "💑 Casamento e Família",
24
+ "criacao_filhos": "👶 Criação de Filhos",
25
+ "papel_mulher": "👩 Papel da Mulher",
26
+ "papel_homem": "👨 Papel do Homem",
27
+ "financas": "💰 Finanças",
28
+ "trabalho": "💼 Trabalho"
29
+ }
30
+
31
+ # CSS personalizado
32
+ custom_css = """
33
+ .feedback-btn {
34
+ margin: 5px;
35
+ min-width: 30px;
36
+ font-size: 1.2em;
37
+ }
38
+ .container {
39
+ max-width: 1200px;
40
+ margin: auto;
41
+ }
42
+ .verse-box {
43
+ background-color: #f8f9fa;
44
+ padding: 15px;
45
+ border-radius: 10px;
46
+ margin: 10px 0;
47
+ }
48
+ .theme-selector {
49
+ margin-bottom: 20px;
50
+ }
51
+ """
52
+
53
+ with gr.Blocks(theme=gr.themes.Soft(), css=custom_css) as demo:
54
+ # Cabeçalho
55
+ with gr.Row(elem_classes="container"):
56
+ gr.Markdown("""
57
+ # 🕊️ Conselheiro Bíblico Virtual
58
+ ### Orientação Espiritual Baseada nas Sagradas Escrituras
59
+
60
+ _"Toda a Escritura é inspirada por Deus e útil para o ensino, para a repreensão,
61
+ para a correção e para a instrução na justiça." - 2 Timóteo 3:16_
62
+ """)
63
+
64
+ # Conteúdo Principal
65
+ with gr.Tabs() as tabs:
66
+ # Aba de Aconselhamento
67
+ with gr.TabItem("📚 Aconselhamento", id=1):
68
+ with gr.Row():
69
+ # Coluna Esquerda - Entrada
70
+ with gr.Column(scale=1):
71
+ theme = gr.Dropdown(
72
+ choices=list(THEMES.items()),
73
+ label="Escolha o Tema",
74
+ value="casamento",
75
+ elem_classes="theme-selector"
76
+ )
77
+
78
+ # Versículo do Dia
79
+ verse_box = gr.Textbox(
80
+ label="✨ Versículo do Dia",
81
+ value="Renovado diariamente...",
82
+ elem_classes="verse-box",
83
+ lines=3,
84
+ interactive=False
85
+ )
86
+
87
+ question = gr.Textbox(
88
+ label="💭 Sua Pergunta",
89
+ placeholder="Digite sua dúvida ou preocupação...",
90
+ lines=3
91
+ )
92
+
93
+ with gr.Row():
94
+ submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary")
95
+ clear_btn = gr.Button("🔄 Nova Consulta")
96
+
97
+ # Coluna Direita - Saída
98
+ with gr.Column(scale=1):
99
+ with gr.Box():
100
+ answer_output = gr.Markdown(
101
+ label="Resposta",
102
+ value="Sua orientação aparecerá aqui..."
103
+ )
104
+
105
+ with gr.Accordion("📖 Referências Bíblicas", open=False):
106
+ references = gr.Markdown()
107
+
108
+ # Feedback
109
+ with gr.Row():
110
+ gr.Markdown("Esta resposta foi útil?")
111
+ helpful_btn = gr.Button("👍", elem_classes="feedback-btn")
112
+ not_helpful_btn = gr.Button("👎", elem_classes="feedback-btn")
113
+
114
+ # Aba de Exemplos
115
+ with gr.TabItem("📋 Exemplos", id=2):
116
+ gr.Examples(
117
+ examples=[
118
+ ["casamento", "Como resolver conflitos no casamento?"],
119
+ ["casamento", "Como manter um casamento forte espiritualmente?"],
120
+ ["casamento", "Qual o papel do perdão no casamento?"],
121
+ ["casamento", "Como manter a fidelidade no casamento?"],
122
+ ["casamento", "Como lidar com diferenças no casamento?"]
123
+ ],
124
+ inputs=[theme, question],
125
+ outputs=[answer_output, references],
126
+ fn=lambda t, q: counselor.get_unique_response(q, t),
127
+ label="Exemplos de Perguntas Comuns"
128
  )
129
 
130
+ # Aba de Recursos
131
+ with gr.TabItem("📚 Recursos", id=3):
132
+ gr.Markdown("""
133
+ ### 📖 Recursos Disponíveis
134
+
135
+ #### Temas Abordados:
136
+ - 💑 **Casamento e Família**
137
+ - Relacionamento conjugal
138
+ - Comunicação
139
+ - Resolução de conflitos
140
+
141
+ - 👶 **Criação de Filhos**
142
+ - Educação cristã
143
+ - Disciplina
144
+ - Desenvolvimento espiritual
145
+
146
+ - 👩 **Papel da Mulher**
147
+ - Liderança no lar
148
+ - Ministério
149
+ - Equilíbrio vida-trabalho
150
+
151
+ - 👨 **Papel do Homem**
152
+ - Liderança espiritual
153
+ - Responsabilidades
154
+ - Paternidade
155
+
156
+ #### 🛠️ Como Usar:
157
+ 1. Escolha um tema relacionado à sua dúvida
158
+ 2. Digite sua pergunta de forma clara
159
+ 3. Clique em "Buscar Orientação"
160
+ 4. Leia a resposta e as referências bíblicas
161
+ 5. Use o feedback para nos ajudar a melhorar
162
+
163
+ #### 🙏 Lembretes Importantes:
164
+ - Ore antes de buscar orientação
165
+ - Leia o contexto completo das passagens
166
+ - Consulte sua liderança espiritual local
167
+ """)
168
+
169
+ # Rodapé
170
+ with gr.Row(elem_classes="container"):
171
+ gr.Markdown("""
172
+ ---
173
+ 💝 Desenvolvido para edificação do Corpo de Cristo | Atualizado: {data}
174
+
175
+ _"Porque a palavra de Deus é viva e eficaz..." - Hebreus 4:12_
176
+ """.format(data=datetime.now().strftime("%d/%m/%Y")))
177
+
178
+ # Eventos
179
+ def clear_outputs():
180
+ return {
181
+ question: "",
182
+ answer_output: "Sua orientação aparecerá aqui...",
183
+ references: ""
184
+ }
185
+
186
+ def update_verse():
187
+ verses = [
188
+ "O Senhor é meu pastor, nada me faltará. (Salmos 23:1)",
189
+ "Tudo posso naquele que me fortalece. (Filipenses 4:13)",
190
+ "O amor é paciente, o amor é bondoso... (1 Coríntios 13:4)"
191
+ ]
192
+ return random.choice(verses)
193
+
194
+ def process_feedback(helpful: bool):
195
+ feedback_msg = "Obrigado pelo seu feedback! 🙏"
196
+ return gr.Markdown.update(value=feedback_msg)
197
+
198
+ # Eventos
199
  submit_btn.click(
200
  fn=lambda t, q: counselor.get_unique_response(q, t),
201
  inputs=[theme, question],
202
+ outputs=[answer_output, references]
203
+ )
204
+
205
+ clear_btn.click(
206
+ fn=clear_outputs,
207
+ inputs=[],
208
+ outputs=[question, answer_output, references]
209
+ )
210
+
211
+ helpful_btn.click(
212
+ fn=lambda: process_feedback(True),
213
+ inputs=[],
214
+ outputs=[answer_output]
215
+ )
216
+
217
+ not_helpful_btn.click(
218
+ fn=lambda: process_feedback(False),
219
+ inputs=[],
220
+ outputs=[answer_output]
221
+ )
222
+
223
+ # Atualiza versículo do dia ao iniciar
224
+ demo.load(
225
+ fn=update_verse,
226
+ inputs=[],
227
+ outputs=[verse_box]
228
  )
229
 
230
  return demo
231
 
232
  if __name__ == "__main__":
233
  try:
234
+ logger.info("Iniciando aplicação com interface aprimorada...")
235
+ demo = create_enhanced_interface()
236
  demo.launch(
237
  server_name="0.0.0.0",
238
  share=True,