Personnalisation des recommandations avec AWS Lambda - Amazon Pinpoint

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Personnalisation des recommandations avec AWS Lambda

Dans Amazon Pinpoint, vous pouvez récupérer des recommandations personnalisées à partir d'un modèle de recommandation et les ajouter aux messages que vous envoyez à partir de campagnes et de parcours. Un modèle de recommandation est un type de modèle de machine learning qui trouve des modèles dans les données et génère des prédictions et des recommandations basées sur les modèles qu'il trouve. Il prédit ce qu'un utilisateur particulier préférera à partir d'un ensemble donné de produits ou d'articles, et il fournit ces informations sous la forme d'un ensemble de recommandations pour l'utilisateur.

En utilisant des modèles de recommandation avec Amazon Pinpoint, vous pouvez envoyer des recommandations personnalisées aux destinataires des messages en fonction des attributs et du comportement de chaque destinataire. Avec AWS Lambda, vous pouvez également personnaliser et améliorer ces recommandations. Par exemple, vous pouvez transformer dynamiquement une recommandation d'une valeur de texte unique (par exemple un nom ou un ID de produit) en contenu plus sophistiqué (par exemple un nom de produit, une description et une image). Et vous pouvez le faire en temps réel, quand Amazon Pinpoint envoie le message.

Cette fonctionnalité est disponible dans les régions AWS suivantes : USA Est (Virginie du Nord), USA Ouest (Oregon), Asie Pacifique (Mumbai), Asie Pacifique (Sydney) et Europe (Irlande).

Utilisation des recommandations dans les messages

Pour utiliser un modèle de recommandation avec Amazon Pinpoint, vous commencez par créer une solution Amazon Personalize et par déployer cette solution en tant que campagne Amazon Personalize. Ensuite, vous créez une configuration pour le modèle de recommandation dans Amazon Pinpoint. Dans la configuration, vous spécifiez les paramètres qui déterminent comment récupérer et traiter les données de recommandation de la campagne Amazon Personalize. Il s'agit notamment d'appeler ou non une fonction AWS Lambda pour effectuer un traitement supplémentaire des données récupérées.

Amazon Personalize est un service AWS conçu pour vous aider à créer des modèles de machine learning fournissant des recommandations personnalisées en temps réel aux clients qui utilisent vos applications. Amazon Personalize vous guide tout au long du processus de création et d'entraînement d'un modèle de machine learning, puis de préparation et de déploiement du modèle sous forme de campagne Amazon Personalize. Vous pouvez ensuite récupérer des recommandations personnalisées et en temps réel de la campagne. Pour en savoir plus sur Amazon Personalize, consultez le Guide du développeur Amazon Personalize.

AWS Lambda est un service de calcul qui permet d'exécuter du code sans avoir à mettre en service ni à gérer des serveurs. Vous empaquetez votre code et le téléchargez dans AWS Lambda en tant que fonction Lambda. AWS Lambda exécute alors la fonction lorsque la fonction est appelée. Une fonction peut être appelée manuellement, par vous, automatiquement en réponse à des événements, ou en réponse à des demandes d'applications ou de services, y compris Amazon Pinpoint. Pour en savoir plus sur la création et l'invocation de fonctions Lambda, consultez le Guide du développeur AWS Lambda.

Après avoir créé une configuration Amazon Pinpoint pour un modèle de recommandation, vous pouvez ajouter des recommandations du modèle aux messages que vous envoyez à partir de campagnes et de parcours. Pour cela, utilisez des modèles de message qui contiennent des variables de message pour les attributs recommandés. Un attribut recommandé est un point de terminaison dynamique ou un attribut utilisateur conçu pour stocker les données de recommandation. Vous définissez ces attributs lorsque vous créez la configuration d'un modèle de recommandation.

Vous pouvez utiliser des variables pour les attributs recommandés dans les types de modèles de message suivants :

  • Modèles d'e-mail, pour les messages électroniques que vous envoyez à partir de campagnes ou de parcours

  • Modèles de notification Push, pour les notifications Push que vous envoyez à partir de campagnes

  • Modèles SMS, pour les SMS que vous envoyez à partir de campagnes

