L'application d'analyse alimentaire est une application Web nutritionnelle GenAI personnalisée pour vos recettes de courses et de cuisine, construite avec une architecture sans serveur et des capacités d'IA générative. Il a d'abord été créé en tant que gagnant de l'AWS Hackathon France 2024, puis présenté comme stand d'exposition au AWS Summit Paris 2024.
Le back-end de l'application est réalisé à l'aide de services AWS tels que :
L'application est conçue pour contenir un minimum de code, être extensible, évolutive et rentable. Il utilise le Lazy Loading pour réduire les coûts et garantir la meilleure expérience utilisateur.
Nous avons développé cette exposition pour créer une application interactive sans serveur utilisant des services d'IA générative.
Informations personnalisées sur le produit : Curieux de savoir ce que contient un produit et s'il est bon pour vous ? Scannez simplement le code-barres avec l'application pour obtenir une liste expliquée des ingrédients/allergènes et un résumé personnalisé en fonction de vos préférences.
Générateur de recettes personnalisées : prenez une photo des ingrédients dans votre réfrigérateur et l'application générera des recettes basées sur vos préférences en utilisant ces ingrédients.
L'architecture de l'application peut être découpée en 4 blocs :
Implémentation : Utilisation d'AWS Lambda pour la logique côté serveur, Amazon Bedrock comme plateforme de création d'intelligence artificielle générative (GenAI), Anthropic Claude comme Large Language Models (LLM) et Stable Diffusion XL de StabilityAI comme modèle de diffusion pour générer des images.
Développement du modèle IA : Le choix du modèle LLM a eu un impact sur la qualité et la latence de la réponse. Au final, nous avons choisi Anthropic Claude 3 Haiku pour son bon rapport entre latence et qualité.
Images générées par l'IA : La demande d'image est très sensible et constitue un défi pour générer une image qui met réellement en valeur les caractéristiques nutritives des produits. Pour créer l'invite, nous avons utilisé un premier LLM pour générer l'invite basée sur les caractéristiques nutritives du produit. Cette technique est similaire à une auto-interrogation des bases de données vectorielles. L’utilisation de l’ingénierie d’invites multi-shots a également beaucoup contribué à améliorer la qualité de l’invite.
Stratégie : "Ne réinventez pas la roue"
Implémentation : Les scanners de codes-barres existent depuis longtemps, nous avons choisi une bibliothèque open source compatible avec notre stack. Faute de temps, nous n'avons pas consacré beaucoup de temps à la comparaison des bibliothèques, nous concentrant sur la création d'un prototype fonctionnel plutôt que sur la recherche du prototype parfait. "Le parfait est l'ennemi du bien".
Stratégie : Reconnaissant la diversité des préférences des utilisateurs et des besoins alimentaires, notre application intègre une fonctionnalité de personnalisation robuste. Au-delà de la fourniture de données brutes, l’application vise à sensibiliser les utilisateurs aux implications nutritionnelles de leurs choix.
Mise en œuvre : les utilisateurs ressentent un sentiment d'appartenance et de connexion à mesure que l'application adapte ses informations pour les aligner sur leurs objectifs de santé individuels et leurs contraintes alimentaires. L'intégration d'un contenu concis et informatif dans l'application garantit que les utilisateurs comprennent l'importance des divers composants nutritionnels. Cet aspect éducatif transforme l'application en un outil d'apprentissage, favorisant une connexion plus profonde avec les utilisateurs cherchant à améliorer leurs connaissances nutritionnelles.
Stratégie : Pour capter l'attention des utilisateurs et communiquer efficacement les informations nutritionnelles clés, notre application utilise des images générées par l'IA.
Implémentation : Amazon Bedrock offre une expérience de développement prête à l'emploi en générant des représentations visuellement frappantes des produits numérisés. Si un produit contient trop de sucre, par exemple, l’image de l’IA l’entoure d’une représentation visuelle du sucre, servant de repère visuel engageant et mémorable.
Stratégie : Extraire les ingrédients de l'image, fonctionne bien sur les fruits et légumes.
Implémentation : Nous utilisons Anthropic Claude 3 Sonnet sur Amazon Bedrock avec ses capacités de vision pour extraire uniquement les éléments alimentaires de l'image. Cela nous permet de nous concentrer sur les éléments alimentaires et d'ignorer l'arrière-plan ou d'autres éléments de l'image. Claude 3 est un modèle multimodal capable de gérer à la fois du texte et des images. Le résultat est une liste d’ingrédients présents dans l’image.
Ingénierie d'invite : Pour exploiter tout le potentiel du modèle, nous utilisons une invite système. Une invite système est un moyen de fournir un contexte, des instructions et des lignes directrices à Claude avant de lui présenter une question ou une tâche. En utilisant une invite système, vous pouvez préparer le terrain pour la conversation, en spécifiant le rôle, la personnalité, le ton ou toute autre information pertinente de Claude qui l'aidera à mieux comprendre et à répondre aux commentaires de l'utilisateur.
system_prompt = "You have perfect vision and pay great attention to ingredients in each picture, you are very good at detecting food ingredients on images"
Stratégie : Générez 3 recettes à partir des ingrédients correspondants dans les images :
Mise en œuvre : Nous utilisons Claude 3 Sonnet pour générer les 3 recettes. Chaque recette contient les informations JSON suivantes :
{
"recipe_title" : " Succulent Grilled Cheese Sandwich " ,
"description" : " A classic comforting and flavorful dish, perfect for a quick meal " ,
"difficulty" : " easy " ,
"ingredients" : [ " bread " , " cheese " , " butter " ],
"additional_ingredients" : [ " ham " , " tomato " ],
"preparation_time" : 5 ,
"cooking_time" : 6
}
Stratégie : Générez une recette étape par étape que l'utilisateur doit suivre.
Implémentation : Nous utilisons Anthropic Claude 3 Haiku sur Amazon Bedrock pour générer la recette étape par étape. Les étapes sont diffusées en continu vers l'utilisateur pour réduire la latence de la réponse, nous exploitons le streaming d'URL lambda. Cette méthode garantit un accès plus fluide au contenu textuel, améliorant ainsi l’expérience utilisateur et l’interaction.
Le format de sortie est un fichier Markdown pour faciliter l'affichage de la recette sur le site. Cela simplifie également grandement l'analyse de la recette par le front-end lors de l'utilisation du mode streaming.
Choisir le bon modèle d'IA
Défi : La sélection du modèle linguistique (LM) a influencé de manière significative à la fois la latence et la qualité des réponses, posant un point de décision critique.
Solution : Suite à une évaluation complète de différents modèles, nous avons choisi les modèles Anthropic Claude suivants pour différents composants de l'application :
Utilisez le Lazy Loading pour réduire le coût/la bande passante
Défi : L’IA générative est coûteuse en prix et en bande passante. Nous voulions être économes et efficaces lors d’événements bondés.
Solution : L'utilisation du chargement paresseux avec la clé étant le hachage de l'invite nous permet de réduire les coûts et de fournir une réponse plus rapidement.
Ingénierie rapide pour la génération d'images IA
Défi : La création d'une invite permettant de générer des images d'IA mettant efficacement en évidence les caractéristiques nutritionnelles a posé un défi nuancé.
Solution : En tirant parti d'une approche en deux étapes, nous avons utilisé un premier LLM pour générer une invite basée sur les caractéristiques nutritionnelles du produit. Cette technique d'auto-interrogation (semblable à un processus d'auto-interrogation pour une base de données vectorielle) a été complétée par l'incorporation d'invites multi-shots. Cette méthode a considérablement amélioré la qualité et la pertinence des images générées, garantissant que les utilisateurs reçoivent des représentations visuellement convaincantes des caractéristiques du produit.
Complexité de la personnalisation des utilisateurs
Défi : Intégrer les préférences et restrictions alimentaires personnalisées dans le modèle présenté complexe.
Solution : Pour améliorer la compréhension du LLM, nous avons incorporé de manière dynamique un en-tête dans notre invite contenant des entrées personnalisées sur les allergies et le régime alimentaire. Cette approche a considérablement amélioré l'exactitude et la pertinence des réponses du LLM, garantissant ainsi une expérience sur mesure aux utilisateurs. Les invites personnalisées sont devenues la pierre angulaire de la fourniture d'informations précises et pertinentes basées sur les préférences individuelles.
Prise en charge multilingue
Challenge : Présenter l'application en plusieurs langues
Solution : la même invite est utilisée, mais le LLM est invité à générer la sortie dans une langue spécifique, en fonction des préférences linguistiques de l'utilisateur (anglais/français).
URL AWS Lambda et Amazon CloudFront
Défi : Appeler un LLM pour exécuter certaines tâches en mode réponse à une requête peut être lent.
Solution : pour résoudre le délai d'expiration de 30 secondes d'un point de terminaison API Gateway, l'approche sélectionnée consiste à utiliser une URL AWS Lambda via Amazon CloudFront. Au sein d'Amazon CloudFront, une fonction Lambda@Edge est déclenchée pour chaque requête, chargée de vérifier l'authentification de l'utilisateur auprès d'Amazon Cognito. Si l'authentification réussit, la fonction Lambda@Edge signe la demande à l'URL Lambda (qui utilise AWS_IAM
comme méthode d'authentification). Bien que l'utilisation d'une URL Lambda offre une solution réalisable, il est essentiel de reconnaître qu'opter pour AWS AppSync présente une alternative offrant des avantages supplémentaires. AWS AppSync propose une solution alternative, dotée de mécanismes d'authentification et d'autorisation intégrés qui répondent de manière transparente à ces besoins. Cependant, pour cette application de démonstration, nous avons choisi d'utiliser l'URL Lambda à la place.
Réponse synchrone/asynchrone d'Amazon Bedrock
Défi : L'obtention de la réponse d'Amazon Bedrock peut se produire soit en mode requête/réponse, soit en mode streaming, dans lequel Lambda lance la diffusion en continu de la réponse au lieu d'attendre que la réponse complète soit générée.
Solution : Certaines sections de l'application fonctionnent en mode requête/réponse (comme Product ingredients description
ou la récupération des trois propositions de recettes), tandis qu'une autre partie ( Product summary
, Getting the Step-by-Step Recipe
) utilise le mode streaming pour démontrer à la fois la mise en œuvre méthodes.
Cas d'utilisation illustrés de l'application GenAi
npm install
us-east-1
. cdk deploy
Avant d'accéder à l'application, assurez-vous d'avoir créé un compte utilisateur dans Amazon Cognito. Pour ce faire, accédez à la console AWS, puis à Amazon Cognito et localisez un groupe d'utilisateurs nommé quelque chose de similaire à AuthenticationFoodAnalyzerUserPoolXXX
.
Vérifiez les sorties de la pile pour une URL ressemblant à Food analyzer app.domainName
. Collez cette URL dans votre navigateur, connectez-vous avec l'utilisateur précédemment créé et commencez à profiter de l'application.
Vous pouvez exécuter cette application vite React localement en suivant ces étapes.
Suivez les instructions ci-dessus pour déployer l'application cdk.
Récupérez le aws-exports.json
à partir du point de terminaison de distribution Amazon CloudFront que vous avez obtenu à partir de la sortie CDK et enregistrez-le dans le dossier ./resources/ui/public/
.
L'URL ressemble à ceci :
https://dxxxxxxxxxxxx.cloudfront.net/aws-exports.json
cd resources/ui
npm run dev
Node JS 18+ doit être installé sur la machine de déploiement. (Instructions)
AWS CLI 2+ doit être installé sur la machine de déploiement. (Instructions)
Demander l'accès aux modèles Anthropic Claude et Stable Diffusion XL sur Amazon Bedrock
Ce projet est sous licence MIT-0. Voir le fichier LICENCE.