Spaces:
Sleeping
Sleeping
File size: 8,720 Bytes
6e827c2 f69b9a6 4263f88 f69b9a6 8e7e0ba 20a9402 f69b9a6 6e827c2 8e7e0ba 20a9402 f69b9a6 20a9402 f69b9a6 20a9402 8d70aef 20a9402 0ee930b 20a9402 0ee930b 20a9402 f69b9a6 20a9402 8e7e0ba 20a9402 8e7e0ba 20a9402 8e7e0ba 20a9402 6e827c2 20a9402 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 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 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 |
import gradio as gr
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
import torch
import logging
import warnings
from typing import List, Tuple
# Configuração do logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
warnings.filterwarnings('ignore')
# Exemplos de perguntas por tema
THEME_EXAMPLES = {
"casamento": [
["casamento", "Como manter um casamento feliz segundo a Bíblia?"],
["casamento", "Quais são os princípios bíblicos para resolver conflitos no casamento?"],
["casamento", "Como demonstrar amor ao cônjuge de acordo com a Bíblia?"],
["casamento", "O que a Bíblia diz sobre perdão no casamento?"],
["casamento", "Como orar pelo meu casamento?"]
],
"criacao_filhos": [
["criacao_filhos", "Como disciplinar os filhos segundo a Bíblia?"],
["criacao_filhos", "Qual a importância de ensinar a Palavra de Deus aos filhos?"],
["criacao_filhos", "Como criar filhos tementes a Deus?"],
["criacao_filhos", "Como lidar com filhos rebeldes de forma bíblica?"],
["criacao_filhos", "Como ensinar valores cristãos aos filhos pequenos?"]
],
"papel_mulher": [
["papel_mulher", "Qual o papel da mulher cristã no lar?"],
["papel_mulher", "Como ser uma mãe segundo o coração de Deus?"],
["papel_mulher", "O que significa ser uma mulher virtuosa?"],
["papel_mulher", "Como equilibrar trabalho e família como mulher cristã?"],
["papel_mulher", "Como desenvolver uma vida de oração como mulher?"]
],
"papel_homem": [
["papel_homem", "Quais as responsabilidades do homem como líder do lar?"],
["papel_homem", "Como ser um pai presente segundo a Bíblia?"],
["papel_homem", "O que significa ser o sacerdote do lar?"],
["papel_homem", "Como liderar a família espiritualmente?"],
["papel_homem", "Como demonstrar amor à esposa segundo as escrituras?"]
]
}
# Banco de passagens bíblicas [mantido o mesmo de antes]
BIBLICAL_PASSAGES = {
"casamento": [
{
"passagem": "Efésios 5:22-33",
"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... Assim devem os maridos amar as suas mulheres, como a seus próprios corpos.",
"contexto": "Relacionamento conjugal"
}
],
"criacao_filhos": [
{
"passagem": "Provérbios 22:6",
"texto": "Instrui o menino no caminho em que deve andar, e até quando envelhecer não se desviará dele.",
"contexto": "Educação dos filhos"
}
],
"papel_mulher": [
{
"passagem": "Provérbios 31:10-31",
"texto": "Mulher virtuosa, quem a achará? O seu valor muito excede o de rubis... Abre a sua boca com sabedoria, e a lei da beneficência está na sua língua.",
"contexto": "Mulher virtuosa"
}
],
"papel_homem": [
{
"passagem": "1 Timóteo 5:8",
"texto": "Mas, se alguém não tem cuidado dos seus, e principalmente dos da sua família, negou a fé, e é pior do que o infiel.",
"contexto": "Responsabilidade familiar"
}
]
}
class BiblicalCounselor:
def __init__(self):
logger.info("Inicializando conselheiro bíblico...")
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
try:
self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name)
self.model.to(self.device)
logger.info(f"Modelo carregado com sucesso no dispositivo: {self.device}")
except Exception as e:
logger.error(f"Erro ao carregar modelo: {str(e)}")
raise
def get_answer(self, theme: str, question: str) -> tuple:
try:
if theme not in BIBLICAL_PASSAGES:
return "Tema não encontrado em nossa base.", "Sem referências disponíveis."
passage = BIBLICAL_PASSAGES[theme][0]
context = passage["texto"]
inputs = self.tokenizer.encode_plus(
question,
context,
return_tensors="pt",
max_length=512,
truncation=True,
padding="max_length"
).to(self.device)
with torch.no_grad():
outputs = self.model(**inputs)
answer_start = torch.argmax(outputs.start_logits)
answer_end = torch.argmax(outputs.end_logits)
tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
answer = tokens[answer_start:answer_end + 1]
answer = self.tokenizer.convert_tokens_to_string(answer)
formatted_answer = f"Com base na palavra de Deus, {answer}"
reference = f"📖 {passage['passagem']}\n✝️ Contexto: {passage['contexto']}"
return formatted_answer, reference
except Exception as e:
logger.error(f"Erro ao processar pergunta: {str(e)}")
return "Perdoe-nos, ocorreu um erro ao processar sua pergunta.", "Erro no processamento"
def get_theme_examples(theme: str) -> List[List[str]]:
"""Retorna exemplos para um tema específico"""
return THEME_EXAMPLES.get(theme, [])
def create_interface():
try:
counselor = BiblicalCounselor()
logger.info("Interface sendo criada...")
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# 🕊️ Conselheiro Bíblico
### Orientação baseada nas Sagradas Escrituras
""")
with gr.Row():
with gr.Column():
theme = gr.Dropdown(
choices=list(BIBLICAL_PASSAGES.keys()),
label="Tema de Aconselhamento",
value="casamento"
)
question = gr.Textbox(
label="Sua Pergunta",
placeholder="O que gostaria de saber sobre este tema?",
lines=2
)
submit_btn = gr.Button("🙏 Buscar Orientação")
with gr.Column():
answer_output = gr.Textbox(
label="Conselho Bíblico",
lines=4
)
reference_output = gr.Textbox(
label="Referência Bíblica",
lines=2
)
# Exemplos dinâmicos baseados no tema
examples = gr.Examples(
examples=THEME_EXAMPLES["casamento"], # Exemplos iniciais
inputs=[theme, question],
outputs=[answer_output, reference_output],
fn=lambda t, q: counselor.get_answer(t, q),
label="Exemplos de Perguntas"
)
# Atualiza exemplos quando o tema muda
def update_examples(new_theme):
examples.update(examples=THEME_EXAMPLES[new_theme])
theme.change(
fn=update_examples,
inputs=[theme]
)
submit_btn.click(
fn=lambda t, q: counselor.get_answer(t, q),
inputs=[theme, question],
outputs=[answer_output, reference_output]
)
gr.Markdown("""
---
💝 Desenvolvido para edificação | Baseado nas Sagradas Escrituras
#### Como usar:
1. Selecione um tema de seu interesse
2. Digite sua pergunta ou use um dos exemplos abaixo
3. Clique em "Buscar Orientação" para receber o conselho bíblico
4. Medite na resposta e nas referências fornecidas
""")
return demo
except Exception as e:
logger.error(f"Erro ao criar interface: {str(e)}")
raise
if __name__ == "__main__":
try:
logger.info("Iniciando aplicação...")
demo = create_interface()
demo.launch(
server_name="0.0.0.0",
share=True,
show_error=True
)
except Exception as e:
logger.error(f"Erro ao iniciar aplicação: {str(e)}")
raise |