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