Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
|
|
|
|
|
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.
|
25 |
|
26 |
-
|
27 |
-
|
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 |
-
"
|
|
|
66 |
},
|
67 |
-
# ... [mantém todos os versículos anteriores] ...
|
68 |
{
|
69 |
-
"referencia": "
|
70 |
-
"texto": "
|
71 |
-
"
|
|
|
72 |
},
|
73 |
{
|
74 |
-
"referencia": "
|
75 |
-
"texto": "
|
76 |
-
"
|
|
|
77 |
},
|
78 |
{
|
79 |
-
"referencia": "
|
80 |
-
"texto": "
|
81 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
116 |
-
<p>Encontre orientação
|
117 |
</div>
|
118 |
""")
|
119 |
|
120 |
with gr.Row():
|
121 |
with gr.Column(scale=2):
|
122 |
chatbot = gr.Chatbot(
|
123 |
-
height=
|
124 |
show_label=False,
|
125 |
-
|
|
|
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=
|
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.
|
140 |
-
with gr.Accordion(
|
141 |
-
for
|
142 |
-
btn = gr.Button(prompt)
|
143 |
btn.click(
|
144 |
-
fn=
|
145 |
-
inputs=[chatbot],
|
146 |
outputs=[chatbot]
|
147 |
)
|
148 |
|
149 |
gr.Markdown("""
|
150 |
-
### 💡
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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])
|