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 | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
warnings.filterwarnings('ignore') | |
# Banco de exemplos e respostas pré-definidas | |
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": "Qual o papel do perdão no casamento?", | |
"passagem": "Colossenses 3:13-14", | |
"texto": """Suportando-vos uns aos outros, e perdoando-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": """O perdão no casamento reflete o perdão que recebemos de Cristo. É um ato contínuo de amor que fortalece o vínculo conjugal e promove a cura emocional. Devemos perdoar assim como fomos perdoados.""", | |
"aplicacao": "Prática do perdão e cultivo do amor sacrificial" | |
}, | |
{ | |
"pergunta": "Como manter a fidelidade no casamento?", | |
"passagem": "Hebreus 13:4", | |
"texto": """Venerado seja entre todos o matrimônio e o leito sem mácula; porém aos que se dão à prostituição e aos adúlteros, Deus os julgará.""", | |
"resposta_base": """A fidelidade no casamento é um mandamento divino que requer compromisso, respeito mútuo e temor a Deus. O matrimônio deve ser honrado por todos, mantendo a pureza e a santidade da união conjugal.""", | |
"aplicacao": "Compromisso com a fidelidade e pureza conjugal" | |
}, | |
{ | |
"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 tornando mal por mal, ou injúria por injúria; antes, pelo contrário, bendizendo.""", | |
"resposta_base": """As diferenças no casamento devem ser tratadas com compreensão, humildade e respeito mútuo. A unidade não significa uniformidade, mas harmonia nas diferenças através do amor e da compaixão.""", | |
"aplicacao": "Respeito às diferenças e busca da harmonia" | |
} | |
], | |
"criacao_filhos": [ | |
# [Exemplos similares para outros temas...] | |
] | |
} | |
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" | |
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_unique_response(self, question: str, theme: str) -> Tuple[str, Dict]: | |
"""Gera uma resposta única baseada na pergunta e tema""" | |
# Gera um hash da pergunta para garantir consistência | |
question_hash = hashlib.md5(question.lower().encode()).hexdigest() | |
# Seleciona exemplo baseado no hash | |
examples = BIBLICAL_EXAMPLES.get(theme, []) | |
if not examples: | |
return "Tema não encontrado", {} | |
# Usa o hash para selecionar um exemplo de forma determinística | |
selected_index = int(question_hash, 16) % len(examples) | |
example = examples[selected_index] | |
# Prepara o contexto para o modelo | |
inputs = self.tokenizer.encode_plus( | |
question, | |
example["texto"], | |
return_tensors="pt", | |
max_length=512, | |
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]) | |
model_answer = tokens[answer_start:answer_end + 1] | |
model_answer = self.tokenizer.convert_tokens_to_string(model_answer) | |
# Formata a resposta final | |
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} | |
""" | |
metadata = { | |
"passagem": example['passagem'], | |
"contexto": "Baseado em princípios bíblicos para " + theme.replace('_', ' '), | |
"aplicacao": example['aplicacao'] | |
} | |
return response, metadata | |
def create_interface(): | |
counselor = DiverseBiblicalCounselor() | |
with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
gr.Markdown(""" | |
# 🕊️ Conselheiro Bíblico | |
### Orientação Bíblica Personalizada | |
""") | |
with gr.Row(): | |
with gr.Column(): | |
theme = gr.Dropdown( | |
choices=list(BIBLICAL_EXAMPLES.keys()), | |
label="Tema", | |
value="casamento" | |
) | |
question = gr.Textbox( | |
label="Sua Pergunta", | |
placeholder="Digite sua pergunta...", | |
lines=3 | |
) | |
submit_btn = gr.Button("🙏 Buscar Orientação") | |
with gr.Column(): | |
answer_output = gr.Textbox( | |
label="Resposta", | |
lines=10 | |
) | |
metadata_output = gr.Textbox( | |
label="Referências", | |
lines=3 | |
) | |
# Exemplos | |
gr.Examples( | |
examples=[ | |
["casamento", "Como resolver conflitos no casamento?"], | |
["casamento", "Como manter um casamento forte espiritualmente?"], | |
["casamento", "Qual o papel do perdão no casamento?"], | |
["casamento", "Como manter a fidelidade no casamento?"], | |
["casamento", "Como lidar com diferenças no casamento?"] | |
], | |
inputs=[theme, question], | |
outputs=[answer_output, metadata_output], | |
fn=lambda t, q: counselor.get_unique_response(q, t), | |
label="Exemplos de Perguntas" | |
) | |
submit_btn.click( | |
fn=lambda t, q: counselor.get_unique_response(q, t), | |
inputs=[theme, question], | |
outputs=[answer_output, metadata_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 | |
) | |
except Exception as e: | |
logger.error(f"Erro ao iniciar aplicação: {str(e)}") | |
raise |