DHEIVER commited on
Commit
35edc8e
1 Parent(s): a15a384

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +161 -40
app.py CHANGED
@@ -19,7 +19,6 @@ class DiverseBiblicalCounselor:
19
  self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
20
  self.session_history = []
21
 
22
- # Movendo os exemplos para dentro da classe
23
  self.biblical_examples = {
24
  "casamento": [
25
  {
@@ -35,6 +34,13 @@ class DiverseBiblicalCounselor:
35
  "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.""",
36
  "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.""",
37
  "aplicacao": "Desenvolvimento espiritual conjunto e oração em casal"
 
 
 
 
 
 
 
38
  }
39
  ],
40
  "familia": [
@@ -44,6 +50,84 @@ class DiverseBiblicalCounselor:
44
  "texto": """Instrui o menino no caminho em que deve andar, e até quando envelhecer não se desviará dele.""",
45
  "resposta_base": """A educação dos filhos deve ser fundamentada nos princípios bíblicos, com amor, disciplina e instrução constante. Os pais são responsáveis por guiar seus filhos no caminho do Senhor desde cedo.""",
46
  "aplicacao": "Ensino diário dos princípios bíblicos aos filhos"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  }
48
  ]
49
  }
@@ -85,6 +169,23 @@ class DiverseBiblicalCounselor:
85
 
86
  return f"📖 Versículo do Dia:\n{verse['passagem']}\n\n{verse['texto']}"
87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  def save_to_history(self, question: str, theme: str, response: str, metadata: Dict):
89
  """Salva a consulta no histórico com timestamp"""
