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