Pour plus d'informations sur l'utilisation des modèles de recommandation avec Amazon Pinpoint, consultez Modèles de machine learning dans le Guide de l'utilisateur d'Amazon Pinpoint.

Si vous configurez Amazon Pinpoint pour invoquer une fonction Lambda qui traite les données de recommandation, Amazon Pinpoint exécute les tâches générales suivantes chaque fois qu'il envoie des recommandations personnalisées dans un message pour une campagne ou un parcours :

  1. Évalue et traite les paramètres de configuration et le contenu du message et du modèle de message.

  2. Détermine que le modèle de message est connecté à un modèle de recommandation.

  3. Évalue les paramètres de configuration pour la connexion au modèle et l'utilisation du modèle. Ces paramètres sont définis par la ressource Recommender Model du modèle.

  4. Détecte une ou plusieurs variables de message pour les attributs recommandés qui sont définis par les paramètres de configuration du modèle.

  5. Récupère les données de recommandation de la campagne Amazon Personalize spécifiée dans les paramètres de configuration du modèle. Utilise l'opération GetRecommendations de l'API d'exécution Amazon Personalize pour effectuer cette tâche.

  6. Ajoute les données de recommandation appropriées à un attribut recommandé dynamique (RecommendationItems) pour chaque destinataire de message.

  7. Invoque votre fonction Lambda et envoie les données de recommandation pour chaque destinataire à cette fonction afin qu'elles soient traitées.

    Les données sont envoyées sous la forme d'un objet JSON qui contient la définition de point de terminaison pour chaque destinataire. Chaque définition de point de terminaison inclut un champ RecommendationItems contenant un tableau ordonné de 1 à 5 valeurs. Le nombre de valeurs dans le tableau dépend des paramètres de configuration du modèle.

  8. Attend que votre fonction Lambda traite les données et renvoie les résultats.

    Les résultats prennent la forme d'un objet JSON qui contient une définition de point de terminaison mise à jour pour chaque destinataire. Chaque définition de point de terminaison mise à jour contient un nouvel objet Recommendations. Cet objet contient 1 à 10 champs, un pour chaque attribut recommandé personnalisé que vous avez défini dans les paramètres de configuration du modèle. Chacun de ces champs stocke des données de recommandation améliorées pour le point de terminaison.

  9. Utilise la définition de point de terminaison mise à jour pour chaque destinataire afin de remplacer chaque variable de message par la valeur appropriée pour ce destinataire.

  10. Il envoie une version du message qui contient les recommandations personnalisées pour chaque destinataire du message.

Pour personnaliser et améliorer les recommandations de cette manière, commencez par créer une fonction Lambda qui traite les définitions de point de terminaison envoyées par Amazon Pinpoint, et renvoie les définitions de point de terminaison mises à jour. Ensuite, affectez une stratégie de fonction Lambda à la fonction et autorisez Amazon Pinpoint à invoquer la fonction. Configurez ensuite le modèle de recommandation dans Amazon Pinpoint. Lorsque vous configurez le modèle, spécifiez la fonction à appeler et définissez les attributs recommandés à utiliser.

Création de la fonction Lambda

Pour savoir comment créer une fonction Lambda, consultez Démarrage dans le Guide du développeur AWS Lambda. Lorsque vous concevez et développez votre fonction, gardez à l'esprit les exigences et consignes suivantes.

Données d'événement en entrée

Lorsqu'Amazon Pinpoint invoque une fonction Lambda pour un modèle de recommandation, il envoie une charge utile qui contient la configuration et d'autres paramètres pour la campagne ou le parcours qui envoie le message. La charge utile comprend un objet Endpoints, qui est une carte qui associe les ID de point de terminaison aux définitions de point de terminaison pour les destinataires de message.