90
  self.session_history.append({
@@ -110,49 +211,57 @@ class DiverseBiblicalCounselor:
110
  history_text += "─" * 50 + "\n"
111
  return history_text
112
 
113
- def get_unique_response(self, question: str, theme: str) -> Tuple[str, Dict, str]:
114
- """Gera uma resposta única baseada na pergunta e tema"""
115
- if theme not in self.biblical_examples:
116
- return "Tema não encontrado", {}, self.format_history()
117
 
118
- question_hash = hashlib.md5(question.lower().encode()).hexdigest()
119
  examples = self.biblical_examples[theme]
120
- selected_index = int(question_hash, 16) % len(examples)
121
  example = examples[selected_index]
122
 
123
- inputs = self.tokenizer.encode_plus(
124
- question,
125
- example["texto"],
126
- return_tensors="pt",
127
- max_length=512,
128
- truncation=True,
129
- padding="max_length"
130
- ).to(self.device)
 
131
 
132
- with torch.no_grad():
133
- outputs = self.model(**inputs)
134
-
135
- answer_start = torch.argmax(outputs.start_logits)
136
- answer_end = torch.argmax(outputs.end_logits)
137
-
138
- tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
139
- model_answer = tokens[answer_start:answer_end + 1]
140
- model_answer = self.tokenizer.convert_tokens_to_string(model_answer)
 
 
 
141
 
142
  response = f"""
143
  🕊️ Conselho Bíblico:
144
  {example['resposta_base']}
 
145
  📖 Passagem Bíblica:
146
  {example['passagem']}: {example['texto']}
 
147
  ✝️ Aplicação Prática:
148
  {example['aplicacao']}
 
149
  💭 Reflexão Adicional:
150
  {model_answer}
 
 
151
  """
152
 
153
  metadata = {
154
  "passagem": example['passagem'],
155
- "contexto": "Baseado em princípios bíblicos para " + theme.replace('_', ' '),
156
  "aplicacao": example['aplicacao']
157
  }
158
 
@@ -165,7 +274,7 @@ def create_interface():
165
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
166
  gr.Markdown("""
167
  # 🕊️ Conselheiro Bíblico
168
- ### Orientação Bíblica Personalizada
169
  """)
170
 
171
  with gr.Row():
@@ -182,12 +291,13 @@ def create_interface():
182
  with gr.Column():
183
  theme = gr.Dropdown(
184
  choices=counselor.get_themes(),
185
- label="Tema",
186
- value="casamento"
 
187
  )
188
  question = gr.Textbox(
189
  label="Sua Pergunta",
190
- placeholder="Digite sua pergunta...",
191
  lines=3
192
  )
193
  submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary")
@@ -195,7 +305,7 @@ def create_interface():
195
  with gr.Column():
196
  answer_output = gr.Textbox(
197
  label="Resposta",
198
- lines=10
199
  )
200
  metadata_output = gr.Textbox(
201
  label="Referências",
@@ -213,19 +323,29 @@ def create_interface():
213
  with gr.TabItem("ℹ️ Ajuda"):
214
  gr.Markdown("""
215
  ### Como usar o Conselheiro Bíblico:
216
- 1. Selecione um tema relacionado à sua dúvida
217
- 2. Digite sua pergunta de forma clara e objetiva
218
  3. Clique em "Buscar Orientação"
219
  4. Receba orientação baseada em princípios bíblicos
220
-
221
  ### Temas Disponíveis:
222
  - Casamento: Conselhos para relacionamento conjugal
223
  - Família: Orientação para vida familiar
224
-
225
- ### Notas:
226
- - As respostas são baseadas em princípios bíblicos
227
- - Cada consulta é salva no histórico para referência futura
228
- - O versículo do dia é atualizado diariamente
 
 
 
 
 
 
 
 
 
 
229
  """)
230
 
231
  gr.Examples(
@@ -238,7 +358,7 @@ def create_interface():
238
 
239
  submit_btn.click(
240
  fn=counselor.get_unique_response,
241
- inputs=[theme, question],
242
  outputs=[answer_output, metadata_output, history_output]
243
  )
244
 
@@ -251,7 +371,8 @@ if __name__ == "__main__":
251
  demo.launch(
252
  server_name="0.0.0.0",
253
  share=True,
254
- show_error=True
 
255
  )
256
  except Exception as e:
257
  logger.error(f"Erro ao iniciar aplicação: {str(e)}")
 
19
  self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
20
  self.session_history = []
21
 
 
22
  self.biblical_examples = {
23
  "casamento": [
24
  {
 
34
  "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.""",
35
  "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.""",
36
  "aplicacao": "Desenvolvimento espiritual conjunto e oração em casal"
37
+ },
38
+ {
39
+ "pergunta": "Como lidar com diferenças no casamento?",
40
+ "passagem": "1 Pedro 3:8-9",
41
+ "texto": """Finalmente, sede todos de um mesmo sentimento, compassivos, amando os irmãos, entranhavelmente misericordiosos e humildes. Não torneis mal por mal, ou injúria por injúria; antes, pelo contrário, bendizei, sabendo que para isto fostes chamados, para que por herança alcanceis a bênção.""",
42
+ "resposta_base": """As diferenças no casamento devem ser tratadas com compreensão mútua, humildade e amor. O casal deve buscar unidade sem anular as individualidades.""",
43
+ "aplicacao": "Praticar empatia e respeito às diferenças"
44
  }
45
  ],
46
  "familia": [
 
50
  "texto": """Instrui o menino no caminho em que deve andar, e até quando envelhecer não se desviará dele.""",
51
  "resposta_base": """A educação dos filhos deve ser fundamentada nos princípios bíblicos, com amor, disciplina e instrução constante. Os pais são responsáveis por guiar seus filhos no caminho do Senhor desde cedo.""",
52
  "aplicacao": "Ensino diário dos princípios bíblicos aos filhos"
53
+ },
54
+ {
55
+ "pergunta": "Como manter a harmonia familiar?",
56
+ "passagem": "Colossenses 3:13-14",
57
+ "texto": """Suportai-vos uns aos outros, e perdoai-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.""",
58
+ "resposta_base": """A harmonia familiar é construída sobre o fundamento do amor, perdão e compreensão mútua. Cada membro deve contribuir para um ambiente de paz e respeito.""",
59
+ "aplicacao": "Cultivo diário do amor e perdão no ambiente familiar"
60
+ }
61
+ ],
62
+ "vida_espiritual": [
63
+ {
64
+ "pergunta": "Como desenvolver uma vida de oração?",
65
+ "passagem": "1 Tessalonicenses 5:17-18",
66
+ "texto": """Orai sem cessar. Em tudo dai graças, porque esta é a vontade de Deus em Cristo Jesus para convosco.""",
67
+ "resposta_base": """A vida de oração é fundamental para o crescimento espiritual. Devemos manter comunicação constante com Deus, sendo gratos em todas as circunstâncias.""",
68
+ "aplicacao": "Estabelecer momentos diários de oração e gratidão"
69
+ },
70
+ {
71
+ "pergunta": "Como crescer na fé?",
72
+ "passagem": "Romanos 10:17",
73
+ "texto": """De sorte que a fé é pelo ouvir, e o ouvir pela palavra de Deus.""",
74
+ "resposta_base": """O crescimento na fé vem através do estudo e meditação na Palavra de Deus, além da prática constante dos seus ensinamentos.""",
75
+ "aplicacao": "Estudo diário da Bíblia e prática dos ensinamentos"
76
+ },
77
+ {
78
+ "pergunta": "Como vencer tentações?",
79
+ "passagem": "1 Coríntios 10:13",
80
+ "texto": """Não veio sobre vós tentação, senão humana; mas fiel é Deus, que não vos deixará tentar acima do que podeis, antes com a tentação dará também o escape, para que a possais suportar.""",
81
+ "resposta_base": """Deus é fiel em nos dar força e escape das tentações. Devemos confiar em Sua palavra e buscar Sua presença nos momentos de provação.""",
82
+ "aplicacao": "Buscar força em Deus e usar os escapes que Ele provê"
83
+ }
84
+ ],
85
+ "trabalho": [
86
+ {
87
+ "pergunta": "Como ter integridade no trabalho?",
88
+ "passagem": "Colossenses 3:23",
89
+ "texto": """E tudo quanto fizerdes, fazei-o de coração, como ao Senhor e não aos homens.""",
90
+ "resposta_base": """O trabalho deve ser realizado com excelência e integridade, como um serviço ao Senhor.""",
91
+ "aplicacao": "Praticar ética e dedicação no ambiente profissional"
92
+ },
93
+ {
94
+ "pergunta": "Como lidar com pressões no trabalho?",
95
+ "passagem": "Filipenses 4:6-7",
96
+ "texto": """Não andeis ansiosos por coisa alguma; antes em tudo sejam os vossos pedidos conhecidos diante de Deus pela oração e súplica com ação de graças; E a paz de Deus, que excede todo entendimento, guardará os vossos corações e os vossos sentimentos em Cristo Jesus.""",
97
+ "resposta_base": """As pressões do trabalho devem ser entregues a Deus através da oração, mantendo a confiança em Sua provisão e direção.""",
98
+ "aplicacao": "Praticar a entrega das preocupações a Deus"
99
+ }
100
+ ],
101
+ "relacionamentos": [
102
+ {
103
+ "pergunta": "Como lidar com conflitos?",
104
+ "passagem": "Mateus 5:23-24",
105
+ "texto": """Portanto, se estiveres apresentando a tua oferta no altar e aí te lembrares de que teu irmão tem alguma coisa contra ti, deixa ali a tua oferta diante do altar, e vai primeiro reconciliar-te com teu irmão; e depois vem apresentar a tua oferta.""",
106
+ "resposta_base": """A reconciliação e o perdão são prioridades nos relacionamentos cristãos.""",
107
+ "aplicacao": "Buscar reconciliação ativa nos relacionamentos"
108
+ },
109
+ {
110
+ "pergunta": "Como construir amizades verdadeiras?",
111
+ "passagem": "Provérbios 17:17",
112
+ "texto": """Em todo tempo ama o amigo, e na angústia nasce o irmão.""",
113
+ "resposta_base": """Amizades verdadeiras são construídas com amor, lealdade e presença nos momentos difíceis.""",
114
+ "aplicacao": "Cultivar amizades com dedicação e fidelidade"
115
+ }
116
+ ],
117
+ "geral": [
118
+ {
119
+ "pergunta": "Como encontrar propósito na vida?",
120
+ "passagem": "Jeremias 29:11",
121
+ "texto": """Porque eu bem sei os pensamentos que tenho a vosso respeito, diz o Senhor; pensamentos de paz, e não de mal, para vos dar o fim que esperais.""",
122
+ "resposta_base": """Deus tem um propósito específico para cada pessoa, baseado em Seu plano de paz e esperança.""",
123
+ "aplicacao": "Buscar a direção de Deus para a vida"
124
+ },
125
+ {
126
+ "pergunta": "Como ter paz em tempos difíceis?",
127
+ "passagem": "João 14:27",
128
+ "texto": """Deixo-vos a paz, a minha paz vos dou; não vo-la dou como o mundo a dá. Não se turbe o vosso coração, nem se atemorize.""",
129
+ "resposta_base": """A verdadeira paz vem de Deus e permanece mesmo em meio às tribulações.""",
130
+ "aplicacao": "Confiar na paz de Deus em todas as circunstâncias"
131
  }
132
  ]
133
  }
 
169
 
170
  return f"📖 Versículo do Dia:\n{verse['passagem']}\n\n{verse['texto']}"
171
 
172
+ def find_best_theme(self, question: str) -> str:
173
+ """Identifica o melhor tema baseado na pergunta"""
174
+ question = question.lower()
175
+ theme_keywords = {
176
+ "casamento": ["casamento", "cônjuge", "esposa", "marido", "casal", "matrimônio", "matrimonial"],
177
+ "familia": ["família", "filhos", "pais", "criação", "lar", "familiar", "doméstico"],
178
+ "vida_espiritual": ["oração", "jejum", "adoração", "espiritual", "fé", "devoção", "santidade"],
179
+ "trabalho": ["trabalho", "emprego", "carreira", "profissão", "negócio", "profissional"],
180
+ "relacionamentos": ["amizade", "relacionamento", "conflito", "perdão", "amigo", "social"],
181
+ "geral": [] # Tema padrão se nenhum outro corresponder
182
+ }
183
+
184
+ for theme, keywords in theme_keywords.items():
185
+ if any(keyword in question for keyword in keywords):
186
+ return theme
187
+ return "geral"
188
+
189
  def save_to_history(self, question: str, theme: str, response: str, metadata: Dict):
190
  """Salva a consulta no histórico com timestamp"""
191
  self.session_history.append({
 
211
  history_text += "─" * 50 + "\n"
212
  return history_text
213
 
214
+ def get_unique_response(self, question: str, theme: str = None) -> Tuple[str, Dict, str]:
215
+ """Gera uma resposta única baseada na pergunta, detectando o tema automaticamente se não fornecido"""
216
+ if not theme or theme not in self.biblical_examples:
217
+ theme = self.find_best_theme(question)
218
 
 
219
  examples = self.biblical_examples[theme]
220
+ selected_index = random.randint(0, len(examples) - 1)
221
  example = examples[selected_index]
222
 
223
+ try:
224
+ inputs = self.tokenizer.encode_plus(
225
+ question,
226
+ example["texto"],
227
+ return_tensors="pt",
228
+ max_length=512,
229
+ truncation=True,
230
+ padding="max_length"
231
+ ).to(self.device)
232
 
233
+ with torch.no_grad():
234
+ outputs = self.model(**inputs)
235
+
236
+ answer_start = torch.argmax(outputs.start_logits)
237
+ answer_end = torch.argmax(outputs.end_logits)
238
+
239
+ tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
240
+ model_answer = tokens[answer_start:answer_end + 1]
241
+ model_answer = self.tokenizer.convert_tokens_to_string(model_answer)
242
+ except Exception as e:
243
+ logger.error(f"Erro ao gerar resposta: {str(e)}")
244
+ model_answer = "Reflexão baseada nos princípios bíblicos apresentados."
245
 
246
  response = f"""
247
  🕊️ Conselho Bíblico:
248
  {example['resposta_base']}
249
+
250
  📖 Passagem Bíblica:
251
  {example['passagem']}: {example['texto']}
252
+
253
  ✝️ Aplicação Prática:
254
  {example['aplicacao']}
255
+
256
  💭 Reflexão Adicional:
257
  {model_answer}
258
+
259
+ 🙏 Lembre-se: Esta é uma orientação baseada em princípios bíblicos. Para questões específicas, consulte também sua liderança espiritual local.
260
  """
261
 
262
  metadata = {
263
  "passagem": example['passagem'],
264
+ "contexto": f"Baseado em princípios bíblicos para {theme.replace('_', ' ')}",
265
  "aplicacao": example['aplicacao']
266
  }
267
 
 
274
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
275
  gr.Markdown("""
276
  # 🕊️ Conselheiro Bíblico
277
+ ### Orientação Bíblica Personalizada para Qualquer Pergunta
278
  """)
279
 
280
  with gr.Row():
 
291
  with gr.Column():
292
  theme = gr.Dropdown(
293
  choices=counselor.get_themes(),
294
+ label="Tema (Opcional)",
295
+ value="geral",
296
+ info="Selecione um tema ou deixe em branco para detecção automática"
297
  )
298
  question = gr.Textbox(
299
  label="Sua Pergunta",
300
+ placeholder="Digite qualquer pergunta sobre a Bíblia ou vida cristã...",
301
  lines=3
302
  )
303
  submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary")
 
305
  with gr.Column():
306
  answer_output = gr.Textbox(
307
  label="Resposta",
308
+ lines=12
309
  )
310
  metadata_output = gr.Textbox(
311
  label="Referências",
 
323
  with gr.TabItem("ℹ️ Ajuda"):
324
  gr.Markdown("""
325
  ### Como usar o Conselheiro Bíblico:
326
+ 1. Digite sua pergunta sobre qualquer tema bíblico ou da vida cristã
327
+ 2. Opcionalmente, selecione um tema específico para contextualizar melhor sua pergunta
328
  3. Clique em "Buscar Orientação"
329
  4. Receba orientação baseada em princípios bíblicos
330
+
331
  ### Temas Disponíveis:
332
  - Casamento: Conselhos para relacionamento conjugal
333
  - Família: Orientação para vida familiar
334
+ - Vida Espiritual: Crescimento na fé e devoção
335
+ - Trabalho: Princípios bíblicos para a vida profissional
336
+ - Relacionamentos: Amizades e convivência
337
+ - Geral: Outros temas e questões diversas
338
+
339
+ ### Funcionalidades:
340
+ - Versículo diário atualizado automaticamente
341
+ - Detecção automática do tema da sua pergunta
342
+ - Histórico das últimas consultas
343
+ - Respostas baseadas em princípios bíblicos com aplicações práticas
344
+
345
+ ### Observações:
346
+ - As respostas são geradas com base em princípios bíblicos
347
+ - Para questões específicas, recomenda-se consultar também sua liderança espiritual
348
+ - O sistema aprende e se adapta para fornecer respostas mais relevantes
349
  """)
350
 
351
  gr.Examples(
 
358
 
359
  submit_btn.click(
360
  fn=counselor.get_unique_response,
361
+ inputs=[question, theme],
362
  outputs=[answer_output, metadata_output, history_output]
363
  )
364
 
 
371
  demo.launch(
372
  server_name="0.0.0.0",
373
  share=True,
374
+ show_error=True,
375
+ server_port=7860
376
  )
377
  except Exception as e:
378
  logger.error(f"Erro ao iniciar aplicação: {str(e)}")