DHEIVER commited on
Commit
b9c754c
1 Parent(s): f5eff85

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +118 -122
app.py CHANGED
@@ -6,60 +6,20 @@ import warnings
6
  from typing import List, Tuple, Dict
7
  import random
8
  import hashlib
 
9
 
10
  logging.basicConfig(level=logging.INFO)
11
  logger = logging.getLogger(__name__)
12
  warnings.filterwarnings('ignore')
13
 
14
- # Banco de exemplos e respostas pré-definidas
15
- BIBLICAL_EXAMPLES = {
16
- "casamento": [
17
- {
18
- "pergunta": "Como resolver conflitos no casamento?",
19
- "passagem": "Efésios 4:26-32",
20
- "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.""",
21
- "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.""",
22
- "aplicacao": "Resolução diária de conflitos, perdão e reconciliação"
23
- },
24
- {
25
- "pergunta": "Como manter um casamento forte espiritualmente?",
26
- "passagem": "Eclesiastes 4:9-12",
27
- "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.""",
28
- "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.""",
29
- "aplicacao": "Desenvolvimento espiritual conjunto e oração em casal"
30
- },
31
- {
32
- "pergunta": "Qual o papel do perdão no casamento?",
33
- "passagem": "Colossenses 3:13-14",
34
- "texto": """Suportando-vos uns aos outros, e perdoando-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.""",
35
- "resposta_base": """O perdão no casamento reflete o perdão que recebemos de Cristo. É um ato contínuo de amor que fortalece o vínculo conjugal e promove a cura emocional. Devemos perdoar assim como fomos perdoados.""",
36
- "aplicacao": "Prática do perdão e cultivo do amor sacrificial"
37
- },
38
- {
39
- "pergunta": "Como manter a fidelidade no casamento?",
40
- "passagem": "Hebreus 13:4",
41
- "texto": """Venerado seja entre todos o matrimônio e o leito sem mácula; porém aos que se dão à prostituição e aos adúlteros, Deus os julgará.""",
42
- "resposta_base": """A fidelidade no casamento é um mandamento divino que requer compromisso, respeito mútuo e temor a Deus. O matrimônio deve ser honrado por todos, mantendo a pureza e a santidade da união conjugal.""",
43
- "aplicacao": "Compromisso com a fidelidade e pureza conjugal"
44
- },
45
- {
46
- "pergunta": "Como lidar com diferenças no casamento?",
47
- "passagem": "1 Pedro 3:8-9",
48
- "texto": """Finalmente, sede todos de um mesmo sentimento, compassivos, amando os irmãos, entranhavelmente misericordiosos e humildes. Não tornando mal por mal, ou injúria por injúria; antes, pelo contrário, bendizendo.""",
49
- "resposta_base": """As diferenças no casamento devem ser tratadas com compreensão, humildade e respeito mútuo. A unidade não significa uniformidade, mas harmonia nas diferenças através do amor e da compaixão.""",
50
- "aplicacao": "Respeito às diferenças e busca da harmonia"
51
- }
52
- ],
53
- "criacao_filhos": [
54
- # [Exemplos similares para outros temas...]
55
- ]
56
- }
57
 
58
  class DiverseBiblicalCounselor:
59
  def __init__(self):
60
  logger.info("Inicializando conselheiro bíblico...")
61
  self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
62
  self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
 
63
 
64
  try:
65
  self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
@@ -70,64 +30,58 @@ class DiverseBiblicalCounselor:
70
  logger.error(f"Erro ao carregar modelo: {str(e)}")
71
  raise
72
 
73
- def get_unique_response(self, question: str, theme: str) -> Tuple[str, Dict]:
74
- """Gera uma resposta única baseada na pergunta e tema"""
75
-
76
- # Gera um hash da pergunta para garantir consistência
77
- question_hash = hashlib.md5(question.lower().encode()).hexdigest()
78
-
79
- # Seleciona exemplo baseado no hash
80
- examples = BIBLICAL_EXAMPLES.get(theme, [])
81
- if not examples:
82
- return "Tema não encontrado", {}
 
 
 
 
 
83
 
84
- # Usa o hash para selecionar um exemplo de forma determinística
85
- selected_index = int(question_hash, 16) % len(examples)
86
- example = examples[selected_index]
87
-
88
- # Prepara o contexto para o modelo
89
- inputs = self.tokenizer.encode_plus(
90
- question,
91
- example["texto"],
92
- return_tensors="pt",
93
- max_length=512,
94
- truncation=True,
95
- padding="max_length"
96
- ).to(self.device)
97
-
98
- # Gera a resposta
99
- with torch.no_grad():
100
- outputs = self.model(**inputs)
 
101
 
102
- answer_start = torch.argmax(outputs.start_logits)
103
- answer_end = torch.argmax(outputs.end_logits)
 
 
104
 