Les définitions de point de terminaison utilisent la structure définie par la ressource Endpoint de l'API Amazon Pinpoint. Cependant, elles incluent également un champ pour un attribut recommandé dynamique nommé RecommendationItems. Le champ RecommendationItems contient un ou plusieurs éléments recommandés pour le point de terminaison, tels que renvoyés par la campagne Amazon Personalize. La valeur de ce champ est un tableau ordonné de 1 à 5 éléments recommandés (sous forme de chaînes). Le nombre d'éléments dans le tableau dépend du nombre d'éléments recommandés que vous avez configuré dans Amazon Pinpoint afin qu'ils soient récupérés pour chaque point de terminaison ou utilisateur.

Par exemple :

"Endpoints": { "endpointIDexample-1":{ "ChannelType":"EMAIL", "Address":"sofiam@example.com", "EndpointStatus":"ACTIVE", "OptOut":"NONE", "EffectiveDate":"2020-02-26T18:56:24.875Z", "Attributes":{ "AddressType":[ "primary" ] }, "User":{ "UserId":"SofiaMartínez", "UserAttributes":{ "LastName":[ "Martínez" ], "FirstName":[ "Sofia" ], "Neighborhood":[ "East Bay" ] } }, "RecommendationItems":[ "1815", "2009", "1527" ], "CreationDate":"2020-02-26T18:56:24.875Z" }, "endpointIDexample-2":{ "ChannelType":"EMAIL", "Address":"alejandror@example.com", "EndpointStatus":"ACTIVE", "OptOut":"NONE", "EffectiveDate":"2020-02-26T18:56:24.897Z", "Attributes":{ "AddressType":[ "primary" ] }, "User":{ "UserId":"AlejandroRosalez", "UserAttributes":{ "LastName ":[ "Rosalez" ], "FirstName":[ "Alejandro" ], "Neighborhood":[ "West Bay" ] } }, "RecommendationItems":[ "1210", "6542", "4582" ], "CreationDate":"2020-02-26T18:56:24.897Z" } }

