DHEIVER commited on
Commit
354f3df
·
verified ·
1 Parent(s): aff5950

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +146 -93
app.py CHANGED
@@ -1,98 +1,148 @@
1
  import gradio as gr
2
- from transformers import AutoTokenizer, AutoModel, pipeline
3
- import torch
4
  import numpy as np
5
  from typing import List, Dict
6
  import logging
7
- from functools import lru_cache
 
 
8
 
9
  logging.basicConfig(level=logging.INFO)
10
  logger = logging.getLogger(__name__)
11
 
12
  class AssistenteBiblico:
13
  def __init__(self):
14
- self.device = "cuda" if torch.cuda.is_available() else "cpu"
15
- logger.info(f"Usando dispositivo: {self.device}")
16
-
17
- model_name = "neuralmind/bert-base-portuguese-cased"
18
- self.tokenizer = AutoTokenizer.from_pretrained(model_name)
19
- self.model = AutoModel.from_pretrained(model_name).to(self.device)
20
- self.analisador_sentimento = pipeline("sentiment-analysis",
21
- model="pierreguillou/bert-base-multilingual-cased-sentiment-brazilian-news")
22
-
23
  self.dados_biblia = self.carregar_dados_biblia()
24
- self.embeddings_versiculos = self.computar_embeddings()
25
 
26
- # Dicionário de prompts temáticos
27
- self.prompts_tematicos = {
28
- "Família": [
29
- "Como criar filhos segundo a Bíblia?",
30
- "Como ter um casamento abençoado?",
31
- "Como honrar pai e mãe?",
32
- "Como lidar com conflitos familiares?",
33
- ],
34
- "Trabalho": [
35
- "Como ser um bom profissional cristão?",
36
- "Como lidar com problemas no trabalho?",
37
- "Como encontrar propósito no trabalho?",
38
- "Como administrar as finanças biblicamente?",
39
- ],
40
- "Saúde": [
41
- "Como encontrar força na doença?",
42
- "Como confiar em Deus nos momentos difíceis?",
43
- "Como lidar com ansiedade e depressão?",
44
- "Como encontrar paz interior?",
45
- ],
46
- "Relacionamentos": [
47
- "Como perdoar quem nos magoou?",
48
- "Como escolher boas amizades?",
49
- "Como lidar com a solidão?",
50
- "Como amar o próximo?",
51
- ],
52
- "Vida Espiritual": [
53
- "Como crescer na fé?",
54
- "Como orar melhor?",
55
- "Como ler a Bíblia diariamente?",
56
- "Como desenvolver intimidade com Deus?",
57
- ]
58
- }
59
-
60
- def carregar_dados_biblia(self):
61
  return [
62
  {
63
  "referencia": "João 3:16",
64
  "texto": "Porque Deus amou o mundo de tal maneira que deu o seu Filho unigênito, para que todo aquele que nele crê não pereça, mas tenha a vida eterna.",
65
- "topico": "Salvação"
 
66
  },
67
- # ... [mantém todos os versículos anteriores] ...
68
  {
69
- "referencia": "Efésios 6:4",
70
- "texto": "E vós, pais, não provoqueis vossos filhos à ira, mas criai-os na disciplina e na admoestação do Senhor.",
71
- "topico": "Família"
 
72
  },
73
  {
74
- "referencia": "Colossenses 3:23",
75
- "texto": "E tudo quanto fizerdes, fazei-o de coração, como ao Senhor e não aos homens.",
76
- "topico": "Trabalho"
 
77
  },
78
  {
79
- "referencia": "Filipenses 4:6-7",
80
- "texto": "Não andeis ansiosos por coisa alguma; antes, em tudo, sejam os vossos pedidos conhecidos diante de Deus pela oração e súplica, com ação de graças. E a paz de Deus, que excede todo o entendimento, guardará os vossos corações e os vossos pensamentos em Cristo Jesus.",
81
- "topico": "Saúde Mental"
 
 
 
 
 
 
 
82
  }
83
  ]
