DHEIVER commited on
Commit
32648a9
1 Parent(s): 3f3176a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +124 -121
app.py CHANGED
@@ -5,53 +5,61 @@ import logging
5
  import warnings
6
  from typing import List, Tuple, Dict
7
  import random
 
8
 
9
  logging.basicConfig(level=logging.INFO)
10
  logger = logging.getLogger(__name__)
11
  warnings.filterwarnings('ignore')
12
 
13
- # Expandindo o banco de passagens bíblicas com mais contexto
14
- BIBLICAL_PASSAGES = {
15
  "casamento": [
16
  {
17
- "passagem": "Efésios 5:22-33",
18
- "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, sendo ele próprio o salvador do corpo. De sorte que, assim como a igreja está sujeita a Cristo, assim também as mulheres sejam em tudo sujeitas a seus maridos. Vós, maridos, amai vossas mulheres, como também Cristo amou a igreja, e a si mesmo se entregou por ela, Para a santificar, purificando-a com a lavagem da água, pela palavra, Para a apresentar a si mesmo igreja gloriosa, sem mácula, nem ruga, nem coisa semelhante, mas santa e irrepreensível. Assim devem os maridos amar as suas mulheres, como a seus próprios corpos. Quem ama a sua mulher, ama-se a si mesmo.""",
19
- "contexto": "Relacionamento conjugal e amor sacrificial",
20
- "aplicação": "Este texto apresenta o modelo divino para o casamento, onde o amor sacrificial e o respeito mútuo são fundamentais. O marido deve amar como Cristo amou a igreja, e a esposa deve respeitar como a igreja respeita a Cristo.",
21
- "princípios": ["Amor sacrificial", "Respeito mútuo", "Liderança servidora", "Unidade conjugal"]
22
  },
23
  {
24
- "passagem": "1 Coríntios 13:4-7",
25
- "texto": """O amor é paciente, o amor é bondoso. Não inveja, não se vangloria, não se orgulha. Não maltrata, não procura seus interesses, não se ira facilmente, não guarda rancor. O amor não se alegra com a injustiça, mas se alegra com a verdade. Tudo sofre, tudo crê, tudo espera, tudo suporta.""",
26
- "contexto": "Definição do amor verdadeiro",
27
- "aplicação": "Esta passagem define o amor verdadeiro e suas características práticas, essenciais para um casamento saudável.",
28
- "princípios": ["Paciência", "Bondade", "Humildade", "Perdão", "Perseverança"]
29
- }
30
- ],
31
- "criacao_filhos": [
32
  {
33
- "passagem": "Deuteronômio 6:6-9",
34
- "texto": """E estas palavras, que hoje te ordeno, estarão no teu coração; E as ensinarás a teus filhos, e delas falarás assentado em tua casa, e andando pelo caminho, e deitando-te e levantando-te. Também as atarás por sinal na tua mão, e te serão por frontais entre os teus olhos. E as escreverás nos umbrais de tua casa, e nas tuas portas.""",
35
- "contexto": "Instrução espiritual dos filhos",
36
- "aplicação": "Os pais têm a responsabilidade primária de ensinar os princípios divinos aos filhos em todos os momentos da vida cotidiana.",
37
- "princípios": ["Ensino contínuo", "Exemplo pessoal", "Imersão na Palavra", "Disciplina amorosa"]
38
  },
39
  {
40
- "passagem": "Provérbios 22:6",
41
- "texto": """Instrui o menino no caminho em que deve andar, e até quando envelhecer não se desviará dele.""",
42
- "contexto": "Educação e formação de caráter",
43
- "aplicação": "A formação espiritual e moral na infância tem impacto duradouro na vida adulta.",
44
- "princípios": ["Instrução precoce", "Constância no ensino", "Formação de caráter"]
 
 
 
 
 
 
 
45
  }
 
 
 
46
  ]
47
  }
48
 
49
- class EnhancedBiblicalCounselor:
50
  def __init__(self):
51
- logger.info("Inicializando conselheiro bíblico aprimorado...")
52
  self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
53
  self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
54
- self.max_length = 512 # Máximo de tokens
55
 
56
  try:
57
  self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
@@ -62,135 +70,130 @@ class EnhancedBiblicalCounselor:
62
  logger.error(f"Erro ao carregar modelo: {str(e)}")
63
  raise
64
 
65
- def format_contextual_response(self, answer: str, passage: Dict, question: str) -> str:
66
- """Formata uma resposta contextualizada e detalhada"""
67
 
