paint-brush
Como construir um mecanismo de recomendação básico sem aprendizado de máquinapor@thestartupdeveloper
700 leituras
700 leituras

Como construir um mecanismo de recomendação básico sem aprendizado de máquina

por Aditya Kumar11m2024/03/18
Read on Terminal Reader

Muito longo; Para ler

Este artigo investiga o desenvolvimento de um mecanismo de recomendação sem modelos de aprendizado de máquina, fornecendo insights sobre os principais requisitos, arquitetura do sistema e ferramentas utilizadas. Descubra estratégias para captar os interesses dos usuários, gerar recomendações de alta qualidade e garantir o desempenho ideal do sistema.
featured image - Como construir um mecanismo de recomendação básico sem aprendizado de máquina
Aditya Kumar HackerNoon profile picture
0-item


Os sistemas de recomendação tornaram-se parte integrante e indispensável de nossas vidas. Estes algoritmos inteligentes são fundamentais para moldar as nossas experiências online, influenciando o conteúdo que consumimos, os produtos que compramos e os serviços que exploramos. Quer estejamos transmitindo conteúdo em plataformas como Netflix , descobrindo novas músicas no Spotify ou fazendo compras on-line, os sistemas de recomendação trabalham silenciosamente nos bastidores para personalizar e aprimorar nossas interações.


O elemento único destes sistemas de recomendação é a sua capacidade de compreender e prever as nossas preferências com base no comportamento histórico e nos padrões do utilizador. Ao analisar as nossas escolhas anteriores, estes sistemas selecionam sugestões personalizadas, poupando-nos tempo e esforço ao mesmo tempo que nos apresentam conteúdos/produtos que se alinham com os nossos interesses. Isso aumenta a satisfação do usuário e promove a descoberta, apresentando-nos ofertas novas e relevantes que de outra forma não teríamos encontrado.


Em um alto nível, os desenvolvedores entendem que esses algoritmos são alimentados por aprendizado de máquina e sistemas de aprendizado profundo (intercambiavelmente chamados de redes neurais), mas e se eu disser que existe uma maneira de construir um mecanismo de recomendação sem passar pela dor de implantar seu sistema neural? modelo de aprendizado de máquina ou de rede?


Esta questão é especificamente relevante no contexto de startups em estágio inicial e intermediário porque elas não possuem toneladas de dados estruturados para treinar seus modelos. E como já sabemos, a maioria dos modelos de aprendizado de máquina não fornecerá previsões precisas sem dados de treinamento adequados.


Recentemente, criei e implantei um mecanismo de recomendação básico para um rede social que prioriza a voz , o que levou a um salto de 40% em nossas principais métricas. No momento em que escrevo este blog, o sistema gera mais de 30 milhões de recomendações por mês. Embora este sistema de recomendação tenha sido construído para uma rede social, você pode aplicar a arquitetura básica a qualquer caso de uso, como recomendações de produtos, recomendações de músicas, recomendações de conteúdo em plataformas de texto e vídeo ou qualquer outra coisa. Deixe-me começar descrevendo a declaração do problema.


Declaração do problema da perspectiva da engenharia

Eu tive uma extensa documento de requisitos do produto e documento de requisitos de engenharia subsequente pois estávamos construindo o sistema de recomendação de um produto que já é utilizado por milhares de usuários diariamente. Mas para manter este blog curto e direto, escreverei apenas os requisitos de alto nível e depois discutirei a solução para os mesmos. Se você estiver construindo um sistema de recomendação para o seu produto (simples ou baseado em rede neural) e estiver preso em algum lugar, sinta-se à vontade para entrar em contato comigo pelo telefone Twitter ou Linkedin , e terei o maior prazer em responder às suas perguntas.


Em alto nível, tínhamos os seguintes requisitos do ponto de vista da engenharia -


  1. O sistema deve ser capaz de capturar os interesses do usuário na forma de palavras-chave. O sistema também deve ser capaz de classificar o nível de interesse de um usuário por palavras-chave específicas.


  2. O sistema deve ser capaz de capturar o interesse de um usuário em outros usuários. Deve ser capaz de classificar o nível de interesse que um usuário tem no conteúdo criado por outro usuário.


  3. O sistema deve ser capaz de gerar recomendações de alta qualidade com base nos interesses do usuário.


  4. O sistema deve ser capaz de garantir que as recomendações já visualizadas/rejeitadas pelo usuário não reapareçam por X dias.


  5. O sistema deve ter lógica para garantir que as postagens dos mesmos criadores não sejam agrupadas na mesma página. O sistema deve fazer o possível para garantir que se um usuário consumir dez postagens (tamanho de nossa página), todas elas sejam de criadores diferentes.


  6. O sistema deve ser rápido. Menos de 150 milissegundos de latência P99.


  7. Todos os outros requisitos não funcionais, como alta disponibilidade, escalabilidade, segurança, confiabilidade, facilidade de manutenção, etc., devem ser atendidos.


