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