La aplicación de análisis de alimentos es una aplicación web nutricional GenAI personalizada para sus compras y recetas de cocina creada con arquitectura sin servidor y capacidades de IA generativa. Se creó por primera vez como ganador del AWS Hackathon France 2024 y luego se presentó como un stand de exhibición en la AWS Summit Paris 2024.
El back-end de la aplicación se realiza utilizando servicios de AWS como:
La aplicación está diseñada para tener un código mínimo, ser extensible, escalable y rentable. Utiliza Lazy Loading para reducir costos y garantizar la mejor experiencia de usuario.
Desarrollamos esta exhibición para crear una aplicación interactiva sin servidor utilizando servicios de IA generativa.
Información personalizada del producto : ¿Tiene curiosidad por saber qué contiene un producto y si es bueno para usted? Simplemente escanee el código de barras con la aplicación para obtener una lista explicada de ingredientes/alérgenos y un resumen personalizado según sus preferencias.
Generador de recetas personalizado : tome una foto de los ingredientes en su refrigerador y la aplicación generará recetas basadas en sus preferencias utilizando esos ingredientes.
La arquitectura de la aplicación se puede dividir en 4 bloques:
Implementación : uso de AWS Lambda para la lógica del lado del servidor, Amazon Bedrock como plataforma de construcción de inteligencia artificial generativa (GenAI), Anthropic Claude como Large Language Models (LLM) y Stable Diffusion XL de StabilityAI como modelo de difusión para generar imágenes.
Desarrollo del modelo de IA : la elección del modelo LLM tuvo un impacto en la calidad y la latencia de la respuesta. Al final, elegimos Anthropic Claude 3 Haiku por su buena relación entre latencia y calidad.
Imágenes generadas por IA : solicitar una imagen es muy sensible y fue un desafío generar una imagen que realmente resalte las características nutritivas de los productos. Para elaborar el mensaje, utilizamos un primer LLM para generar el mensaje en función de las características nutritivas del producto. Esta técnica es similar a la autoconsulta de bases de datos vectoriales. El uso de ingeniería de avisos de múltiples disparos también ayudó mucho a mejorar la calidad del aviso.
Estrategia : "No reinventar la rueda"
Implementación : los lectores de códigos de barras existen desde hace mucho tiempo, elegimos una biblioteca de código abierto que era compatible con nuestra pila. Debido a las limitaciones de tiempo, no dedicamos mucho tiempo a comparar bibliotecas, centrándonos en tener un prototipo funcional en lugar de encontrar el perfecto. "Lo perfecto es enemigo de lo bueno".
Estrategia : reconociendo la diversidad de preferencias de los usuarios y necesidades dietéticas, nuestra aplicación incorpora una sólida función de personalización. Más allá de proporcionar datos sin procesar, la aplicación pretende educar a los usuarios sobre las implicaciones nutricionales de sus elecciones.
Implementación : los usuarios sienten una sensación de propiedad y conexión a medida que la aplicación adapta sus conocimientos para alinearse con sus objetivos de salud individuales y limitaciones dietéticas. La incorporación de contenido conciso e informativo dentro de la aplicación garantiza que los usuarios comprendan la importancia de los diversos componentes nutricionales. Este aspecto educativo transforma la aplicación en una herramienta de aprendizaje, fomentando una conexión más profunda con los usuarios que buscan mejorar sus conocimientos nutricionales.
Estrategia : para captar la atención de los usuarios y comunicar información nutricional clave de forma eficaz, nuestra aplicación emplea imágenes generadas por IA.
Implementación : Amazon Bedrock ofrece una experiencia de desarrollador lista para usar al generar representaciones visualmente impactantes de productos escaneados. Si un producto contiene exceso de azúcar, por ejemplo, la imagen de IA lo rodea con una representación visual del azúcar, lo que sirve como una señal visual atractiva y memorable.
Estrategia : Extrae ingredientes de la imagen, funciona bien con frutas y verduras.
Implementación : utilizamos Anthropic Claude 3 Sonnet en Amazon Bedrock con sus capacidades de visión para extraer solo elementos alimentarios de la imagen. Esto nos permite centrarnos en los elementos de la comida e ignorar el fondo u otros elementos de la imagen. Claude 3 es un modelo multimodal que puede manejar tanto texto como imágenes. El resultado es una lista de ingredientes presentes en la imagen.
Ingeniería de avisos : para explotar todo el potencial del modelo, utilizamos un aviso del sistema. Un mensaje del sistema es una forma de proporcionar contexto, instrucciones y pautas a Claude antes de presentarle una pregunta o tarea. Al utilizar un mensaje del sistema, puede preparar el escenario para la conversación, especificando el rol, la personalidad, el tono o cualquier otra información relevante de Claude que le ayudará a comprender y responder mejor a las aportaciones del usuario.
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"
Estrategia : Genera 3 recetas a partir de los ingredientes que coinciden en las imágenes:
Implementación : utilizamos Claude 3 Sonnet para generar las 3 recetas. Cada receta contiene la siguiente información JSON:
{
"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
}
Estrategia : Generar una receta paso a paso para que la siga el usuario.
Implementación : utilizamos Anthropic Claude 3 Haiku en Amazon Bedrock para generar la receta paso a paso. Los pasos se transmiten al usuario para reducir la latencia de la respuesta; aprovechamos la transmisión de URL lambda. Este método garantiza un acceso más fluido al contenido de texto, mejorando la experiencia y la interacción del usuario.
El formato de salida es un archivo Markdown para facilitar la visualización de la receta en el sitio web. También simplifica enormemente el análisis de la receta por parte del front-end cuando se utiliza el modo de transmisión.
Elegir el modelo de IA adecuado
Desafío : La selección del modelo de lenguaje (LM) influyó significativamente tanto en la latencia como en la calidad de la respuesta, lo que plantea un punto de decisión crítico.
Solución : Después de una evaluación exhaustiva de varios modelos, hemos elegido los siguientes modelos de Anthropic Claude para diferentes componentes dentro de la aplicación:
Utilice Lazy Loading para reducir el costo/ancho de banda
Desafío : La IA generativa es costosa en precio y ancho de banda. Queríamos ser frugales y eficientes al realizar eventos llenos de gente.
Solución : el uso de la carga diferida con la clave como hash del mensaje nos permite reducir costos y brindar una respuesta más rápida.
Ingeniería rápida para la generación de imágenes de IA
Desafío : crear un mensaje para generar imágenes de IA que resaltaran de manera efectiva las características nutricionales planteó un desafío lleno de matices.
Solución : Aprovechando un enfoque de dos pasos, utilizamos un primer LLM para generar un mensaje basado en las características nutricionales del producto. Esta técnica de autoconsulta (similar a un proceso de autoconsulta para una base de datos vectorial) se complementó con la incorporación de indicaciones de múltiples disparos. Este método mejoró significativamente la calidad y relevancia de las imágenes generadas, asegurando que los usuarios recibieran representaciones visualmente atractivas de las características del producto.
Complejidad de personalización del usuario
Desafío : integrar preferencias y restricciones dietéticas personalizadas en el modelo presentaba complejidad.
Solución : para mejorar la comprensión del LLM, incorporamos dinámicamente un encabezado en nuestro mensaje que contiene entradas personalizadas sobre alergias y dietas. Este enfoque mejoró significativamente la precisión y relevancia de las respuestas del LLM, asegurando una experiencia personalizada para los usuarios. Las indicaciones personalizadas se convirtieron en la piedra angular a la hora de ofrecer información precisa y relevante basada en las preferencias individuales.
Soporte en varios idiomas
Desafío : Presentar la aplicación en varios idiomas.
Solución : se utiliza el mismo mensaje, pero se le indica al LLM que genere el resultado en un idioma específico, atendiendo a la preferencia de idioma del usuario (inglés/francés).
URL de AWS Lambda y Amazon CloudFront
Desafío : llamar a un LLM para ejecutar algunas tareas en un modo de respuesta de solicitud puede ser lento.
Solución : para abordar el tiempo de espera de 30 segundos de un punto final de API Gateway, el enfoque seleccionado implica utilizar una URL de AWS Lambda a través de Amazon CloudFront. Dentro de Amazon CloudFront, se activa una función Lambda@Edge para cada solicitud, responsable de verificar la autenticación del usuario con Amazon Cognito. Si la autenticación se realiza correctamente, la función Lambda@Edge firma la solicitud en la URL de Lambda (que utiliza AWS_IAM
como método de autenticación). Si bien utilizar una URL Lambda ofrece una solución factible, es esencial reconocer que optar por AWS AppSync presenta una alternativa que ofrece beneficios adicionales. AWS AppSync ofrece una solución alternativa, que incluye mecanismos de autenticación y autorización integrados que satisfacen perfectamente estas necesidades. Sin embargo, para esta aplicación de demostración, optamos por utilizar la URL de Lambda.
Respuesta sincrónica/asincrónica de Amazon Bedrock
Desafío : la obtención de la respuesta de Amazon Bedrock puede ocurrir en modo de solicitud/respuesta o en modo de transmisión, en el que Lambda inicia la transmisión de la respuesta en lugar de esperar a que se genere la respuesta completa.
Solución : algunas secciones de la aplicación funcionan en modo de solicitud/respuesta (como Product ingredients description
o la recuperación de las tres propuestas de recetas), mientras que otra parte ( Product summary
, Getting the Step-by-Step Recipe
) emplea el modo de transmisión para demostrar ambas implementaciones. métodos.
Casos de uso ilustrados de la aplicación GenAi
npm install
us-east-1
. cdk deploy
Antes de acceder a la aplicación, asegúrese de haber establecido una cuenta de usuario en Amazon Cognito. Para lograr esto, navegue hasta la consola de AWS, luego a Amazon Cognito y busque un grupo de usuarios con un nombre similar a AuthenticationFoodAnalyzerUserPoolXXX
.
Verifique las salidas de la pila para encontrar una URL que se parezca a Food analyzer app.domainName
. Pega esta URL en tu navegador, inicia sesión con el usuario creado previamente y comienza a disfrutar de la aplicación.
Puede ejecutar esta aplicación vite reaccionar localmente siguiendo estos pasos.
Siga las instrucciones anteriores para implementar la aplicación cdk.
Tome aws-exports.json
del punto final de distribución de Amazon CloudFront que obtuvo de la salida del CDK y guárdelo en la carpeta ./resources/ui/public/
.
La URL es algo así como:
https://dxxxxxxxxxxxx.cloudfront.net/aws-exports.json
cd resources/ui
npm run dev
Node JS 18+ debe estar instalado en la máquina de implementación. (Instrucciones)
AWS CLI 2+ debe estar instalado en la máquina de implementación. (Instrucciones)
Solicite acceso a los modelos Anthropic Claude y Stable Diffusion XL en Amazon Bedrock
Este proyecto tiene la licencia MIT-0. Ver el archivo de LICENCIA.