Spaces:
Sleeping
Sleeping
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() |