Update app.py
Browse files
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:]):
|
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
|
59 |
-
"""
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
|
75 |
-
|
76 |
-
|
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 |
-
|
82 |
-
|
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=
|
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 |
-
-
|
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=
|
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 |
)
|