BiblioBot / app.py
FelipeMena's picture
Arreglos en la interfaz
2aaaefb verified
raw
history blame
3.29 kB
import gradio as gr
from transformers import pipeline
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# --- Base documental: información sobre la biblioteca ---
documentos = [
"La biblioteca abre de lunes a viernes de 8:00 a.m. a 6:00 p.m.",
"Los estudiantes pueden prestar hasta 3 libros por 15 días.",
"Puedes buscar libros en el catálogo en línea accediendo desde la página web institucional.",
"No se permite comer ni beber dentro de la biblioteca.",
"Hay salas de estudio grupal disponibles con reserva previa.",
"La biblioteca cuenta con acceso a bases de datos académicas para estudiantes.",
"Para renovar un libro, debes ingresar al sistema antes de la fecha de vencimiento.",
"Se realizan talleres de lectura y escritura todos los miércoles a las 3 p.m.",
"Los libros extraviados deben ser reportados inmediatamente al personal de la biblioteca.",
"Los usuarios deben mantener el silencio dentro de las instalaciones."
]
# --- Cargar modelo de embeddings y crear índice FAISS ---
modelo_emb = SentenceTransformer('sentence-transformers/bert-base-nli-mean-tokens')
embeddings_docs = modelo_emb.encode(documentos, convert_to_numpy=True)
dim = embeddings_docs.shape[1]
index = faiss.IndexFlatL2(dim)
index.add(embeddings_docs)
# --- Pipeline de pregunta-respuesta ---
qa_pipeline = pipeline("question-answering", model="PlanTL-GOB-ES/roberta-base-bne-sqac")
# --- Detectar saludos y frases comunes ---
def respuesta_basica(texto):
texto = texto.lower().strip()
saludos = ["hola", "buenos días", "buenas tardes", "buenas noches", "qué tal", "hey", "buen día"]
despedidas = ["adiós", "hasta luego", "nos vemos"]
agradecimientos = ["gracias", "muchas gracias", "te lo agradezco"]
if any(s in texto for s in saludos):
return "¡Hola! ¿En qué puedo ayudarte con la biblioteca?"
elif any(d in texto for d in despedidas):
return "¡Hasta luego! No olvides devolver tus libros a tiempo 📚."
elif any(a in texto for a in agradecimientos):
return "¡De nada! Estoy aquí para ayudarte 😊."
else:
return None
# --- Función de chatbot con manejo de frases comunes ---
def chat_biblioteca(pregunta):
respuesta_simple = respuesta_basica(pregunta)
if respuesta_simple:
return respuesta_simple
# Si no es frase común, responder usando embeddings y modelo QA
embedding = modelo_emb.encode([pregunta], convert_to_numpy=True)
D, I = index.search(embedding, k=2)
contexto = " ".join([documentos[i] for i in I[0]])
try:
resultado = qa_pipeline(question=pregunta, context=contexto)
respuesta = resultado["answer"]
except:
respuesta= "Lo siento, no pude procesar tu pregunta. ¿Puedes intentar reformularla?"
return historial + [[mensaje, respuesta]]
# --- Interfaz tipo chat oscuro ---
gr.ChatInterface(
fn=responder,
title="📚 BiblioBot",
description="¡Bienvenido a BiblioBot! Pregunta sobre libros, horarios o servicios de biblioteca.",
theme="soft",
examples=["¿Cuál es el horario?", "¿Puedo comer en la biblioteca?", "¿Qué pasa si pierdo un libro?"],
retry_btn="Reintentar",
clear_btn="Borrar historial",
).launch()