フード アナライザー アプリは、サーバーレス アーキテクチャと生成 AI 機能を使用して構築された、買い物や料理のレシピ用にパーソナライズされた GenAI 栄養 Web アプリです。これは、AWS ハッカソン フランス 2024 の優勝者として最初に作成され、その後 AWS Summit Paris 2024 のブース展示として紹介されました。
アプリのバックエンドは、次のような AWS サービスを使用して作成されます。
このアプリは、最小限のコードで拡張可能で、スケーラブルでコスト効率が高いように設計されています。遅延読み込みを使用してコストを削減し、最高のユーザー エクスペリエンスを保証します。
この展示は、生成 AI サービスを使用してインタラクティブなサーバーレス アプリケーションを作成するために開発されました。
パーソナライズされた製品情報: 製品に何が入っているのか、それがあなたにとって良いものなのか知りたいですか?アプリでバーコードをスキャンするだけで、成分/アレルゲンの説明リストと好みに基づいたパーソナライズされた概要が表示されます。
パーソナライズされたレシピ生成機能: 冷蔵庫内の食材の写真を撮影すると、アプリがそれらの食材を使用した好みに基づいたレシピを生成します。
アプリケーションのアーキテクチャは 4 つのブロックに分割できます。
実装: サーバー側ロジックに AWS Lambda、生成人工知能 (GenAI) 構築プラットフォームとして Amazon Bedrock、大規模言語モデル (LLM) として Anthropic Claude、画像生成用の拡散モデルとして StabilityAI の Stable Diffusion XL を使用します。
AI モデルの開発: LLM モデルの選択は、応答の品質と遅延に影響を与えました。最終的に、待ち時間と品質のバランスが適切であるとして、Anthropic Claude 3 Haiku を選択しました。
AI 生成画像: 画像の入力を求めるプロンプトは非常にデリケートであり、製品の栄養特徴を真に強調する画像を生成するのは困難でした。プロンプトを作成するために、最初の LLM を使用して、製品の栄養特性に基づいてプロンプトを生成しました。この手法は、ベクトル データベースの自己クエリに似ています。マルチショット プロンプト エンジニアリングの使用も、プロンプトの品質の向上に大きく役立ちました。
戦略: 「車輪の再発明はしない」
実装: バーコード スキャナは長い間存在しており、スタックと互換性のあるオープン ソース ライブラリを選択しました。時間の制約があるため、ライブラリの比較にはあまり時間を費やさず、完璧なプロトタイプを見つけることよりも、動作するプロトタイプを作成することに重点を置きました。 「完璧は善の敵である」。
戦略: ユーザーの好みや食事のニーズの多様性を認識し、当社のアプリには強力なパーソナライゼーション機能が組み込まれています。このアプリは、生データを提供するだけでなく、ユーザーの選択による栄養上の影響についてユーザーに教育することも目的としています。
実装: ユーザーは、アプリが個人の健康目標や食事制限に合わせて洞察を調整するため、当事者意識とつながりを感じます。アプリ内に簡潔で有益なコンテンツを組み込むことで、ユーザーはさまざまな栄養成分の重要性を確実に理解できます。この教育的側面により、アプリが学習ツールに変わり、栄養リテラシーの向上を目指すユーザーとのより深いつながりが促進されます。
戦略: ユーザーの注意を引き、重要な栄養情報を効果的に伝えるために、アプリでは AI が生成した画像を採用しています。
実装: Amazon Bedrock は、スキャンされた製品の視覚的に印象的な表現を生成するための、すぐに使える開発者エクスペリエンスを提供します。たとえば、製品に過剰な砂糖が含まれている場合、AI 画像が砂糖の視覚的な描写で製品を囲み、魅力的で記憶に残る視覚的な手がかりとして機能します。
戦略: 画像から成分を抽出し、果物や野菜に効果を発揮します。
実装: Amazon Bedrock の Anthropic Claude 3 Sonnet とそのビジョン機能を使用して、画像から食品要素のみを抽出します。これにより、画像内の背景やその他の要素を無視して、食べ物の要素に焦点を当てることができます。 Claude 3 は、テキストと画像の両方を処理できるマルチモーダル モデルです。出力は、画像内に存在する成分のリストです。
プロンプト エンジニアリング: モデルの可能性を最大限に活用するために、システム プロンプトを使用します。システム プロンプトは、クロードに質問やタスクを提示する前に、コンテキスト、指示、ガイドラインをクロードに提供する方法です。システム プロンプトを使用すると、クロードの役割、性格、口調、またはユーザーの入力をよりよく理解して応答するのに役立つその他の関連情報を指定して、会話の準備を整えることができます。
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"
戦略: 写真内で一致する材料から 3 つのレシピを生成します。
実装: Claude 3 Sonnet を使用して 3 つのレシピを生成します。各レシピには次の 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
}
戦略: ユーザーが従うためのステップバイステップのレシピを生成します。
実装: Amazon Bedrock の Anthropic Claude 3 Haiku を使用して、ステップバイステップのレシピを生成します。応答のレイテンシを短縮するために、ステップはユーザーにストリーミングされます。ラムダ URL ストリーミングを利用します。この方法により、テキスト コンテンツへのアクセスがよりスムーズになり、ユーザー エクスペリエンスと対話が向上します。
出力形式は、Web サイト上でのレシピの表示を容易にするための Markdown ファイルです。また、ストリーミング モードを使用する場合、フロントエンドによるレシピの解析が大幅に簡素化されます。
適切な AI モデルの選択
課題: 言語モデル (LM) の選択は、応答待ち時間と品質の両方に大きな影響を及ぼし、重要な決定点をもたらしました。
解決策: さまざまなモデルの包括的な評価に続いて、アプリ内のさまざまなコンポーネントに次の人間クロード モデルを選択しました。
遅延読み込みを使用してコスト/帯域幅を削減する
課題: 生成 AI は価格と帯域幅の点で高価です。私たちは、混雑したイベントで実行する際には、倹約と効率を重視しました。
解決策: プロンプトのハッシュであるキーを使用して遅延読み込みを使用すると、コストを削減し、応答をより速く提供できるようになります。
AI画像生成の迅速なエンジニアリング
課題: 栄養上の特徴を効果的に強調する AI 画像を生成するためのプロンプトを作成することは、微妙な課題を引き起こしました。
解決策: 2 段階のアプローチを活用し、最初の LLM を利用して製品の栄養特性に基づいたプロンプトを生成しました。この自己クエリ技術 (ベクトル データベースの自己クエリ プロセスに似ています) は、マルチショット プロンプトを組み込むことで補完されました。この方法により、生成された画像の品質と関連性が大幅に向上し、ユーザーが製品の特徴を視覚的に説得力のある表現で受け取ることができるようになりました。
ユーザーのパーソナライゼーションの複雑さ
課題: パーソナライズされた食事の好みと制限をモデルに統合すると、複雑さが生じます。
解決策: LLM の理解を強化するために、パーソナライズされたアレルギーと食事の入力を含むヘッダーをプロンプトに動的に組み込みました。このアプローチにより、LLM の応答の精度と関連性が大幅に向上し、ユーザーに合わせたエクスペリエンスが保証されました。パーソナライズされたプロンプトは、個人の好みに基づいて正確で関連性のある情報を提供するための基礎となりました。
多言語サポート
課題: アプリケーションを複数の言語で提示する
解決策: 同じプロンプトが使用されますが、LLM はユーザーの言語設定 (英語/フランス語) に合わせて特定の言語で出力を生成するように指示されます。
AWS Lambda URL と Amazon CloudFront
課題: 要求応答モードで一部のタスクを実行するために LLM を呼び出すと、時間がかかることがあります。
解決策: API Gateway エンドポイントの 30 秒のタイムアウトに対処するために、選択されたアプローチには、Amazon CloudFront 経由で AWS Lambda URL を利用することが含まれます。 Amazon CloudFront 内では、リクエストごとに Lambda@Edge 関数がトリガーされ、Amazon Cognito に対するユーザー認証を検証します。認証が成功すると、Lambda@Edge 関数は Lambda URL へのリクエストに署名します (認証方法としてAWS_IAM
使用します)。 Lambda URL の利用は実現可能なソリューションを提供しますが、AWS AppSync を選択することで追加のメリットが得られる代替手段があることを認識することが重要です。 AWS AppSync は、これらのニーズをシームレスに満たす組み込みの認証および認可メカニズムを備えた代替ソリューションを提供します。ただし、このデモアプリでは、代わりに Lambda URL を使用することを選択しました。
Amazon Bedrock の同期/非同期応答
課題: Amazon Bedrock からの応答の取得は、リクエスト/応答モードまたはストリーミング モードで実行できます。この場合、Lambda は、応答全体が生成されるのを待つのではなく、応答のストリーミングを開始します。
解決策: アプリケーションの一部のセクションはリクエスト/レスポンス モード ( Product ingredients description
や 3 つのレシピ提案の取得など) で動作しますが、別の部分 ( Product summary
、 Getting the Step-by-Step Recipe
) は両方の実装を示すためにストリーミング モードを採用しています。メソッド。
GenAi アプリケーションの使用例の図解
npm install
us-east-1
リージョンにデプロイします。 cdk deploy
アプリケーションにアクセスする前に、Amazon Cognito でユーザー アカウントを確立していることを確認してください。これを行うには、AWS コンソール、Amazon Cognito に移動し、 AuthenticationFoodAnalyzerUserPoolXXX
のような名前のユーザー プールを見つけます。
スタック出力でFood analyzer app.domainName
に似た URL を確認します。この URL をブラウザに貼り付け、以前に作成したユーザーでログインし、アプリをお楽しみください。
次の手順に従って、この vite React アプリをローカルで実行できます。
上記の手順に従って、cdk アプリをデプロイします。
CDK 出力から取得した Amazon CloudFront ディストリビューション エンドポイントからaws-exports.json
を取得し、 ./resources/ui/public/
/public/ フォルダーに保存します。
URL は次のようなものです。
https://dxxxxxxxxxxxx.cloudfront.net/aws-exports.json
cd resources/ui
npm run dev
Node JS 18+ がデプロイメント マシンにインストールされている必要があります。 (説明書)
AWS CLI 2+ がデプロイメントマシンにインストールされている必要があります。 (説明書)
Amazon Bedrock で Anthropic Claude モデルと Stable Diffusion XL へのアクセスをリクエストする
このプロジェクトは、MIT-0 ライセンスに基づいてライセンスされています。 LICENSE ファイルを参照してください。