DHEIVER commited on
Commit
a15a384
·
verified ·
1 Parent(s): b9c754c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +105 -42
app.py CHANGED
@@ -12,8 +12,6 @@ logging.basicConfig(level=logging.INFO)
12
  logger = logging.getLogger(__name__)
13
  warnings.filterwarnings('ignore')
14
 
15
- # Existing BIBLICAL_EXAMPLES dictionary remains the same...
16
-
17
  class DiverseBiblicalCounselor:
18
  def __init__(self):
19
  logger.info("Inicializando conselheiro bíblico...")
@@ -21,6 +19,35 @@ class DiverseBiblicalCounselor:
21
  self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
22
  self.session_history = []
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  try:
25
  self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
26
  self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name)
@@ -30,6 +57,34 @@ class DiverseBiblicalCounselor:
30
  logger.error(f"Erro ao carregar modelo: {str(e)}")
31
  raise
32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  def save_to_history(self, question: str, theme: str, response: str, metadata: Dict):
34
  """Salva a consulta no histórico com timestamp"""
35
  self.session_history.append({
@@ -47,7 +102,7 @@ class DiverseBiblicalCounselor:
47
  return "Nenhuma consulta realizada ainda."
48
 
49
  history_text = "📚 Histórico de Consultas:\n\n"
50
- for entry in reversed(self.session_history[-5:]): # Shows last 5 consultations
51
  history_text += f"🕒 {entry['timestamp']}\n"
52
  history_text += f"📌 Tema: {entry['theme']}\n"
53
  history_text += f"❓ Pergunta: {entry['question']}\n"
@@ -55,32 +110,53 @@ class DiverseBiblicalCounselor:
55
  history_text += "─" * 50 + "\n"
56
  return history_text
57
 
58
- def get_verse_of_the_day(self) -> str:
59
- """Retorna um versículo diário baseado na data"""
60
- all_verses = []
61
- for theme_examples in BIBLICAL_EXAMPLES.values():
62
- for example in theme_examples:
63
- all_verses.append({
64
- 'passagem': example['passagem'],
65
- 'texto': example['texto']
66
- })
67
-
68
- # Use a data atual como seed para selecionar o versículo
69
- today = datetime.now().strftime("%Y%m%d")
70
- random.seed(today)
71
- verse = random.choice(all_verses)
72
 
73
- return f"📖 Versículo do Dia:\n{verse['passagem']}\n\n{verse['texto']}"
 
 
 
 
 
 
 
74
 
75
- def get_unique_response(self, question: str, theme: str) -> Tuple[str, Dict]:
76
- """Gera uma resposta única baseada na pergunta e tema"""
77
- # Previous implementation remains the same...
78
- # Get response and metadata as before
79
- response, metadata = super().get_unique_response(question, theme) # Assuming this exists
80
 
81
- # Save to history
82
- history = self.save_to_history(question, theme, response, metadata)
83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  return response, metadata, history
85
 
86
  def create_interface():
@@ -92,7 +168,6 @@ def create_interface():
92
  ### Orientação Bíblica Personalizada
93
  """)
94
 
95
- # Verse of the day section
96
  with gr.Row():
97
  verse_of_day = gr.Textbox(
98
  label="Versículo do Dia",
@@ -106,7 +181,7 @@ def create_interface():
106
  with gr.Row():
107
  with gr.Column():
108
  theme = gr.Dropdown(
109
- choices=list(BIBLICAL_EXAMPLES.keys()),
110
  label="Tema",
111
  value="casamento"
112
  )
@@ -145,8 +220,7 @@ def create_interface():
145
 
146
  ### Temas Disponíveis:
147
  - Casamento: Conselhos para relacionamento conjugal
148
- - Criação de Filhos: Orientação para pais
149
- - [outros temas conforme disponível no sistema]
150
 
151
  ### Notas:
152
  - As respostas são baseadas em princípios bíblicos
@@ -154,27 +228,16 @@ def create_interface():
154
  - O versículo do dia é atualizado diariamente
155
  """)
156
 
157
- # Examples section
158
  gr.Examples(
159
- examples=[
160
- ["casamento", "Como resolver conflitos no casamento?"],
161
- ["casamento", "Como manter um casamento forte espiritualmente?"],
162
- ["casamento", "Qual o papel do perdão no casamento?"],
163
- ["casamento", "Como manter a fidelidade no casamento?"],
164
- ["casamento", "Como lidar com diferenças no casamento?"]
165
- ],
166
  inputs=[theme, question],
167
  outputs=[answer_output, metadata_output, history_output],
168
  fn=lambda t, q: counselor.get_unique_response(q, t),
169
  label="Exemplos de Perguntas"
170
  )
171
 
172
- def update_outputs(theme, question):
173
- response, metadata, history = counselor.get_unique_response(question, theme)
174
- return response, metadata, history
175
-
176
  submit_btn.click(
177
- fn=update_outputs,
178
  inputs=[theme, question],
179
  outputs=[answer_output, metadata_output, history_output]
180
  )
 
12
  logger = logging.getLogger(__name__)
13
  warnings.filterwarnings('ignore')
14
 
 
 
15
  class DiverseBiblicalCounselor:
16
  def __init__(self):
17
  logger.info("Inicializando conselheiro bíblico...")
 
19
  self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
20
  self.session_history = []
21
 
22
+ # Movendo os exemplos para dentro da classe
23
+ self.biblical_examples = {
24
+ "casamento": [
25
+ {
26
+ "pergunta": "Como resolver conflitos no casamento?",
27
+ "passagem": "Efésios 4:26-32",
28
+ "texto": """Não se ponha o sol sobre a vossa ira. Não deis lugar ao diabo. Toda amargura, cólera, ira, gritaria e blasfêmia sejam tiradas dentre vós, bem como toda malícia. Antes, sede bondosos uns para com os outros, compassivos, perdoando uns aos outros, como também Deus vos perdoou em Cristo.""",
29
+ "resposta_base": """O princípio bíblico para resolução de conflitos no casamento envolve três aspectos fundamentais: não deixar a ira se prolongar, comunicar-se com amor e praticar o perdão mútuo. A Palavra nos ensina que devemos resolver os conflitos rapidamente, não permitindo que o sol se ponha sobre nossa ira.""",
30
+ "aplicacao": "Resolução diária de conflitos, perdão e reconciliação"
31
+ },
32
+ {
33
+ "pergunta": "Como manter um casamento forte espiritualmente?",
34
+ "passagem": "Eclesiastes 4:9-12",
35
+ "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.""",
36
+ "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.""",
37
+ "aplicacao": "Desenvolvimento espiritual conjunto e oração em casal"
38
+ }
39
+ ],
40
+ "familia": [
41
+ {
42
+ "pergunta": "Como educar filhos segundo a Bíblia?",
43
+ "passagem": "Provérbios 22:6",
44
+ "texto": """Instrui o menino no caminho em que deve andar, e até quando envelhecer não se desviará dele.""",
45
+ "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.""",
46
+ "aplicacao": "Ensino diário dos princípios bíblicos aos filhos"
47
+ }
48
+ ]
49
+ }
50
+
51
  try:
52
  self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
53
  self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name)
 
