Spaces:
Sleeping
Sleeping
import gradio as gr | |
import re | |
from typing import List, Dict, Set | |
from difflib import SequenceMatcher | |
from datetime import datetime, timedelta | |
import logging | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
class AssistenteBiblico: | |
def __init__(self): | |
self.dados_biblia = [ | |
{"referencia": "Filipenses 4:6-7", "texto": "Não andeis ansiosos por coisa alguma...", "palavras_chave": ["ansiedade", "paz"], "topicos": ["Ansiedade", "Paz"]}, | |
{"referencia": "1 Pedro 5:7", "texto": "Lancem sobre ele toda a sua ansiedade...", "palavras_chave": ["ansiedade", "cuidado"], "topicos": ["Ansiedade", "Confiança"]}, | |
{"referencia": "Efésios 6:4", "texto": "E vós, pais, não provoqueis vossos filhos...", "palavras_chave": ["filhos", "família"], "topicos": ["Família", "Educação"]}, | |
{"referencia": "1 Coríntios 13:4-7", "texto": "O amor é paciente, o amor é bondoso...", "palavras_chave": ["amor", "relacionamento"], "topicos": ["Amor", "Relacionamentos"]}, | |
{"referencia": "Efésios 5:25", "texto": "Maridos, amai vossas mulheres, como também Cristo amou a igreja...", "palavras_chave": ["casamento", "amor"], "topicos": ["Casamento", "Amor"]}, | |
{"referencia": "Gênesis 2:24", "texto": "Por isso, deixa o homem pai e mãe e se une à sua mulher, tornando-se os dois uma só carne.", "palavras_chave": ["casamento", "união"], "topicos": ["Casamento", "União"]}, | |
{"referencia": "Provérbios 31:10", "texto": "Mulher virtuosa, quem a achará? O seu valor muito excede o de rubis.", "palavras_chave": ["casamento", "virtude"], "topicos": ["Casamento", "Virtude"]} | |
] | |
self.cache_pesquisa = {} | |
self.max_cache_size = 100 | |
self.cache_expiry = timedelta(hours=24) | |
def _expandir_palavras_chave(self, palavras: List[str]) -> Set[str]: | |
sinonimos = { | |
"ansiedade": ["preocupação", "aflição"], | |
"amor": ["afeição", "carinho"], | |
"família": ["parentes", "lar"], | |
"casamento": ["matrimônio", "união", "casal", "cônjuge"] | |
} | |
expandidas = set(palavra.lower() for palavra in palavras) | |
for palavra in palavras: | |
if palavra in sinonimos: | |
expandidas.update(sinonimos[palavra]) | |
return expandidas | |
def calcular_relevancia(self, texto_busca: str, versiculo: Dict) -> float: | |
if not texto_busca or not versiculo: return 0.0 | |
texto_busca = texto_busca.lower().strip() | |
palavras_busca = set(re.findall(r'\w+', texto_busca)) | |
pesos = {'palavras_chave': 1.0, 'topicos': 0.8, 'texto': 0.3} | |
pontuacao = 0.0 | |
matches_palavras = palavras_busca.intersection(set(v.lower() for v in versiculo['palavras_chave'])) | |
pontuacao += len(matches_palavras) * pesos['palavras_chave'] | |
matches_topicos = palavras_busca.intersection(set(v.lower() for v in versiculo['topicos'])) | |
pontuacao += len(matches_topicos) * pesos['topicos'] | |
similaridade_texto = SequenceMatcher(None, texto_busca, versiculo['texto'].lower()).ratio() | |
pontuacao += similaridade_texto * pesos['texto'] | |
return pontuacao | |
def buscar_versiculos(self, texto: str, max_versiculos: int = 3) -> List[Dict]: | |
if not texto or max_versiculos < 1: return [] | |
cache_key = texto.lower().strip() | |
if cache_key in self.cache_pesquisa and datetime.now() - self.cache_pesquisa[cache_key]['timestamp'] < self.cache_expiry: | |
return self.cache_pesquisa[cache_key]['resultados'] | |
resultados = [(self.calcular_relevancia(texto, v), v) for v in self.dados_biblia] | |
resultados.sort(reverse=True) | |
versiculos = [v[1] for v in resultados[:max_versiculos]] | |
self.cache_pesquisa[cache_key] = {'timestamp': datetime.now(), 'resultados': versiculos} | |
if len(self.cache_pesquisa) > self.max_cache_size: | |
chaves_antigas = sorted(self.cache_pesquisa.keys(), key=lambda k: self.cache_pesquisa[k]['timestamp'])[:-self.max_cache_size] | |
for k in chaves_antigas: del self.cache_pesquisa[k] | |
return versiculos | |
def gerar_resposta(self, pergunta: str) -> str: | |
if not pergunta: return "Por favor, forneça uma pergunta válida." | |
try: | |
versiculos = self.buscar_versiculos(pergunta) | |
if not versiculos: | |
return "🤔 Não encontrei versículos específicos para sua pergunta." | |
resposta = "📖 Encontrei estas palavras de sabedoria:\n\n" | |
for i, v in enumerate(versiculos, 1): | |
resposta += f"#{i} {v['referencia']}\n{v['texto']}\n\n" | |
resposta += "🙏 Reflita sobre estas palavras." | |
return resposta | |
except Exception as e: | |
logger.error(f"Erro: {str(e)}") | |
return "Desculpe, ocorreu um erro. Tente novamente." | |
def criar_interface(): | |
assistente = AssistenteBiblico() | |
def processar_prompt(prompt: str, historico: List) -> List: | |
if not prompt or len(prompt.strip()) < 3: | |
return historico + [(prompt, "Por favor, digite uma pergunta mais detalhada.")] | |
try: | |
resposta = assistente.gerar_resposta(prompt) | |
novo_historico = historico + [(prompt, resposta)] | |
return novo_historico[-10:] # Mantém últimas 10 interações | |
except Exception as e: | |
logger.error(f"Erro: {str(e)}") | |
return historico + [(prompt, "Erro ao processar pergunta.")] | |
with gr.Blocks(title="Assistente Bíblico") as demo: | |
gr.HTML(""" | |
<div style="text-align:center; padding:20px; background:linear-gradient(135deg,#f0f8ff 0%,#e6f3ff 100%); border-radius:10px"> | |
<h1 style="color:#2c3e50">🙏 Conselheiro Bíblico</h1> | |
<p style="color:#34495e">Encontre orientação nas Escrituras</p> | |
</div> | |
""") | |
with gr.Row(): | |
with gr.Column(scale=2): | |
chatbot = gr.Chatbot(height=500, label="Diálogo") | |
with gr.Row(): | |
msg = gr.Textbox(show_label=False, placeholder="Digite sua dúvida...") | |
clear = gr.Button("🔄 Recomeçar") | |
with gr.Column(scale=1): | |
gr.Markdown("### 📚 Perguntas sobre Casamento") | |
perguntas_casamento = [ | |
"Como ter um casamento abençoado?", | |
"Qual o papel do marido no casamento?", | |
"Qual o papel da esposa no casamento?", | |
"Como resolver conflitos no casamento?", | |
"O que a Bíblia diz sobre amor conjugal?", | |
"Como manter a união no casamento?", | |
"Como superar crises no casamento?", | |
"Como ter um casamento segundo Deus?", | |
"Como perdoar no casamento?", | |
"Como cultivar intimidade no casamento?" | |
] | |
for pergunta in perguntas_casamento: | |
gr.Button(pergunta).click( | |
fn=processar_prompt, | |
inputs=[gr.Textbox(value=pergunta, visible=False), chatbot], | |
outputs=[chatbot] | |
) | |
gr.Markdown("### 💡 Outras Sugestões") | |
sugestoes = ["Como encontrar paz?", "Orientação para família", "Sobre amor e relacionamentos"] | |
for sugestao in sugestoes: | |
gr.Button(sugestao).click( | |
fn=processar_prompt, | |
inputs=[gr.Textbox(value=sugestao, visible=False), chatbot], | |
outputs=[chatbot] | |
) | |
msg.submit(processar_prompt, [msg, chatbot], [chatbot]) | |
clear.click(lambda: [], None, chatbot, queue=False) | |
return demo | |
if __name__ == "__main__": | |
demo = criar_interface() | |
demo.launch(share=True, server_name="0.0.0.0", server_port=7860) |