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
Eu tive uma extensa
Em alto nível, tínhamos os seguintes requisitos do ponto de vista da engenharia -
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.
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.
O sistema deve ser capaz de gerar recomendações de alta qualidade com base nos interesses do usuário.
O sistema deve ser capaz de garantir que as recomendações já visualizadas/rejeitadas pelo usuário não reapareçam por X dias.
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.
O sistema deve ser rápido. Menos de 150 milissegundos de latência P99.
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.
Discutirei as soluções para o problema uma por uma e depois descreverei o funcionamento geral de todo o sistema.
Para isso, criamos algo chamado
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
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
O diagrama a seguir é uma representação simplificada de alto nível de como o sistema funciona.
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:
Para gerar essas recomendações, primeiro temos que converter o conteúdo de uma postagem em algo chamado -
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.
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.
Bancos de dados vetoriais são usados predominantemente para realizar um tipo específico de pesquisa chamado
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 -
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.
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 você pode ver no diagrama acima, o sistema foi intencionalmente mantido muito simples. A seguir está como o sistema funciona -
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
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
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.
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.
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.
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 (
Alguns serviços foram escritos em
Nós estamos usando
Nós usamos
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.
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.
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.
Não estamos fazendo nenhum ajuste fino em nossos modelos de incorporação no momento. Precisaremos fazer isso em um futuro próximo.
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
Também publicado aqui .