Novamente, esta é uma lista altamente simplificada de declarações de problemas. Na realidade, os documentos tinham mais de 3.000 palavras, pois também cobriam muitos casos extremos e extremos que podem surgir ao integrar esse mecanismo de recomendação em nossos sistemas existentes. Vamos passar para a solução.


Solução – Funcionamento de alto nível do mecanismo de recomendação

Discutirei as soluções para o problema uma por uma e depois descreverei o funcionamento geral de todo o sistema.

Nosso primeiro problema é capturar os interesses do usuário e definir seu nível de interesse com um interesse específico

Para isso, criamos algo chamado gráfico social . Simplificando, um gráfico social armazena os relacionamentos e conexões entre diferentes entidades em uma rede social. Estas entidades podem ser diferentes utilizadores ou uma relação de utilizadores com um interesse específico. Os gráficos sociais são uma forma poderosa de compreender e estruturar os relacionamentos dentro de um sistema específico. Para ser breve, não vou explicar o gráfico social em detalhes, mas recomendo que você pesquise no Google e aprenda mais sobre ele. A seguir está uma versão simplificada do gráfico social que construí para nosso mecanismo de recomendação.


Exemplo de gráfico social


Como você pode ver na imagem acima, estamos armazenando muitas informações, como o número de interações (curtidas, comentários, compartilhamentos) e o tempo recente dessas interações (quando aconteceram pela última vez) como dados de relacionamento entre dois usuários também entre um usuário e um interesse. Estamos até armazenando o relacionamento entre duas palavras-chave de interesses diferentes. eu usei Amazon Netuno , um banco de dados gráfico gerenciado pela AWS, para armazenar esse gráfico social. Você pode usar qualquer outro banco de dados gráfico, como Neo4j, JanusGraph, ArrangoDB , etc.


Essas palavras-chave de interesse são predominantemente substantivos. Existe um sistema que divide o conteúdo de uma postagem nessas palavras-chave (substantivos). É desenvolvido pela AWS Compreender; um serviço de processamento de linguagem natural (PNL) que usa aprendizado de máquina para dividir o texto em entidades, frases-chave, etc. Novamente, você pode usar qualquer serviço gerenciado de PNL (vários disponíveis) para fazer o mesmo. Você não precisa aprender ou implantar seus modelos de aprendizado de máquina! Se você já entende de aprendizado de máquina, pode verificar modelos de PNL de código aberto também no Huggingface .


Nosso segundo problema é gerar recomendações de alta qualidade com base no interesse do usuário

O diagrama a seguir é uma representação simplificada de alto nível de como o sistema funciona.

representação simplificada de alto nível de como funciona o sistema de recomendação.


Embora o que foi dito acima pareça fácil, há muito mais coisas acontecendo em cada etapa, e essas coisas devem ser cuidadosamente pensadas e depois programadas para garantir que o sistema tenha um desempenho ideal.


Deixe-me explicar passo a passo:


Passo 1 – Convertendo o conteúdo da postagem em incorporações vetoriais

Para gerar essas recomendações, primeiro temos que converter o conteúdo de uma postagem em algo chamado - Incorporações de vetores . Com o recente aumento na marca de LLMs OpenAI(os criadores do ChatGPT) e Bancos de dados vetoriais , Incorporações de vetores estão se tornando um termo cotidiano. Não entrarei em detalhes sobre o que são e como funcionam, mas recomendo fortemente ler mais sobre eles. Mas a geração de candidatos viáveis para um feed também precisa levar em conta coisas como privacidade e moderação de conteúdo (remoção de palavras obscenas, abusos, conteúdo sexual, assédio, filtragem de usuários bloqueados, etc.).


Para gerar os embeddings vetoriais, você pode usar qualquer modelo de incorporação proeminente, como o modelo de incorporação OpenAI , Amazon titan ou qualquer modelo de incorporação de texto de código aberto , dependendo do seu caso de uso. Optamos pelo Amazon Titan por causa de seu preço amigável, desempenho e facilidade operacional.


