DHEIVER commited on
Commit
b4fe7ab
1 Parent(s): b9288fb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +162 -65
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
- # Exemplos bíblicos diretamente na inicialização
41
- self.biblical_examples = {
 
 
 
 
 
 
 
 
 
 
 
 
42
  "casamento": [
43
  BiblicalExample(
44
- question="Como resolver conflitos no casamento?",
45
- passage="Efésios 4:26-32",
46
- text="Não se ponha o sol sobre a vossa ira...",
47
- base_response="O princípio bíblico para resolução de conflitos no casamento envolve três aspectos...",
48
- application="Resolução diária de conflitos e perdão",
49
  sentiment="supportive"
50
  ),
51
- # Adicione mais exemplos aqui
 
 
 
 
 
 
 
52
  ],
53
  "familia": [
54
  BiblicalExample(
55
- question="Como educar filhos segundo a Bíblia?",
56
  passage="Provérbios 22:6",
57
- text="Instrui o menino no caminho em que deve andar...",
58
- base_response="A educação dos filhos deve ser fundamentada nos princípios bíblicos...",
59
- application="Ensino diário dos princípios bíblicos",
60
  sentiment="instructive"
61
- ),
62
- # Adicione mais exemplos aqui
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  ],
64
- # Continue com outros temas
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  }
66
-
67
- self.setup_model()
68
 
69
- def setup_model(self):
70
- try:
71
- self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
72
- self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name)
73
- self.model.to(self.device)
74
- logger.info(f"Modelo carregado com sucesso no dispositivo: {self.device}")
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
- # Adicione mais versículos
 
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
- # Adicione mais focos
 
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.get(theme, self.biblical_examples["geral"])
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: Esta orientação é baseada em princípios bíblicos.
 
 
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
- return "\n\n".join([
164
- f"🕒 {entry['timestamp']}\n📌 {entry['theme']}\n❓ {entry['question']}\n"
165
- for entry in reversed(self.session_history[-5:])
166
- ])
167
-
168
- def find_best_theme(self, question: str) -> str:
169
- # Implementação simplificada do find_best_theme
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
- question = gr.Textbox(
200
- label="Sua Pergunta",
201
- placeholder="Digite sua pergunta...",
202
- lines=3
203
- )
204
- theme = gr.Dropdown(
205
- choices=[t.value for t in ThemeType],
206
- label="Tema (Opcional)",
207
- value="geral"
208
- )
209
-
210
- submit_btn = gr.Button("🙏 Buscar Orientação")
211
-
212
- answer_output = gr.Textbox(label="Resposta", lines=10)
213
- metadata_output = gr.JSON(label="Detalhes")
214
- history_output = gr.Textbox(label="Histórico", lines=10)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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,