DHEIVER's picture
Update app.py
8e7e0ba verified
raw
history blame
8.72 kB
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