Spaces:
Sleeping
Sleeping
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 |