File size: 18,691 Bytes
5c8e40d
 
 
 
 
94817a4
 
 
 
 
 
 
5c8e40d
 
bbcfa8b
a617aa5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3be054e
bbcfa8b
5c8e40d
94817a4
 
 
f15458a
2600dd7
f15458a
438cee4
 
 
f15458a
 
2600dd7
 
7813428
86c1b54
 
7813428
 
 
 
 
 
 
 
 
 
 
 
 
86c1b54
 
7813428
 
fa070ce
7813428
86c1b54
 
7813428
 
fa070ce
86c1b54
 
 
7813428
 
 
 
 
 
86c1b54
 
7813428
 
a617aa5
 
86c1b54
 
 
7813428
 
 
 
86c1b54
7813428
 
 
 
 
 
 
 
 
 
 
 
 
 
86c1b54
b8a494d
7813428
 
a617aa5
 
 
 
 
 
 
 
 
 
438cee4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f68ca19
d6f6372
 
3be054e
 
f15458a
 
94817a4
 
 
5c8e40d
 
94817a4
5c8e40d
 
 
 
 
 
 
 
401e9a4
 
94817a4
b8a494d
57fbcc0
401e9a4
 
 
57fbcc0
401e9a4
438cee4
401e9a4
438cee4
401e9a4
 
 
 
8921965
94817a4
 
8921965
401e9a4
8921965
401e9a4
94817a4
 
 
f15458a
8921965
94817a4
 
 
401e9a4
 
8921965
401e9a4
69f487e
f87636f
 
8921965
8eba735
 
8a30239
0d06af3
f87636f
 
 
438cee4
f87636f
438cee4
 
 
 
 
a617aa5
438cee4
 
 
 
a617aa5
438cee4
 
a617aa5
438cee4
 
 
1b42eb5
8921965
82017d9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
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()