Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -5,13 +5,9 @@ import logging
|
|
5 |
import warnings
|
6 |
from typing import List, Tuple, Dict
|
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__)
|
@@ -32,56 +28,44 @@ class BiblicalExample:
|
|
32 |
text: str
|
33 |
base_response: str
|
34 |
application: str
|
35 |
-
|
36 |
-
sentiment: str # Added for emotional context
|
37 |
|
38 |
-
class
|
39 |
def __init__(self):
|
40 |
-
|
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 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
def setup_model(self):
|
86 |
try:
|
87 |
self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
|
@@ -92,137 +76,155 @@ class EnhancedBiblicalCounselor:
|
|
92 |
logger.error(f"Erro ao carregar modelo: {str(e)}")
|
93 |
raise
|
94 |
|
95 |
-
def
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
101 |
|
102 |
-
|
103 |
-
|
|
|
104 |
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
)
|
|
|
|
|
112 |
|
113 |
-
|
|
|
114 |
history = self.save_to_history(question, theme, response, metadata)
|
115 |
|
116 |
return response, metadata, history
|
117 |
|
118 |
-
def
|
|
|
|
|
|
|
|
|
|
|
|
|
119 |
return f"""
|
120 |
🌟 Orientação Personalizada:
|
121 |
-
{
|
122 |
|
123 |
📖 Passagem Bíblica:
|
124 |
-
{example
|
125 |
|
126 |
✨ Aplicação Prática:
|
127 |
-
{example
|
128 |
|
129 |
-
|
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
|
140 |
-
|
141 |
-
|
142 |
-
"
|
143 |
-
|
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
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
|
158 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
159 |
gr.Markdown("""
|
160 |
-
# 🕊️
|
161 |
-
### Orientação
|
162 |
""")
|
163 |
|
164 |
with gr.Row():
|
165 |
-
with gr.Column(
|
166 |
verse_of_day = gr.Textbox(
|
167 |
-
label="
|
168 |
-
value=counselor.
|
169 |
lines=4,
|
170 |
interactive=False
|
171 |
)
|
172 |
-
|
173 |
-
with gr.Column(
|
174 |
prayer_focus = gr.Textbox(
|
175 |
-
label="
|
176 |
value=counselor.get_daily_prayer_focus(),
|
177 |
lines=4,
|
178 |
interactive=False
|
179 |
)
|
180 |
|
181 |
-
with gr.
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
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
|
225 |
-
demo =
|
226 |
demo.launch(
|
227 |
server_name="0.0.0.0",
|
228 |
share=True,
|
|
|
5 |
import warnings
|
6 |
from typing import List, Tuple, Dict
|
7 |
import random
|
|
|
8 |
from datetime import datetime
|
9 |
from dataclasses import dataclass
|
10 |
from enum import Enum
|
|
|
|
|
|
|
11 |
|
12 |
logging.basicConfig(level=logging.INFO)
|
13 |
logger = logging.getLogger(__name__)
|
|
|
28 |
text: str
|
29 |
base_response: str
|
30 |
application: str
|
31 |
+
sentiment: str
|
|
|
32 |
|
33 |
+
class SapienciaBiblica:
|
34 |
def __init__(self):
|
35 |
+
logger.info("Inicializando SapiênciaBíblica...")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
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))
|
104 |
+
neg_count = len(text_words.intersection(negative_words))
|
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 |
|
116 |
+
response = self.format_response(example, sentiment)
|
117 |
+
metadata = self.create_metadata(example, theme)
|
118 |
history = self.save_to_history(question, theme, response, metadata)
|
119 |
|
120 |
return response, metadata, history
|
121 |
|
122 |
+
def format_response(self, example: BiblicalExample, sentiment: str) -> str:
|
123 |
+
intro = {
|
124 |
+
'positive': "Que bom que você está buscando orientação! ",
|
125 |
+
'negative': "Entendo seu momento e estou aqui para ajudar. ",
|
126 |
+
'neutral': "Agradeço sua busca por sabedoria. "
|
127 |
+
}
|
128 |
+
|
129 |
return f"""
|
130 |
🌟 Orientação Personalizada:
|
131 |
+
{intro[sentiment]}{example.base_response}
|
132 |
|
133 |
📖 Passagem Bíblica:
|
134 |
+
{example.passage}: {example.text}
|
135 |
|
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:
|
150 |
+
self.session_history.append({
|
151 |
+
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
152 |
+
"theme": theme,
|
153 |
+
"question": question,
|
154 |
+
"response": response,
|
155 |
+
"metadata": metadata
|
156 |
+
})
|
157 |
+
return self.format_history()
|
158 |
+
|
159 |
+
def format_history(self) -> str:
|
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()
|
174 |
+
|
175 |
+
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
176 |
gr.Markdown("""
|
177 |
+
# 🕊️ SapiênciaBíblica
|
178 |
+
### Orientação Divina para Vida Moderna
|
179 |
""")
|
180 |
|
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
|
188 |
)
|
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,
|
218 |
+
inputs=[question, theme],
|
219 |
+
outputs=[answer_output, metadata_output, history_output]
|
220 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
221 |
|
222 |
return demo
|
223 |
|
224 |
if __name__ == "__main__":
|
225 |
try:
|
226 |
+
logger.info("Iniciando SapiênciaBíblica...")
|
227 |
+
demo = create_interface()
|
228 |
demo.launch(
|
229 |
server_name="0.0.0.0",
|
230 |
share=True,
|