57
  logger.error(f"Erro ao carregar modelo: {str(e)}")
58
  raise
59
 
60
+ def get_themes(self) -> List[str]:
61
+ """Retorna lista de temas disponíveis"""
62
+ return list(self.biblical_examples.keys())
63
+
64
+ def get_examples(self) -> List[List[str]]:
65
+ """Retorna exemplos formatados para a interface"""
66
+ examples = []
67
+ for theme in self.biblical_examples:
68
+ for example in self.biblical_examples[theme]:
69
+ examples.append([theme, example["pergunta"]])
70
+ return examples
71
+
72
+ def get_verse_of_the_day(self) -> str:
73
+ """Retorna um versículo diário baseado na data"""
74
+ all_verses = []
75
+ for theme_examples in self.biblical_examples.values():
76
+ for example in theme_examples:
77
+ all_verses.append({
78
+ 'passagem': example['passagem'],
79
+ 'texto': example['texto']
80
+ })
81
+
82
+ today = datetime.now().strftime("%Y%m%d")
83
+ random.seed(today)
84
+ verse = random.choice(all_verses)
85
+
86
+ return f"📖 Versículo do Dia:\n{verse['passagem']}\n\n{verse['texto']}"
87
+
88
  def save_to_history(self, question: str, theme: str, response: str, metadata: Dict):
