import gradio as gr from transformers import AutoTokenizer, AutoModelForQuestionAnswering import torch import logging import warnings import json from datetime import datetime import random from pathlib import Path # Configuração do logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) warnings.filterwarnings('ignore') # Banco de passagens bíblicas 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: # Obtém o contexto bíblico para o tema 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"] # Tokenização inputs = self.tokenizer.encode_plus( question, context, return_tensors="pt", max_length=512, truncation=True, padding="max_length" ).to(self.device) # Obtenção da resposta 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) # Formatação da resposta 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 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 ) 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 """) 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