import gradio as gr from transformers import AutoTokenizer, AutoModelForQuestionAnswering import torch import logging import warnings from typing import List, Tuple, Dict import random logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) warnings.filterwarnings('ignore') # Expandindo o banco de passagens bíblicas com mais contexto 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, sendo ele próprio o salvador do corpo. De sorte que, assim como a igreja está sujeita a Cristo, assim também as mulheres sejam em tudo sujeitas a seus maridos. Vós, maridos, amai vossas mulheres, como também Cristo amou a igreja, e a si mesmo se entregou por ela, Para a santificar, purificando-a com a lavagem da água, pela palavra, Para a apresentar a si mesmo igreja gloriosa, sem mácula, nem ruga, nem coisa semelhante, mas santa e irrepreensível. Assim devem os maridos amar as suas mulheres, como a seus próprios corpos. Quem ama a sua mulher, ama-se a si mesmo.""", "contexto": "Relacionamento conjugal e amor sacrificial", "aplicação": "Este texto apresenta o modelo divino para o casamento, onde o amor sacrificial e o respeito mútuo são fundamentais. O marido deve amar como Cristo amou a igreja, e a esposa deve respeitar como a igreja respeita a Cristo.", "princípios": ["Amor sacrificial", "Respeito mútuo", "Liderança servidora", "Unidade conjugal"] }, { "passagem": "1 Coríntios 13:4-7", "texto": """O amor é paciente, o amor é bondoso. Não inveja, não se vangloria, não se orgulha. Não maltrata, não procura seus interesses, não se ira facilmente, não guarda rancor. O amor não se alegra com a injustiça, mas se alegra com a verdade. Tudo sofre, tudo crê, tudo espera, tudo suporta.""", "contexto": "Definição do amor verdadeiro", "aplicação": "Esta passagem define o amor verdadeiro e suas características práticas, essenciais para um casamento saudável.", "princípios": ["Paciência", "Bondade", "Humildade", "Perdão", "Perseverança"] } ], "criacao_filhos": [ { "passagem": "Deuteronômio 6:6-9", "texto": """E estas palavras, que hoje te ordeno, estarão no teu coração; E as ensinarás a teus filhos, e delas falarás assentado em tua casa, e andando pelo caminho, e deitando-te e levantando-te. Também as atarás por sinal na tua mão, e te serão por frontais entre os teus olhos. E as escreverás nos umbrais de tua casa, e nas tuas portas.""", "contexto": "Instrução espiritual dos filhos", "aplicação": "Os pais têm a responsabilidade primária de ensinar os princípios divinos aos filhos em todos os momentos da vida cotidiana.", "princípios": ["Ensino contínuo", "Exemplo pessoal", "Imersão na Palavra", "Disciplina amorosa"] }, { "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 e formação de caráter", "aplicação": "A formação espiritual e moral na infância tem impacto duradouro na vida adulta.", "princípios": ["Instrução precoce", "Constância no ensino", "Formação de caráter"] } ] } class EnhancedBiblicalCounselor: def __init__(self): logger.info("Inicializando conselheiro bíblico aprimorado...") self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese" self.max_length = 512 # Máximo de tokens 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 format_contextual_response(self, answer: str, passage: Dict, question: str) -> str: """Formata uma resposta contextualizada e detalhada""" response_template = f""" 🕊️ Resposta Pastoral: Com base nas Sagradas Escrituras, especialmente em {passage['passagem']}, {answer} 📖 Contexto Bíblico: {passage['contexto']} ✝️ Princípios Bíblicos Aplicáveis: {' • '.join(passage['princípios'])} 🙏 Aplicação Prática: {passage['aplicação']} 📚 Passagem Completa para Meditação: "{passage['texto']}" 💭 Reflexão Final: Medite nesta palavra e permita que o Espírito Santo a aplique em sua vida. Lembre-se que a Palavra de Deus é viva e eficaz para todas as áreas de nossa vida. """ return response_template def get_comprehensive_answer(self, theme: str, question: str) -> Tuple[str, str]: try: if theme not in BIBLICAL_PASSAGES: return "Tema não encontrado em nossa base.", "Sem referências disponíveis." # Seleciona uma passagem relevante passage = BIBLICAL_PASSAGES[theme][0] # Poderia ser randomizado entre as disponíveis context = passage["texto"] # Prepara o input com máximo de tokens inputs = self.tokenizer.encode_plus( question, context, return_tensors="pt", max_length=self.max_length, truncation=True, padding="max_length" ).to(self.device) # Gera a 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 resposta contextualizada detailed_answer = self.format_contextual_response(answer, passage, question) # Prepara metadados metadata = f""" 📚 Referências Adicionais: • Passagem Principal: {passage['passagem']} • Tema: {theme.replace('_', ' ').title()} • Contexto: {passage['contexto']} """ return detailed_answer, metadata 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_enhanced_interface(): counselor = EnhancedBiblicalCounselor() with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown(""" # 🕊️ Conselheiro Bíblico Aprofundado ### Orientação Bíblica Contextualizada e Detalhada """) 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="Compartilhe sua dúvida para receber orientação bíblica...", lines=3 ) submit_btn = gr.Button("🙏 Buscar Orientação Aprofundada") with gr.Column(): answer_output = gr.Textbox( label="Conselho Bíblico Detalhado", lines=15 ) reference_output = gr.Textbox( label="Referências e Contexto", lines=5 ) submit_btn.click( fn=lambda t, q: counselor.get_comprehensive_answer(t, q), inputs=[theme, question], outputs=[answer_output, reference_output] ) gr.Markdown(""" --- 💝 Desenvolvido para edificação profunda na Palavra | Baseado nas Sagradas Escrituras #### Como aproveitar ao máximo este recurso: 1. Escolha o tema específico de sua dúvida 2. Faça uma pergunta clara e específica 3. Leia atentamente a resposta contextualizada 4. Medite nas passagens bíblicas fornecidas 5. Ore pedindo sabedoria para aplicar os princípios """) return demo if __name__ == "__main__": try: logger.info("Iniciando aplicação de aconselhamento bíblico aprofundado...") demo = create_enhanced_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