Mejorando los Resultados de Búsqueda con Embeddings de Vectores y Redis
En el panorama digital actual, la capacidad de buscar información es más crítica que nunca. Los usuarios anticipan funcionalidades de búsqueda robustas en casi todas las aplicaciones y sitios web que encuentran. Para elevar la calidad de los resultados de búsqueda, arquitectos y desarrolladores buscan continuamente métodos y arquitecturas innovadoras. Un enfoque prometedor es la utilización de embeddings de vectores generados por modelos de aprendizaje profundo, que mejoran significativamente tanto la precisión como la relevancia de los resultados de búsqueda.
Comprendiendo los Embeddings de Vectores
Muchas organizaciones están aprovechando técnicas de indexación sofisticadas para transformar sus datos en espacio vectorial. Al representar los datos como vectores, se hace posible ejecutar búsquedas de similitud que generan los resultados más pertinentes. Este artículo profundizará en el proceso de creación de embeddings de vectores y su indexación utilizando Redis, un poderoso almacén de estructuras de datos en memoria.
Objetivos de Este Tutorial
- Generar embeddings de vectores para un conjunto de datos de productos de Amazon.
- Indexar estos embeddings utilizando Redis.
- Realizar búsquedas de vectores similares.
- Evaluar las ventajas y desventajas de varios métodos de indexación para mejorar el rendimiento de búsqueda.
Comenzando
Para comenzar, crea un nuevo directorio y crea un cuaderno de Jupyter. Recupera el conjunto de datos de productos de Amazon en formato CSV de la fuente correspondiente y guárdalo en el directorio ./data/
. Asegúrate de utilizar la versión 3.8 de Python e instala las siguientes dependencias en la primera celda del cuaderno:
pip install redis pandas sentence-transformers
Cargando Datos en un DataFrame de Pandas
Una vez que hayas instalado las dependencias necesarias, el siguiente paso es importar las bibliotecas y definir las clases y funciones requeridas. En este paso, se importará la biblioteca Redis para conectarse con Redis, que servirá como nuestra base de datos para el almacenamiento de vectores. También incorporarás clases de los módulos redis.commands.search.field
y redis.commands.search.query
, que incluyen:
- VectorField: Representa campos de vectores en Redis.
- TextField: Representa campos de texto en Redis.
- TagField: Representa campos de etiquetas en Redis.
- Query: Usado para formular consultas de búsqueda.
- Result: Representa resultados de búsqueda.
Luego, cargarás los datos de productos de Amazon en un DataFrame de Pandas, truncando los campos de texto extensos a un máximo de 512 caracteres. Esta longitud se adhiere a las especificaciones del generador de embeddings de oraciones preentrenado.
Conectándose a Redis
Después de cargar los datos del producto, conéctate a una instancia de Redis. Puedes utilizar un nivel gratuito de RedisLabs; regístrate para obtener una cuenta gratuita en redis.com/try-free/. Configura una nueva instancia de Redis y anota los detalles de conexión, ya que necesitarás la contraseña para iniciar sesión.
Creando Embeddings con SentenceTransformer
Con tus datos cargados, ahora estás listo para crear embeddings. Usando la biblioteca SentenceTransformer, carga el modelo preentrenado distilroberta-v1 para generar embeddings:
model = SentenceTransformer('distilroberta-v1')
embeddings = model.encode(product_keywords)
Después de generar los embeddings, asegúrate de verificar sus dimensiones para confirmar que se crearon correctamente.
Preparando Funciones Utilitarias
A continuación, define tres funciones utilitarias para cargar datos de productos y crear índices en campos de vectores.
Comparación de Métodos de Indexación
Dos métodos prevalentes para la búsqueda de vecinos más cercanos aproximados en espacios de alta dimensión son la indexación plana y HNSW (Pequeño Mundo Navegable Jerárquico). Mientras que la indexación plana proporciona un enfoque directo, depender de una búsqueda de fuerza bruta puede ser computacionalmente pesado con grandes conjuntos de datos. Por otro lado, HNSW utiliza una estructura de grafo jerárquico, ofreciendo una escalabilidad superior y capacidades de búsqueda más rápidas, pero requiere un ajuste más cuidadoso de los parámetros.
Indexando y Consultando los Datos
Inicialmente, carga e indexa los datos del producto utilizando indexación plana:
index_flat = redis_client.index.create_index([(VectorField('embedding'), 'FLOAT32')])
Posteriormente, consulta el índice plano para encontrar los 5 vecinos más cercanos basados en un vector dado:
results_flat = redis_client.query(Query('(@vector:[*])=>[KNN 5 @embedding $vec]'), query_vec=query_vector)
Ahora, replica el proceso con indexación HNSW:
index_hnsw = redis_client.index.create_index([(VectorField('embedding_hnsw'), 'FLOAT32')], method='HNSW')
Conclusión: Aprendiendo Más
Este tutorial ha esbozado los pasos necesarios para mejorar los resultados de búsqueda a través de embeddings de vectores y Redis. Para ver el código completo y detalles adicionales, visita nuestro repositorio de GitHub. ¡Aprovecha el poder de la búsqueda impulsada por IA y optimiza la experiencia para los usuarios!
Dejar un comentario
Todos los comentarios se revisan antes de su publicación.
Este sitio está protegido por hCaptcha y se aplican la Política de privacidad de hCaptcha y los Términos del servicio.