Los sistemas de recomendación se han convertido en una parte integral e indispensable de nuestras vidas. Estos algoritmos inteligentes son fundamentales para dar forma a nuestras experiencias en línea, influyendo en el contenido que consumimos, los productos que compramos y los servicios que exploramos. Ya sea que estemos transmitiendo contenido en plataformas como Netflix , descubriendo nueva música en Spotify o comprando en línea, los sistemas de recomendación funcionan silenciosamente detrás de escena para personalizar y mejorar nuestras interacciones.
El elemento único de estos sistemas de recomendación es su capacidad para comprender y predecir nuestras preferencias en función del comportamiento histórico y los patrones de los usuarios. Al analizar nuestras elecciones pasadas, estos sistemas seleccionan sugerencias personalizadas, lo que nos ahorra tiempo y esfuerzo al mismo tiempo que nos presentan contenido/productos que se alinean con nuestros intereses. Esto mejora la satisfacción del usuario y fomenta el descubrimiento, presentándonos ofertas nuevas y relevantes que de otro modo no hubiéramos encontrado.
En un nivel alto, los desarrolladores entienden que estos algoritmos están impulsados por sistemas de aprendizaje automático y aprendizaje profundo (llamados indistintamente redes neuronales), pero ¿qué pasa si les digo que hay una manera de crear un motor de recomendación sin pasar por la molestia de implementar sus redes neuronales? ¿Modelo de aprendizaje neto o automático?
Esta pregunta es específicamente relevante en el contexto de las empresas emergentes en etapa inicial y media porque no tienen toneladas de datos estructurados para entrenar sus modelos. Y como ya sabemos, la mayoría de los modelos de aprendizaje automático no darán predicciones precisas sin los datos de entrenamiento adecuados.
Recientemente construí e implementé un motor de recomendación básico para un
Tuve una extensa
A un alto nivel, teníamos los siguientes requisitos desde una perspectiva de ingeniería:
El sistema debería poder capturar los intereses de un usuario en forma de palabras clave. El sistema también debería poder clasificar el nivel de interés que tiene un usuario con palabras clave específicas.
El sistema debería poder captar el interés de un usuario en otros usuarios. Debería poder clasificar el nivel de interés que tiene un usuario en el contenido creado por otro usuario.
El sistema debería poder generar recomendaciones de alta calidad basadas en los intereses del usuario.
El sistema debería poder garantizar que las recomendaciones ya vistas/rechazadas por el usuario no vuelvan a aparecer durante X días.
El sistema debe tener lógica para garantizar que las publicaciones de los mismos creadores no estén agrupadas en la misma página. El sistema debe hacer todo lo posible para garantizar que si un usuario consume diez publicaciones (el tamaño de nuestra página), todas sean de diferentes creadores.
El sistema debería ser rápido. Menos de 150 milisegundos de latencia P99.
Se deben cumplir todos los demás requisitos no funcionales, como alta disponibilidad, escalabilidad, seguridad, confiabilidad, mantenibilidad, etc.
Nuevamente, ésta es una lista muy simplificada de planteamientos de problemas. En realidad, los documentos tenían más de 3000 palabras y también cubrían muchos casos extremos y casos extremos que pueden surgir al integrar este motor de recomendaciones en nuestros sistemas existentes. Pasemos a la solución.
Discutiré las soluciones al problema una por una y luego describiré el funcionamiento general de todo el sistema.
Para esto, creamos algo llamado
Como puede ver en la imagen de arriba, estamos almacenando mucha información, como la cantidad de interacciones (me gusta, comentarios, acciones compartidas) y la actualidad de estas interacciones (cuándo ocurrieron por última vez) como datos de relación entre dos usuarios y entre un usuario y un interés. Incluso estamos almacenando la relación entre dos palabras clave de intereses diferentes. solía
Estas palabras clave de interés son predominantemente sustantivos. Existe un sistema que desglosa el contenido de una publicación en estas palabras clave (sustantivos). Está impulsado por AWS. un servicio de procesamiento de lenguaje natural (NLP) que utiliza el aprendizaje automático para dividir el texto en entidades, frases clave, etc. Nuevamente, puede usar cualquier servicio de NLP administrado (varios disponibles) para lograr lo mismo. ¡No necesita aprender ni implementar sus modelos de aprendizaje automático! Si ya comprende el aprendizaje automático, puede consultar
El siguiente diagrama es una representación simplificada de alto nivel de cómo funciona el sistema.
Si bien lo anterior parece fácil, suceden muchas más cosas en cada paso, y esas cosas deben pensarse cuidadosamente y luego programarse para garantizar que el sistema funcione de manera óptima.
Déjame explicarte paso a paso:
Para generar estas recomendaciones, primero tenemos que convertir el contenido de una publicación en algo llamado:
Para generar incrustaciones de vectores, puede utilizar cualquier modelo de incrustación destacado, como el modelo de incrustación OpenAI , Amazon Titan o cualquier modelo de incrustación de texto de código abierto , según su caso de uso. Elegimos Amazon Titan por su precio asequible, su rendimiento y su facilidad operativa.
Ahora bien, aquí es donde las cosas se ponen interesantes. Le recomendamos diseñar las consultas en función de sus necesidades comerciales específicas. Por ejemplo, al consultar intereses, le damos más importancia a la antigüedad de la interacción que a la cantidad de interacciones con una palabra clave o usuario específico. También ejecutamos múltiples consultas paralelas para encontrar diferentes tipos de interés del usuario: palabra clave u otro usuario. Dado que generamos múltiples feeds para un solo usuario, también ejecutamos algunas consultas que promocionan un tema específico según la tendencia (por ejemplo, verá muchas publicaciones relacionadas con Navidad cerca de Navidad o publicaciones relacionadas con terremotos si ha ocurrido algún terremoto). No hace falta decir que este tema sólo aparecerá en los resultados de la consulta si el usuario ha expresado algún interés en él durante su viaje.
Por lo tanto, elija la lógica que se adapte a su caso de uso empresarial y al comportamiento que desea impulsar y ejecute múltiples consultas para obtener una lista lo suficientemente grande de todos los intereses del usuario.
Las bases de datos vectoriales se utilizan predominantemente para realizar un tipo particular de búsqueda llamado
Caché de base de datos porque uno de los problemas que debemos solucionar es la velocidad. Usamos conjuntos ordenados de Redis para almacenar las identificaciones únicas de las publicaciones de un usuario específico. Usamos conjuntos ordenados de Redis porque el orden de las publicaciones en el feed de un usuario es fundamental. Además, otro problema que debes resolver es que el " sistema debe tener lógica para garantizar que las publicaciones de los mismos creadores no estén agrupadas en la misma página". Para evitar la repetición de contenido del mismo creador, hemos escrito un algoritmo simple que garantiza que si la publicación de un creador específico se inserta en cualquier posición en el feed de un usuario en particular (conjunto ordenado), no insertamos otra publicación del mismo creador. para diez posiciones sucesivas (tenemos un tamaño de página de 10 mientras entregamos el feed al usuario final, por lo que lo mantuvimos estático para evitar complejidad).
Para decidir el orden de una recomendación específica del usuario, tomamos en cuenta lo siguiente:
La fuerza de la relación con un interés específico (u otro usuario) para este usuario : está determinada por una fórmula aritmética que toma varios puntos de datos del gráfico social. Todo esto son datos de participación, como la marca de tiempo de los últimos Me gusta creados, la cantidad de Me gusta creados, el último comentario, etc. El comportamiento de participación del usuario es el indicador de su interés en algo.
La popularidad de la publicación en la plataforma: para determinar esto, hemos creado un algoritmo que toma varios factores, como participación, índices de participación e impresión, cantidad de usuarios únicos que participaron, etc., para generar una puntuación de participación de esa publicación. publicar a nivel de plataforma.
En algunos feeds, damos prioridad a la popularidad; en otros, priorizamos el gráfico social. Pero sobre todo, todos ellos son una mezcla saludable de los dos.
Como puede ver en el diagrama anterior, el sistema se ha mantenido intencionalmente muy simple. A continuación se explica cómo funciona el sistema:
Cuando el usuario A crea una publicación, el servicio de publicación, después de guardar esa publicación, activa un evento de publicación/suscripción en una cola, que es recibido por un servicio en segundo plano destinado a la generación de candidatos. Usamos
Este servicio en segundo plano recibe esto de forma asincrónica y realiza las funcionalidades analizadas anteriormente: comprobaciones de privacidad, comprobaciones de moderación y generación de palabras clave y luego genera las incrustaciones de vectores y las almacena en la base de datos de vectores. Estamos usando
Cada vez que un usuario interactúa (me gusta/comenta/comparte, etc.) después de actualizar nuestra base de datos NoSQL principal, el servicio posterior activa un evento de publicación/suscripción en el servicio del motor de recomendación.
Este servicio de motor de recomendación actualiza la base de datos de gráficos y luego actualiza la fuente recomendada del usuario casi en tiempo real realizando la búsqueda de ANN y actualizando la base de datos de Redis. Entonces, cuanto más interactúan los usuarios, mejor se vuelve el feed. Hay controles para garantizar que las recomendaciones no estén sesgadas hacia una lista específica de palabras clave . Esas comprobaciones se realizan mientras consultamos la base de datos de Graph. Este servicio también actualiza la puntuación de participación de forma asincrónica. Las puntuaciones de participación también se vuelven a calcular en función de los usuarios que ven la publicación.
Dado que todos los pasos anteriores se realizan de forma asincrónica en segundo plano, estos cálculos no tienen ningún impacto en la experiencia del usuario final.
El feed finalmente se entrega al usuario final a través de un servicio de feed. Dado que este servicio simplemente realiza una búsqueda en redis y nuestra base de datos principal NoSQL (
Algunos servicios han sido escritos en
Estamos usando
Usamos
Como puede imaginar, esta misma configuración se puede modificar para crear un motor de recomendación básico para cualquier caso de uso. Pero, dado que la nuestra es una red social, necesitaremos algunos ajustes en el futuro para que este sistema sea más eficiente.
Se necesitarán algoritmos de aprendizaje automático/aprendizaje profundo a nivel de gráfico social para predecir las palabras clave y los usuarios más relevantes para el usuario. Actualmente, el conjunto de datos es demasiado pequeño para predecir algo con precisión, ya que es un producto muy nuevo. Sin embargo, a medida que los datos crezcan, necesitaremos reemplazar las consultas y fórmulas simples actuales con el resultado de algoritmos de aprendizaje automático.
Las relaciones entre varias palabras clave y usuarios deben ajustarse y hacerse más granulares. Están en un nivel muy alto ahora mismo. Pero tendrán que ser más profundos. Primero necesitaremos explorar las relaciones de segundo y tercer grado en nuestro gráfico para refinar las recomendaciones.
No estamos realizando ningún ajuste en nuestros modelos de incrustación en este momento. Tendremos que hacerlo en un futuro próximo.
Espero que este blog te haya resultado útil. Si tiene alguna pregunta, duda o sugerencia, no dude en ponerse en contacto conmigo en
También publicado aquí .