O aplicativo analisador de alimentos é um aplicativo da web nutricional GenAI personalizado para suas compras e receitas culinárias, criado com arquitetura sem servidor e recursos de IA generativos. Ele foi criado inicialmente como vencedor do AWS Hackathon France 2024 e depois apresentado como um estande no AWS Summit Paris 2024.
O back-end do aplicativo é feito usando serviços AWS como:
O aplicativo foi projetado para ter código mínimo, ser extensível, escalonável e econômico. Ele usa Lazy Load para reduzir custos e garantir a melhor experiência do usuário.
Desenvolvemos esta exposição para criar um aplicativo interativo sem servidor usando serviços generativos de IA.
Informações personalizadas sobre o produto : Curioso para saber o que há em um produto e se ele é bom para você? Basta digitalizar o código de barras com o aplicativo para obter uma lista explicada de ingredientes/alérgenos e um resumo personalizado com base em suas preferências.
Gerador de receitas personalizadas : tire uma foto dos ingredientes em sua geladeira e o aplicativo irá gerar receitas com base em suas preferências usando esses ingredientes.
A arquitetura da aplicação pode ser dividida em 4 blocos:
Implementação : usando AWS Lambda para lógica do lado do servidor, Amazon Bedrock como plataforma de construção de inteligência artificial generativa (GenAI), Anthropic Claude como Large Language Models (LLM) e Stable Diffusion XL da StabilityAI como modelo de difusão para geração de imagens.
Desenvolvimento de modelo de IA : a escolha do modelo LLM teve impacto na qualidade e latência da resposta. Por fim, escolhemos o Anthropic Claude 3 Haiku como uma boa relação entre latência e qualidade.
Imagens geradas por IA : solicitar uma imagem é muito sensível e foi um desafio gerar uma imagem que realmente destaque as características nutritivas dos produtos. Para elaborar o prompt, usamos um primeiro LLM para gerar o prompt com base nas características nutritivas do produto. Esta técnica é semelhante à autoconsulta para bancos de dados vetoriais. Usar a engenharia de prompt multi-shot também ajudou muito a melhorar a qualidade do prompt.
Estratégia : “Não reinventar a roda”
Implementação : Os leitores de código de barras já existem há muito tempo, escolhemos uma biblioteca de código aberto que fosse compatível com nossa pilha. Com a restrição de tempo, não perdemos muito tempo comparando bibliotecas, focando em ter um protótipo funcional em vez de encontrar o perfeito. “O perfeito é inimigo do bom”.
Estratégia : Reconhecendo a diversidade de preferências dos usuários e necessidades alimentares, nosso aplicativo incorpora um recurso robusto de personalização. Além de fornecer dados brutos, o aplicativo visa educar os usuários sobre as implicações nutricionais de suas escolhas.
Implementação : os usuários sentem uma sensação de propriedade e conexão à medida que o aplicativo adapta seus insights para se alinhar com seus objetivos individuais de saúde e restrições alimentares. A incorporação de conteúdo conciso e informativo no aplicativo garante que os usuários entendam o significado de vários componentes nutricionais. Esta vertente educativa transforma a aplicação numa ferramenta de aprendizagem, promovendo uma ligação mais profunda com os utilizadores que procuram melhorar a sua literacia nutricional.
Estratégia : Para cativar a atenção dos usuários e comunicar informações nutricionais importantes de maneira eficaz, nosso aplicativo emprega imagens geradas por IA.
Implementação : o Amazon Bedrock oferece uma experiência de desenvolvedor pronta para uso na geração de representações visualmente impressionantes de produtos digitalizados. Se um produto contém açúcar excessivo, por exemplo, a imagem de IA envolve-o com uma representação visual de açúcar, servindo como uma dica visual envolvente e memorável.
Estratégia : Extraia ingredientes da imagem, funciona bem com frutas e vegetais.
Implementação : Usamos o Anthropic Claude 3 Sonnet no Amazon Bedrock com seus recursos de visão para extrair apenas elementos alimentares da imagem. Isso nos permite focar nos elementos alimentares e ignorar o fundo ou outros elementos da imagem. Claude 3 é um modelo multimodal que pode lidar com texto e imagens. A saída é uma lista de ingredientes presentes na imagem.
Prompt Engineering : Para explorar todo o potencial do modelo, usamos um prompt do sistema. Um prompt do sistema é uma forma de fornecer contexto, instruções e diretrizes a Claude antes de apresentar-lhe uma pergunta ou tarefa. Usando um prompt do sistema, você pode definir o cenário para a conversa, especificando a função, a personalidade, o tom de Claude ou qualquer outra informação relevante que o ajudará a compreender e responder melhor à entrada do usuário.
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"
Estratégia : Gere 3 receitas a partir dos ingredientes correspondentes nas imagens:
Implementação : Usamos Claude 3 Sonnet para gerar as 3 receitas. Cada receita contém as seguintes informações 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
}
Estratégia : Gere uma receita passo a passo para o usuário seguir.
Implementação : Usamos Anthropic Claude 3 Haiku no Amazon Bedrock para gerar a receita passo a passo. As etapas são transmitidas ao usuário para reduzir a latência da resposta. Aproveitamos o streaming de URL lambda. Este método garante um acesso mais fácil ao conteúdo de texto, melhorando a experiência e a interação do usuário.
O formato de saída é um arquivo Markdown para facilitar a exibição da receita no site. Também simplifica muito a análise da receita pelo front-end ao usar o modo de streaming.
Escolhendo o modelo de IA certo
Desafio : A seleção do Modelo de Linguagem (LM) influenciou significativamente a latência e a qualidade da resposta, representando um ponto de decisão crítico.
Solução : Após uma avaliação abrangente de vários modelos, escolhemos os seguintes modelos Antrópicos de Claude para diferentes componentes do aplicativo:
Use o Lazy Load para reduzir custo/largura de banda
Desafio : A IA generativa é cara em preço e largura de banda. Queríamos ser frugais e eficientes ao realizar eventos lotados.
Solução : Usar o carregamento lento com a chave sendo o hash do prompt nos permite reduzir custos e entregar uma resposta mais rápida.
Engenharia imediata para geração de imagens de IA
Desafio : Elaborar um prompt para gerar imagens de IA que destacassem efetivamente as características nutricionais representou um desafio diferenciado.
Solução : Aproveitando uma abordagem em duas etapas, utilizamos um primeiro LLM para gerar um prompt com base nas características nutricionais do produto. Essa técnica de autoconsulta (semelhante a um processo de autoconsulta para um banco de dados vetorial) foi complementada pela incorporação de prompts multi-shot. Este método melhorou significativamente a qualidade e a relevância das imagens geradas, garantindo que os usuários recebessem representações visualmente atraentes dos recursos do produto.
Complexidade de personalização do usuário
Desafio : Integrar preferências e restrições alimentares personalizadas no modelo apresentou complexidade.
Solução : Para melhorar a compreensão do LLM, incorporamos dinamicamente um cabeçalho em nosso prompt contendo informações personalizadas sobre alergia e dieta. Esta abordagem melhorou significativamente a precisão e a relevância das respostas do LLM, garantindo uma experiência personalizada para os utilizadores. Os prompts personalizados tornaram-se a base para fornecer informações precisas e relevantes com base nas preferências individuais.
Suporte multilíngue
Desafio : Apresentar a aplicação em vários idiomas
Solução : O mesmo prompt é utilizado, mas o LLM é instruído a gerar a saída em um idioma específico, atendendo à preferência de idioma do usuário (inglês/francês).
URL do AWS Lambda e Amazon CloudFront
Desafio : Chamar um LLM para executar algumas tarefas em modo de resposta de solicitação pode ser lento.
Solução : para resolver o tempo limite de 30 segundos de um endpoint do API Gateway, a abordagem selecionada envolve a utilização de um URL do AWS Lambda por meio do Amazon CloudFront. No Amazon CloudFront, uma função Lambda@Edge é acionada para cada solicitação, responsável por verificar a autenticação do usuário no Amazon Cognito. Se a autenticação for bem-sucedida, a função Lambda@Edge assina a solicitação para o URL do Lambda (que utiliza AWS_IAM
como método de autenticação). Embora a utilização de um URL Lambda ofereça uma solução viável, é essencial reconhecer que optar pelo AWS AppSync apresenta uma alternativa que oferece benefícios adicionais. O AWS AppSync oferece uma solução alternativa, com mecanismos integrados de autenticação e autorização que atendem perfeitamente a essas necessidades. No entanto, para este aplicativo de demonstração, optamos por usar o URL Lambda.
Resposta síncrona/assíncrona do Amazon Bedrock
Desafio : A obtenção da resposta do Amazon Bedrock pode ocorrer em modo de solicitação/resposta ou em modo de streaming, em que o Lambda inicia o streaming da resposta em vez de aguardar a geração de toda a resposta.
Solução : Algumas seções do aplicativo operam no modo solicitação/resposta (como Product ingredients description
ou a recuperação das três propostas de receitas), enquanto outra parte ( Product summary
, Getting the Step-by-Step Recipe
) emprega o modo de streaming para demonstrar a implementação. métodos.
Casos de uso ilustrados do aplicativo GenAi
npm install
us-east-1
. cdk deploy
Antes de acessar o aplicativo, certifique-se de ter estabelecido uma conta de usuário no Amazon Cognito. Para fazer isso, navegue até o Console AWS, depois Amazon Cognito e localize um grupo de usuários com nome semelhante a AuthenticationFoodAnalyzerUserPoolXXX
.
Verifique as saídas da pilha para um URL semelhante Food analyzer app.domainName
. Cole esta URL em seu navegador, faça login com o usuário criado anteriormente e comece a desfrutar do aplicativo.
Você pode executar este aplicativo vite react localmente seguindo estas etapas.
Siga as instruções acima para implantar o aplicativo cdk.
Pegue o aws-exports.json
do endpoint de distribuição do Amazon CloudFront obtido na saída do CDK e salve-o na pasta ./resources/ui/public/
.
A URL é algo como:
https://dxxxxxxxxxxxx.cloudfront.net/aws-exports.json
cd resources/ui
npm run dev
O nó JS 18+ deve ser instalado na máquina de implantação. (Instruções)
AWS CLI 2+ deve ser instalado na máquina de implantação. (Instruções)
Solicite acesso aos modelos Anthropic Claude e Stable Diffusion XL no Amazon Bedrock
Este projeto está licenciado sob a licença MIT-0. Veja o arquivo LICENÇA.