84
-
85
- # [mantém os métodos anteriores de embeddings e busca...]
86
-
87
- def get_prompt_tematico(self, categoria: str, indice: int) -> str:
88
- """Retorna um prompt específico de uma categoria"""
89
- return self.prompts_tematicos.get(categoria, [])[indice]
90
-
91
- def get_categorias(self) -> List[str]:
92
- """Retorna todas as categorias disponíveis"""
93
- return list(self.prompts_tematicos.keys())
94
 
95
- # Interface Gradio atualizada
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  def criar_interface():
97
  assistente = AssistenteBiblico()
98
 
@@ -104,54 +154,57 @@ def criar_interface():
104
  except Exception as e:
105
  logger.error(f"Erro: {str(e)}")
106
  return historico + [(prompt, "Desculpe, ocorreu um erro.")]
107
-
108
- def usar_prompt_tematico(categoria: str, indice: int, historico: List) -> List:
109
- prompt = assistente.get_prompt_tematico(categoria, indice)
110
- return processar_prompt(prompt, historico)
111
-
112
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
113
  gr.HTML("""
114
- <div style="text-align: center; padding: 20px;">
115
- <h1>🙏 Assistente Bíblico - Sua Luz na Palavra</h1>
116
- <p>Encontre orientação bíblica para sua vida</p>
117
  </div>
118
  """)
119
 
120
  with gr.Row():
121
  with gr.Column(scale=2):
122
  chatbot = gr.Chatbot(
123
- height=400,
124
  show_label=False,
125
- layout="bubble",
 
126
  )
127
 
128
  with gr.Row():
129
  msg = gr.Textbox(
130
  show_label=False,
131
  placeholder="Digite sua pergunta ou use os botões temáticos...",
132
- scale=4
133
  )
134
  limpar = gr.Button("🔄 Limpar", scale=1)
135
 
136
  with gr.Column(scale=1):
137
- gr.Markdown("### 📚 Temas")
138
 
139
- for categoria in assistente.get_categorias():
140
- with gr.Accordion(f"🎯 {categoria}", open=False):
141
- for i, prompt in enumerate(assistente.prompts_tematicos[categoria]):
142
- btn = gr.Button(prompt)
143
  btn.click(
144
- fn=lambda cat=categoria, idx=i, hist=chatbot: usar_prompt_tematico(cat, idx, hist),
145
- inputs=[chatbot],
146
  outputs=[chatbot]
147
  )
148
 
149
  gr.Markdown("""
150
- ### 💡 Dicas
151
- - Use os botões temáticos para perguntas comuns
152
- - Digite suas próprias perguntas
153
- - Explore diferentes temas da vida cristã
154
- - Receba versículos específicos para cada situação
 
 
 
 
 
 
155
  """)
156
 
157
  msg.submit(processar_prompt, [msg, chatbot], [chatbot])
 
1
  import gradio as gr
 
 
2
  import numpy as np
3
  from typing import List, Dict
4
  import logging
5
+ import json
6
+ import re
7
+ from pathlib import Path
8
 
9
  logging.basicConfig(level=logging.INFO)
10
  logger = logging.getLogger(__name__)
11
 
12
  class AssistenteBiblico:
13
  def __init__(self):
 
 
 
 
 
 
 
 
 
14
  self.dados_biblia = self.carregar_dados_biblia()
15
+ self.prompts_tematicos = self.carregar_prompts()
16
 
