Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
#
|
15 |
-
|
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 |
-
|
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 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
"""
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
163 |
)
|
164 |
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
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,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
184 |
)
|
185 |
|
186 |
return demo
|
187 |
|
188 |
if __name__ == "__main__":
|
189 |
try:
|
190 |
-
logger.info("Iniciando aplicação...")
|
191 |
-
demo =
|
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,
|