DHEIVER commited on
Commit
b9288fb
1 Parent(s): 8445ab0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +143 -141
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
- keywords: List[str]
36
- sentiment: str # Added for emotional context
37
 
38
- class ResponseGenerator:
39
  def __init__(self):
40
- self.nlp_model = None # Placeholder for sentiment analysis
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
- def load_examples(self):
76
- # Load examples from JSON file (you would need to create this)
77
- examples_path = Path("biblical_examples.json")
78
- if examples_path.exists():
79
- with open(examples_path) as f:
80
- self.biblical_examples = json.load(f)
81
- else:
82
- # Fallback to default examples
83
- self.biblical_examples = self._get_default_examples()
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 get_unique_response(self, question: str, theme: str = None) -> Tuple[str, Dict, str]:
96
- if not theme:
97
- theme = self.find_best_theme(question)
98
-
99
- example = self._select_best_example(question, theme)
100
- personalized_response = self.response_generator.personalize_response(example, question)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
 
102
- # Generate AI response using the model
103
- model_response = self._generate_model_response(question, example['texto'])
 
104
 
105
- # Create enhanced response with better formatting and structure
106
- response = self._format_enhanced_response(
107
- personalized_response,
108
- example,
109
- model_response,
110
- self._get_additional_resources(theme)
111
- )
 
 
112
 
113
- metadata = self._create_metadata(example, theme)
 
114
  history = self.save_to_history(question, theme, response, metadata)
115
 
116
  return response, metadata, history
117
 
118
- def _format_enhanced_response(self, personalized_response, example, model_response, resources):
 
 
 
 
 
 
119
  return f"""
120
  🌟 Orientação Personalizada:
121
- {personalized_response}
122
 
123
  📖 Passagem Bíblica:
124
- {example['passagem']}: {example['texto']}
125
 
126
  ✨ Aplicação Prática:
127
- {example['aplicacao']}
128
 
129
- 💭 Reflexão Gerada por IA:
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 _get_additional_resources(self, theme):
140
- # Add relevant books, articles, or other resources based on the theme
141
- resources = {
142
- "casamento": ["'O Significado do Casamento' - Timothy Keller",
143
- "'Casamento Blindado' - Renato e Cristiane Cardoso"],
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 create_enhanced_interface():
151
- counselor = EnhancedBiblicalCounselor()
152
-
153
- custom_theme = gr.themes.Soft().set(
154
- button_primary_background_fill="indigo",
155
- button_primary_background_fill_dark="darkblue",
156
- )
 
 
 
 
 
 
 
 
 
 
 
157
 
158
- with gr.Blocks(theme=custom_theme) as demo:
 
 
 
 
 
 
 
159
  gr.Markdown("""
160
- # 🕊️ Conselheiro Bíblico Plus
161
- ### Orientação Bíblica Personalizada com Inteligência Artificial
162
  """)
163
 
164
  with gr.Row():
165
- with gr.Column(scale=1):
166
  verse_of_day = gr.Textbox(
167
- label="🌟 Versículo do Dia",
168
- value=counselor.get_verse_of_the_day(),
169
  lines=4,
170
  interactive=False
171
  )
172
-
173
- with gr.Column(scale=1):
174
  prayer_focus = gr.Textbox(
175
- label="🙏 Foco de Oração do Dia",
176
  value=counselor.get_daily_prayer_focus(),
177
  lines=4,
178
  interactive=False
179
  )
180
 
181
- with gr.Tabs():
182
- with gr.TabItem("📝 Nova Consulta", id=1):
183
- with gr.Row():
184
- with gr.Column():
185
- theme = gr.Dropdown(
186
- choices=counselor.get_themes(),
187
- label="🎯 Tema",
188
- value="geral",
189
- info="Selecione um tema ou deixe em automático"
190
- )
191
-
192
- question = gr.Textbox(
193
- label=" Sua Pergunta",
194
- placeholder="Digite sua pergunta sobre qualquer tema bíblico...",
195
- lines=3
196
- )
197
-
198
- with gr.Row():
199
- submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary")
200
- clear_btn = gr.Button("🔄 Limpar", variant="secondary")
201
-
202
- with gr.Column():
203
- answer_output = gr.Textbox(
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 aplicação aprimorada...")
225
- demo = create_enhanced_interface()
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,