Dans l'exemple précédent, les paramètres Amazon Pinpoint pertinents sont :

  • Le modèle de recommandation est configuré pour récupérer trois éléments recommandés pour chaque point de terminaison ou utilisateur. (La valeur de la propriété RecommendationsPerMessage est définie sur 3.) Avec ce paramètre, Amazon Pinpoint récupère et ajoute uniquement les trois premiers éléments recommandés pour chaque point de terminaison ou utilisateur.

  • Le projet est configuré pour utiliser des attributs utilisateur personnalisés qui stockent le prénom, le nom de famille et le quartier de chaque utilisateur. (L'objet UserAttributes contient les valeurs de ces attributs.)

  • Le projet est configuré pour utiliser un attribut de point de terminaison personnalisé (AddressType) qui indique si le point de terminaison est l'adresse préférée (canal) de l'utilisateur pour recevoir des messages du projet. (L'objet Attributes contient la valeur de cet attribut.)

Lorsqu'Amazon Pinpoint appelle la fonction Lambda et envoie cette charge utile en tant que données d'événement, AWS Lambda transmet les données à la fonction Lambda afin qu'elles soient traitées.

Chaque charge utile peut contenir des données pour un maximum de 50 points de terminaison. Si un segment contient plus de 50 points de terminaison, Amazon Pinpoint appelle la fonction à plusieurs reprises, pour un maximum de 50 points de terminaison à la fois, jusqu'à ce que la fonction traite toutes les données.

Données et exigences de réponse

Lorsque vous concevez et développez votre fonction Lambda, gardez à l'esprit les quotas pour les modèles de machine learning. Si la fonction ne répond pas aux conditions définies par ces quotas, Amazon Pinpoint ne sera pas en mesure de traiter et d'envoyer le message.

Gardez également à l'esprit les exigences suivantes :

  • La fonction doit renvoyer les définitions de point de terminaison mises à jour dans le même format que celui fourni par les données d'événement en entrée.

  • Chaque définition de point de terminaison mise à jour peut contenir 1 à 10 attributs personnalisés recommandés pour le point de terminaison ou l'utilisateur. Les noms de ces attributs doivent correspondre aux noms d'attributs que vous spécifiez lorsque vous configurez le modèle de recommandation dans Amazon Pinpoint.

  • Tous les attributs recommandés personnalisés doivent être renvoyés dans un seul objet Recommendations pour chaque point de terminaison ou utilisateur. Cette exigence permet de s'assurer qu'aucun conflit de dénomination ne survient. Vous pouvez ajouter l'objet Recommendations à n'importe quel emplacement dans une définition de point de terminaison.

  • La valeur de chaque attribut recommandé personnalisé doit être une chaîne (valeur unique) ou un tableau de chaînes (valeurs multiples). Si la valeur est un tableau de chaînes, nous vous recommandons de préserver l'ordre des éléments recommandés renvoyés par Amazon Personalize, comme indiqué dans le champ RecommendationItems. Sinon, votre contenu risque de ne pas refléter les prédictions du modèle pour un point de terminaison ou un utilisateur.

  • La fonction ne doit pas modifier d'autres éléments dans les données d'événement, y compris d'autres valeurs d'attribut pour un point de terminaison ou un utilisateur. Il ne doit ajouter et renvoyer des valeurs que pour les attributs recommandés personnalisés. Amazon Pinpoint n'acceptera aucune mise à jour d'autres valeurs dans la réponse de la fonction.

  • La fonction doit être hébergée dans la même région AWS que le projet Amazon Pinpoint qui invoque la fonction. Si la fonction et le projet ne se trouvent pas dans la même région, Amazon Pinpoint ne peut pas envoyer de données d'événement à la fonction.

Si l'une des exigences précédentes n'est pas satisfaite, Amazon Pinpoint ne sera pas en mesure de traiter et d'envoyer le message à un ou plusieurs points de terminaison. Cela peut entraîner l'échec d'une activité de campagne ou de parcours.

Enfin, nous vous recommandons de réserver 256 exécutions simultanées pour la fonction.

Dans l'ensemble, votre fonction Lambda doit traiter les données d'événement envoyées par Amazon Pinpoint et renvoyer les définitions de point de terminaison modifiées. Pour cela, elle peut itérer chaque point de terminaison de l'objet Endpoints et, pour chaque point de terminaison, créer et définir des valeurs pour les attributs personnalisés recommandés que vous souhaitez utiliser. L'exemple de gestionnaire suivant, écrit en Python et qui poursuit l'exemple précédent de données d'événement d'entrée, montre ceci :

import json import string def lambda_handler(event, context): print("Received event: " + json.dumps(event)) print("Received context: " + str(context)) segment_endpoints = event["Endpoints"] new_segment = dict() for endpoint_id in segment_endpoints.keys(): endpoint = segment_endpoints[endpoint_id] if supported_endpoint(endpoint): new_segment[endpoint_id] = add_recommendation(endpoint) print("Returning endpoints: " + json.dumps(new_segment)) return new_segment def supported_endpoint(endpoint): return True def add_recommendation(endpoint): endpoint["Recommendations"] = dict() customTitleList = list() customGenreList = list() for i,item in enumerate(endpoint["RecommendationItems"]): item = int(item) if item == 1210: customTitleList.insert(i, "Hanna") customGenreList.insert(i, "Action") elif item == 1527: customTitleList.insert(i, "Catastrophe") customGenreList.insert(i, "Comedy") elif item == 1815: customTitleList.insert(i, "Fleabag") customGenreList.insert(i, "Comedy") elif item == 2009: customTitleList.insert(i, "Late Night") customGenreList.insert(i, "Drama") elif item == 4582: customTitleList.insert(i, "Agatha Christie\'s The ABC Murders") customGenreList.insert(i, "Crime") elif item == 6542: customTitleList.insert(i, "Hunters") customGenreList.insert(i, "Drama") endpoint["Recommendations"]["Title"] = customTitleList endpoint["Recommendations"]["Genre"] = customGenreList return endpoint

Dans l'exemple précédent, AWS Lambda transmet les données d'événement au gestionnaire en tant que paramètre event. Le gestionnaire itère chaque point de terminaison de l'objet Endpoints et définit les valeurs des attributs recommandés personnalisés nommés Recommendations.Title et Recommendations.Genre. L'instruction return renvoie chaque définition de point de terminaison mise à jour à Amazon Pinpoint.

Pour poursuivre l'exemple précédent de données d'événement en entrée, les définitions de point de terminaison mises à jour sont les suivantes :

"Endpoints":{ "endpointIDexample-1":{ "ChannelType":"EMAIL", "Address":"sofiam@example.com", "EndpointStatus":"ACTIVE", "OptOut":"NONE", "EffectiveDate":"2020-02-26T18:56:24.875Z", "Attributes":{ "AddressType":[ "primary" ] }, "User":{ "UserId":"SofiaMartínez", "UserAttributes":{ "LastName":[ "Martínez" ], "FirstName":[ "Sofia" ], "Neighborhood":[ "East Bay" ] } }, "RecommendationItems":[ "1815", "2009", "1527" ], "CreationDate":"2020-02-26T18:56:24.875Z", "Recommendations":{ "Title":[ "Fleabag", "Late Night", "Catastrophe" ], "Genre":[ "Comedy", "Comedy", "Comedy" ] } }, "endpointIDexample-2":{ "ChannelType":"EMAIL", "Address":"alejandror@example.com", "EndpointStatus":"ACTIVE", "OptOut":"NONE", "EffectiveDate":"2020-02-26T18:56:24.897Z", "Attributes":{ "AddressType":[ "primary" ] }, "User":{ "UserId":"AlejandroRosalez", "UserAttributes":{ "LastName ":[ "Rosalez" ], "FirstName":[ "Alejandro" ], "Neighborhood":[ "West Bay" ] } }, "RecommendationItems":[ "1210", "6542", "4582" ], "CreationDate":"2020-02-26T18:56:24.897Z", "Recommendations":{ "Title":[ "Hanna", "Hunters", "Agatha Christie\'s The ABC Murders" ], "Genre":[ "Action", "Drama", "Crime" ] } } }

Dans l'exemple précédent, la fonction a modifié l'objet Endpoints reçu et a renvoyé les résultats. L'objet Endpoint de chaque point de terminaison contient désormais un nouvel objet Recommendations, qui contient des champs Title et Genre. Chacun de ces champs stocke un tableau ordonné de trois valeurs (sous forme de chaînes), où chaque valeur fournit un contenu amélioré pour un élément recommandé correspondant dans le champ RecommendationItems.

Attribution d'une stratégie de fonction Lambda

Avant de pouvoir utiliser votre fonction Lambda pour traiter les données de recommandation, vous devez autoriser Amazon Pinpoint à invoquer la fonction. Pour accorder l'autorisation d'invocation, attribuez une stratégie de fonction Lambda à la fonction. Une stratégie de fonction Lambda est une stratégie d'autorisations basée sur les ressources qui désigne les entités qui peuvent utiliser une fonction et les actions que ces entités peuvent effectuer. Pour plus d'informations, consultez Utilisation des stratégies fondées sur les ressources pour AWS Lambda dans le Guide du développeur AWS Lambda.

L'exemple de stratégie suivant permet au principal du service Amazon Pinpoint d'utiliser l'action lambda:InvokeFunction pour une campagne Amazon Pinpoint particulière (campaignId) dans un projet Amazon Pinpoint particulier (projectId) :

{ "Sid": "sid", "Effect": "Allow", "Principal": { "Service": "pinpoint.us-east-1.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "{arn:aws:lambda:us-east-1:accountId:function:function-name}", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:mobiletargeting:us-east-1:accountId:recommenders/*" } } }

La stratégie de fonction exige un bloc Condition qui inclut une clé AWS:SourceArn. Cette clé spécifie quelle ressource est autorisée à appeler la fonction. Dans l'exemple précédent, la stratégie permet à une campagne spécifique d'appeler la fonction.

Vous pouvez également écrire une stratégie qui permet au principal du service Amazon Pinpoint d'utiliser l'action lambda:InvokeFunction pour toutes les campagnes et tous les parcours d'un projet Amazon Pinpoint spécifique (projectId). L'exemple de stratégie ci-dessous montre ceci :

{ "Sid": "sid", "Effect": "Allow", "Principal": { "Service": "pinpoint.us-east-1.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "{arn:aws:lambda:us-east-1:accountId:function:function-name}", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:mobiletargeting:us-east-1:accountId:recommenders/*" } } }

