Mejorando los Resultados de Búsqueda con Embeddings Vectoriales y Redis
La capacidad de buscar información es crucial en el panorama digital actual, ya que los usuarios esperan funcionalidades de búsqueda en casi todas las aplicaciones y sitios web. Para arquitectos y desarrolladores, es imperativo explorar continuamente nuevos métodos y arquitecturas para mejorar los resultados de búsqueda. Un enfoque efectivo es la utilización de embeddings vectoriales generados por modelos de aprendizaje profundo, que mejoran considerablemente la precisión y relevancia de los resultados de búsqueda.
Entendiendo los Embeddings Vectoriales y Redis
Para mejorar la funcionalidad de búsqueda, muchas organizaciones están aprovechando técnicas de indexación que transforman sus datos en un espacio vectorial. Al representar los datos como vectores, se pueden realizar búsquedas de similitud para devolver los resultados más relevantes.
En este tutorial integral, profundizaremos en cómo los modelos de aprendizaje profundo crean embeddings vectoriales, indexados de manera eficiente para capacidades de búsqueda precisas con Redis. Al comprender este enfoque, arquitectos y desarrolladores pueden aprovechar el potencial de las mejoras impulsadas por inteligencia artificial para la experiencia de búsqueda del usuario.
Alcance de Este Tutorial
En este tutorial, cubriremos los siguientes pasos clave:
- Creación de embeddings vectoriales para un conjunto de datos de productos de Amazon
- Indexación de estos embeddings con Redis
- Realización de búsquedas de vectores similares
Adicionalmente, analizaremos los pros y los contras de varios métodos de indexación y cómo pueden optimizar el rendimiento de búsqueda.
Comenzando
Comienza creando un nuevo directorio y lanzando un notebook de Jupyter. Adquiere el archivo CSV del conjunto de datos de una fuente en línea y guárdalo en el directorio ./data/
. Asegúrate de estar utilizando Python 3.8 e instala las dependencias requeridas en la primera celda:
pip install redis pandas sentence-transformers
Importando Bibliotecas Necesarias
Después de configurar las dependencias, el siguiente paso es importar las bibliotecas necesarias y definir las clases o funciones esenciales. En este caso, importarás:
- Biblioteca Redis - Para interactuar con Redis, conocida por su velocidad y flexibilidad.
- VectorField - Representa campos vectoriales en Redis.
- TextField - Representa campos de texto en Redis.
- TagField - Representa campos de etiquetas en Redis.
- Query - Crea consultas de búsqueda para Redis.
- Result - Maneja los resultados de búsqueda devueltos por Redis.
También, definimos una clase de color simple que puede usarse para imprimir texto en color en la consola.
Cargando Datos de Productos
El siguiente paso implica cargar datos de productos de Amazon en un DataFrame de Pandas mientras truncamos los campos de texto largos a un máximo de 512 caracteres. Este límite admite el modelo SentenceTransformer preentrenado. Aquí tienes un fragmento de código de muestra para ejecutar esto:
import pandas as pd
df = pd.read_csv('./data/amazon_products.csv')
df['product_description'] = df['product_description'].str.slice(0, 512)
df = df.dropna(subset=['keywords'])
Conectando a Redis
Después de cargar con éxito los datos del producto en el DataFrame y filtrar los elementos relevantes, conéctate a Redis registrándote para una instancia gratuita a través de RedisLabs:
- Inicia una nueva instancia de Redis.
- Copia los detalles de conexión y asegúrate de tener la contraseña de tu instancia de Redis.
Generando Embeddings Usando SentenceTransformer
A continuación, generaremos embeddings (vectores) para las palabras clave del artículo utilizando el modelo de Sentence Transformer distilroberta-v1 preentrenado. A continuación se muestra un ejemplo de código para configurar:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('distilroberta-v1')
embeddings = model.encode(df['keywords'].tolist())
Funciones Utilitarias para Indexación
Ahora que poseemos embeddings para nuestros productos, definiremos funciones utilitarias para agilizar el proceso de carga de datos y creación de índices en campos vectoriales:
def load_data():
... # lógica de carga aquí
def create_index():
... # lógica de creación de índice aquí
Comparando Métodos de Indexación
Exploraremos dos métodos de indexación: Indexación plana e HNSW (Mundo Pequeño Navegable Jerárquico). Cada uno tiene ventajas y desventajas únicas en términos de rendimiento:
- Indexación Plana: Simple pero computacionalmente cara para conjuntos de datos grandes.
- Indexación HNSW: Eficiente con buena escalabilidad, aprovechando una estructura de gráfico compleja para búsquedas rápidas.
Indexando y Consultando los Datos
Primero cargaremos e indexaremos los datos de productos utilizando indexación plana, seguido de la consulta de los cinco vecinos más cercanos:
query_vector = ... # define tu vector de consulta aquí
result = redis_db.query(Query.Similarity(query_vector)).limit(5)
Consultando Usando HNSW
Ahora, después de cargar e indexar los datos del producto con HNSW, la consulta se puede ejecutar de manera similar:
result_hnsw = redis_db.query(Query.Similarity(query_vector)).limit(5)
Conclusión
Con el uso de embeddings vectoriales y Redis, las organizaciones pueden mejorar significativamente las experiencias de búsqueda para sus usuarios. Este tutorial ha ilustrado el proceso de creación e indexación de embeddings vectoriales para un conjunto de datos de productos de Amazon y las ventajas de cada método de indexación.
Para el código completo y más información, recomendamos consultar el repositorio de GitHub para obtener más información.
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.