Spaces:
Sleeping
Sleeping
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 |