89
  """Salva a consulta no histórico com timestamp"""
90
  self.session_history.append({
 
102
  return "Nenhuma consulta realizada ainda."
103
 
104
  history_text = "📚 Histórico de Consultas:\n\n"
105
+ for entry in reversed(self.session_history[-5:]):
106
  history_text += f"🕒 {entry['timestamp']}\n"
107
  history_text += f"📌 Tema: {entry['theme']}\n"
108
  history_text += f"❓ Pergunta: {entry['question']}\n"
 
110
  history_text += "─" * 50 + "\n"
111
  return history_text
112
 
113
+ def get_unique_response(self, question: str, theme: str) -> Tuple[str, Dict, str]:
114
+ """Gera uma resposta única baseada na pergunta e tema"""
115
+ if theme not in self.biblical_examples:
116
+ return "Tema não encontrado", {}, self.format_history()
117
+
118
+ question_hash = hashlib.md5(question.lower().encode()).hexdigest()
119
+ examples = self.biblical_examples[theme]
120
+ selected_index = int(question_hash, 16) % len(examples)
121
+ example = examples[selected_index]
 
 
 
 
 
122
 
123
+ inputs = self.tokenizer.encode_plus(
124
+ question,
125
+ example["texto"],
126
+ return_tensors="pt",
127
+ max_length=512,
128
+ truncation=True,
129
+ padding="max_length"
130
+ ).to(self.device)
131
 
132
+ with torch.no_grad():
133
+ outputs = self.model(**inputs)
 
 
 
134
 
135
+ answer_start = torch.argmax(outputs.start_logits)
136
+ answer_end = torch.argmax(outputs.end_logits)
137
 
138
+ tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
139
+ model_answer = tokens[answer_start:answer_end + 1]
140
+ model_answer = self.tokenizer.convert_tokens_to_string(model_answer)
141
+
142
+ response = f"""
143
+ 🕊️ Conselho Bíblico:
144
+ {example['resposta_base']}
145
+ 📖 Passagem Bíblica:
146
+ {example['passagem']}: {example['texto']}
147
+ ✝️ Aplicação Prática:
148
+ {example['aplicacao']}
149
+ 💭 Reflexão Adicional:
150
+ {model_answer}
151
+ """
152
+
153
+ metadata = {
154
+ "passagem": example['passagem'],
155
+ "contexto": "Baseado em princípios bíblicos para " + theme.replace('_', ' '),
156
+ "aplicacao": example['aplicacao']
157
+ }
158
+
159
+ history = self.save_to_history(question, theme, response, metadata)
160
  return response, metadata, history
161
 
162
  def create_interface():
 
168
  ### Orientação Bíblica Personalizada
169
  """)
170
 
 
171
  with gr.Row():
172
  verse_of_day = gr.Textbox(
173
  label="Versículo do Dia",
 
181
  with gr.Row():
182
  with gr.Column():
183
  theme = gr.Dropdown(
184
+ choices=counselor.get_themes(),
185
  label="Tema",
186
  value="casamento"
187
  )
 
220
 
221
  ### Temas Disponíveis:
222
  - Casamento: Conselhos para relacionamento conjugal
223
+ - Família: Orientação para vida familiar
 
224
 
225
  ### Notas:
226
  - As respostas são baseadas em princípios bíblicos
 
228
  - O versículo do dia é atualizado diariamente
229
  """)
230
 
 
231
  gr.Examples(
232
+ examples=counselor.get_examples(),
 
 
 
 
 
 
233
  inputs=[theme, question],
234
  outputs=[answer_output, metadata_output, history_output],
235
  fn=lambda t, q: counselor.get_unique_response(q, t),
236
  label="Exemplos de Perguntas"
237
  )
238
 
 
 
 
 
239
  submit_btn.click(
240
+ fn=counselor.get_unique_response,
241
  inputs=[theme, question],
242
  outputs=[answer_output, metadata_output, history_output]
243
  )