105
- tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
106
- model_answer = tokens[answer_start:answer_end + 1]
107
- model_answer = self.tokenizer.convert_tokens_to_string(model_answer)
108
-
109
- # Formata a resposta final
110
- response = f"""
111
- 🕊️ Conselho Bíblico:
112
- {example['resposta_base']}
113
-
114
- 📖 Passagem Bíblica:
115
- {example['passagem']}: {example['texto']}
116
-
117
- ✝️ Aplicação Prática:
118
- {example['aplicacao']}
119
-
120
- 💭 Reflexão Adicional:
121
- {model_answer}
122
- """
123
-
124
- metadata = {
125
- "passagem": example['passagem'],
126
- "contexto": "Baseado em princípios bíblicos para " + theme.replace('_', ' '),
127
- "aplicacao": example['aplicacao']
128
- }
129
 
130
- return response, metadata
 
 
 
 
 
 
 
 
 
131
 
132
  def create_interface():
133
  counselor = DiverseBiblicalCounselor()
@@ -138,31 +92,69 @@ def create_interface():
138
  ### Orientação Bíblica Personalizada
139
  """)
140
 
 
141
  with gr.Row():
142
- with gr.Column():
143
- theme = gr.Dropdown(
144
- choices=list(BIBLICAL_EXAMPLES.keys()),
145
- label="Tema",
146
- value="casamento"
147
- )
148
- question = gr.Textbox(
149
- label="Sua Pergunta",
150
- placeholder="Digite sua pergunta...",
151
- lines=3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  )
153
- submit_btn = gr.Button("🙏 Buscar Orientação")
154
 
155
- with gr.Column():
156
- answer_output = gr.Textbox(
157
- label="Resposta",
158
- lines=10
159
- )
160
- metadata_output = gr.Textbox(
161
- label="Referências",
162
- lines=3
163
- )
164
-
165
- # Exemplos
 
 
 
 
 
 
 
 
 
166
  gr.Examples(
167
  examples=[
168
  ["casamento", "Como resolver conflitos no casamento?"],
@@ -172,15 +164,19 @@ def create_interface():
172
  ["casamento", "Como lidar com diferenças no casamento?"]
173
  ],
174
  inputs=[theme, question],
175
- outputs=[answer_output, metadata_output],
176
  fn=lambda t, q: counselor.get_unique_response(q, t),
177
  label="Exemplos de Perguntas"
178
  )
179
 
 
 
 
 
180
  submit_btn.click(
181
- fn=lambda t, q: counselor.get_unique_response(q, t),
182
  inputs=[theme, question],
183
- outputs=[answer_output, metadata_output]
184
  )
185
 
186
  return demo
 
6
  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
+ # Existing BIBLICAL_EXAMPLES dictionary remains the same...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
  class DiverseBiblicalCounselor:
18
  def __init__(self):
19
  logger.info("Inicializando conselheiro bíblico...")
20
  self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
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)
 
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({
36
+ "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
37
+ "theme": theme,
38
+ "question": question,
39
+ "response": response,
40
+ "metadata": metadata
41
+ })
42
+ return self.format_history()
43
+
44
+ def format_history(self) -> str:
45
+ """Formata o histórico de consultas para exibição"""
46
+ if not self.session_history:
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"
54
+ history_text += f"📖 Passagem: {entry['metadata']['passagem']}\n"
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():
87
  counselor = DiverseBiblicalCounselor()
 
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",
99
+ value=counselor.get_verse_of_the_day(),
100
+ lines=4,
101
+ interactive=False
102
+ )
103
+
104
+ with gr.Tabs():
105
+ with gr.TabItem("📝 Consulta"):
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
+ )
113
+ question = gr.Textbox(
114
+ label="Sua Pergunta",
115
+ placeholder="Digite sua pergunta...",
116
+ lines=3
117
+ )
118
+ submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary")
119
+
120
+ with gr.Column():
121
+ answer_output = gr.Textbox(
122
+ label="Resposta",
123
+ lines=10
124
+ )
125
+ metadata_output = gr.Textbox(
126
+ label="Referências",
127
+ lines=3
128
+ )
129
+
130
+ with gr.TabItem("📚 Histórico"):
131
+ history_output = gr.Textbox(
132
+ label="Histórico de Consultas",
133
+ value="Nenhuma consulta realizada ainda.",
134
+ lines=15,
135
+ interactive=False
136
  )
 
137
 
138
+ with gr.TabItem("ℹ️ Ajuda"):
139
+ gr.Markdown("""
140
+ ### Como usar o Conselheiro Bíblico:
141
+ 1. Selecione um tema relacionado à sua dúvida
142
+ 2. Digite sua pergunta de forma clara e objetiva
143
+ 3. Clique em "Buscar Orientação"
144
+ 4. Receba orientação baseada em princípios bíblicos
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
153
+ - Cada consulta é salva no histórico para referência futura
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?"],
 
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
  )
181
 
182
  return demo