68
- response_template = f"""
69
- 🕊️ Resposta Pastoral:
70
- Com base nas Sagradas Escrituras, especialmente em {passage['passagem']}, {answer}
71
-
72
- 📖 Contexto Bíblico:
73
- {passage['contexto']}
74
-
75
- ✝️ Princípios Bíblicos Aplicáveis:
76
- {' '.join(passage['princípios'])}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
 
78
- 🙏 Aplicação Prática:
79
- {passage['aplicação']}
 
 
80
 
81
- 📚 Passagem Completa para Meditação:
82
- "{passage['texto']}"
83
 
84
- 💭 Reflexão Final:
85
- Medite nesta palavra e permita que o Espírito Santo a aplique em sua vida. Lembre-se que a Palavra de Deus é viva e eficaz para todas as áreas de nossa vida.
86
- """
87
- return response_template
88
 
89
- def get_comprehensive_answer(self, theme: str, question: str) -> Tuple[str, str]:
90
- try:
91
- if theme not in BIBLICAL_PASSAGES:
92
- return "Tema não encontrado em nossa base.", "Sem referências disponíveis."
93
-
94
- # Seleciona uma passagem relevante
95
- passage = BIBLICAL_PASSAGES[theme][0] # Poderia ser randomizado entre as disponíveis
96
- context = passage["texto"]
97
-
98
- # Prepara o input com máximo de tokens
99
- inputs = self.tokenizer.encode_plus(
100
- question,
101
- context,
102
- return_tensors="pt",
103
- max_length=self.max_length,
104
- truncation=True,
105
- padding="max_length"
106
- ).to(self.device)
107
-
108
- # Gera a resposta
109
- with torch.no_grad():
110
- outputs = self.model(**inputs)
111
-
112
- answer_start = torch.argmax(outputs.start_logits)
113
- answer_end = torch.argmax(outputs.end_logits)
114
-
115
- tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
116
- answer = tokens[answer_start:answer_end + 1]
117
- answer = self.tokenizer.convert_tokens_to_string(answer)
118
 
119
- # Formata resposta contextualizada
120
- detailed_answer = self.format_contextual_response(answer, passage, question)
121
-
122
- # Prepara metadados
123
- metadata = f"""
124
- 📚 Referências Adicionais:
125
- • Passagem Principal: {passage['passagem']}
126
- • Tema: {theme.replace('_', ' ').title()}
127
- • Contexto: {passage['contexto']}
128
- """
129
 
130
- return detailed_answer, metadata
131
 
132
- except Exception as e:
133
- logger.error(f"Erro ao processar pergunta: {str(e)}")
134
- return "Perdoe-nos, ocorreu um erro ao processar sua pergunta.", "Erro no processamento"
135
 
136
- def create_enhanced_interface():
137
- counselor = EnhancedBiblicalCounselor()
138
-
139
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
140
  gr.Markdown("""
141
- # 🕊️ Conselheiro Bíblico Aprofundado
142
- ### Orientação Bíblica Contextualizada e Detalhada
143
  """)
144
 
145
  with gr.Row():
146
  with gr.Column():
147
  theme = gr.Dropdown(
148
- choices=list(BIBLICAL_PASSAGES.keys()),
149
- label="Tema de Aconselhamento",
150
  value="casamento"
151
  )
152
  question = gr.Textbox(
153
  label="Sua Pergunta",
154
- placeholder="Compartilhe sua dúvida para receber orientação bíblica...",
155
  lines=3
156
  )
157
- submit_btn = gr.Button("🙏 Buscar Orientação Aprofundada")
158
 
159
  with gr.Column():
160
  answer_output = gr.Textbox(
161
- label="Conselho Bíblico Detalhado",
162
- lines=15
163
  )
164
- reference_output = gr.Textbox(
165
- label="Referências e Contexto",
166
- lines=5
167
  )
168
 
169
- submit_btn.click(
170
- fn=lambda t, q: counselor.get_comprehensive_answer(t, q),
 
 
 
 
 
 
 
171
  inputs=[theme, question],
172
- outputs=[answer_output, reference_output]
 
 
173
  )
174
 
175
- gr.Markdown("""
176
- ---
177
- 💝 Desenvolvido para edificação profunda na Palavra | Baseado nas Sagradas Escrituras
178
-
179
- #### Como aproveitar ao máximo este recurso:
180
- 1. Escolha o tema específico de sua dúvida
181
- 2. Faça uma pergunta clara e específica
182
- 3. Leia atentamente a resposta contextualizada
183
- 4. Medite nas passagens bíblicas fornecidas
184
- 5. Ore pedindo sabedoria para aplicar os princípios
185
- """)
186
 
187
  return demo
188
 
189
  if __name__ == "__main__":
190
  try:
191
- logger.info("Iniciando aplicação de aconselhamento bíblico aprofundado...")
192
- demo = create_enhanced_interface()
193
- demo.launch(server_name="0.0.0.0", share=True, show_error=True)
 
 
 
 
194
  except Exception as e:
195
  logger.error(f"Erro ao iniciar aplicação: {str(e)}")
196
  raise
 
5
  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)
 
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,
195
+ show_error=True
196
+ )
197
  except Exception as e:
198
  logger.error(f"Erro ao iniciar aplicação: {str(e)}")
199
  raise