17
+ def carregar_dados_biblia(self) -> List[Dict]:
18
+ """Carrega base de dados de versículos bíblicos"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  return [
20
  {
21
  "referencia": "João 3:16",
22
  "texto": "Porque Deus amou o mundo de tal maneira que deu o seu Filho unigênito, para que todo aquele que nele crê não pereça, mas tenha a vida eterna.",
23
+ "palavras_chave": ["amor", "salvação", "vida eterna", "deus", "jesus", "fé"],
24
+ "topicos": ["Salvação", "Amor de Deus"]
25
  },
 
26
  {
27
+ "referencia": "Salmos 23:1-3",
28
+ "texto": "O Senhor é o meu pastor, nada me faltará. Ele me faz repousar em pastos verdejantes. Leva-me para junto das águas de descanso; refrigera-me a alma.",
29
+ "palavras_chave": ["paz", "descanso", "confiança", "proteção", "cuidado", "deus"],
30
+ "topicos": ["Paz", "Confiança"]
31
  },
32
  {
33
+ "referencia": "Filipenses 4:13",
34
+ "texto": "Posso todas as coisas naquele que me fortalece.",
35
+ "palavras_chave": ["força", "superação", "fé", "conquista", "jesus"],
36
+ "topicos": ["Força", "Superação"]
37
  },
38
  {
39
+ "referencia": "Provérbios 22:6",
40
+ "texto": "Instrua a criança no caminho em que deve andar, e até quando envelhecer não se desviará dele.",
41
+ "palavras_chave": ["família", "educação", "filhos", "criação", "ensino"],
42
+ "topicos": ["Família", "Educação"]
43
+ },
44
+ {
45
+ "referencia": "1 Pedro 5:7",
46
+ "texto": "Lancem sobre ele toda a sua ansiedade, porque ele tem cuidado de vocês.",
47
+ "palavras_chave": ["ansiedade", "preocupação", "cuidado", "confiança", "paz"],
48
+ "topicos": ["Ansiedade", "Confiança"]
49
  }
50
  ]
 
 
 
 
 
 
 
 
 
 
51
 
52
+ def carregar_prompts(self) -> Dict:
53
+ """Carrega prompts temáticos organizados por categoria"""
54
+ return {
55
+ "Família": {
56
+ "título": "👨‍👩‍👦 Família",
57
+ "prompts": [
58
+ "Como criar filhos segundo a Bíblia?",
59
+ "Como ter um casamento abençoado?",
60
+ "Como honrar pai e mãe?",
61
+ "Como lidar com conflitos familiares?"
62
+ ]
63
+ },
64
+ "Ansiedade": {
65
+ "título": "🧘‍♂️ Ansiedade e Paz",
66
+ "prompts": [
67
+ "Como vencer a ansiedade?",
68
+ "Como encontrar paz interior?",
69
+ "Como confiar em Deus nos problemas?",
70
+ "Como lidar com preocupações?"
71
+ ]
72
+ },
73
+ "Trabalho": {
74
+ "título": "💼 Trabalho",
75
+ "prompts": [
76
+ "Como ser um bom profissional cristão?",
77
+ "Como lidar com dificuldades no trabalho?",
78
+ "Como servir a Deus no trabalho?",
79
+ "Como administrar melhor o dinheiro?"
80
+ ]
81
+ },
82
+ "Saúde": {
83
+ "título": "🏥 Saúde",
84
+ "prompts": [
85
+ "Como encontrar força na doença?",
86
+ "Como orar por cura?",
87
+ "Como ajudar alguém doente?",
88
+ "Como ter saúde segundo a Bíblia?"
89
+ ]
90
+ },
91
+ "Relacionamentos": {
92
+ "título": "❤️ Relacionamentos",
93
+ "prompts": [
94
+ "Como perdoar quem me magoou?",
95
+ "Como escolher boas amizades?",
96
+ "Como lidar com a solidão?",
97
+ "Como amar o próximo?"
98
+ ]
99
+ }
100
+ }
101
+
102
+ def buscar_versiculos(self, texto: str, max_versiculos: int = 2) -> List[Dict]:
103
+ """Busca versículos relevantes baseado em palavras-chave"""
104
+ # Normaliza o texto para busca
105
+ texto = texto.lower()
106
+ palavras = set(re.findall(r'\w+', texto))
107
+
108
+ # Calcula relevância dos versículos
109
+ versiculos_pontuados = []
110
+ for versiculo in self.dados_biblia:
111
+ pontos = sum(1 for palavra in palavras
112
+ if palavra in versiculo['palavras_chave'] or
113
+ palavra in [p.lower() for p in versiculo['topicos']])
114
+ if pontos > 0:
115
+ versiculos_pontuados.append((pontos, versiculo))
116
+
117
+ # Retorna os versículos mais relevantes
118
+ versiculos_ordenados = sorted(versiculos_pontuados, key=lambda x: x[0], reverse=True)
119
+ return [v[1] for v in versiculos_ordenados[:max_versiculos]]
120
+
121
+ def gerar_resposta(self, pergunta: str) -> str:
122
+ """Gera resposta baseada na pergunta e versículos encontrados"""
123
+ try:
124
+ versiculos = self.buscar_versiculos(pergunta)
125
+
126
+ if not versiculos:
127
+ return "Desculpe, não encontrei versículos específicos para sua pergunta. Tente reformular ou escolher outro tema."
128
+
129
+ resposta = "📖 Com base na sua pergunta, separei estes versículos:\n\n"
130
+
131
+ for versiculo in versiculos:
132
+ resposta += f"➤ {versiculo['referencia']}\n"
133
+ resposta += f"{versiculo['texto']}\n\n"
134
+
135
+ # Adiciona tópicos relacionados
136
+ topicos = set(sum([v['topicos'] for v in versiculos], []))
137
+ if topicos:
138
+ resposta += f"🏷️ Tópicos relacionados: {', '.join(topicos)}\n"
139
+
140
+ return resposta
141
+
142
+ except Exception as e:
143
+ logger.error(f"Erro gerando resposta: {str(e)}")
144
+ return "Desculpe, ocorreu um erro ao processar sua pergunta. Por favor, tente novamente."
145
+
146
  def criar_interface():
147
  assistente = AssistenteBiblico()
148
 
 
154
  except Exception as e:
155
  logger.error(f"Erro: {str(e)}")
156
  return historico + [(prompt, "Desculpe, ocorreu um erro.")]
157
+
 
 
 
 
158
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
159
  gr.HTML("""