Passo 2 – Consulte o interesse do usuário

Agora, é aqui que as coisas ficam interessantes. Você gostaria de projetar as consultas com base em suas necessidades comerciais específicas. Por exemplo, damos mais peso à atualidade do envolvimento ao consultar interesses do que ao número de envolvimentos com uma palavra-chave ou usuário específico. Também executamos várias consultas paralelas para encontrar diferentes tipos de interesse do usuário - palavra-chave ou outro usuário. Como geramos vários feeds para um único usuário, também executamos algumas consultas promovendo um tópico específico de acordo com a tendência (por exemplo, você verá muitas postagens relacionadas ao Natal perto do Natal ou postagens relacionadas a terremotos se algum terremoto acontecer). Escusado será dizer que este tópico só aparecerá nos resultados da consulta se o usuário tiver manifestado algum interesse nele em sua jornada.


Portanto, escolha a lógica adequada ao seu caso de uso de negócios e ao comportamento que você deseja gerar e execute várias consultas para obter uma lista grande o suficiente de todos os interesses do usuário.


Passo 3 – Faça uma busca na RNA com base nos interesses encontrados

Bancos de dados vetoriais são usados predominantemente para realizar um tipo específico de pesquisa chamado Pesquisa aproximada do vizinho mais próximo (ANN). Novamente, a maneira como você categoriza vários interesses e se você está fazendo uma grande pesquisa de RNA ou pesquisas de diferenças paralelas deve ser inteiramente baseada em seu caso de uso e nos requisitos de negócios. Recomendo fazer mais do que pesquisas baseadas em coorte e depois ordenar os resultados (discutiremos isso mais tarde neste blog) para obter a melhor experiência do usuário final. O que a busca da ANN faz, nesse caso, é encontrar outros posts na plataforma que sejam semelhantes (mais próximos) dos interesses do usuário.


Passo 4 - Armazene os resultados em um banco de dados cache com ordenação.

Cache de banco de dados porque um dos problemas que precisamos resolver é a velocidade. Usamos conjuntos classificados redis para armazenar os IDs exclusivos das postagens de um usuário específico. Usamos conjuntos classificados redis porque a ordem das postagens no feed de um usuário é crítica. Além disso, outro problema que você precisa resolver é que o “ sistema deve ter lógica para garantir que as postagens dos mesmos criadores não sejam agrupadas na mesma página”. Para evitar a repetição de conteúdo do mesmo criador, escrevemos um algoritmo simples que garante que se a postagem de um criador específico for inserida em qualquer posição do feed de um usuário específico (conjunto classificado), não inseriremos outra postagem do mesmo criador para dez posições sucessivas (temos um tamanho de página de 10 enquanto veiculamos o feed ao usuário final, por isso o mantivemos estático para evitar complexidade).


Para decidir a ordem de uma recomendação específica do usuário, levamos em consideração o seguinte -


  1. A força do relacionamento com um interesse específico (ou outro usuário) deste usuário : é determinada por uma fórmula aritmética que obtém vários pontos de dados do gráfico social. Tudo isso são dados de engajamento, como o carimbo de data/hora das últimas curtidas criadas, número de curtidas criadas, último comentário, etc. O comportamento de engajamento do usuário é o indicador de seu interesse em algo.


  2. A popularidade da postagem na plataforma: para determinar isso, criamos um algoritmo que leva vários fatores, como engajamento, taxas de engajamento por impressão, número de usuários únicos engajados, etc., para gerar uma pontuação de engajamento desse postar em nível de plataforma.


Em alguns feeds, priorizamos a popularidade; em outros, priorizamos o gráfico social. Mas principalmente, todos eles são uma mistura saudável dos dois.


Como funciona o sistema