Contrairement au premier exemple, la clé AWS:SourceArn dans le bloc Condition de cet exemple permet à un projet particulier d'appeler la fonction. Cette autorisation s'applique à toutes les campagnes et à tous les parcours du projet.

Pour écrire une stratégie plus générique, vous pouvez utiliser des caractères génériques (*) correspondant à plusieurs caractères. Par exemple, vous pouvez utiliser le bloc Condition suivant pour autoriser n'importe quel projet Amazon Pinpoint à invoquer la fonction :

"Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:mobiletargeting:us-east-1:accountId:recommenders/*" } }

Si vous souhaitez utiliser la fonction Lambda avec tous les projets de votre compte Amazon Pinpoint, nous vous recommandons de configurer le bloc Condition de la stratégie comme indiqué précédemment. Toutefois, la bonne pratique consiste à créer des stratégies qui incluent uniquement les autorisations requises pour effectuer une action spécifique sur une ressource spécifique.

Autorisation accordée à Amazon Pinpoint d'invoquer la fonction

Après avoir attribué une stratégie de fonction Lambda à la fonction, vous pouvez ajouter des autorisations qui autorisent Amazon Pinpoint à invoquer la fonction pour un projet, une campagne ou un parcours spécifique. Vous pouvez le faire à l'aide de AWS Command Line Interface (AWS CLI) et de la commande add-permission. L'exemple suivant montre comment procéder pour un projet spécifique (projectId) :

