import gradio as gr from transformers import AutoTokenizer, AutoModelForQuestionAnswering import torch import logging import warnings from typing import List, Tuple, Dict import random from datetime import datetime logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) warnings.filterwarnings('ignore') 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[str, str]: try: # Respostas pré-definidas para exemplos responses = { "casamento_conflitos": ( """🕊️ Orientação Bíblica: Com base em Efésios 4:26-27, devemos resolver os conflitos sem deixar que o sol se ponha sobre nossa ira. O perdão e a comunicação são fundamentais no casamento cristão. 📖 Princípios Importantes: 1. Não permita que a raiva permaneça 2. Comunique-se com amor 3. Pratique o perdão mútuo ✝️ Aplicação Prática: - Resolva os conflitos no mesmo dia - Use palavras edificantes - Ore juntos pela situação""", "📚 Referência: Efésios 4:26-27\n🔍 Contexto: Resolução de Conflitos no Casamento" ), "casamento_oracao": ( """🕊️ Orientação Bíblica: A oração conjunta fortalece o casamento. Conforme 1 Pedro 3:7, marido e mulher são co-herdeiros da graça da vida. 📖 Princípios Importantes: 1. Orem juntos diariamente 2. Compartilhem pedidos de oração 3. Agradeçam um pelo outro ✝️ Aplicação Prática: - Estabeleçam um momento diário de oração - Orem pelos desafios mútuos - Celebrem as bênçãos juntos""", "📚 Referência: 1 Pedro 3:7\n🔍 Contexto: Vida de Oração no Casamento" ) } # Tenta encontrar uma resposta pré-definida key = f"{theme}_{question.lower().split()[0]}" if key in responses: return responses[key] # Se não encontrar resposta pré-definida, usa o modelo passage = "Efésios 5:22-33: Vós, mulheres, sujeitai-vos a vossos maridos, como ao Senhor... Assim devem os maridos amar as suas mulheres, como a seus próprios corpos." inputs = self.tokenizer.encode_plus( question, passage, 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] model_answer = self.tokenizer.convert_tokens_to_string(answer) response = f""" 🕊️ Orientação Bíblica: {model_answer} 📖 Princípios Importantes: 1. Busque a orientação divina 2. Aplique os princípios bíblicos 3. Mantenha-se em oração ✝️ Aplicação Prática: - Estude a Palavra regularmente - Pratique os ensinamentos - Busque aconselhamento pastoral quando necessário """ references = "📚 Referência: Efésios 5:22-33\n🔍 Contexto: Princípios Bíblicos para a Vida Cristã" return response, references 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 create_interface(): counselor = BiblicalCounselor() with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown(""" # 🕊️ Conselheiro Bíblico Virtual ### Orientação Espiritual Baseada nas Sagradas Escrituras """) with gr.Row(): with gr.Column(): # Dropdown com valores corretos theme = gr.Dropdown( choices=["💑 Casamento", "👶 Criação de Filhos"], value="💑 Casamento", label="Escolha o Tema" ) question = gr.Textbox( label="💭 Sua Pergunta", placeholder="Digite sua pergunta aqui...", lines=3 ) submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary") with gr.Column(): answer_output = gr.Markdown(label="Resposta") references = gr.Textbox(label="Referências", interactive=False) # Exemplos sem cache with gr.Row(): gr.Markdown("""### Exemplos de Perguntas: 1. Como resolver conflitos no casamento? 2. Como orar pelo casamento? 3. Como educar filhos biblicamente? 4. Como manter a harmonia familiar? 5. Como lidar com diferenças no casamento? """) # Função para processar a pergunta def process_question(theme_selected, question_text): # Remove emojis do tema para processamento theme_clean = "casamento" if "Casamento" in theme_selected else "criacao_filhos" return counselor.get_answer(theme_clean, question_text) # Eventos submit_btn.click( fn=process_question, inputs=[theme, question], outputs=[answer_output, references] ) return demo 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, cache_examples=False # Desativa cache de exemplos ) except Exception as e: logger.error(f"Erro ao iniciar aplicação: {str(e)}") raise