Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -36,68 +36,122 @@ class SapienciaBiblica:
|
|
36 |
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
37 |
self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
|
38 |
self.session_history = []
|
39 |
-
|
40 |
-
|
41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
"casamento": [
|
43 |
BiblicalExample(
|
44 |
-
question="Como
|
45 |
-
passage="Efésios 4:
|
46 |
-
text="Não
|
47 |
-
base_response="
|
48 |
-
application="
|
49 |
sentiment="supportive"
|
50 |
),
|
51 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
],
|
53 |
"familia": [
|
54 |
BiblicalExample(
|
55 |
-
question="Como
|
56 |
passage="Provérbios 22:6",
|
57 |
-
text="Instrui o menino no caminho em que deve andar
|
58 |
-
base_response="A
|
59 |
-
application="
|
60 |
sentiment="instructive"
|
61 |
-
)
|
62 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
],
|
64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
}
|
66 |
-
|
67 |
-
self.setup_model()
|
68 |
|
69 |
-
def
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
except Exception as e:
|
76 |
-
logger.error(f"Erro ao carregar modelo: {str(e)}")
|
77 |
-
raise
|
78 |
|
79 |
def get_verse_of_day(self) -> str:
|
80 |
verses = [
|
81 |
-
("João 3:16", "Porque Deus amou o mundo de tal maneira..."),
|
82 |
-
("Salmos 23:1", "O Senhor é meu pastor e nada me faltar
|
83 |
-
|
|
|
84 |
]
|
85 |
verse = random.choice(verses)
|
86 |
return f"📖 Versículo do Dia:\n{verse[0]}\n\n{verse[1]}"
|
87 |
|
88 |
def get_daily_prayer_focus(self) -> str:
|
89 |
focuses = [
|
90 |
-
"Gratidão",
|
91 |
-
"Família",
|
92 |
-
"Sabedoria",
|
93 |
-
|
|
|
94 |
]
|
95 |
focus = random.choice(focuses)
|
96 |
return f"🙏 Foco de Oração:\n{focus}"
|
97 |
|
98 |
def analyze_sentiment(self, text: str) -> str:
|
99 |
-
positive_words = {'alegria', 'esperança', 'paz', 'amor'}
|
100 |
-
negative_words = {'tristeza', 'medo', 'ansiedade'}
|
101 |
|
102 |
text_words = set(text.lower().split())
|
103 |
pos_count = len(text_words.intersection(positive_words))
|
@@ -105,11 +159,26 @@ class SapienciaBiblica:
|
|
105 |
|
106 |
return 'positive' if pos_count > neg_count else 'negative' if neg_count > pos_count else 'neutral'
|
107 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
108 |
def get_unique_response(self, question: str, theme: str = None) -> Tuple[str, Dict, str]:
|
109 |
if not theme or theme not in self.biblical_examples:
|
110 |
theme = self.find_best_theme(question)
|
111 |
|
112 |
-
examples = self.biblical_examples
|
113 |
example = random.choice(examples)
|
114 |
sentiment = self.analyze_sentiment(question)
|
115 |
|
@@ -136,14 +205,17 @@ class SapienciaBiblica:
|
|
136 |
✨ Aplicação Prática:
|
137 |
{example.application}
|
138 |
|
139 |
-
🙏 Observação:
|
|
|
|
|
140 |
"""
|
141 |
|
142 |
def create_metadata(self, example: BiblicalExample, theme: str) -> Dict:
|
143 |
return {
|
144 |
"passagem": example.passage,
|
145 |
"tema": theme,
|
146 |
-
"aplicacao": example.application
|
|
|
147 |
}
|
148 |
|
149 |
def save_to_history(self, question: str, theme: str, response: str, metadata: Dict) -> str:
|
@@ -160,14 +232,13 @@ class SapienciaBiblica:
|
|
160 |
if not self.session_history:
|
161 |
return "Nenhuma consulta realizada ainda."
|
162 |
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
return "geral"
|
171 |
|
172 |
def create_interface():
|
173 |
counselor = SapienciaBiblica()
|
@@ -181,7 +252,7 @@ def create_interface():
|
|
181 |
with gr.Row():
|
182 |
with gr.Column():
|
183 |
verse_of_day = gr.Textbox(
|
184 |
-
label="Versículo do Dia",
|
185 |
value=counselor.get_verse_of_day(),
|
186 |
lines=4,
|
187 |
interactive=False
|
@@ -189,29 +260,55 @@ def create_interface():
|
|
189 |
|
190 |
with gr.Column():
|
191 |
prayer_focus = gr.Textbox(
|
192 |
-
label="Foco de Oração",
|
193 |
value=counselor.get_daily_prayer_focus(),
|
194 |
lines=4,
|
195 |
interactive=False
|
196 |
)
|
197 |
|
198 |
with gr.Row():
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
215 |
|
216 |
submit_btn.click(
|
217 |
fn=counselor.get_unique_response,
|
|
|
36 |
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
37 |
self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
|
38 |
self.session_history = []
|
39 |
+
self.biblical_examples = self.get_default_examples_dict()
|
40 |
+
self.setup_model()
|
41 |
+
|
42 |
+
def setup_model(self):
|
43 |
+
try:
|
44 |
+
self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
|
45 |
+
self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name)
|
46 |
+
self.model.to(self.device)
|
47 |
+
logger.info(f"Modelo carregado com sucesso no dispositivo: {self.device}")
|
48 |
+
except Exception as e:
|
49 |
+
logger.error(f"Erro ao carregar modelo: {str(e)}")
|
50 |
+
raise
|
51 |
+
|
52 |
+
def get_default_examples_dict(self) -> Dict[str, List[BiblicalExample]]:
|
53 |
+
return {
|
54 |
"casamento": [
|
55 |
BiblicalExample(
|
56 |
+
question="Como melhorar a comunicação no casamento?",
|
57 |
+
passage="Efésios 4:29",
|
58 |
+
text="Não saia da vossa boca nenhuma palavra torpe, mas só a que for boa para promover a edificação, para que dê graça aos que a ouvem.",
|
59 |
+
base_response="A comunicação efetiva no casamento requer sabedoria, paciência e amor. A Bíblia nos ensina a usar palavras que edificam e não destroem.",
|
60 |
+
application="Pratique escuta ativa, escolha momentos adequados para conversas importantes.",
|
61 |
sentiment="supportive"
|
62 |
),
|
63 |
+
BiblicalExample(
|
64 |
+
question="Como resolver conflitos no casamento?",
|
65 |
+
passage="Efésios 4:26-32",
|
66 |
+
text="Não se ponha o sol sobre a vossa ira. Não deis lugar ao diabo.",
|
67 |
+
base_response="Resolva os conflitos rapidamente, não permita que a raiva se acumule.",
|
68 |
+
application="Resolução diária de conflitos e perdão mútuo.",
|
69 |
+
sentiment="instructive"
|
70 |
+
)
|
71 |
],
|
72 |
"familia": [
|
73 |
BiblicalExample(
|
74 |
+
question="Como criar filhos segundo a Bíblia?",
|
75 |
passage="Provérbios 22:6",
|
76 |
+
text="Instrui o menino no caminho em que deve andar, e até quando envelhecer não se desviará dele.",
|
77 |
+
base_response="A criação dos filhos requer dedicação e instrução consistente.",
|
78 |
+
application="Estabeleça momentos diários de devocional em família.",
|
79 |
sentiment="instructive"
|
80 |
+
)
|
81 |
+
],
|
82 |
+
"vida_espiritual": [
|
83 |
+
BiblicalExample(
|
84 |
+
question="Como desenvolver uma vida de oração?",
|
85 |
+
passage="1 Tessalonicenses 5:17",
|
86 |
+
text="Orai sem cessar.",
|
87 |
+
base_response="A vida de oração se desenvolve através da prática constante.",
|
88 |
+
application="Reserve um tempo diário para oração.",
|
89 |
+
sentiment="spiritual"
|
90 |
+
)
|
91 |
+
],
|
92 |
+
"trabalho": [
|
93 |
+
BiblicalExample(
|
94 |
+
question="Como ter integridade no trabalho?",
|
95 |
+
passage="Colossenses 3:23",
|
96 |
+
text="E tudo quanto fizerdes, fazei-o de coração, como ao Senhor.",
|
97 |
+
base_response="Trabalhe com excelência e integridade como para o Senhor.",
|
98 |
+
application="Pratique ética e dedicação no trabalho.",
|
99 |
+
sentiment="professional"
|
100 |
+
)
|
101 |
],
|
102 |
+
"relacionamentos": [
|
103 |
+
BiblicalExample(
|
104 |
+
question="Como construir amizades verdadeiras?",
|
105 |
+
passage="Provérbios 17:17",
|
106 |
+
text="Em todo tempo ama o amigo, e na angústia nasce o irmão.",
|
107 |
+
base_response="Amizades verdadeiras são construídas com amor e lealdade.",
|
108 |
+
application="Seja presente e fiel nas amizades.",
|
109 |
+
sentiment="friendly"
|
110 |
+
)
|
111 |
+
],
|
112 |
+
"geral": [
|
113 |
+
BiblicalExample(
|
114 |
+
question="Como encontrar paz em tempos difíceis?",
|
115 |
+
passage="João 14:27",
|
116 |
+
text="Deixo-vos a paz, a minha paz vos dou.",
|
117 |
+
base_response="A verdadeira paz vem de Deus e permanece nas tribulações.",
|
118 |
+
application="Confie em Deus em todas as circunstâncias.",
|
119 |
+
sentiment="comforting"
|
120 |
+
)
|
121 |
+
]
|
122 |
}
|
|
|
|
|
123 |
|
124 |
+
def get_examples_for_interface(self) -> List[List[str]]:
|
125 |
+
examples = []
|
126 |
+
for theme in self.biblical_examples:
|
127 |
+
for example in self.biblical_examples[theme]:
|
128 |
+
examples.append([theme, example.question])
|
129 |
+
return examples
|
|
|
|
|
|
|
130 |
|
131 |
def get_verse_of_day(self) -> str:
|
132 |
verses = [
|
133 |
+
("João 3:16", "Porque Deus amou o mundo de tal maneira que deu o seu Filho unigênito..."),
|
134 |
+
("Salmos 23:1", "O Senhor é meu pastor e nada me faltará."),
|
135 |
+
("Filipenses 4:13", "Posso todas as coisas em Cristo que me fortalece."),
|
136 |
+
("Jeremias 29:11", "Porque eu bem sei os pensamentos que tenho a vosso respeito...")
|
137 |
]
|
138 |
verse = random.choice(verses)
|
139 |
return f"📖 Versículo do Dia:\n{verse[0]}\n\n{verse[1]}"
|
140 |
|
141 |
def get_daily_prayer_focus(self) -> str:
|
142 |
focuses = [
|
143 |
+
"Gratidão e Louvor",
|
144 |
+
"Família e Relacionamentos",
|
145 |
+
"Sabedoria e Direção",
|
146 |
+
"Paz e Serenidade",
|
147 |
+
"Cura e Restauração"
|
148 |
]
|
149 |
focus = random.choice(focuses)
|
150 |
return f"🙏 Foco de Oração:\n{focus}"
|
151 |
|
152 |
def analyze_sentiment(self, text: str) -> str:
|
153 |
+
positive_words = {'alegria', 'esperança', 'paz', 'amor', 'gratidão', 'feliz', 'bem'}
|
154 |
+
negative_words = {'tristeza', 'medo', 'ansiedade', 'preocupação', 'angústia', 'mal', 'dor'}
|
155 |
|
156 |
text_words = set(text.lower().split())
|
157 |
pos_count = len(text_words.intersection(positive_words))
|
|
|
159 |
|
160 |
return 'positive' if pos_count > neg_count else 'negative' if neg_count > pos_count else 'neutral'
|
161 |
|
162 |
+
def find_best_theme(self, question: str) -> str:
|
163 |
+
question = question.lower()
|
164 |
+
theme_keywords = {
|
165 |
+
"casamento": ["casamento", "cônjuge", "esposa", "marido", "casal"],
|
166 |
+
"familia": ["família", "filhos", "pais", "criação", "lar"],
|
167 |
+
"vida_espiritual": ["oração", "jejum", "adoração", "espiritual", "fé"],
|
168 |
+
"trabalho": ["trabalho", "emprego", "carreira", "profissão"],
|
169 |
+
"relacionamentos": ["amizade", "relacionamento", "conflito", "perdão"],
|
170 |
+
}
|
171 |
+
|
172 |
+
for theme, keywords in theme_keywords.items():
|
173 |
+
if any(keyword in question for keyword in keywords):
|
174 |
+
return theme
|
175 |
+
return "geral"
|
176 |
+
|
177 |
def get_unique_response(self, question: str, theme: str = None) -> Tuple[str, Dict, str]:
|
178 |
if not theme or theme not in self.biblical_examples:
|
179 |
theme = self.find_best_theme(question)
|
180 |
|
181 |
+
examples = self.biblical_examples[theme]
|
182 |
example = random.choice(examples)
|
183 |
sentiment = self.analyze_sentiment(question)
|
184 |
|
|
|
205 |
✨ Aplicação Prática:
|
206 |
{example.application}
|
207 |
|
208 |
+
🙏 Observação:
|
209 |
+
Esta orientação é baseada em princípios bíblicos. Para questões específicas,
|
210 |
+
considere consultar sua liderança espiritual local.
|
211 |
"""
|
212 |
|
213 |
def create_metadata(self, example: BiblicalExample, theme: str) -> Dict:
|
214 |
return {
|
215 |
"passagem": example.passage,
|
216 |
"tema": theme,
|
217 |
+
"aplicacao": example.application,
|
218 |
+
"contexto": "Baseado em princípios bíblicos"
|
219 |
}
|
220 |
|
221 |
def save_to_history(self, question: str, theme: str, response: str, metadata: Dict) -> str:
|
|
|
232 |
if not self.session_history:
|
233 |
return "Nenhuma consulta realizada ainda."
|
234 |
|
235 |
+
history_text = "📚 Histórico de Consultas:\n\n"
|
236 |
+
for entry in reversed(self.session_history[-5:]):
|
237 |
+
history_text += f"🕒 {entry['timestamp']}\n"
|
238 |
+
history_text += f"📌 Tema: {entry['theme']}\n"
|
239 |
+
history_text += f"❓ Pergunta: {entry['question']}\n"
|
240 |
+
history_text += "─" * 40 + "\n"
|
241 |
+
return history_text
|
|
|
242 |
|
243 |
def create_interface():
|
244 |
counselor = SapienciaBiblica()
|
|
|
252 |
with gr.Row():
|
253 |
with gr.Column():
|
254 |
verse_of_day = gr.Textbox(
|
255 |
+
label="📖 Versículo do Dia",
|
256 |
value=counselor.get_verse_of_day(),
|
257 |
lines=4,
|
258 |
interactive=False
|
|
|
260 |
|
261 |
with gr.Column():
|
262 |
prayer_focus = gr.Textbox(
|
263 |
+
label="🙏 Foco de Oração",
|
264 |
value=counselor.get_daily_prayer_focus(),
|
265 |
lines=4,
|
266 |
interactive=False
|
267 |
)
|
268 |
|
269 |
with gr.Row():
|
270 |
+
with gr.Column():
|
271 |
+
theme = gr.Dropdown(
|
272 |
+
choices=[t.value for t in ThemeType],
|
273 |
+
label="🎯 Tema (Opcional)",
|
274 |
+
value="geral",
|
275 |
+
info="Selecione um tema ou deixe em automático"
|
276 |
+
)
|
277 |
+
|
278 |
+
question = gr.Textbox(
|
279 |
+
label="❓ Sua Pergunta",
|
280 |
+
placeholder="Digite sua pergunta sobre qualquer tema bíblico...",
|
281 |
+
lines=3
|
282 |
+
)
|
283 |
+
|
284 |
+
submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary")
|
285 |
+
|
286 |
+
with gr.Column():
|
287 |
+
answer_output = gr.Textbox(
|
288 |
+
label="✨ Orientação",
|
289 |
+
lines=12
|
290 |
+
)
|
291 |
+
|
292 |
+
with gr.Accordion("📚 Detalhes"):
|
293 |
+
metadata_output = gr.JSON(
|
294 |
+
label="📋 Informações Detalhadas"
|
295 |
+
)
|
296 |
+
|
297 |
+
history_output = gr.Textbox(
|
298 |
+
label="📚 Histórico",
|
299 |
+
lines=10,
|
300 |
+
interactive=False
|
301 |
+
)
|
302 |
+
|
303 |
+
# Exemplos para a interface
|
304 |
+
gr.Examples(
|
305 |
+
examples=counselor.get_examples_for_interface(),
|
306 |
+
inputs=[theme, question],
|
307 |
+
outputs=[answer_output, metadata_output, history_output],
|
308 |
+
fn=counselor.get_unique_response,
|
309 |
+
label="📝 Exemplos de Perguntas",
|
310 |
+
examples_per_page=5
|
311 |
+
)
|
312 |
|
313 |
submit_btn.click(
|
314 |
fn=counselor.get_unique_response,
|