Spaces:
Sleeping
Sleeping
File size: 3,457 Bytes
5c8e40d 401e9a4 0d06af3 401e9a4 ca2d1b9 401e9a4 69f487e f87636f 8eba735 401e9a4 8eba735 82017d9 0d06af3 f87636f 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 |
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, historial):
respuesta_simple = respuesta_basica(pregunta)
if respuesta_simple:
return historial + [[pregunta, 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 + [[pregunta, respuesta]]
# --- Interfaz ---
gr.Interface(
fn=chat_biblioteca,
title="📚 BiblioBot",
description="¡Bienvenido a BiblioBot! Pregunta sobre libros, horarios o servicios de biblioteca.",
theme="soft", # Puedes cambiar a "base" o "default" si lo deseas más claro
examples=[
"¿Cuál es el horario de la biblioteca?",
"¿Puedo comer dentro de la biblioteca?",
"¿Qué pasa si pierdo un libro?",
"hola",
"gracias"
],
retry_btn="Reintentar",
clear_btn="Borrar historial",
).launch() |