Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -5,13 +5,57 @@ import logging
|
|
5 |
import warnings
|
6 |
from typing import List, Tuple, Dict
|
7 |
import random
|
8 |
-
|
9 |
|
10 |
logging.basicConfig(level=logging.INFO)
|
11 |
logger = logging.getLogger(__name__)
|
12 |
warnings.filterwarnings('ignore')
|
13 |
|
14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
def __init__(self):
|
16 |
logger.info("Inicializando conselheiro bíblico...")
|
17 |
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
@@ -26,147 +70,117 @@ class BiblicalCounselor:
|
|
26 |
logger.error(f"Erro ao carregar modelo: {str(e)}")
|
27 |
raise
|
28 |
|
29 |
-
def
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
"📚 Referência: 1 Pedro 3:7\n🔍 Contexto: Vida de Oração no Casamento"
|
66 |
-
)
|
67 |
-
}
|
68 |
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
inputs = self.tokenizer.encode_plus(
|
78 |
-
question,
|
79 |
-
passage,
|
80 |
-
return_tensors="pt",
|
81 |
-
max_length=512,
|
82 |
-
truncation=True,
|
83 |
-
padding="max_length"
|
84 |
-
).to(self.device)
|
85 |
-
|
86 |
-
with torch.no_grad():
|
87 |
-
outputs = self.model(**inputs)
|
88 |
-
|
89 |
-
answer_start = torch.argmax(outputs.start_logits)
|
90 |
-
answer_end = torch.argmax(outputs.end_logits)
|
91 |
-
|
92 |
-
tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
|
93 |
-
answer = tokens[answer_start:answer_end + 1]
|
94 |
-
model_answer = self.tokenizer.convert_tokens_to_string(answer)
|
95 |
|
96 |
-
|
97 |
-
|
98 |
-
{model_answer}
|
99 |
-
|
100 |
-
📖 Princípios Importantes:
|
101 |
-
1. Busque a orientação divina
|
102 |
-
2. Aplique os princípios bíblicos
|
103 |
-
3. Mantenha-se em oração
|
104 |
-
|
105 |
-
✝️ Aplicação Prática:
|
106 |
-
- Estude a Palavra regularmente
|
107 |
-
- Pratique os ensinamentos
|
108 |
-
- Busque aconselhamento pastoral quando necessário
|
109 |
-
"""
|
110 |
|
111 |
-
|
|
|
|
|
112 |
|
113 |
-
|
|
|
|
|
|
|
|
|
114 |
|
115 |
-
|
116 |
-
logger.error(f"Erro ao processar pergunta: {str(e)}")
|
117 |
-
return "Perdoe-nos, ocorreu um erro ao processar sua pergunta.", "Erro no processamento"
|
118 |
|
119 |
def create_interface():
|
120 |
-
counselor =
|
121 |
-
|
122 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
123 |
gr.Markdown("""
|
124 |
-
# 🕊️ Conselheiro Bíblico
|
125 |
-
### Orientação
|
126 |
""")
|
127 |
|
128 |
with gr.Row():
|
129 |
with gr.Column():
|
130 |
-
# Dropdown com valores corretos
|
131 |
theme = gr.Dropdown(
|
132 |
-
choices=
|
133 |
-
|
134 |
-
|
135 |
)
|
136 |
-
|
137 |
question = gr.Textbox(
|
138 |
-
label="
|
139 |
-
placeholder="Digite sua pergunta
|
140 |
lines=3
|
141 |
)
|
142 |
-
|
143 |
-
submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary")
|
144 |
|
145 |
with gr.Column():
|
146 |
-
answer_output = gr.
|
147 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
148 |
|
149 |
-
# Exemplos sem cache
|
150 |
-
with gr.Row():
|
151 |
-
gr.Markdown("""### Exemplos de Perguntas:
|
152 |
-
1. Como resolver conflitos no casamento?
|
153 |
-
2. Como orar pelo casamento?
|
154 |
-
3. Como educar filhos biblicamente?
|
155 |
-
4. Como manter a harmonia familiar?
|
156 |
-
5. Como lidar com diferenças no casamento?
|
157 |
-
""")
|
158 |
-
|
159 |
-
# Função para processar a pergunta
|
160 |
-
def process_question(theme_selected, question_text):
|
161 |
-
# Remove emojis do tema para processamento
|
162 |
-
theme_clean = "casamento" if "Casamento" in theme_selected else "criacao_filhos"
|
163 |
-
return counselor.get_answer(theme_clean, question_text)
|
164 |
-
|
165 |
-
# Eventos
|
166 |
submit_btn.click(
|
167 |
-
fn=
|
168 |
inputs=[theme, question],
|
169 |
-
outputs=[answer_output,
|
170 |
)
|
171 |
|
172 |
return demo
|
@@ -178,8 +192,7 @@ if __name__ == "__main__":
|
|
178 |
demo.launch(
|
179 |
server_name="0.0.0.0",
|
180 |
share=True,
|
181 |
-
show_error=True
|
182 |
-
cache_examples=False # Desativa cache de exemplos
|
183 |
)
|
184 |
except Exception as e:
|
185 |
logger.error(f"Erro ao iniciar aplicação: {str(e)}")
|
|
|
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")
|
|
|
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
|
|
|
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)}")
|