BiblioBot / app.py
FelipeMena's picture
Codigo arreglado
3be054e verified
import gradio as gr
from transformers import pipeline
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
import unicodedata
# --- Normalización de texto (quita tildes y pasa a minúsculas) ---
def normalizar(texto):
texto = texto.lower().strip()
texto = unicodedata.normalize("NFD", texto).encode("ascii", "ignore").decode("utf-8")
return texto
# --- Base documental: información sobre la biblioteca ---
documentos = {
"¿Cual es el horario de la biblioteca?": "La biblioteca abre de lunes a viernes de 8:00 a.m. a 6:00 p.m.",
"¿Como puedo buscar libros?": "Puedes buscar libros en el catálogo en línea accediendo desde la página web institucional.",
"¿Se puede comer o beber dentro de la biblioteca?": "No se permite comer ni beber dentro de la biblioteca. Esto incluye snacks, bebidas, y alimentos en general para preservar el ambiente de estudio.",
"¿Hay salas de estudio grupal?": "Hay salas de estudio grupal disponibles con reserva previa.",
"¿Que recursos digitales ofrece la biblioteca?": "La biblioteca cuenta con acceso a bases de datos académicas para estudiantes.",
"¿Como renuevo un libro?": "Para renovar un libro, debes ingresar al sistema antes de la fecha de vencimiento.",
"¿Hay actividades en la biblioteca?": "Se realizan talleres de lectura y escritura todos los miércoles a las 3 p.m.",
"¿Que normas de comportamiento hay?": "Los usuarios deben mantener el silencio dentro de las instalaciones.",
"¿Puedo acceder a libros de otras sedes?": "Los préstamos interbibliotecarios permiten acceder a libros de otras sedes universitarias.",
"¿Puedo pedir ayuda para buscar libros?": "Puedes solicitar ayuda al bibliotecario para encontrar libros o hacer búsquedas avanzadas.",
"¿La biblioteca ofrece capacitaciones?": "Se ofrecen capacitaciones sobre el uso de bases de datos académicas.",
"¿Hay computadoras disponibles?": "La biblioteca dispone de computadoras para uso estudiantil.",
"¿Hay acceso a Internet?": "El acceso a Internet es gratuito dentro de la biblioteca.",
"¿Puedo imprimir documentos?": "Las impresiones tienen un costo y se solicitan en el módulo de servicios.",
"¿Donde devuelvo libros fuera de horario?": "Puedes devolver los libros en el buzón de devoluciones fuera del horario.",
"¿Que libros tienen préstamo restringido?": "Los libros de reserva solo se prestan por 2 horas dentro de la biblioteca.",
"¿Donde veo mi historial de prestamos?": "Cada estudiante tiene un historial de préstamos en su cuenta institucional.",
"¿Como se calculan las multas?": "Las multas por retraso en la devolución se calculan por día hábil de retraso.",
"¿Con quien estoy hablando?": "Estás hablando con un chatbot diseñado para ayudarte con información sobre la biblioteca.",
"¿Que categorías de libros hay?": "La biblioteca cuenta con libros de texto, literatura, investigación, tecnología, humanidades, y más."
}
# Normalizar documentos
documentos_normalizados = [normalizar(doc) for doc in documentos]
# --- Preguntas frecuentes personalizadas ---
# --- Son preguntas que se hacen sin signos de pregunta o con signos incompletos ---
faq_personalizadas = {
"con quien estoy hablando": "Estás hablando con BiblioBot, el asistente virtual de la biblioteca.",
"con quien estoy hablando?": "Estás hablando con BiblioBot, el asistente virtual de la biblioteca.",
"hablo":"Estás hablando con BiblioBot, el asistente virtual de la biblioteca.",
"quien eres": "Soy BiblioBot, un chatbot creado para ayudarte con preguntas sobre la biblioteca.",
"cuales son los horarios de la biblioteca": "La biblioteca abre de lunes a viernes de 8:00 a.m. a 6:00 p.m.",
"cuales son los horarios de la biblioteca?": "La biblioteca abre de lunes a viernes de 8:00 a.m. a 6:00 p.m.",
"que categoria de libros hay": "Hay libros de ciencia, literatura, ingeniería, arte, historia, tecnología y muchos más.",
"que categoria de libros hay?": "Hay libros de ciencia, literatura, ingeniería, arte, historia, tecnología y muchos más.",
"¿Se puede hablar por celular dentro de la biblioteca?": "Los usuarios deben mantener el silencio dentro de las instalaciones.",
"¿se puede hablar por celular dentro de la biblioteca?": "Los usuarios deben mantener el silencio dentro de las instalaciones.",
# Comer / beber
"comer": "No se permite comer ni beber dentro de la biblioteca.",
"beber": "No se permite comer ni beber dentro de la biblioteca.",
"comida": "No se permite comer ni beber dentro de la biblioteca.",
"alimentos": "No se permite comer ni beber dentro de la biblioteca.",
"tomar algo": "No se permite comer ni beber dentro de la biblioteca.",
"llevar comida": "No se permite comer ni beber dentro de la biblioteca.",
# Horarios
"horario": "La biblioteca abre de lunes a viernes de 8:00 a.m. a 6:00 p.m.",
"a qué hora abre": "La biblioteca abre de lunes a viernes de 8:00 a.m. a 6:00 p.m.",
"cuando abre": "La biblioteca abre de lunes a viernes de 8:00 a.m. a 6:00 p.m.",
"hasta qué hora": "La biblioteca cierra a las 6:00 p.m., de lunes a viernes.",
"cuando cierra": "La biblioteca cierra a las 6:00 p.m., de lunes a viernes.",
"abre": "La biblioteca abre de lunes a viernes de 8:00 a.m. a 6:00 p.m.",
"abren": "La biblioteca abre de lunes a viernes de 8:00 a.m. a 6:00 p.m.",
# Préstamos
"prestar libros": "Puedes prestar hasta 3 libros por 15 días.",
"cuantos días": "Los préstamos duran 15 días.",
"renovar": "Para renovar un libro, debes ingresar al sistema antes de la fecha de vencimiento.",
"¿Cómo renuevo un libro?": "Para renovar un libro, debes ingresar al sistema antes de la fecha de vencimiento.",
"¿Como renuevo un libro?": "Para renovar un libro, debes ingresar al sistema antes de la fecha de vencimiento.",
"devolver": "Puedes devolver libros en el buzón de devoluciones fuera del horario.",
"multas": "Las multas por retraso se calculan por día hábil de retraso.",
"historial de prestamos": "Puedes consultar tu historial de préstamos en tu cuenta institucional.",
"¿Cuánto me cobran si devuelvo un libro tarde?": "Las multas por retraso en la devolución se calculan por día hábil de retraso.",
"¿Cuanto me cobran si devuelvo un libro tarde?": "Las multas por retraso en la devolución se calculan por día hábil de retraso.",
"tarde": "Las multas por retraso en la devolución se calculan por día hábil de retraso.",
# Recursos
"computadoras": "La biblioteca dispone de computadoras para uso estudiantil.",
"impresora": "Las impresiones tienen un costo y se solicitan en el módulo de servicios.",
"imprimir": "Las impresiones tienen un costo y se solicitan en el módulo de servicios.",
"internet": "El acceso a Internet es gratuito dentro de la biblioteca.",
"wifi": "El acceso a Internet es gratuito dentro de la biblioteca.",
"¿Hay Wi-Fi en la biblioteca?": "El acceso a Internet es gratuito dentro de la biblioteca.",
"¿Hay WiFi en la biblioteca?": "El acceso a Internet es gratuito dentro de la biblioteca.",
# Búsqueda
"catalogo": "Puedes buscar libros en el catálogo en línea desde la página web institucional.",
"buscar libros": "Puedes buscar libros en nuestro catálogo en línea desde la página web de la biblioteca. Solo escribe el título, autor o tema y encontrarás todas las opciones disponibles.",
"ayuda para buscar": "Si tienes dificultad para encontrar un libro, puedes acercarte al bibliotecario o solicitar ayuda aquí mismo. Estaremos encantados de asistirte.",
"¿Puedo conseguir libros de otras sedes?": "Los préstamos interbibliotecarios permiten acceder a libros de otras sedes universitarias.",
"sedes": "Los préstamos interbibliotecarios permiten acceder a libros de otras sedes universitarias.",
# Normas y comportamiento
"silencio": "Los usuarios deben mantener el silencio dentro de las instalaciones.",
"normas": "Se debe mantener el silencio, no se permite comer ni beber, y se debe respetar el mobiliario.",
"reglas": "Se debe mantener el silencio, no se permite comer ni beber, y se debe respetar el mobiliario.",
"comportamiento": "Se debe mantener el silencio y respeto dentro de la biblioteca.",
"Perdi un libro, que hago": "Los libros extraviados deben ser reportados inmediatamente al personal de la biblioteca.",
# Salas de estudio
"sala de estudio": "Hay salas de estudio grupal disponibles con reserva previa.",
"salas grupales": "Hay salas de estudio grupal disponibles con reserva previa.",
"reservar sala": "Puedes reservar una sala de estudio grupal con anticipación.",
# Actividades y capacitaciones
"talleres": "Se realizan talleres de lectura y escritura todos los miércoles a las 3 p.m.",
"capacitaciones": "Se ofrecen capacitaciones sobre el uso de bases de datos académicas.",
"eventos": "Se realizan talleres de lectura y escritura todos los miércoles a las 3 p.m.",
# Recursos digitales
"bases de datos": "La biblioteca cuenta con acceso a bases de datos académicas.",
"recursos digitales": "La biblioteca cuenta con acceso a bases de datos académicas.",
"ebooks": "Puedes consultar ebooks desde el portal de recursos digitales institucional.",
"libros digitales": "Puedes consultar ebooks desde el portal de recursos digitales institucional.",
# Otros
"hey bro": "¡Hola! ¿En qué puedo ayudarte con la biblioteca?",
"hey": "¡Hola! ¿En qué puedo ayudarte con la biblioteca?",
"interbibliotecario": "Puedes acceder a libros de otras sedes mediante préstamo interbibliotecario.",
"categorías de libros": "La biblioteca cuenta con libros de texto, literatura, investigación, tecnología, humanidades, y más.",
"libros disponibles": "Actualmente, contamos con miles de libros disponibles en formato físico y digital. ¿Te gustaría que te ayude a encontrar algún tema específico?",
"dónde están los libros": "Los libros están organizados por secciones y categorías en la biblioteca física. Si quieres, puedo indicarte la ubicación exacta o ayudarte a buscarlos en el catálogo digital.",
"quiere un libro": "Para obtener un libro, puedes buscarlo en nuestro catálogo y, si está disponible, reservarlo o acercarte a la biblioteca para solicitarlo en préstamo.",
"libro recomendado": "¿Buscas recomendaciones? Puedo sugerirte libros populares, novedades o lecturas según tus preferencias y área de interés.",
"reservar libro": "Si un libro está prestado, puedes reservarlo desde nuestra plataforma en línea para que te avisemos cuando esté disponible.",
"libros para estudiar": "Tenemos una amplia colección de libros especializados para diferentes áreas de estudio. ¿Me dices qué materia te interesa para ayudarte mejor?",
"libro electrónico": "También ofrecemos acceso a libros electrónicos que puedes leer desde cualquier dispositivo con internet. ¿Quieres que te explique cómo acceder a ellos?",
"libros de historia": "En la sección de historia encontrarás libros organizados por periodos y regiones. Puedo ayudarte a buscar títulos específicos o sugerirte algunos.",
"consulta de libros": "Puedes consultar la disponibilidad, ubicación y detalles de cualquier libro a través de nuestro catálogo en línea o preguntarme aquí directamente.",
"buscar textos": "Puedes buscar libros, artículos y otros textos académicos en nuestro catálogo digital con solo ingresar las palabras clave.",
"libros académicos": "Contamos con una amplia variedad de libros académicos para todas las carreras. ¿Qué área o tema te gustaría explorar?",
"¿Puedo usar la biblioteca sin ser miembro?": "Sí, puedes usar la biblioteca para consulta en sala, pero para préstamos y acceso a recursos digitales necesitas estar registrado.",
"¿Como reporto un libro dañado o perdido?": "Debes notificar al personal directamente o enviar un correo al soporte de la biblioteca.",
"¿Cuanto tiempo puedo tener un libro prestado?": "El período estándar de préstamo es de 15 días, pero puede variar según el tipo de material. Puedes consultar la duración exacta en el catálogo o con el bibliotecario.",
"¿Puedo renovar el préstamo de un libro?": "Sí, puedes renovar el préstamo si el libro no ha sido reservado por otro usuario. Puedes hacerlo en línea o acercándote a la biblioteca.",
"¿Que hago si no puedo devolver un libro a tiempo?": "Si no puedes devolver un libro a tiempo, te recomendamos avisar a la biblioteca para evitar multas. En algunos casos, puedes solicitar una extensión del préstamo.",
"¿Como busco un libro en el catalogo?": "Para buscar un libro, ingresa el título, autor o palabra clave en el buscador del catálogo en línea disponible en la página web de la biblioteca.",
"¿Puedo reservar un libro que esta prestado?": "Sí, puedes reservar libros que estén prestados para que se te notifique cuando estén disponibles para recogerlos.",
"¿Como encuentro libros electronicos?": "Puedes acceder a libros electrónicos a través de nuestra plataforma digital. Solo necesitas iniciar sesión con tu usuario de biblioteca.",
"¿Que hago si no encuentro el libro que busco?": "Si no encuentras el libro que buscas, puedes pedir ayuda al bibliotecario o solicitar un préstamo interbibliotecario si está disponible.",
"¿Ofrecen acceso a bases de datos cientificas?": "Sí, la biblioteca ofrece acceso a diversas bases de datos científicas y académicas para consulta de artículos y publicaciones especializadas.",
"¿Hay salas de estudio disponibles?": "Sí, contamos con salas de estudio individuales y grupales que puedes reservar para tus sesiones de trabajo.",
"¿Como puedo usar la sala de computadoras?": "Para usar la sala de computadoras debes registrarte en recepción y seguir las normas establecidas para su uso.",
"¿Hay acceso a internet en la biblioteca?": "Sí, la biblioteca cuenta con acceso a internet inalámbrico gratuito para todos los usuarios.",
"¿Como me registro en la biblioteca?": "Para registrarte debes presentar tu documento de identidad y llenar un formulario en la recepción de la biblioteca o en línea desde nuestra página web.",
"¿Que documentos necesito para hacerme miembro?": "Necesitarás tu documento de identidad vigente y un comprobante de residencia o matrícula para completar tu registro.",
"¿Donde esta ubicada la biblioteca?": "La biblioteca está ubicada en el segundo piso del edificio principal.",
"¿Como puedo sacar un libro prestado?": "Debes presentar tu carnet universitario en el mostrador de préstamos.",
"¿Que pasa si pierdo un libro?": "Si pierdes un libro, debes reportarlo al personal. Podrías tener que reponerlo o pagar una multa.",
"¿Tienen ayuda para trabajos de investigacion?": "Sí, la biblioteca ofrece asesoría para buscar información, usar bases de datos y aplicar normas de citación."
}
# Normalizar claves de faq_personalizadas
faq_personalizadas_normalizadas = {normalizar(k): v for k, v in faq_personalizadas.items()}
# --- Cargar modelo de embeddings y crear índice FAISS ---
modelo_emb = SentenceTransformer('sentence-transformers/bert-base-nli-mean-tokens')
embeddings_docs = modelo_emb.encode(documentos_normalizados, 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 = normalizar(texto)
saludos = ["hola", "buenos dias", "buenas tardes", "buenas noches", "que tal", "buen dia"]
despedidas = ["adios", "hasta luego", "nos vemos"]
agradecimientos = ["gracias", "muchas gracias", "te lo agradezco"]
if any(s in texto for s in saludos):
return "Hola, soy BiblioBot, tu asistente virtual de la biblioteca UDI. Estoy aquí para responder tus preguntas sobre préstamos, horarios, normas, y todo lo que necesites saber. ¡Escríbeme o selecciona una pregunta frecuente!"
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(mensaje, historial=None):
mensaje_normal = normalizar(mensaje)
respuesta_simple = respuesta_basica(mensaje)
if respuesta_simple:
return respuesta_simple
for clave in faq_personalizadas_normalizadas:
if clave in mensaje_normal:
return faq_personalizadas_normalizadas[clave]
# Respuesta con embeddings y QA
embedding = modelo_emb.encode([mensaje_normal], convert_to_numpy=True)
D, I = index.search(embedding, k=5)
contexto = " ".join([documentos_normalizados[i] for i in I[0]])
try:
resultado = qa_pipeline(question=mensaje, context=contexto)
respuesta = resultado["answer"]
except:
respuesta = "Lo siento, no pude procesar tu pregunta. ¿Puedes intentar reformularla?"
return respuesta
# --- Interfaz ---
gr.ChatInterface(
fn=chat_biblioteca,
title="📚 BiblioBot",
description="¡Bienvenido a BiblioBot! Pregunta sobre libros, horarios o servicios de biblioteca.",
examples=[
"¿Cual es el horario de la biblioteca?",
"¿Puedo comer dentro de la biblioteca?",
"¿Que pasa si pierdo un libro?",
"¿Como puedo sacar un libro prestado?",
"¿Cuanto tiempo puedo tener un libro prestado?",
"¿Puedo renovar el prestamo de un libro?",
"¿Donde esta ubicada la biblioteca?",
"¿Hay salas de estudio disponibles?",
"¿Como busco un libro en el catalogo?",
"¿Puedo reservar un libro que esta prestado?",
"¿Como encuentro libros electronicos?",
"¿Ofrecen acceso a bases de datos cientificas?",
"¿Hay acceso a internet en la biblioteca?",
"¿Como me registro en la biblioteca?",
"¿Que documentos necesito para hacerme miembro?",
"¿Puedo usar la biblioteca sin ser miembro?",
"¿Cuales son las normas de la biblioteca?",
"¿Como reporto un libro dañado o perdido?",
"¿Tienen ayuda para trabajos de investigacion?",
"Hola"
],
).launch()