$ aws lambda add-permission \ --function-name function-name \ --statement-id sid \ --action lambda:InvokeFunction \ --principal pinpoint.us-east-1.amazonaws.com \ --source-arn arn:aws:mobiletargeting:us-east-1:accountId:recommenders/*

L'exemple précédent est mis en forme pour Unix, Linux et macOS. Sous Microsoft Windows, remplacez le caractère de continuité de ligne (\) par le caret (^).

Si la commande s'exécute correctement, vous obtenez une sortie similaire à ce qui suit :

{ "Statement": "{\"Sid\":\"sid\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"pinpoint.us-east-1.amazonaws.com\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:function-name\", \"Condition\": {\"ArnLike\": {\"AWS:SourceArn\": \"arn:aws:mobiletargeting:us-east-1:111122223333:recommenders/*\"}}}" }

La valeur Statement est une version de la chaîne JSON correspondant à l'instruction ajoutée à la politique de la fonction Lambda.

Configuration du modèle de recommandation

Pour configurer Amazon Pinpoint afin qu'il invoque la fonction Lambda d'un modèle de recommandation, spécifiez les paramètres de configuration spécifiques à Lambda suivants pour le modèle :

  • RecommendationTransformerUri : cette propriété spécifie le nom ou l'Amazon Resource Name (ARN) de la fonction Lambda.

  • Attributes : cet objet est une carte qui définit les attributs recommandés personnalisés que la fonction ajoute à chaque définition de point de terminaison. Chacun de ces attributs peut être utilisé comme variable de message dans un modèle de message.

Vous pouvez spécifier ces paramètres à l'aide de la ressource Modèles de recommandation de l'API Amazon Pinpoint (lorsque vous créez la configuration d'un modèle) ou de la ressource Modèle de recommandation de l'API Amazon Pinpoint (si vous mettez à jour la configuration d'un modèle). Vous pouvez également définir ces paramètres à l'aide de la console Amazon Pinpoint.

Pour plus d'informations sur l'utilisation des modèles de recommandation avec Amazon Pinpoint, consultez Modèles de machine learning dans le Guide de l'utilisateur d'Amazon Pinpoint.