import gradio as gr from transformers import AutoTokenizer, AutoModelForQuestionAnswering import torch import logging import warnings from typing import List, Tuple, Dict import random import hashlib from datetime import datetime logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) warnings.filterwarnings('ignore') class DiverseBiblicalCounselor: 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" self.session_history = [] self.biblical_examples = { "casamento": [ { "pergunta": "Como resolver conflitos no casamento?", "passagem": "Efésios 4:26-32", "texto": """Não se ponha o sol sobre a vossa ira. Não deis lugar ao diabo. Toda amargura, cólera, ira, gritaria e blasfêmia sejam tiradas dentre vós, bem como toda malícia. Antes, sede bondosos uns para com os outros, compassivos, perdoando uns aos outros, como também Deus vos perdoou em Cristo.""", "resposta_base": """O princípio bíblico para resolução de conflitos no casamento envolve três aspectos fundamentais: não deixar a ira se prolongar, comunicar-se com amor e praticar o perdão mútuo. A Palavra nos ensina que devemos resolver os conflitos rapidamente, não permitindo que o sol se ponha sobre nossa ira.""", "aplicacao": "Resolução diária de conflitos, perdão e reconciliação" }, { "pergunta": "Como manter um casamento forte espiritualmente?", "passagem": "Eclesiastes 4:9-12", "texto": """É melhor serem dois do que um, porque têm melhor paga do seu trabalho. Porque se um cair, o outro levanta o seu companheiro; mas ai do que estiver só; pois, caindo, não haverá outro que o levante. Também, se dois dormirem juntos, eles se aquentarão; mas um só, como se aquentará? E, se alguém prevalecer contra um, os dois lhe resistirão; e o cordão de três dobras não se quebra tão depressa.""", "resposta_base": """A força espiritual do casamento vem da união em três dimensões: o marido, a esposa e Deus. Como um cordão de três dobras, esta união proporciona apoio mútuo, fortalecimento espiritual e resistência nas adversidades.""", "aplicacao": "Desenvolvimento espiritual conjunto e oração em casal" }, { "pergunta": "Como lidar com diferenças no casamento?", "passagem": "1 Pedro 3:8-9", "texto": """Finalmente, sede todos de um mesmo sentimento, compassivos, amando os irmãos, entranhavelmente misericordiosos e humildes. Não torneis mal por mal, ou injúria por injúria; antes, pelo contrário, bendizei, sabendo que para isto fostes chamados, para que por herança alcanceis a bênção.""", "resposta_base": """As diferenças no casamento devem ser tratadas com compreensão mútua, humildade e amor. O casal deve buscar unidade sem anular as individualidades.""", "aplicacao": "Praticar empatia e respeito às diferenças" } ], "familia": [ { "pergunta": "Como educar filhos segundo a Bíblia?", "passagem": "Provérbios 22:6", "texto": """Instrui o menino no caminho em que deve andar, e até quando envelhecer não se desviará dele.""", "resposta_base": """A educação dos filhos deve ser fundamentada nos princípios bíblicos, com amor, disciplina e instrução constante. Os pais são responsáveis por guiar seus filhos no caminho do Senhor desde cedo.""", "aplicacao": "Ensino diário dos princípios bíblicos aos filhos" }, { "pergunta": "Como manter a harmonia familiar?", "passagem": "Colossenses 3:13-14", "texto": """Suportai-vos uns aos outros, e perdoai-vos uns aos outros, se alguém tiver queixa contra outro; assim como Cristo vos perdoou, assim fazei vós também. E, sobre tudo isto, revesti-vos de amor, que é o vínculo da perfeição.""", "resposta_base": """A harmonia familiar é construída sobre o fundamento do amor, perdão e compreensão mútua. Cada membro deve contribuir para um ambiente de paz e respeito.""", "aplicacao": "Cultivo diário do amor e perdão no ambiente familiar" } ], "vida_espiritual": [ { "pergunta": "Como desenvolver uma vida de oração?", "passagem": "1 Tessalonicenses 5:17-18", "texto": """Orai sem cessar. Em tudo dai graças, porque esta é a vontade de Deus em Cristo Jesus para convosco.""", "resposta_base": """A vida de oração é fundamental para o crescimento espiritual. Devemos manter comunicação constante com Deus, sendo gratos em todas as circunstâncias.""", "aplicacao": "Estabelecer momentos diários de oração e gratidão" }, { "pergunta": "Como crescer na fé?", "passagem": "Romanos 10:17", "texto": """De sorte que a fé é pelo ouvir, e o ouvir pela palavra de Deus.""", "resposta_base": """O crescimento na fé vem através do estudo e meditação na Palavra de Deus, além da prática constante dos seus ensinamentos.""", "aplicacao": "Estudo diário da Bíblia e prática dos ensinamentos" }, { "pergunta": "Como vencer tentações?", "passagem": "1 Coríntios 10:13", "texto": """Não veio sobre vós tentação, senão humana; mas fiel é Deus, que não vos deixará tentar acima do que podeis, antes com a tentação dará também o escape, para que a possais suportar.""", "resposta_base": """Deus é fiel em nos dar força e escape das tentações. Devemos confiar em Sua palavra e buscar Sua presença nos momentos de provação.""", "aplicacao": "Buscar força em Deus e usar os escapes que Ele provê" } ], "trabalho": [ { "pergunta": "Como ter integridade no trabalho?", "passagem": "Colossenses 3:23", "texto": """E tudo quanto fizerdes, fazei-o de coração, como ao Senhor e não aos homens.""", "resposta_base": """O trabalho deve ser realizado com excelência e integridade, como um serviço ao Senhor.""", "aplicacao": "Praticar ética e dedicação no ambiente profissional" }, { "pergunta": "Como lidar com pressões no trabalho?", "passagem": "Filipenses 4:6-7", "texto": """Não andeis ansiosos por coisa alguma; antes em tudo sejam os vossos pedidos conhecidos diante de Deus pela oração e súplica com ação de graças; E a paz de Deus, que excede todo entendimento, guardará os vossos corações e os vossos sentimentos em Cristo Jesus.""", "resposta_base": """As pressões do trabalho devem ser entregues a Deus através da oração, mantendo a confiança em Sua provisão e direção.""", "aplicacao": "Praticar a entrega das preocupações a Deus" } ], "relacionamentos": [ { "pergunta": "Como lidar com conflitos?", "passagem": "Mateus 5:23-24", "texto": """Portanto, se estiveres apresentando a tua oferta no altar e aí te lembrares de que teu irmão tem alguma coisa contra ti, deixa ali a tua oferta diante do altar, e vai primeiro reconciliar-te com teu irmão; e depois vem apresentar a tua oferta.""", "resposta_base": """A reconciliação e o perdão são prioridades nos relacionamentos cristãos.""", "aplicacao": "Buscar reconciliação ativa nos relacionamentos" }, { "pergunta": "Como construir amizades verdadeiras?", "passagem": "Provérbios 17:17", "texto": """Em todo tempo ama o amigo, e na angústia nasce o irmão.""", "resposta_base": """Amizades verdadeiras são construídas com amor, lealdade e presença nos momentos difíceis.""", "aplicacao": "Cultivar amizades com dedicação e fidelidade" } ], "geral": [ { "pergunta": "Como encontrar propósito na vida?", "passagem": "Jeremias 29:11", "texto": """Porque eu bem sei os pensamentos que tenho a vosso respeito, diz o Senhor; pensamentos de paz, e não de mal, para vos dar o fim que esperais.""", "resposta_base": """Deus tem um propósito específico para cada pessoa, baseado em Seu plano de paz e esperança.""", "aplicacao": "Buscar a direção de Deus para a vida" }, { "pergunta": "Como ter paz em tempos difíceis?", "passagem": "João 14:27", "texto": """Deixo-vos a paz, a minha paz vos dou; não vo-la dou como o mundo a dá. Não se turbe o vosso coração, nem se atemorize.""", "resposta_base": """A verdadeira paz vem de Deus e permanece mesmo em meio às tribulações.""", "aplicacao": "Confiar na paz de Deus em todas as circunstâncias" } ] } 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_themes(self) -> List[str]: """Retorna lista de temas disponíveis""" return list(self.biblical_examples.keys()) def get_examples(self) -> List[List[str]]: """Retorna exemplos formatados para a interface""" examples = [] for theme in self.biblical_examples: for example in self.biblical_examples[theme]: examples.append([theme, example["pergunta"]]) return examples def get_verse_of_the_day(self) -> str: """Retorna um versículo diário baseado na data""" all_verses = [] for theme_examples in self.biblical_examples.values(): for example in theme_examples: all_verses.append({ 'passagem': example['passagem'], 'texto': example['texto'] }) today = datetime.now().strftime("%Y%m%d") random.seed(today) verse = random.choice(all_verses) return f"📖 Versículo do Dia:\n{verse['passagem']}\n\n{verse['texto']}" def find_best_theme(self, question: str) -> str: """Identifica o melhor tema baseado na pergunta""" question = question.lower() theme_keywords = { "casamento": ["casamento", "cônjuge", "esposa", "marido", "casal", "matrimônio", "matrimonial"], "familia": ["família", "filhos", "pais", "criação", "lar", "familiar", "doméstico"], "vida_espiritual": ["oração", "jejum", "adoração", "espiritual", "fé", "devoção", "santidade"], "trabalho": ["trabalho", "emprego", "carreira", "profissão", "negócio", "profissional"], "relacionamentos": ["amizade", "relacionamento", "conflito", "perdão", "amigo", "social"], "geral": [] # Tema padrão se nenhum outro corresponder } for theme, keywords in theme_keywords.items(): if any(keyword in question for keyword in keywords): return theme return "geral" def save_to_history(self, question: str, theme: str, response: str, metadata: Dict): """Salva a consulta no histórico com timestamp""" self.session_history.append({ "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "theme": theme, "question": question, "response": response, "metadata": metadata }) return self.format_history() def format_history(self) -> str: """Formata o histórico de consultas para exibição""" if not self.session_history: return "Nenhuma consulta realizada ainda." history_text = "📚 Histórico de Consultas:\n\n" for entry in reversed(self.session_history[-5:]): history_text += f"🕒 {entry['timestamp']}\n" history_text += f"📌 Tema: {entry['theme']}\n" history_text += f"❓ Pergunta: {entry['question']}\n" history_text += f"📖 Passagem: {entry['metadata']['passagem']}\n" history_text += "─" * 50 + "\n" return history_text def get_unique_response(self, question: str, theme: str = None) -> Tuple[str, Dict, str]: """Gera uma resposta única baseada na pergunta, detectando o tema automaticamente se não fornecido""" if not theme or theme not in self.biblical_examples: theme = self.find_best_theme(question) examples = self.biblical_examples[theme] selected_index = random.randint(0, len(examples) - 1) example = examples[selected_index] try: inputs = self.tokenizer.encode_plus( question, example["texto"], 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]) model_answer = tokens[answer_start:answer_end + 1] model_answer = self.tokenizer.convert_tokens_to_string(model_answer) except Exception as e: logger.error(f"Erro ao gerar resposta: {str(e)}") model_answer = "Reflexão baseada nos princípios bíblicos apresentados." response = f""" 🕊️ Conselho Bíblico: {example['resposta_base']} 📖 Passagem Bíblica: {example['passagem']}: {example['texto']} ✝️ Aplicação Prática: {example['aplicacao']} 💭 Reflexão Adicional: {model_answer} 🙏 Lembre-se: Esta é uma orientação baseada em princípios bíblicos. Para questões específicas, consulte também sua liderança espiritual local. """ metadata = { "passagem": example['passagem'], "contexto": f"Baseado em princípios bíblicos para {theme.replace('_', ' ')}", "aplicacao": example['aplicacao'] } history = self.save_to_history(question, theme, response, metadata) return response, metadata, history def create_interface(): counselor = DiverseBiblicalCounselor() with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown(""" # 🕊️ Conselheiro Bíblico ### Orientação Bíblica Personalizada para Qualquer Pergunta """) with gr.Row(): verse_of_day = gr.Textbox( label="Versículo do Dia", value=counselor.get_verse_of_the_day(), lines=4, interactive=False ) with gr.Tabs(): with gr.TabItem("📝 Consulta"): with gr.Row(): with gr.Column(): theme = gr.Dropdown( choices=counselor.get_themes(), label="Tema (Opcional)", value="geral", info="Selecione um tema ou deixe em branco para detecção automática" ) question = gr.Textbox( label="Sua Pergunta", placeholder="Digite qualquer pergunta sobre a Bíblia ou vida cristã...", lines=3 ) submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary") with gr.Column(): answer_output = gr.Textbox( label="Resposta", lines=12 ) metadata_output = gr.Textbox( label="Referências", lines=3 ) with gr.TabItem("📚 Histórico"): history_output = gr.Textbox( label="Histórico de Consultas", value="Nenhuma consulta realizada ainda.", lines=15, interactive=False ) with gr.TabItem("ℹ️ Ajuda"): gr.Markdown(""" ### Como usar o Conselheiro Bíblico: 1. Digite sua pergunta sobre qualquer tema bíblico ou da vida cristã 2. Opcionalmente, selecione um tema específico para contextualizar melhor sua pergunta 3. Clique em "Buscar Orientação" 4. Receba orientação baseada em princípios bíblicos ### Temas Disponíveis: - Casamento: Conselhos para relacionamento conjugal - Família: Orientação para vida familiar - Vida Espiritual: Crescimento na fé e devoção - Trabalho: Princípios bíblicos para a vida profissional - Relacionamentos: Amizades e convivência - Geral: Outros temas e questões diversas ### Funcionalidades: - Versículo diário atualizado automaticamente - Detecção automática do tema da sua pergunta - Histórico das últimas consultas - Respostas baseadas em princípios bíblicos com aplicações práticas ### Observações: - As respostas são geradas com base em princípios bíblicos - Para questões específicas, recomenda-se consultar também sua liderança espiritual - O sistema aprende e se adapta para fornecer respostas mais relevantes """) gr.Examples( examples=counselor.get_examples(), inputs=[theme, question], outputs=[answer_output, metadata_output, history_output], fn=lambda t, q: counselor.get_unique_response(q, t), label="Exemplos de Perguntas" ) submit_btn.click( fn=counselor.get_unique_response, inputs=[question, theme], outputs=[answer_output, metadata_output, history_output] ) 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, server_port=7860 ) except Exception as e: logger.error(f"Erro ao iniciar aplicação: {str(e)}") raise