DHEIVER's picture
Update app.py
b9288fb verified
raw
history blame
8.25 kB
import gradio as gr
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
import torch
import logging
import warnings
from typing import List, Tuple, Dict
import random
from datetime import datetime
from dataclasses import dataclass
from enum import Enum
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
warnings.filterwarnings('ignore')
class ThemeType(Enum):
MARRIAGE = "casamento"
FAMILY = "familia"
SPIRITUAL = "vida_espiritual"
WORK = "trabalho"
RELATIONSHIPS = "relacionamentos"
GENERAL = "geral"
@dataclass
class BiblicalExample:
question: str
passage: str
text: str
base_response: str
application: str
sentiment: str
class SapienciaBiblica:
def __init__(self):
logger.info("Inicializando SapiênciaBíblica...")
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 = []
# Exemplos bíblicos diretamente na inicialização
self.biblical_examples = {
"casamento": [
BiblicalExample(
question="Como resolver conflitos no casamento?",
passage="Efésios 4:26-32",
text="Não se ponha o sol sobre a vossa ira...",
base_response="O princípio bíblico para resolução de conflitos no casamento envolve três aspectos...",
application="Resolução diária de conflitos e perdão",
sentiment="supportive"
),
# Adicione mais exemplos aqui
],
"familia": [
BiblicalExample(
question="Como educar filhos segundo a Bíblia?",
passage="Provérbios 22:6",
text="Instrui o menino no caminho em que deve andar...",
base_response="A educação dos filhos deve ser fundamentada nos princípios bíblicos...",
application="Ensino diário dos princípios bíblicos",
sentiment="instructive"
),
# Adicione mais exemplos aqui
],
# Continue com outros temas
}
self.setup_model()
def setup_model(self):
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_verse_of_day(self) -> str:
verses = [
("João 3:16", "Porque Deus amou o mundo de tal maneira..."),
("Salmos 23:1", "O Senhor é meu pastor e nada me faltará..."),
# Adicione mais versículos
]
verse = random.choice(verses)
return f"📖 Versículo do Dia:\n{verse[0]}\n\n{verse[1]}"
def get_daily_prayer_focus(self) -> str:
focuses = [
"Gratidão",
"Família",
"Sabedoria",
# Adicione mais focos
]
focus = random.choice(focuses)
return f"🙏 Foco de Oração:\n{focus}"
def analyze_sentiment(self, text: str) -> str:
positive_words = {'alegria', 'esperança', 'paz', 'amor'}
negative_words = {'tristeza', 'medo', 'ansiedade'}
text_words = set(text.lower().split())
pos_count = len(text_words.intersection(positive_words))
neg_count = len(text_words.intersection(negative_words))
return 'positive' if pos_count > neg_count else 'negative' if neg_count > pos_count else 'neutral'
def get_unique_response(self, question: str, theme: str = None) -> Tuple[str, Dict, str]:
if not theme or theme not in self.biblical_examples:
theme = self.find_best_theme(question)
examples = self.biblical_examples.get(theme, self.biblical_examples["geral"])
example = random.choice(examples)
sentiment = self.analyze_sentiment(question)
response = self.format_response(example, sentiment)
metadata = self.create_metadata(example, theme)
history = self.save_to_history(question, theme, response, metadata)
return response, metadata, history
def format_response(self, example: BiblicalExample, sentiment: str) -> str:
intro = {
'positive': "Que bom que você está buscando orientação! ",
'negative': "Entendo seu momento e estou aqui para ajudar. ",
'neutral': "Agradeço sua busca por sabedoria. "
}
return f"""
🌟 Orientação Personalizada:
{intro[sentiment]}{example.base_response}
📖 Passagem Bíblica:
{example.passage}: {example.text}
✨ Aplicação Prática:
{example.application}
🙏 Observação: Esta orientação é baseada em princípios bíblicos.
"""
def create_metadata(self, example: BiblicalExample, theme: str) -> Dict:
return {
"passagem": example.passage,
"tema": theme,
"aplicacao": example.application
}
def save_to_history(self, question: str, theme: str, response: str, metadata: Dict) -> str:
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:
if not self.session_history:
return "Nenhuma consulta realizada ainda."
return "\n\n".join([
f"🕒 {entry['timestamp']}\n📌 {entry['theme']}\n❓ {entry['question']}\n"
for entry in reversed(self.session_history[-5:])
])
def find_best_theme(self, question: str) -> str:
# Implementação simplificada do find_best_theme
return "geral"
def create_interface():
counselor = SapienciaBiblica()
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# 🕊️ SapiênciaBíblica
### Orientação Divina para Vida Moderna
""")
with gr.Row():
with gr.Column():
verse_of_day = gr.Textbox(
label="Versículo do Dia",
value=counselor.get_verse_of_day(),
lines=4,
interactive=False
)
with gr.Column():
prayer_focus = gr.Textbox(
label="Foco de Oração",
value=counselor.get_daily_prayer_focus(),
lines=4,
interactive=False
)
with gr.Row():
question = gr.Textbox(
label="Sua Pergunta",
placeholder="Digite sua pergunta...",
lines=3
)
theme = gr.Dropdown(
choices=[t.value for t in ThemeType],
label="Tema (Opcional)",
value="geral"
)
submit_btn = gr.Button("🙏 Buscar Orientação")
answer_output = gr.Textbox(label="Resposta", lines=10)
metadata_output = gr.JSON(label="Detalhes")
history_output = gr.Textbox(label="Histórico", lines=10)
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 SapiênciaBíblica...")
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