Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -3,85 +3,55 @@ from transformers import AutoTokenizer, AutoModelForQuestionAnswering
|
|
3 |
import torch
|
4 |
import logging
|
5 |
import warnings
|
6 |
-
from typing import List, Tuple
|
|
|
7 |
|
8 |
-
|
9 |
-
logging.basicConfig(
|
10 |
-
level=logging.INFO,
|
11 |
-
format='%(asctime)s - %(levelname)s - %(message)s'
|
12 |
-
)
|
13 |
logger = logging.getLogger(__name__)
|
14 |
warnings.filterwarnings('ignore')
|
15 |
|
16 |
-
#
|
17 |
-
THEME_EXAMPLES = {
|
18 |
-
"casamento": [
|
19 |
-
["casamento", "Como manter um casamento feliz segundo a Bíblia?"],
|
20 |
-
["casamento", "Quais são os princípios bíblicos para resolver conflitos no casamento?"],
|
21 |
-
["casamento", "Como demonstrar amor ao cônjuge de acordo com a Bíblia?"],
|
22 |
-
["casamento", "O que a Bíblia diz sobre perdão no casamento?"],
|
23 |
-
["casamento", "Como orar pelo meu casamento?"]
|
24 |
-
],
|
25 |
-
"criacao_filhos": [
|
26 |
-
["criacao_filhos", "Como disciplinar os filhos segundo a Bíblia?"],
|
27 |
-
["criacao_filhos", "Qual a importância de ensinar a Palavra de Deus aos filhos?"],
|
28 |
-
["criacao_filhos", "Como criar filhos tementes a Deus?"],
|
29 |
-
["criacao_filhos", "Como lidar com filhos rebeldes de forma bíblica?"],
|
30 |
-
["criacao_filhos", "Como ensinar valores cristãos aos filhos pequenos?"]
|
31 |
-
],
|
32 |
-
"papel_mulher": [
|
33 |
-
["papel_mulher", "Qual o papel da mulher cristã no lar?"],
|
34 |
-
["papel_mulher", "Como ser uma mãe segundo o coração de Deus?"],
|
35 |
-
["papel_mulher", "O que significa ser uma mulher virtuosa?"],
|
36 |
-
["papel_mulher", "Como equilibrar trabalho e família como mulher cristã?"],
|
37 |
-
["papel_mulher", "Como desenvolver uma vida de oração como mulher?"]
|
38 |
-
],
|
39 |
-
"papel_homem": [
|
40 |
-
["papel_homem", "Quais as responsabilidades do homem como líder do lar?"],
|
41 |
-
["papel_homem", "Como ser um pai presente segundo a Bíblia?"],
|
42 |
-
["papel_homem", "O que significa ser o sacerdote do lar?"],
|
43 |
-
["papel_homem", "Como liderar a família espiritualmente?"],
|
44 |
-
["papel_homem", "Como demonstrar amor à esposa segundo as escrituras?"]
|
45 |
-
]
|
46 |
-
}
|
47 |
-
|
48 |
-
# Banco de passagens bíblicas [mantido o mesmo de antes]
|
49 |
BIBLICAL_PASSAGES = {
|
50 |
"casamento": [
|
51 |
{
|
52 |
"passagem": "Efésios 5:22-33",
|
53 |
-
"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
|
54 |
-
"contexto": "Relacionamento conjugal"
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
{
|
59 |
-
"passagem": "
|
60 |
-
"texto": "
|
61 |
-
"contexto": "
|
|
|
|
|
62 |
}
|
63 |
],
|
64 |
-
"
|
65 |
{
|
66 |
-
"passagem": "
|
67 |
-
"texto": "
|
68 |
-
"contexto": "
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
{
|
73 |
-
"passagem": "
|
74 |
-
"texto": "
|
75 |
-
"contexto": "
|
|
|
|
|
76 |
}
|
77 |
]
|
78 |
}
|
79 |
|
80 |
-
class
|
81 |
def __init__(self):
|
82 |
-
logger.info("Inicializando conselheiro bíblico...")
|
83 |
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
84 |
self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
|
|
|
85 |
|
86 |
try:
|
87 |
self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
|
@@ -92,23 +62,50 @@ class BiblicalCounselor:
|
|
92 |
logger.error(f"Erro ao carregar modelo: {str(e)}")
|
93 |
raise
|
94 |
|
95 |
-
def
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
try:
|
97 |
if theme not in BIBLICAL_PASSAGES:
|
98 |
return "Tema não encontrado em nossa base.", "Sem referências disponíveis."
|
99 |
|
100 |
-
|
|
|
101 |
context = passage["texto"]
|
102 |
|
|
|
103 |
inputs = self.tokenizer.encode_plus(
|
104 |
question,
|
105 |
context,
|
106 |
return_tensors="pt",
|
107 |
-
max_length=
|
108 |
truncation=True,
|
109 |
padding="max_length"
|
110 |
).to(self.device)
|
111 |
|
|
|
112 |
with torch.no_grad():
|
113 |
outputs = self.model(**inputs)
|
114 |
|
@@ -119,104 +116,81 @@ class BiblicalCounselor:
|
|
119 |
answer = tokens[answer_start:answer_end + 1]
|
120 |
answer = self.tokenizer.convert_tokens_to_string(answer)
|
121 |
|
122 |
-
|
123 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
|
125 |
-
return
|
126 |
|
127 |
except Exception as e:
|
128 |
logger.error(f"Erro ao processar pergunta: {str(e)}")
|
129 |
return "Perdoe-nos, ocorreu um erro ao processar sua pergunta.", "Erro no processamento"
|
130 |
|
131 |
-
def
|
132 |
-
|
133 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
134 |
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
with gr.Row():
|
147 |
-
with gr.Column():
|
148 |
-
theme = gr.Dropdown(
|
149 |
-
choices=list(BIBLICAL_PASSAGES.keys()),
|
150 |
-
label="Tema de Aconselhamento",
|
151 |
-
value="casamento"
|
152 |
-
)
|
153 |
-
question = gr.Textbox(
|
154 |
-
label="Sua Pergunta",
|
155 |
-
placeholder="O que gostaria de saber sobre este tema?",
|
156 |
-
lines=2
|
157 |
-
)
|
158 |
-
submit_btn = gr.Button("🙏 Buscar Orientação")
|
159 |
-
|
160 |
-
with gr.Column():
|
161 |
-
answer_output = gr.Textbox(
|
162 |
-
label="Conselho Bíblico",
|
163 |
-
lines=4
|
164 |
-
)
|
165 |
-
reference_output = gr.Textbox(
|
166 |
-
label="Referência Bíblica",
|
167 |
-
lines=2
|
168 |
-
)
|
169 |
-
|
170 |
-
# Exemplos dinâmicos baseados no tema
|
171 |
-
examples = gr.Examples(
|
172 |
-
examples=THEME_EXAMPLES["casamento"], # Exemplos iniciais
|
173 |
-
inputs=[theme, question],
|
174 |
-
outputs=[answer_output, reference_output],
|
175 |
-
fn=lambda t, q: counselor.get_answer(t, q),
|
176 |
-
label="Exemplos de Perguntas"
|
177 |
-
)
|
178 |
-
|
179 |
-
# Atualiza exemplos quando o tema muda
|
180 |
-
def update_examples(new_theme):
|
181 |
-
examples.update(examples=THEME_EXAMPLES[new_theme])
|
182 |
-
|
183 |
-
theme.change(
|
184 |
-
fn=update_examples,
|
185 |
-
inputs=[theme]
|
186 |
-
)
|
187 |
-
|
188 |
-
submit_btn.click(
|
189 |
-
fn=lambda t, q: counselor.get_answer(t, q),
|
190 |
-
inputs=[theme, question],
|
191 |
-
outputs=[answer_output, reference_output]
|
192 |
-
)
|
193 |
-
|
194 |
-
gr.Markdown("""
|
195 |
-
---
|
196 |
-
💝 Desenvolvido para edificação | Baseado nas Sagradas Escrituras
|
197 |
-
|
198 |
-
#### Como usar:
|
199 |
-
1. Selecione um tema de seu interesse
|
200 |
-
2. Digite sua pergunta ou use um dos exemplos abaixo
|
201 |
-
3. Clique em "Buscar Orientação" para receber o conselho bíblico
|
202 |
-
4. Medite na resposta e nas referências fornecidas
|
203 |
-
""")
|
204 |
-
|
205 |
-
return demo
|
206 |
|
207 |
-
|
208 |
-
logger.error(f"Erro ao criar interface: {str(e)}")
|
209 |
-
raise
|
210 |
|
211 |
if __name__ == "__main__":
|
212 |
try:
|
213 |
-
logger.info("Iniciando aplicação...")
|
214 |
-
demo =
|
215 |
-
demo.launch(
|
216 |
-
server_name="0.0.0.0",
|
217 |
-
share=True,
|
218 |
-
show_error=True
|
219 |
-
)
|
220 |
except Exception as e:
|
221 |
logger.error(f"Erro ao iniciar aplicação: {str(e)}")
|
222 |
raise
|
|
|
3 |
import torch
|
4 |
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 |
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 |
|
|
|
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
|