Acelerando a Geração de Candidatos em Sistemas de Recomendação Usando Milvus em conjunto com PaddlePaddle
Se você tem experiência no desenvolvimento de um sistema de recomendação, é provável que tenha sido vítima de pelo menos um dos seguintes:
- O sistema é extremamente lento ao retornar resultados devido à enorme quantidade de conjuntos de dados.
- Dados recém-inseridos não podem ser processados em tempo real para busca ou consulta.
- A implantação do sistema de recomendação é intimidadora.
Este artigo tem como objetivo abordar os problemas mencionados acima e fornecer alguns insights apresentando um projeto de sistema de recomendação de produtos que usa Milvus, um banco de dados vetorial open-source, combinado com PaddlePaddle, uma plataforma de deep learning.
Este artigo se propõe a descrever brevemente o fluxo de trabalho mínimo de um sistema de recomendação. Em seguida, passa a apresentar os principais componentes e os detalhes de implementação deste projeto.
O fluxo de trabalho básico de um sistema de recomendação
Antes de nos aprofundarmos no projeto em si, vamos primeiro dar uma olhada no fluxo de trabalho básico de um sistema de recomendação. Um sistema de recomendação pode retornar resultados personalizados de acordo com interesses e necessidades únicos do usuário. Para fazer essas recomendações personalizadas, o sistema passa por duas etapas, geração de candidatos e ranqueamento.
Figura 1.
A primeira etapa é a geração de candidatos, que retorna os dados mais relevantes ou semelhantes, como um produto ou um vídeo que corresponde ao perfil do usuário. Durante a geração de candidatos, o sistema compara a característica do usuário com os dados armazenados em seu banco de dados e recupera aqueles semelhantes. Então, durante o ranqueamento, o sistema pontua e reordena os dados recuperados. Finalmente, aqueles resultados no topo da lista são mostrados aos usuários.
No nosso caso de um sistema de recomendação de produtos, ele primeiro compara o perfil do usuário com as características dos produtos em estoque para filtrar uma lista de produtos que atendem às necessidades do usuário. Então o sistema pontua os produtos com base em sua similaridade com o perfil do usuário, ranqueia-os e, finalmente, retorna os 10 principais produtos ao usuário.
Figura 2.
Arquitetura do sistema
O sistema de recomendação de produtos neste projeto usa três componentes: MIND, PaddleRec e Milvus.
MIND
MIND, abreviação de "Multi-Interest Network with Dynamic Routing for Recommendation at Tmall", é um algoritmo desenvolvido pelo Alibaba Group. Antes de o MIND ser proposto, a maioria dos modelos de IA predominantes para recomendação usava um único vetor para representar os interesses variados de um usuário. No entanto, um único vetor está longe de ser suficiente para representar os interesses exatos de um usuário. Portanto, o algoritmo MIND foi proposto para transformar os múltiplos interesses de um usuário em vários vetores.
Especificamente, o MIND adota uma rede multi-interesse com roteamento dinâmico para processar múltiplos interesses de um usuário durante a etapa de geração de candidatos. A rede multi-interesse é uma camada de extrator multi-interesse construída sobre um mecanismo de roteamento por cápsulas. Ela pode ser usada para combinar os comportamentos passados de um usuário com seus múltiplos interesses, a fim de fornecer um perfil de usuário preciso.
O diagrama a seguir ilustra a estrutura de rede do MIND.
Figura 3.
Para representar a característica dos usuários, o MIND recebe comportamentos do usuário e interesses do usuário como entradas e, em seguida, os alimenta na camada de embedding para gerar vetores de usuário, incluindo vetores de interesse do usuário e vetores de comportamento do usuário. Então, os vetores de comportamento do usuário são alimentados na camada extratora multi-interesse para gerar cápsulas de interesse dos usuários. Após concatenar as cápsulas de interesse do usuário com embeddings de comportamento do usuário e usar várias camadas ReLU para transformá-las, o MIND produz vários vetores de representação do usuário. Este projeto definiu que o MIND, em última análise, produzirá quatro vetores de representação do usuário.
Por outro lado, os atributos dos produtos passam pela camada de embedding e são convertidos em vetores esparsos de itens. Em seguida, cada vetor de item passa por uma camada de pooling para se tornar um vetor denso.
Quando todos os dados são convertidos em vetores, uma camada adicional de atenção sensível a rótulos é introduzida para orientar o processo de treinamento.
PaddleRec
PaddleRec é uma biblioteca de modelos de busca em larga escala para recomendação. Ela faz parte do ecossistema PaddlePaddle da Baidu. O PaddleRec tem como objetivo fornecer aos desenvolvedores uma solução integrada para criar um sistema de recomendação de forma fácil e rápida.
Figura 4.
Como mencionado no parágrafo inicial, engenheiros que desenvolvem sistemas de recomendação frequentemente precisam enfrentar os desafios de baixa usabilidade e implantação complicada do sistema. No entanto, o PaddleRec pode ajudar os desenvolvedores nos seguintes aspectos:
Facilidade de uso: o PaddleRec é uma biblioteca de código aberto que encapsula vários modelos populares no setor, incluindo modelos para geração de candidatos, classificação, reclassificação, multitarefas e mais. Com o PaddleRec, você pode testar instantaneamente a eficácia do modelo e melhorar sua eficiência por meio de iteração. O PaddleRec oferece uma maneira fácil de treinar modelos para sistemas distribuídos com excelente desempenho. Ele é otimizado para o processamento de dados em larga escala de vetores esparsos. Você pode escalar facilmente o PaddleRec horizontalmente e acelerar sua velocidade de computação. Portanto, você pode criar rapidamente ambientes de treinamento no Kubernetes usando o PaddleRec.
Suporte à implantação: o PaddleRec fornece soluções de implantação online para seus modelos. Os modelos ficam imediatamente prontos para uso após o treinamento, oferecendo flexibilidade e alta disponibilidade.
Milvus
Milvus é um banco de dados vetorial com uma arquitetura nativa da nuvem. Ele é de código aberto no GitHub e pode ser usado para armazenar, indexar e gerenciar vetores de embedding massivos gerados por redes neurais profundas e outros modelos de aprendizado de máquina (ML). O Milvus encapsula várias bibliotecas de busca aproximada de vizinhos mais próximos (ANN) de primeira classe, incluindo Faiss, NMSLIB e Annoy. Você também pode escalar o Milvus horizontalmente de acordo com sua necessidade. O serviço Milvus é altamente disponível e oferece suporte a processamento unificado em lote e em fluxo. O Milvus está comprometido em simplificar o processo de gerenciamento de dados não estruturados e em fornecer uma experiência de usuário consistente em diferentes ambientes de implantação. Ele tem os seguintes recursos:
Alto desempenho ao realizar busca vetorial em conjuntos de dados massivos.
Uma comunidade voltada para desenvolvedores que oferece suporte multilíngue e cadeia de ferramentas.
Escalabilidade em nuvem e alta confiabilidade mesmo em caso de interrupção.
Busca híbrida alcançada ao combinar filtragem escalar com busca por similaridade vetorial.
O Milvus é usado para busca por similaridade vetorial e gerenciamento de vetores neste projeto porque pode resolver o problema de atualizações frequentes de dados enquanto mantém a estabilidade do sistema.
Implementação do sistema
Para criar o sistema de recomendação de produtos neste projeto, você precisa seguir as seguintes etapas:
- Processamento de dados
- Treinamento do modelo
- Teste do modelo
- Geração de candidatos de itens de produto
- Armazenamento de dados: vetores de itens são obtidos por meio do modelo treinado e armazenados no Milvus.
- Busca de dados: quatro vetores de usuário gerados pelo MIND são inseridos no Milvus para busca por similaridade vetorial.
- Classificação de dados: cada um dos quatro vetores tem seus próprios vetores de itens semelhantes
top_k, e quatro conjuntos de vetorestop_ksão classificados para retornar uma lista final dostop_kvetores mais semelhantes.
O código-fonte deste projeto está hospedado na plataforma Baidu AI Studio. A seção a seguir é uma explicação detalhada do código-fonte deste projeto.
Etapa 1. Processamento de dados
O conjunto de dados original vem do conjunto de dados de livros da Amazon fornecido pelo ComiRec. No entanto, este projeto usa os dados que são baixados e processados pelo PaddleRec. Consulte o conjunto de dados AmazonBook no projeto PaddleRec para obter mais informações.
Espera-se que o conjunto de dados para treinamento apareça no seguinte formato, com cada coluna representando:
Uid: ID do usuário.item_id: ID do item do produto que foi clicado pelo usuário.Time: O carimbo de data/hora ou a ordem do clique.
Espera-se que o conjunto de dados para teste apareça no seguinte formato, com cada coluna representando:
Uid: ID do usuário.hist_item: ID do item do produto no comportamento histórico de cliques do usuário. Quando há várioshist_item, eles são ordenados de acordo com o carimbo de data/hora.eval_item: A sequência real em que o usuário clica nos produtos.
Etapa 2. Treinamento do modelo
O treinamento do modelo usa os dados processados na etapa anterior e adota o modelo de geração de candidatos, MIND, construído sobre o PaddleRec.
1. Entrada do modelo
Em dygraph_model.py, execute o código a seguir para processar os dados e transformá-los em entrada do modelo. Esse processo ordena os itens clicados pelo mesmo usuário nos dados originais de acordo com o carimbo de data/hora e os combina para formar uma sequência. Em seguida, selecione aleatoriamente um item``_``id da sequência como o target_item e extraia os 10 itens antes de target_item como o hist_item para a entrada do modelo. Se a sequência não for longa o suficiente, ela pode ser definida como 0. seq_len deve ser o comprimento real da sequência 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]
Consulte o script /home/aistudio/recommend/model/mind/mind_reader.py para o código de leitura do conjunto de dados original.
2. Rede do modelo
O código a seguir é um trecho de net.py. class Mind_Capsual_Layer define a camada extratora de múltiplos interesses construída sobre o mecanismo de roteamento de cápsulas de interesse. A função label_aware_attention() implementa a técnica de atenção ciente do rótulo no algoritmo MIND. A função forward() em class MindLayer modela as características do usuário e gera os vetores de peso correspondentes.
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
Consulte o script /home/aistudio/recommend/model/mind/net.py para a estrutura de rede específica do MIND.
3. Otimização do modelo
Este projeto usa o algoritmo Adam como otimizador do 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
Além disso, o PaddleRec escreve hiperparâmetros em config.yaml, portanto você só precisa modificar este arquivo para ver uma comparação clara entre a eficácia dos dois modelos para melhorar a eficiência do modelo. Ao treinar o modelo, o efeito ruim do modelo pode resultar de subajuste ou sobreajuste do modelo. Portanto, você pode melhorá-lo modificando o número de rodadas de treinamento. Neste projeto, você só precisa alterar o parâmetro epochs em config.yaml para encontrar o número perfeito de rodadas de treinamento. Além disso, você também pode alterar o otimizador do modelo, optimizer.class,ou learning_rate para depuração. A seguir é mostrada parte dos parâmetros em 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
Consulte o script /home/aistudio/recommend/model/mind/dygraph_model.py para a implementação detalhada.
4. Treinamento do modelo
Execute o seguinte comando para iniciar o treinamento do modelo.
python -u trainer.py -m mind/config.yaml
Consulte /home/aistudio/recommend/model/trainer.py para o projeto de treinamento do modelo.
Etapa 3. Teste do modelo
Esta etapa usa o conjunto de dados de teste para verificar o desempenho, como a taxa de recall do modelo treinado.
Durante o teste do modelo, todos os vetores de itens são carregados a partir do modelo e, em seguida, importados para o Milvus, o banco de dados vetorial de código aberto. Leia o conjunto de dados de teste por meio do script /home/aistudio/recommend/model/mind/mind_infer_reader.py. Carregue o modelo da etapa anterior e alimente o conjunto de dados de teste no modelo para obter quatro vetores de interesse do usuário. Pesquise no Milvus os 50 vetores de itens mais semelhantes aos quatro vetores de interesse. Você pode recomendar os resultados retornados aos usuários.
Execute o seguinte comando para testar o modelo.
python -u infer.py -m mind/config.yaml -top_n 50
Durante o teste do modelo, o sistema fornece vários indicadores para avaliar a eficácia do modelo, como Recall@50, NDCG@50 e HitRate@50. Este artigo apresenta apenas a modificação de um parâmetro. No entanto, no seu próprio cenário de aplicação, você precisa treinar mais epochs para obter um melhor efeito do modelo. Você também pode melhorar a eficácia do modelo usando diferentes otimizadores, definindo diferentes taxas de aprendizado e aumentando o número de rodadas de teste. Recomenda-se que você salve vários modelos com diferentes efeitos e, em seguida, escolha aquele com o melhor desempenho e que melhor se adapte à sua aplicação.
Etapa 4. Geração de candidatos a itens de produto
Para criar o serviço de geração de candidatos de produto, este projeto usa o modelo treinado nas etapas anteriores, combinado com o Milvus. Durante a geração de candidatos, o FASTAPI é usado para fornecer a interface. Quando o serviço é iniciado, você pode executar comandos diretamente no terminal via curl.
Execute o seguinte comando para gerar candidatos preliminares.
uvicorn main:app
O serviço fornece quatro tipos de interfaces:
- Insert : Execute o seguinte comando para ler os vetores de itens do seu modelo e inseri-los em uma coleção no Milvus.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/insert_data' \
-H 'accept: application/json' \
-d ''
- Generate preliminary candidates: Insira a sequência em que os produtos são clicados pelo usuário e descubra o próximo produto em que o usuário pode clicar. Você também pode gerar candidatos de itens de produto em lotes para vários usuários de uma só vez.
hist_itemno comando a seguir é um vetor bidimensional, e cada linha representa uma sequência dos produtos em que o usuário clicou no passado. Você pode definir o comprimento da sequência. Os resultados retornados também são conjuntos de vetores bidimensionais, cada linha representando ositem ids retornados para usuários.
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 o número total de itens de produto: Execute o seguinte comando para retornar o número total de vetores de itens armazenados no banco de dados Milvus.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/count' \
-H 'accept: application/json' \
-d ''
- Delete: Execute o seguinte comando para excluir todos os dados armazenados no banco de dados Milvus .
curl -X 'POST' \
'http://127.0.0.1:8000/qa/drop' \
-H 'accept: application/json' \
-d ''
Se você executar o serviço de geração de candidatos em seu servidor local, também poderá acessar as interfaces acima em 127.0.0.1:8000/docs. Você pode experimentar clicando nas quatro interfaces e inserindo o valor dos parâmetros. Em seguida, clique em "Try it out" para obter o resultado da recomendação.
Figura 5.
Figura 6.
Recapitulação
Este artigo concentra-se principalmente na primeira etapa da geração de candidatos na construção de um sistema de recomendação. Ele também fornece uma solução para acelerar esse processo combinando o Milvus com o algoritmo MIND e o PaddleRec e, portanto, abordou a questão proposta no parágrafo inicial.
E se o sistema for extremamente lento ao retornar resultados devido à enorme quantidade de conjuntos de dados? O Milvus, o banco de dados vetorial de código aberto, foi projetado para busca por similaridade extremamente rápida em conjuntos de dados de vetores densos contendo milhões, bilhões ou até trilhões de vetores.
E se os dados recém-inseridos não puderem ser processados em tempo real para busca ou consulta? Você pode usar o Milvus, pois ele oferece suporte ao processamento unificado em lote e em fluxo e permite que você busque e consulte dados recém-inseridos em tempo real. Além disso, o modelo MIND é capaz de converter o novo comportamento do usuário em tempo real e inserir os vetores de usuário no Milvus instantaneamente.
E se a implantação complicada for intimidadora demais? O PaddleRec, uma biblioteca poderosa que pertence ao ecossistema PaddlePaddle, pode fornecer a você uma solução integrada para implantar seu sistema de recomendação ou outras aplicações de forma fácil e rápida.
Sobre a autora
Yunmei Li, Engenheira de Dados da Zilliz, formou-se pela Huazhong University of Science and Technology em ciência da computação. Desde que ingressou na Zilliz, ela tem trabalhado na exploração de soluções para o projeto de código aberto Milvus e ajudado usuários a aplicar o Milvus em cenários do mundo real. Seu foco principal é em NLP e sistemas de recomendação, e ela gostaria de aprofundar ainda mais seu foco nessas duas áreas. Ela gosta de passar tempo sozinha e ler.
Procurando mais recursos?
- Mais casos de usuários de criação de um sistema de recomendação:
- Criando um Sistema de Recomendação de Produtos Personalizado com Vipshop e Milvus
- Criando um Aplicativo de Planejamento de Guarda-roupa e Looks com Milvus
- Criando um Sistema Inteligente de Recomendação de Notícias Dentro do Aplicativo Sohu News
- Filtragem Colaborativa Baseada em Itens para Sistema de Recomendação de Música
- Criando com Milvus: Recomendação de Notícias com IA Dentro do Navegador Móvel da Xiaomi
- Mais projetos Milvus em colaboração com outras comunidades:
- Interaja com nossa comunidade de código aberto:
Continue lendo

Zilliz Cloud BYOC Now Available Across AWS, GCP, and Azure
Zilliz Cloud BYOC is now generally available on all three major clouds. Deploy fully managed vector search in your own AWS, GCP, or Azure account — your data never leaves your VPC.

Zilliz Cloud Update: Smarter Autoscaling for Cost Savings, Stronger Compliance with Audit Logs, and More
What's new in Zilliz Cloud? Smarter autoscaling with scale-down, audit logs GA, enhanced SSO, and Milvus 2.6 in Private Preview.

Optimizing Embedding Model Selection with TDA Clustering: A Strategic Guide for Vector Databases
Discover how Topological Data Analysis (TDA) reveals hidden embedding model weaknesses and helps optimize vector database performance.