Como você pode ver no diagrama acima, o sistema foi intencionalmente mantido muito simples. A seguir está como o sistema funciona -


  1. Quando o usuário A cria uma postagem, o serviço de postagem, após salvar essa postagem, aciona um evento pub/sub em uma fila, que é recebido por um serviço em segundo plano destinado à geração de candidatos. Nós usamos Google Pub/Sub para a funcionalidade pub/sub.


  2. Este serviço em segundo plano recebe isso de forma assíncrona e executa as funcionalidades discutidas anteriormente - verificações de privacidade, verificações de moderação e geração de palavras-chave e, em seguida, gera os embeddings de vetores e os armazena no banco de dados de vetores. Nós estamos usando AstraDB como nosso banco de dados vetorial (discutido mais tarde).


  3. Sempre que um usuário se envolve (curtir/comentar/compartilhar, etc.) após atualizar nosso banco de dados NoSQL principal, o pós-serviço aciona um evento pub/sub para o serviço do mecanismo de recomendação.


  4. Este serviço de mecanismo de recomendação atualiza o banco de dados gráfico e, em seguida, atualiza o feed recomendado do usuário quase em tempo real, realizando a pesquisa de RNA e atualizando o banco de dados Redis. Portanto, quanto mais os usuários interagem, melhor fica o feed. Existem verificações para garantir que as recomendações não sejam tendenciosas para uma lista específica de palavras-chave . Essas verificações são realizadas enquanto consultamos o banco de dados Graph. Este serviço também atualiza a pontuação de engajamento de forma assíncrona. As pontuações de engajamento também são recalculadas de acordo com os usuários que visualizam a postagem.


  5. Como todas as etapas acima são executadas de forma assíncrona nos bastidores, esses cálculos não têm impacto na experiência do usuário final.


  6. O feed é finalmente servido ao usuário final por meio de um serviço de feed. Como este serviço apenas realiza uma pesquisa no redis e em nosso banco de dados NoSQL principal ( DyanmoDB ), sua latência P99 é inferior a 110 milissegundos. Ambos os bancos de dados retornam resultados de consulta com latência de milissegundos de um dígito, independentemente da escala.


Ferramentas e tecnologias utilizadas

  1. Alguns serviços foram escritos em Vá linguagem de programação , enquanto outros foram escritos em NodeJS (com texto datilografado).


  2. Nós estamos usando AstraDB por Datastax como nosso banco de dados vetorial. Chegamos a esta decisão depois de avaliar vários outros bancos de dados, como pinecone, milvus e weaviate . Além de seus excelentes recursos de consulta e indexação em vetores e outros tipos de dados, ele oferece um plano de preços sem servidor que cabe no bolso. Ele roda em cima de um mecanismo Cassandra, que usamos como banco de dados em vários outros recursos de nossa plataforma, e oferece uma interface de consulta CQL, que é muito amigável ao desenvolvedor. Eu recomendo fortemente experimentá-lo para seus casos de uso de vetores.


  3. Nós usamos Publicação/assinatura do Google para nossa comunicação assíncrona porque, em nossa escala atual (poucos lakh usuários no total, alguns milhares de usuários ativos diariamente), é altamente econômica. Eu o executei em uma escala de alguns lakh usuários com milhares de eventos por segundo. Funciona bem e é fácil de usar e estender.


  4. Redis - Velocidade, simplicidade e estrutura de dados poderosa. Acho que não preciso discutir por que redis em 2024.


  5. DynamoDB - Novamente, é altamente escalável e fácil de usar, e o executamos no modo sem servidor onde, apesar de centenas de milhares de consultas por minuto, nossa conta total é bastante baixa. Ele também oferece recursos de indexação muito poderosos e latência de milissegundos de um dígito em leituras e gravações.


Problemas a serem resolvidos no futuro

Como você pode imaginar, essa mesma configuração pode ser ajustada para construir um mecanismo de recomendação básico para qualquer caso de uso. Mas, como a nossa rede é social, precisaremos de alguns ajustes no futuro para tornar esse sistema mais eficiente.


  1. Algoritmos de aprendizado de máquina/aprendizado profundo serão necessários no nível do gráfico social para prever as palavras-chave e os usuários mais relevantes para o usuário. Atualmente, o conjunto de dados é muito pequeno para prever algo com precisão, pois se trata de um produto muito novo. No entanto, à medida que os dados crescem, precisaremos substituir as atuais consultas e fórmulas simples pela saída de algoritmos de aprendizado de máquina.


  2. Os relacionamentos entre várias palavras-chave e usuários devem ser ajustados e tornados mais granulares. Eles estão em um nível muito alto agora. Mas eles precisarão ser mais profundos. Precisaremos explorar as relações de segundo e terceiro graus em nosso gráfico para refinar primeiro as recomendações.


  3. Não estamos fazendo nenhum ajuste fino em nossos modelos de incorporação no momento. Precisaremos fazer isso em um futuro próximo.


Nota final

Espero que você tenha achado este blog útil. Se você tiver alguma dúvida, dúvida ou sugestão, não hesite em entrar em contato comigo pelo telefone Twitter , Linkedin ou Instagram . Compartilhe este artigo com seus amigos e colegas.


Também publicado aqui .