160
+ <div style="text-align: center; padding: 20px; background-color: #f0f8ff; border-radius: 10px;">
161
+ <h1 style="color: #2c3e50;">🙏 Assistente Bíblico</h1>
162
+ <p style="color: #34495e;">Encontre orientação e conforto na Palavra de Deus</p>
163
  </div>
164
  """)
165
 
166
  with gr.Row():
167
  with gr.Column(scale=2):
168
  chatbot = gr.Chatbot(
169
+ height=500,
170
  show_label=False,
171
+ bubble=True,
172
+ avatar_images=["🙋", "🤖"]
173
  )
174
 
175
  with gr.Row():
176
  msg = gr.Textbox(
177
  show_label=False,
178
  placeholder="Digite sua pergunta ou use os botões temáticos...",
179
+ scale=8
180
  )
181
  limpar = gr.Button("🔄 Limpar", scale=1)
182
 
183
  with gr.Column(scale=1):
184
+ gr.Markdown("### 📚 Temas para Explorar")
185
 
186
+ for categoria, dados in assistente.prompts_tematicos.items():
187
+ with gr.Accordion(dados["título"], open=False):
188
+ for prompt in dados["prompts"]:
189
+ btn = gr.Button(prompt, size="sm")
190
  btn.click(
191
+ fn=processar_prompt,
192
+ inputs=[gr.Textbox(value=prompt, visible=False), chatbot],
193
  outputs=[chatbot]
194
  )
195
 
196
  gr.Markdown("""
197
+ ### 💡 Como usar
198
+ 1. Escolha um tema nos botões
199
+ 2. Ou faça sua própria pergunta
200
+ 3. Receba versículos e orientação
201
+ 4. Explore diferentes temas
202
+
203
+ ### ✨ Sugestões
204
+ - Seja específico nas perguntas
205
+ - Explore diferentes temas
206
+ - Use palavras-chave relevantes
207
+ - Reflita sobre os versículos
208
  """)
209
 
210
  msg.submit(processar_prompt, [msg, chatbot], [chatbot])