Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -7,131 +7,82 @@ from typing import List, Tuple, Dict
|
|
7 |
import random
|
8 |
import hashlib
|
9 |
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
|
10 |
|
11 |
logging.basicConfig(level=logging.INFO)
|
12 |
logger = logging.getLogger(__name__)
|
13 |
warnings.filterwarnings('ignore')
|
14 |
|
15 |
-
class
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
def __init__(self):
|
17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
19 |
self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
|
20 |
self.session_history = []
|
|
|
|
|
|
|
21 |
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
"passagem": "Eclesiastes 4:9-12",
|
34 |
-
"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.""",
|
35 |
-
"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.""",
|
36 |
-
"aplicacao": "Desenvolvimento espiritual conjunto e oração em casal"
|
37 |
-
},
|
38 |
-
{
|
39 |
-
"pergunta": "Como lidar com diferenças no casamento?",
|
40 |
-
"passagem": "1 Pedro 3:8-9",
|
41 |
-
"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.""",
|
42 |
-
"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.""",
|
43 |
-
"aplicacao": "Praticar empatia e respeito às diferenças"
|
44 |
-
}
|
45 |
-
],
|
46 |
-
"familia": [
|
47 |
-
{
|
48 |
-
"pergunta": "Como educar filhos segundo a Bíblia?",
|
49 |
-
"passagem": "Provérbios 22:6",
|
50 |
-
"texto": """Instrui o menino no caminho em que deve andar, e até quando envelhecer não se desviará dele.""",
|
51 |
-
"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.""",
|
52 |
-
"aplicacao": "Ensino diário dos princípios bíblicos aos filhos"
|
53 |
-
},
|
54 |
-
{
|
55 |
-
"pergunta": "Como manter a harmonia familiar?",
|
56 |
-
"passagem": "Colossenses 3:13-14",
|
57 |
-
"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.""",
|
58 |
-
"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.""",
|
59 |
-
"aplicacao": "Cultivo diário do amor e perdão no ambiente familiar"
|
60 |
-
}
|
61 |
-
],
|
62 |
-
"vida_espiritual": [
|
63 |
-
{
|
64 |
-
"pergunta": "Como desenvolver uma vida de oração?",
|
65 |
-
"passagem": "1 Tessalonicenses 5:17-18",
|
66 |
-
"texto": """Orai sem cessar. Em tudo dai graças, porque esta é a vontade de Deus em Cristo Jesus para convosco.""",
|
67 |
-
"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.""",
|
68 |
-
"aplicacao": "Estabelecer momentos diários de oração e gratidão"
|
69 |
-
},
|
70 |
-
{
|
71 |
-
"pergunta": "Como crescer na fé?",
|
72 |
-
"passagem": "Romanos 10:17",
|
73 |
-
"texto": """De sorte que a fé é pelo ouvir, e o ouvir pela palavra de Deus.""",
|
74 |
-
"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.""",
|
75 |
-
"aplicacao": "Estudo diário da Bíblia e prática dos ensinamentos"
|
76 |
-
},
|
77 |
-
{
|
78 |
-
"pergunta": "Como vencer tentações?",
|
79 |
-
"passagem": "1 Coríntios 10:13",
|
80 |
-
"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.""",
|
81 |
-
"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.""",
|
82 |
-
"aplicacao": "Buscar força em Deus e usar os escapes que Ele provê"
|
83 |
-
}
|
84 |
-
],
|
85 |
-
"trabalho": [
|
86 |
-
{
|
87 |
-
"pergunta": "Como ter integridade no trabalho?",
|
88 |
-
"passagem": "Colossenses 3:23",
|
89 |
-
"texto": """E tudo quanto fizerdes, fazei-o de coração, como ao Senhor e não aos homens.""",
|
90 |
-
"resposta_base": """O trabalho deve ser realizado com excelência e integridade, como um serviço ao Senhor.""",
|
91 |
-
"aplicacao": "Praticar ética e dedicação no ambiente profissional"
|
92 |
-
},
|
93 |
-
{
|
94 |
-
"pergunta": "Como lidar com pressões no trabalho?",
|
95 |
-
"passagem": "Filipenses 4:6-7",
|
96 |
-
"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.""",
|
97 |
-
"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.""",
|
98 |
-
"aplicacao": "Praticar a entrega das preocupações a Deus"
|
99 |
-
}
|
100 |
-
],
|
101 |
-
"relacionamentos": [
|
102 |
-
{
|
103 |
-
"pergunta": "Como lidar com conflitos?",
|
104 |
-
"passagem": "Mateus 5:23-24",
|
105 |
-
"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.""",
|
106 |
-
"resposta_base": """A reconciliação e o perdão são prioridades nos relacionamentos cristãos.""",
|
107 |
-
"aplicacao": "Buscar reconciliação ativa nos relacionamentos"
|
108 |
-
},
|
109 |
-
{
|
110 |
-
"pergunta": "Como construir amizades verdadeiras?",
|
111 |
-
"passagem": "Provérbios 17:17",
|
112 |
-
"texto": """Em todo tempo ama o amigo, e na angústia nasce o irmão.""",
|
113 |
-
"resposta_base": """Amizades verdadeiras são construídas com amor, lealdade e presença nos momentos difíceis.""",
|
114 |
-
"aplicacao": "Cultivar amizades com dedicação e fidelidade"
|
115 |
-
}
|
116 |
-
],
|
117 |
-
"geral": [
|
118 |
-
{
|
119 |
-
"pergunta": "Como encontrar propósito na vida?",
|
120 |
-
"passagem": "Jeremias 29:11",
|
121 |
-
"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.""",
|
122 |
-
"resposta_base": """Deus tem um propósito específico para cada pessoa, baseado em Seu plano de paz e esperança.""",
|
123 |
-
"aplicacao": "Buscar a direção de Deus para a vida"
|
124 |
-
},
|
125 |
-
{
|
126 |
-
"pergunta": "Como ter paz em tempos difíceis?",
|
127 |
-
"passagem": "João 14:27",
|
128 |
-
"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.""",
|
129 |
-
"resposta_base": """A verdadeira paz vem de Deus e permanece mesmo em meio às tribulações.""",
|
130 |
-
"aplicacao": "Confiar na paz de Deus em todas as circunstâncias"
|
131 |
-
}
|
132 |
-
]
|
133 |
-
}
|
134 |
-
|
135 |
try:
|
136 |
self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
|
137 |
self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name)
|
@@ -141,233 +92,137 @@ class DiverseBiblicalCounselor:
|
|
141 |
logger.error(f"Erro ao carregar modelo: {str(e)}")
|
142 |
raise
|
143 |
|
144 |
-
def
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
def get_examples(self) -> List[List[str]]:
|
149 |
-
"""Retorna exemplos formatados para a interface"""
|
150 |
-
examples = []
|
151 |
-
for theme in self.biblical_examples:
|
152 |
-
for example in self.biblical_examples[theme]:
|
153 |
-
examples.append([theme, example["pergunta"]])
|
154 |
-
return examples
|
155 |
-
|
156 |
-
def get_verse_of_the_day(self) -> str:
|
157 |
-
"""Retorna um versículo diário baseado na data"""
|
158 |
-
all_verses = []
|
159 |
-
for theme_examples in self.biblical_examples.values():
|
160 |
-
for example in theme_examples:
|
161 |
-
all_verses.append({
|
162 |
-
'passagem': example['passagem'],
|
163 |
-
'texto': example['texto']
|
164 |
-
})
|
165 |
|
166 |
-
|
167 |
-
|
168 |
-
verse = random.choice(all_verses)
|
169 |
|
170 |
-
|
171 |
-
|
172 |
-
def find_best_theme(self, question: str) -> str:
|
173 |
-
"""Identifica o melhor tema baseado na pergunta"""
|
174 |
-
question = question.lower()
|
175 |
-
theme_keywords = {
|
176 |
-
"casamento": ["casamento", "cônjuge", "esposa", "marido", "casal", "matrimônio", "matrimonial"],
|
177 |
-
"familia": ["família", "filhos", "pais", "criação", "lar", "familiar", "doméstico"],
|
178 |
-
"vida_espiritual": ["oração", "jejum", "adoração", "espiritual", "fé", "devoção", "santidade"],
|
179 |
-
"trabalho": ["trabalho", "emprego", "carreira", "profissão", "negócio", "profissional"],
|
180 |
-
"relacionamentos": ["amizade", "relacionamento", "conflito", "perdão", "amigo", "social"],
|
181 |
-
"geral": [] # Tema padrão se nenhum outro corresponder
|
182 |
-
}
|
183 |
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
self.session_history.append({
|
192 |
-
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
193 |
-
"theme": theme,
|
194 |
-
"question": question,
|
195 |
-
"response": response,
|
196 |
-
"metadata": metadata
|
197 |
-
})
|
198 |
-
return self.format_history()
|
199 |
-
|
200 |
-
def format_history(self) -> str:
|
201 |
-
"""Formata o histórico de consultas para exibição"""
|
202 |
-
if not self.session_history:
|
203 |
-
return "Nenhuma consulta realizada ainda."
|
204 |
-
|
205 |
-
history_text = "📚 Histórico de Consultas:\n\n"
|
206 |
-
for entry in reversed(self.session_history[-5:]):
|
207 |
-
history_text += f"🕒 {entry['timestamp']}\n"
|
208 |
-
history_text += f"📌 Tema: {entry['theme']}\n"
|
209 |
-
history_text += f"❓ Pergunta: {entry['question']}\n"
|
210 |
-
history_text += f"📖 Passagem: {entry['metadata']['passagem']}\n"
|
211 |
-
history_text += "─" * 50 + "\n"
|
212 |
-
return history_text
|
213 |
-
|
214 |
-
def get_unique_response(self, question: str, theme: str = None) -> Tuple[str, Dict, str]:
|
215 |
-
"""Gera uma resposta única baseada na pergunta, detectando o tema automaticamente se não fornecido"""
|
216 |
-
if not theme or theme not in self.biblical_examples:
|
217 |
-
theme = self.find_best_theme(question)
|
218 |
-
|
219 |
-
examples = self.biblical_examples[theme]
|
220 |
-
selected_index = random.randint(0, len(examples) - 1)
|
221 |
-
example = examples[selected_index]
|
222 |
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
return_tensors="pt",
|
228 |
-
max_length=512,
|
229 |
-
truncation=True,
|
230 |
-
padding="max_length"
|
231 |
-
).to(self.device)
|
232 |
-
|
233 |
-
with torch.no_grad():
|
234 |
-
outputs = self.model(**inputs)
|
235 |
-
|
236 |
-
answer_start = torch.argmax(outputs.start_logits)
|
237 |
-
answer_end = torch.argmax(outputs.end_logits)
|
238 |
-
|
239 |
-
tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
|
240 |
-
model_answer = tokens[answer_start:answer_end + 1]
|
241 |
-
model_answer = self.tokenizer.convert_tokens_to_string(model_answer)
|
242 |
-
except Exception as e:
|
243 |
-
logger.error(f"Erro ao gerar resposta: {str(e)}")
|
244 |
-
model_answer = "Reflexão baseada nos princípios bíblicos apresentados."
|
245 |
|
246 |
-
|
247 |
-
|
248 |
-
|
|
|
249 |
|
250 |
📖 Passagem Bíblica:
|
251 |
{example['passagem']}: {example['texto']}
|
252 |
|
253 |
-
|
254 |
{example['aplicacao']}
|
255 |
|
256 |
-
💭 Reflexão
|
257 |
-
{
|
|
|
|
|
|
|
258 |
|
259 |
-
🙏
|
|
|
260 |
"""
|
261 |
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
"
|
|
|
|
|
|
|
|
|
266 |
}
|
|
|
267 |
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
|
|
|
|
273 |
|
274 |
-
with gr.Blocks(theme=
|
275 |
gr.Markdown("""
|
276 |
-
# 🕊️ Conselheiro Bíblico
|
277 |
-
### Orientação Bíblica Personalizada
|
278 |
""")
|
279 |
|
280 |
with gr.Row():
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
287 |
|
288 |
with gr.Tabs():
|
289 |
-
with gr.TabItem("📝 Consulta"):
|
290 |
with gr.Row():
|
291 |
with gr.Column():
|
292 |
theme = gr.Dropdown(
|
293 |
choices=counselor.get_themes(),
|
294 |
-
label="Tema
|
295 |
value="geral",
|
296 |
-
info="Selecione um tema ou deixe em
|
297 |
)
|
|
|
298 |
question = gr.Textbox(
|
299 |
-
label="Sua Pergunta",
|
300 |
-
placeholder="Digite
|
301 |
lines=3
|
302 |
)
|
303 |
-
|
|
|
|
|
|
|
304 |
|
305 |
with gr.Column():
|
306 |
answer_output = gr.Textbox(
|
307 |
-
label="
|
308 |
lines=12
|
309 |
)
|
310 |
-
metadata_output = gr.Textbox(
|
311 |
-
label="Referências",
|
312 |
-
lines=3
|
313 |
-
)
|
314 |
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
gr.Markdown("""
|
325 |
-
### Como usar o Conselheiro Bíblico:
|
326 |
-
1. Digite sua pergunta sobre qualquer tema bíblico ou da vida cristã
|
327 |
-
2. Opcionalmente, selecione um tema específico para contextualizar melhor sua pergunta
|
328 |
-
3. Clique em "Buscar Orientação"
|
329 |
-
4. Receba orientação baseada em princípios bíblicos
|
330 |
-
|
331 |
-
### Temas Disponíveis:
|
332 |
-
- Casamento: Conselhos para relacionamento conjugal
|
333 |
-
- Família: Orientação para vida familiar
|
334 |
-
- Vida Espiritual: Crescimento na fé e devoção
|
335 |
-
- Trabalho: Princípios bíblicos para a vida profissional
|
336 |
-
- Relacionamentos: Amizades e convivência
|
337 |
-
- Geral: Outros temas e questões diversas
|
338 |
-
|
339 |
-
### Funcionalidades:
|
340 |
-
- Versículo diário atualizado automaticamente
|
341 |
-
- Detecção automática do tema da sua pergunta
|
342 |
-
- Histórico das últimas consultas
|
343 |
-
- Respostas baseadas em princípios bíblicos com aplicações práticas
|
344 |
-
|
345 |
-
### Observações:
|
346 |
-
- As respostas são geradas com base em princípios bíblicos
|
347 |
-
- Para questões específicas, recomenda-se consultar também sua liderança espiritual
|
348 |
-
- O sistema aprende e se adapta para fornecer respostas mais relevantes
|
349 |
-
""")
|
350 |
-
|
351 |
-
gr.Examples(
|
352 |
-
examples=counselor.get_examples(),
|
353 |
-
inputs=[theme, question],
|
354 |
-
outputs=[answer_output, metadata_output, history_output],
|
355 |
-
fn=lambda t, q: counselor.get_unique_response(q, t),
|
356 |
-
label="Exemplos de Perguntas"
|
357 |
-
)
|
358 |
|
359 |
-
|
360 |
-
fn=counselor.get_unique_response,
|
361 |
-
inputs=[question, theme],
|
362 |
-
outputs=[answer_output, metadata_output, history_output]
|
363 |
-
)
|
364 |
|
365 |
return demo
|
366 |
|
367 |
if __name__ == "__main__":
|
368 |
try:
|
369 |
-
logger.info("Iniciando aplicação...")
|
370 |
-
demo =
|
371 |
demo.launch(
|
372 |
server_name="0.0.0.0",
|
373 |
share=True,
|
|
|
7 |
import random
|
8 |
import hashlib
|
9 |
from datetime import datetime
|
10 |
+
from dataclasses import dataclass
|
11 |
+
from enum import Enum
|
12 |
+
import json
|
13 |
+
import re
|
14 |
+
from pathlib import Path
|
15 |
|
16 |
logging.basicConfig(level=logging.INFO)
|
17 |
logger = logging.getLogger(__name__)
|
18 |
warnings.filterwarnings('ignore')
|
19 |
|
20 |
+
class ThemeType(Enum):
|
21 |
+
MARRIAGE = "casamento"
|
22 |
+
FAMILY = "familia"
|
23 |
+
SPIRITUAL = "vida_espiritual"
|
24 |
+
WORK = "trabalho"
|
25 |
+
RELATIONSHIPS = "relacionamentos"
|
26 |
+
GENERAL = "geral"
|
27 |
+
|
28 |
+
@dataclass
|
29 |
+
class BiblicalExample:
|
30 |
+
question: str
|
31 |
+
passage: str
|
32 |
+
text: str
|
33 |
+
base_response: str
|
34 |
+
application: str
|
35 |
+
keywords: List[str]
|
36 |
+
sentiment: str # Added for emotional context
|
37 |
+
|
38 |
+
class ResponseGenerator:
|
39 |
def __init__(self):
|
40 |
+
self.nlp_model = None # Placeholder for sentiment analysis
|
41 |
+
|
42 |
+
def analyze_sentiment(self, text: str) -> str:
|
43 |
+
# Basic sentiment analysis based on keywords
|
44 |
+
positive_words = {'alegria', 'esperança', 'paz', 'amor', 'gratidão'}
|
45 |
+
negative_words = {'tristeza', 'medo', 'ansiedade', 'preocupação', 'angústia'}
|
46 |
+
|
47 |
+
text_words = set(text.lower().split())
|
48 |
+
pos_count = len(text_words.intersection(positive_words))
|
49 |
+
neg_count = len(text_words.intersection(negative_words))
|
50 |
+
|
51 |
+
return 'positive' if pos_count > neg_count else 'negative' if neg_count > pos_count else 'neutral'
|
52 |
+
|
53 |
+
def personalize_response(self, example: BiblicalExample, question: str) -> str:
|
54 |
+
sentiment = self.analyze_sentiment(question)
|
55 |
+
|
56 |
+
# Customize response based on sentiment
|
57 |
+
intro = {
|
58 |
+
'positive': "Que bom que você está buscando orientação! ",
|
59 |
+
'negative': "Entendo que você possa estar passando por um momento difícil. ",
|
60 |
+
'neutral': "Agradeço sua busca por sabedoria. "
|
61 |
+
}
|
62 |
+
|
63 |
+
return f"{intro[sentiment]}{example.base_response}"
|
64 |
+
|
65 |
+
class EnhancedBiblicalCounselor:
|
66 |
+
def __init__(self):
|
67 |
+
logger.info("Inicializando conselheiro bíblico aprimorado...")
|
68 |
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
69 |
self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
|
70 |
self.session_history = []
|
71 |
+
self.response_generator = ResponseGenerator()
|
72 |
+
self.load_examples()
|
73 |
+
self.setup_model()
|
74 |
|
75 |
+
def load_examples(self):
|
76 |
+
# Load examples from JSON file (you would need to create this)
|
77 |
+
examples_path = Path("biblical_examples.json")
|
78 |
+
if examples_path.exists():
|
79 |
+
with open(examples_path) as f:
|
80 |
+
self.biblical_examples = json.load(f)
|
81 |
+
else:
|
82 |
+
# Fallback to default examples
|
83 |
+
self.biblical_examples = self._get_default_examples()
|
84 |
+
|
85 |
+
def setup_model(self):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
try:
|
87 |
self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
|
88 |
self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name)
|
|
|
92 |
logger.error(f"Erro ao carregar modelo: {str(e)}")
|
93 |
raise
|
94 |
|
95 |
+
def get_unique_response(self, question: str, theme: str = None) -> Tuple[str, Dict, str]:
|
96 |
+
if not theme:
|
97 |
+
theme = self.find_best_theme(question)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
|
99 |
+
example = self._select_best_example(question, theme)
|
100 |
+
personalized_response = self.response_generator.personalize_response(example, question)
|
|
|
101 |
|
102 |
+
# Generate AI response using the model
|
103 |
+
model_response = self._generate_model_response(question, example['texto'])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
104 |
|
105 |
+
# Create enhanced response with better formatting and structure
|
106 |
+
response = self._format_enhanced_response(
|
107 |
+
personalized_response,
|
108 |
+
example,
|
109 |
+
model_response,
|
110 |
+
self._get_additional_resources(theme)
|
111 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
112 |
|
113 |
+
metadata = self._create_metadata(example, theme)
|
114 |
+
history = self.save_to_history(question, theme, response, metadata)
|
115 |
+
|
116 |
+
return response, metadata, history
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
117 |
|
118 |
+
def _format_enhanced_response(self, personalized_response, example, model_response, resources):
|
119 |
+
return f"""
|
120 |
+
🌟 Orientação Personalizada:
|
121 |
+
{personalized_response}
|
122 |
|
123 |
📖 Passagem Bíblica:
|
124 |
{example['passagem']}: {example['texto']}
|
125 |
|
126 |
+
✨ Aplicação Prática:
|
127 |
{example['aplicacao']}
|
128 |
|
129 |
+
💭 Reflexão Gerada por IA:
|
130 |
+
{model_response}
|
131 |
+
|
132 |
+
📚 Recursos Adicionais:
|
133 |
+
{resources}
|
134 |
|
135 |
+
🙏 Observação: Esta orientação é baseada em princípios bíblicos. Para questões específicas,
|
136 |
+
considere consultar sua liderança espiritual local.
|
137 |
"""
|
138 |
|
139 |
+
def _get_additional_resources(self, theme):
|
140 |
+
# Add relevant books, articles, or other resources based on the theme
|
141 |
+
resources = {
|
142 |
+
"casamento": ["'O Significado do Casamento' - Timothy Keller",
|
143 |
+
"'Casamento Blindado' - Renato e Cristiane Cardoso"],
|
144 |
+
"familia": ["'Criando Filhos' - Tim Kimmel",
|
145 |
+
"'Limites' - Henry Cloud e John Townsend"]
|
146 |
+
# Add more resources for other themes
|
147 |
}
|
148 |
+
return "\n".join(resources.get(theme, ["Bíblia de Estudo"]))
|
149 |
|
150 |
+
def create_enhanced_interface():
|
151 |
+
counselor = EnhancedBiblicalCounselor()
|
152 |
+
|
153 |
+
custom_theme = gr.themes.Soft().set(
|
154 |
+
button_primary_background_fill="indigo",
|
155 |
+
button_primary_background_fill_dark="darkblue",
|
156 |
+
)
|
157 |
|
158 |
+
with gr.Blocks(theme=custom_theme) as demo:
|
159 |
gr.Markdown("""
|
160 |
+
# 🕊️ Conselheiro Bíblico Plus
|
161 |
+
### Orientação Bíblica Personalizada com Inteligência Artificial
|
162 |
""")
|
163 |
|
164 |
with gr.Row():
|
165 |
+
with gr.Column(scale=1):
|
166 |
+
verse_of_day = gr.Textbox(
|
167 |
+
label="🌟 Versículo do Dia",
|
168 |
+
value=counselor.get_verse_of_the_day(),
|
169 |
+
lines=4,
|
170 |
+
interactive=False
|
171 |
+
)
|
172 |
+
|
173 |
+
with gr.Column(scale=1):
|
174 |
+
prayer_focus = gr.Textbox(
|
175 |
+
label="🙏 Foco de Oração do Dia",
|
176 |
+
value=counselor.get_daily_prayer_focus(),
|
177 |
+
lines=4,
|
178 |
+
interactive=False
|
179 |
+
)
|
180 |
|
181 |
with gr.Tabs():
|
182 |
+
with gr.TabItem("📝 Nova Consulta", id=1):
|
183 |
with gr.Row():
|
184 |
with gr.Column():
|
185 |
theme = gr.Dropdown(
|
186 |
choices=counselor.get_themes(),
|
187 |
+
label="🎯 Tema",
|
188 |
value="geral",
|
189 |
+
info="Selecione um tema ou deixe em automático"
|
190 |
)
|
191 |
+
|
192 |
question = gr.Textbox(
|
193 |
+
label="❓ Sua Pergunta",
|
194 |
+
placeholder="Digite sua pergunta sobre qualquer tema bíblico...",
|
195 |
lines=3
|
196 |
)
|
197 |
+
|
198 |
+
with gr.Row():
|
199 |
+
submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary")
|
200 |
+
clear_btn = gr.Button("🔄 Limpar", variant="secondary")
|
201 |
|
202 |
with gr.Column():
|
203 |
answer_output = gr.Textbox(
|
204 |
+
label="✨ Orientação",
|
205 |
lines=12
|
206 |
)
|
|
|
|
|
|
|
|
|
207 |
|
208 |
+
with gr.Accordion("📚 Detalhes e Referências"):
|
209 |
+
metadata_output = gr.JSON(
|
210 |
+
label="📋 Informações Detalhadas"
|
211 |
+
)
|
212 |
+
|
213 |
+
feedback = gr.Radio(
|
214 |
+
["👍 Útil", "👎 Precisa Melhorar"],
|
215 |
+
label="📢 Sua Opinião"
|
216 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
217 |
|
218 |
+
# Add more tabs and features...
|
|
|
|
|
|
|
|
|
219 |
|
220 |
return demo
|
221 |
|
222 |
if __name__ == "__main__":
|
223 |
try:
|
224 |
+
logger.info("Iniciando aplicação aprimorada...")
|
225 |
+
demo = create_enhanced_interface()
|
226 |
demo.launch(
|
227 |
server_name="0.0.0.0",
|
228 |
share=True,
|