File size: 7,359 Bytes
6e827c2
f69b9a6
 
4263f88
f69b9a6
3f3176a
 
6ad6360
20a9402
f6cb88d
20a9402
f69b9a6
6e827c2
f756686
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f6cb88d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f756686
 
 
f6cb88d
f756686
 
 
 
 
 
 
 
 
 
 
 
 
 
f6cb88d
f756686
 
f6cb88d
 
 
 
 
 
 
 
 
 
 
 
f756686
 
f6cb88d
f756686
 
 
 
 
f6cb88d
f756686
 
 
6ad6360
f756686
 
 
 
 
 
 
 
f6cb88d
f756686
f6cb88d
 
 
f756686
6ad6360
f756686
 
 
 
 
6ad6360
f6cb88d
f756686
 
f6cb88d
 
f756686
f6cb88d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6ad6360
 
32648a9
f6cb88d
32648a9
6ad6360
 
f756686
3f3176a
6e827c2
 
20a9402
f756686
 
32648a9
 
 
f6cb88d
 
32648a9
20a9402
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
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

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
warnings.filterwarnings('ignore')

class BiblicalCounselor:
    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_answer(self, theme: str, question: str) -> Tuple[str, str]:
        try:
            # Respostas pré-definidas para exemplos
            responses = {
                "casamento_conflitos": (
                    """🕊️ Orientação Bíblica:
                    Com base em Efésios 4:26-27, devemos resolver os conflitos sem deixar que o sol se ponha sobre nossa ira.
                    O perdão e a comunicação são fundamentais no casamento cristão.
                    
                    📖 Princípios Importantes:
                    1. Não permita que a raiva permaneça
                    2. Comunique-se com amor
                    3. Pratique o perdão mútuo
                    
                    ✝️ Aplicação Prática:
                    - Resolva os conflitos no mesmo dia
                    - Use palavras edificantes
                    - Ore juntos pela situação""",
                    
                    "📚 Referência: Efésios 4:26-27\n🔍 Contexto: Resolução de Conflitos no Casamento"
                ),
                
                "casamento_oracao": (
                    """🕊️ Orientação Bíblica:
                    A oração conjunta fortalece o casamento. Conforme 1 Pedro 3:7, marido e mulher são co-herdeiros da graça da vida.
                    
                    📖 Princípios Importantes:
                    1. Orem juntos diariamente
                    2. Compartilhem pedidos de oração
                    3. Agradeçam um pelo outro
                    
                    ✝️ Aplicação Prática:
                    - Estabeleçam um momento diário de oração
                    - Orem pelos desafios mútuos
                    - Celebrem as bênçãos juntos""",
                    
                    "📚 Referência: 1 Pedro 3:7\n🔍 Contexto: Vida de Oração no Casamento"
                )
            }

            # Tenta encontrar uma resposta pré-definida
            key = f"{theme}_{question.lower().split()[0]}"
            if key in responses:
                return responses[key]

            # Se não encontrar resposta pré-definida, usa o modelo
            passage = "Efésios 5:22-33: Vós, mulheres, sujeitai-vos a vossos maridos, como ao Senhor... Assim devem os maridos amar as suas mulheres, como a seus próprios corpos."
            
            inputs = self.tokenizer.encode_plus(
                question,
                passage,
                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])
            answer = tokens[answer_start:answer_end + 1]
            model_answer = self.tokenizer.convert_tokens_to_string(answer)

            response = f"""
            🕊️ Orientação Bíblica:
            {model_answer}
            
            📖 Princípios Importantes:
            1. Busque a orientação divina
            2. Aplique os princípios bíblicos
            3. Mantenha-se em oração
            
            ✝️ Aplicação Prática:
            - Estude a Palavra regularmente
            - Pratique os ensinamentos
            - Busque aconselhamento pastoral quando necessário
            """

            references = "📚 Referência: Efésios 5:22-33\n🔍 Contexto: Princípios Bíblicos para a Vida Cristã"

            return response, references

        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_interface():
    counselor = BiblicalCounselor()
    
    with gr.Blocks(theme=gr.themes.Soft()) as demo:
        gr.Markdown("""
        # 🕊️ Conselheiro Bíblico Virtual
        ### Orientação Espiritual Baseada nas Sagradas Escrituras
        """)

        with gr.Row():
            with gr.Column():
                # Dropdown com valores corretos
                theme = gr.Dropdown(
                    choices=["💑 Casamento", "👶 Criação de Filhos"],
                    value="💑 Casamento",
                    label="Escolha o Tema"
                )
                
                question = gr.Textbox(
                    label="💭 Sua Pergunta",
                    placeholder="Digite sua pergunta aqui...",
                    lines=3
                )
                
                submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary")

            with gr.Column():
                answer_output = gr.Markdown(label="Resposta")
                references = gr.Textbox(label="Referências", interactive=False)

        # Exemplos sem cache
        with gr.Row():
            gr.Markdown("""### Exemplos de Perguntas:
            1. Como resolver conflitos no casamento?
            2. Como orar pelo casamento?
            3. Como educar filhos biblicamente?
            4. Como manter a harmonia familiar?
            5. Como lidar com diferenças no casamento?
            """)

        # Função para processar a pergunta
        def process_question(theme_selected, question_text):
            # Remove emojis do tema para processamento
            theme_clean = "casamento" if "Casamento" in theme_selected else "criacao_filhos"
            return counselor.get_answer(theme_clean, question_text)

        # Eventos
        submit_btn.click(
            fn=process_question,
            inputs=[theme, question],
            outputs=[answer_output, references]
        )

    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,
            cache_examples=False  # Desativa cache de exemplos
        )
    except Exception as e:
        logger.error(f"Erro ao iniciar aplicação: {str(e)}")
        raise