Acelerando la generación de candidatos en sistemas de recomendación usando Milvus junto con PaddlePaddle
Si tienes experiencia desarrollando un sistema de recomendación, es probable que hayas sido víctima de al menos uno de los siguientes problemas:
- El sistema es extremadamente lento al devolver resultados debido a la enorme cantidad de conjuntos de datos.
- Los datos recién insertados no pueden procesarse en tiempo real para búsqueda o consulta.
- El despliegue del sistema de recomendación es desalentador.
Este artículo tiene como objetivo abordar los problemas mencionados anteriormente y proporcionarte algunas ideas mediante la presentación de un proyecto de sistema de recomendación de productos que utiliza Milvus, una base de datos vectorial de código abierto, junto con PaddlePaddle, una plataforma de aprendizaje profundo.
Este artículo se propone describir brevemente el flujo de trabajo mínimo de un sistema de recomendación. Luego pasa a presentar los componentes principales y los detalles de implementación de este proyecto.
El flujo de trabajo básico de un sistema de recomendación
Antes de profundizar en el proyecto en sí, primero echemos un vistazo al flujo de trabajo básico de un sistema de recomendación. Un sistema de recomendación puede devolver resultados personalizados de acuerdo con el interés y las necesidades únicas del usuario. Para hacer recomendaciones tan personalizadas, el sistema pasa por dos etapas, generación de candidatos y clasificación.
Figura 1.
La primera etapa es la generación de candidatos, que devuelve los datos más relevantes o similares, como un producto o un video que coincide con el perfil del usuario. Durante la generación de candidatos, el sistema compara el rasgo del usuario con los datos almacenados en su base de datos y recupera aquellos similares. Luego, durante la clasificación, el sistema puntúa y reordena los datos recuperados. Finalmente, aquellos resultados en la parte superior de la lista se muestran a los usuarios.
En nuestro caso de un sistema de recomendación de productos, primero compara el perfil del usuario con las características de los productos en inventario para filtrar una lista de productos que satisfacen las necesidades del usuario. Luego, el sistema puntúa los productos en función de su similitud con el perfil del usuario, los clasifica y finalmente devuelve los 10 productos principales al usuario.
Figura 2.
Arquitectura del sistema
El sistema de recomendación de productos de este proyecto utiliza tres componentes: MIND, PaddleRec y Milvus.
MIND
MIND, abreviatura de "Multi-Interest Network with Dynamic Routing for Recommendation at Tmall", es un algoritmo desarrollado por Alibaba Group. Antes de que se propusiera MIND, la mayoría de los modelos de IA predominantes para recomendación usaban un único vector para representar los variados intereses de un usuario. Sin embargo, un único vector está lejos de ser suficiente para representar los intereses exactos de un usuario. Por lo tanto, se propuso el algoritmo MIND para convertir los múltiples intereses de un usuario en varios vectores.
Específicamente, MIND adopta una red multiinterés con enrutamiento dinámico para procesar múltiples intereses de un usuario durante la etapa de generación de candidatos. La red multiinterés es una capa de extractor multiinterés construida sobre un mecanismo de enrutamiento de cápsulas. Puede utilizarse para combinar los comportamientos pasados de un usuario con sus múltiples intereses, con el fin de proporcionar un perfil de usuario preciso.
El siguiente diagrama ilustra la estructura de red de MIND.
Figura 3.
Para representar el rasgo de los usuarios, MIND toma los comportamientos del usuario y los intereses del usuario como entradas, y luego los introduce en la capa de embeddings para generar vectores de usuario, incluidos vectores de interés del usuario y vectores de comportamiento del usuario. Luego, los vectores de comportamiento del usuario se introducen en la capa del extractor multiinterés para generar cápsulas de interés de los usuarios. Después de concatenar las cápsulas de interés del usuario con los embeddings de comportamiento del usuario y usar varias capas ReLU para transformarlos, MIND genera varios vectores de representación del usuario. Este proyecto ha definido que MIND finalmente generará cuatro vectores de representación del usuario.
Por otro lado, los rasgos de los productos pasan por la capa de embedding y se convierten en vectores de ítems dispersos. Luego, cada vector de ítem pasa por una capa de pooling para convertirse en un vector denso.
Cuando todos los datos se convierten en vectores, se introduce una capa adicional de atención consciente de etiquetas para guiar el proceso de entrenamiento.
PaddleRec
PaddleRec es una biblioteca de modelos de búsqueda a gran escala para recomendación. Forma parte del ecosistema PaddlePaddle de Baidu. PaddleRec tiene como objetivo proporcionar a los desarrolladores una solución integrada para crear un sistema de recomendación de una manera fácil y rápida.
Figura 4.
Como se mencionó en el párrafo inicial, los ingenieros que desarrollan sistemas de recomendación a menudo tienen que enfrentarse a los desafíos de la escasa usabilidad y el despliegue complicado del sistema. Sin embargo, PaddleRec puede ayudar a los desarrolladores en los siguientes aspectos:
Facilidad de uso: PaddleRec es una biblioteca de código abierto que encapsula varios modelos populares en la industria, incluidos modelos para generación de candidatos, ranking, reranking, multitarea y más. Con PaddleRec, puedes probar al instante la efectividad del modelo y mejorar su eficiencia mediante iteración. PaddleRec te ofrece una forma sencilla de entrenar modelos para sistemas distribuidos con un rendimiento excelente. Está optimizado para el procesamiento de datos a gran escala de vectores dispersos. Puedes escalar PaddleRec horizontalmente con facilidad y acelerar su velocidad de cómputo. Por lo tanto, puedes crear rápidamente entornos de entrenamiento en Kubernetes usando PaddleRec.
Soporte para despliegue: PaddleRec proporciona soluciones de despliegue en línea para sus modelos. Los modelos están listos para usarse inmediatamente después del entrenamiento, con flexibilidad y alta disponibilidad.
Milvus
Milvus es una base de datos vectorial que cuenta con una arquitectura cloud-native. Es de código abierto en GitHub y puede utilizarse para almacenar, indexar y gestionar vectores de embedding masivos generados por redes neuronales profundas y otros modelos de machine learning (ML). Milvus encapsula varias bibliotecas de búsqueda de vecinos más cercanos aproximados (ANN) de primer nivel, incluidas Faiss, NMSLIB y Annoy. También puedes escalar Milvus horizontalmente según tus necesidades. El servicio Milvus tiene alta disponibilidad y admite procesamiento unificado por lotes y en streaming. Milvus está comprometido con simplificar el proceso de gestión de datos no estructurados y proporcionar una experiencia de usuario consistente en diferentes entornos de despliegue. Tiene las siguientes características:
Alto rendimiento al realizar búsqueda vectorial en conjuntos de datos masivos.
Una comunidad centrada en los desarrolladores que ofrece soporte multilenguaje y cadena de herramientas.
Escalabilidad en la nube y alta fiabilidad incluso en caso de una interrupción.
Búsqueda híbrida lograda al combinar filtrado escalar con búsqueda por similitud vectorial.
Milvus se utiliza para la búsqueda por similitud vectorial y la gestión de vectores en este proyecto porque puede resolver el problema de las actualizaciones frecuentes de datos manteniendo al mismo tiempo la estabilidad del sistema.
Implementación del sistema
Para crear el sistema recomendador de productos en este proyecto, debes seguir los siguientes pasos:
- Procesamiento de datos
- Entrenamiento del modelo
- Pruebas del modelo
- Generación de candidatos de ítems de productos
- Almacenamiento de datos: los vectores de ítems se obtienen mediante el modelo entrenado y se almacenan en Milvus.
- Búsqueda de datos: cuatro vectores de usuario generados por MIND se introducen en Milvus para realizar una búsqueda por similitud vectorial.
- Ranking de datos: cada uno de los cuatro vectores tiene sus propios vectores de ítems similares
top_k, y cuatro conjuntos de vectorestop_kse ordenan para devolver una lista final de lostop_kvectores más similares.
El código fuente de este proyecto está alojado en la plataforma Baidu AI Studio. La siguiente sección es una explicación detallada del código fuente de este proyecto.
Paso 1. Procesamiento de datos
El conjunto de datos original proviene del conjunto de datos de libros de Amazon proporcionado por ComiRec. Sin embargo, este proyecto utiliza los datos que se descargan y procesan mediante PaddleRec. Consulta el conjunto de datos AmazonBook en el proyecto PaddleRec para obtener más información.
Se espera que el conjunto de datos para el entrenamiento aparezca en el siguiente formato, donde cada columna representa:
Uid: ID de usuario.item_id: ID del producto en el que el usuario ha hecho clic.Time: La marca de tiempo o el orden del clic.
Se espera que el conjunto de datos para las pruebas aparezca en el siguiente formato, donde cada columna representa:
Uid: ID de usuario.hist_item: ID del producto en el comportamiento histórico de clics del usuario. Cuando hay varioshist_item, se ordenan según la marca de tiempo.eval_item: La secuencia real en la que el usuario hace clic en los productos.
Paso 2. Entrenamiento del modelo
El entrenamiento del modelo utiliza los datos procesados en el paso anterior y adopta el modelo de generación de candidatos, MIND, construido sobre PaddleRec.
1. Entrada del modelo
En dygraph_model.py, ejecuta el siguiente código para procesar los datos y convertirlos en entrada del modelo. Este proceso ordena los artículos en los que hizo clic el mismo usuario en los datos originales según la marca de tiempo, y los combina para formar una secuencia. Luego, selecciona aleatoriamente un item``_``id de la secuencia como el target_item, y extrae los 10 artículos anteriores a target_item como el hist_item para la entrada del modelo. Si la secuencia no es lo suficientemente larga, puede establecerse como 0. seq_len debe ser la longitud real de la secuencia hist_item.
def create_feeds_train(self, batch_data):
hist_item = paddle.to_tensor(batch_data[0], dtype="int64")
target_item = paddle.to_tensor(batch_data[1], dtype="int64")
seq_len = paddle.to_tensor(batch_data[2], dtype="int64")
return [hist_item, target_item, seq_len]
Consulta el script /home/aistudio/recommend/model/mind/mind_reader.py para el código de lectura del conjunto de datos original.
2. Red del modelo
El siguiente código es un extracto de net.py. class Mind_Capsual_Layer define la capa extractora de múltiples intereses construida sobre el mecanismo de enrutamiento por cápsulas de interés. La función label_aware_attention() implementa la técnica de atención consciente de la etiqueta en el algoritmo MIND. La función forward() en la class MindLayer modela las características del usuario y genera los vectores de peso correspondientes.
class Mind_Capsual_Layer(nn.Layer):
def __init__(self):
super(Mind_Capsual_Layer, self).__init__()
self.iters = iters
self.input_units = input_units
self.output_units = output_units
self.maxlen = maxlen
self.init_std = init_std
self.k_max = k_max
self.batch_size = batch_size
# B2I routing
self.routing_logits = self.create_parameter(
shape=[1, self.k_max, self.maxlen],
attr=paddle.ParamAttr(
name="routing_logits", trainable=False),
default_initializer=nn.initializer.Normal(
mean=0.0, std=self.init_std))
# bilinear mapping
self.bilinear_mapping_matrix = self.create_parameter(
shape=[self.input_units, self.output_units],
attr=paddle.ParamAttr(
name="bilinear_mapping_matrix", trainable=True),
default_initializer=nn.initializer.Normal(
mean=0.0, std=self.init_std))
class MindLayer(nn.Layer):
def label_aware_attention(self, keys, query):
weight = paddle.sum(keys * query, axis=-1, keepdim=True)
weight = paddle.pow(weight, self.pow_p) # [x,k_max,1]
weight = F.softmax(weight, axis=1)
output = paddle.sum(keys * weight, axis=1)
return output, weight
def forward(self, hist_item, seqlen, labels=None):
hit_item_emb = self.item_emb(hist_item) # [B, seqlen, embed_dim]
user_cap, cap_weights, cap_mask = self.capsual_layer(hit_item_emb, seqlen)
if not self.training:
return user_cap, cap_weights
target_emb = self.item_emb(labels)
user_emb, W = self.label_aware_attention(user_cap, target_emb)
return self.sampled_softmax(
user_emb, labels, self.item_emb.weight,
self.embedding_bias), W, user_cap, cap_weights, cap_mask
Consulta el script /home/aistudio/recommend/model/mind/net.py para la estructura de red específica de MIND.
3. Optimización del modelo
Este proyecto utiliza el algoritmo Adam como optimizador del modelo.
def create_optimizer(self, dy_model, config):
lr = config.get("hyper_parameters.optimizer.learning_rate", 0.001)
optimizer = paddle.optimizer.Adam(
learning_rate=lr, parameters=dy_model.parameters())
return optimizer
Además, PaddleRec escribe los hiperparámetros en config.yaml, por lo que solo necesitas modificar este archivo para ver una comparación clara entre la efectividad de los dos modelos para mejorar la eficiencia del modelo. Al entrenar el modelo, el efecto deficiente del modelo puede deberse a subajuste o sobreajuste del modelo. Por lo tanto, puedes mejorarlo modificando el número de rondas de entrenamiento. En este proyecto, solo necesitas cambiar el parámetro epochs en config.yaml para encontrar el número perfecto de rondas de entrenamiento. Además, también puedes cambiar el optimizador del modelo, optimizer.class,o learning_rate para la depuración. A continuación se muestra parte de los parámetros en config.yaml.
runner:
use_gpu: True
use_auc: False
train_batch_size: 128
epochs: 20
print_interval: 10
model_save_path: "output_model_mind"
# hyper parameters of user-defined network
hyper_parameters:
# optimizer config
optimizer:
class: Adam
learning_rate: 0.005
Consulta el script /home/aistudio/recommend/model/mind/dygraph_model.py para la implementación detallada.
4. Entrenamiento del modelo
Ejecuta el siguiente comando para iniciar el entrenamiento del modelo.
python -u trainer.py -m mind/config.yaml
Consulta /home/aistudio/recommend/model/trainer.py para el proyecto de entrenamiento del modelo.
Paso 3. Prueba del modelo
Este paso utiliza el conjunto de datos de prueba para verificar el rendimiento, como la tasa de recuperación del modelo entrenado.
Durante la prueba del modelo, todos los vectores de ítems se cargan desde el modelo y luego se importan a Milvus, la base de datos vectorial de código abierto. Lee el conjunto de datos de prueba mediante el script /home/aistudio/recommend/model/mind/mind_infer_reader.py. Carga el modelo del paso anterior y proporciona el conjunto de datos de prueba al modelo para obtener cuatro vectores de interés del usuario. Busca en Milvus los 50 vectores de ítems más similares a los cuatro vectores de interés. Puedes recomendar los resultados devueltos a los usuarios.
Ejecuta el siguiente comando para probar el modelo.
python -u infer.py -m mind/config.yaml -top_n 50
Durante la prueba del modelo, el sistema proporciona varios indicadores para evaluar la efectividad del modelo, como Recall@50, NDCG@50 y HitRate@50. Este artículo solo presenta la modificación de un parámetro. Sin embargo, en tu propio escenario de aplicación, necesitas entrenar más epochs para lograr un mejor efecto del modelo. También puedes mejorar la efectividad del modelo usando diferentes optimizadores, estableciendo diferentes tasas de aprendizaje y aumentando el número de rondas de prueba. Se recomienda que guardes varios modelos con diferentes efectos y luego elijas el que tenga el mejor rendimiento y se ajuste mejor a tu aplicación.
Paso 4. Generación de candidatos de ítems de producto
Para crear el servicio de generación de candidatos de producto, este proyecto utiliza el modelo entrenado en los pasos anteriores, junto con Milvus. Durante la generación de candidatos, se utiliza FASTAPI para proporcionar la interfaz. Cuando el servicio se inicia, puedes ejecutar comandos directamente en la terminal mediante curl.
Ejecute el siguiente comando para generar candidatos preliminares.
uvicorn main:app
El servicio proporciona cuatro tipos de interfaces:
- Insertar : Ejecute el siguiente comando para leer los vectores de elementos desde su modelo e insertarlos en una colección en Milvus.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/insert_data' \
-H 'accept: application/json' \
-d ''
- Generar candidatos preliminares: Introduzca la secuencia en la que el usuario hace clic en los productos y averigüe el siguiente producto en el que el usuario podría hacer clic. También puede generar candidatos de elementos de producto por lotes para varios usuarios de una sola vez.
hist_itemen el siguiente comando es un vector bidimensional, y cada fila representa una secuencia de los productos en los que el usuario ha hecho clic en el pasado. Puede definir la longitud de la secuencia. Los resultados devueltos también son conjuntos de vectores bidimensionales, cada fila representa lositem ids devueltos para los usuarios.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/recall' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"top_k": 50,
"hist_item": [[43,23,65,675,3456,8654,123454,54367,234561],[675,3456,8654,123454,76543,1234,9769,5670,65443,123098,34219,234098]]
}'
- Consultar el número total de elementos de producto: Ejecute el siguiente comando para devolver el número total de vectores de elementos almacenados en la base de datos Milvus.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/count' \
-H 'accept: application/json' \
-d ''
- Eliminar: Ejecute el siguiente comando para eliminar todos los datos almacenados en la base de datos Milvus .
curl -X 'POST' \
'http://127.0.0.1:8000/qa/drop' \
-H 'accept: application/json' \
-d ''
Si ejecuta el servicio de generación de candidatos en su servidor local, también puede acceder a las interfaces anteriores en 127.0.0.1:8000/docs. Puede probar haciendo clic en las cuatro interfaces e introduciendo el valor de los parámetros. Luego haga clic en "Pruébalo" para obtener el resultado de recomendación.
Figura 5.
Figura 6.
Resumen
Este artículo se centra principalmente en la primera etapa de generación de candidatos al construir un sistema de recomendación. También proporciona una solución para acelerar este proceso combinando Milvus con el algoritmo MIND y PaddleRec y, por lo tanto, ha abordado el problema planteado en el párrafo inicial.
¿Qué pasa si el sistema es extremadamente lento al devolver resultados debido a la enorme cantidad de conjuntos de datos? Milvus, la base de datos vectorial de código abierto, está diseñada para búsquedas de similitud ultrarrápidas en conjuntos de datos de vectores densos que contienen millones, miles de millones o incluso billones de vectores.
¿Qué pasa si los datos recién insertados no pueden procesarse en tiempo real para búsquedas o consultas? Puede usar Milvus, ya que admite el procesamiento unificado por lotes y en streaming y le permite buscar y consultar datos recién insertados en tiempo real. Además, el modelo MIND es capaz de convertir el comportamiento de nuevos usuarios en tiempo real e insertar los vectores de usuario en Milvus instantáneamente.
¿Qué pasa si la implementación complicada resulta demasiado intimidante? PaddleRec, una potente biblioteca que pertenece al ecosistema PaddlePaddle, puede proporcionarle una solución integrada para implementar su sistema de recomendación u otras aplicaciones de una manera fácil y rápida.
Acerca de la autora
Yunmei Li, ingeniera de datos de Zilliz, se graduó de la Universidad de Ciencia y Tecnología de Huazhong con un título en ciencias de la computación. Desde que se unió a Zilliz, ha estado trabajando en la exploración de soluciones para el proyecto de código abierto Milvus y ayudando a los usuarios a aplicar Milvus en escenarios del mundo real. Su enfoque principal está en NLP y los sistemas de recomendación, y le gustaría profundizar aún más su enfoque en estas dos áreas. Le gusta pasar tiempo a solas y leer.
¿Busca más recursos?
- Más casos de usuarios de creación de un sistema de recomendación:
- Creación de un sistema de recomendación de productos personalizado con Vipshop con Milvus
- Creación de una aplicación de planificación de vestuario y conjuntos con Milvus
- Creación de un sistema inteligente de recomendación de noticias dentro de la aplicación Sohu News
- Filtrado colaborativo basado en elementos para un sistema de recomendación de música
- Creando con Milvus: recomendación de noticias impulsada por IA dentro del navegador móvil de Xiaomi
- Más proyectos de Milvus en colaboración con otras comunidades:
- Participa en nuestra comunidad de código abierto:
Sigue leyendo

How to Choose the Best Embedding Model for RAG in 2026: 10 Models Benchmarked
We benchmarked 10 embedding models on cross-modal, cross-lingual, long-document, and dimension compression tasks. See which one fits your RAG pipeline.

My Wife Wanted Dior. I Spent $600 on Claude Code to Vibe-Code a 2M-Line Database Instead.
Write tests, not code reviews. How a test-first workflow with 6 parallel Claude Code sessions turns a 2M-line C++ codebase into a daily shipping pipeline.

Milvus WebUI: A Visual Management Tool for Your Vector Database
Explore Milvus WebUI to monitor, manage, and optimize your vector database with real-time insights, performance tracking, and system health monitoring.



