Die Food-Analysator-App ist eine personalisierte GenAI-Ernährungs-Webanwendung für Ihre Einkaufs- und Kochrezepte, die auf serverloser Architektur und generativen KI-Funktionen basiert. Es wurde zunächst als Gewinner des AWS Hackathon France 2024 erstellt und dann als Standausstellung auf dem AWS Summit Paris 2024 vorgestellt.
Das Back-End der App wird mithilfe von AWS-Diensten erstellt, wie zum Beispiel:
Die App ist so konzipiert, dass sie nur minimalen Code benötigt, erweiterbar, skalierbar und kosteneffizient ist. Es nutzt Lazy Loading, um die Kosten zu senken und das beste Benutzererlebnis zu gewährleisten.
Wir haben dieses Exponat entwickelt, um eine interaktive serverlose Anwendung mithilfe generativer KI-Dienste zu erstellen.
Personalisierte Produktinformationen : Sind Sie neugierig, was in einem Produkt enthalten ist und ob es gut für Sie ist? Scannen Sie einfach den Barcode mit der App, um eine erläuterte Liste der Inhaltsstoffe/Alergene und eine personalisierte Zusammenfassung basierend auf Ihren Vorlieben zu erhalten.
Personalisierter Rezeptgenerator : Machen Sie ein Foto der Zutaten in Ihrem Kühlschrank und die App generiert anhand dieser Zutaten Rezepte basierend auf Ihren Vorlieben.
Die Architektur der Anwendung kann in 4 Blöcke unterteilt werden:
Implementierung : Verwendung von AWS Lambda für serverseitige Logik, Amazon Bedrock als Plattform zum Aufbau generativer künstlicher Intelligenz (GenAI), Anthropic Claude als Large Language Models (LLM) und Stable Diffusion XL von StabilityAI als Diffusionsmodell zur Generierung von Bildern.
KI-Modellentwicklung : Die Wahl des LLM-Modells hatte Auswirkungen auf die Antwortqualität und die Latenz. Letztendlich haben wir uns für Anthropic Claude 3 Haiku entschieden, da das Verhältnis zwischen Latenz und Qualität gut ist.
KI-generierte Bilder : Die Aufforderung zur Eingabe eines Bildes ist sehr heikel und es war eine Herausforderung, ein Bild zu erstellen, das die Nährwerte von Produkten wirklich hervorhebt. Um die Eingabeaufforderung zu erstellen, haben wir ein erstes LLM verwendet, um die Eingabeaufforderung basierend auf den Nährwertmerkmalen des Produkts zu generieren. Diese Technik ähnelt einer Selbstabfrage für Vektordatenbanken. Auch der Einsatz von Multi-Shot-Prompt-Engineering trug wesentlich zur Verbesserung der Qualität des Prompts bei.
Strategie : „Das Rad nicht neu erfinden“
Implementierung : Barcodescanner gibt es schon seit langem, wir haben eine Open-Source-Bibliothek ausgewählt, die mit unserem Stack kompatibel ist. Aus Zeitgründen haben wir nicht viel Zeit mit dem Bibliotheksvergleich verbracht und uns eher darauf konzentriert, einen funktionierenden Prototyp zu haben, als den perfekten zu finden. „Das Perfekte ist der Feind des Guten.“
Strategie : Unsere App berücksichtigt die Vielfalt der Benutzerpräferenzen und Ernährungsbedürfnisse und verfügt über eine robuste Personalisierungsfunktion. Über die Bereitstellung von Rohdaten hinaus zielt die App darauf ab, Benutzer über die ernährungsphysiologischen Auswirkungen ihrer Entscheidungen aufzuklären.
Umsetzung : Benutzer spüren ein Gefühl der Eigenverantwortung und Verbundenheit, während die App ihre Erkenntnisse an ihre individuellen Gesundheitsziele und Ernährungsbeschränkungen anpasst. Durch die Integration prägnanter und informativer Inhalte in die App wird sichergestellt, dass Benutzer die Bedeutung verschiedener Ernährungskomponenten verstehen. Dieser pädagogische Aspekt verwandelt die App in ein Lernwerkzeug und fördert eine tiefere Verbindung mit Benutzern, die ihre Ernährungskompetenz verbessern möchten.
Strategie : Um die Aufmerksamkeit der Benutzer zu fesseln und wichtige Nährwertinformationen effektiv zu kommunizieren, verwendet unsere App KI-generierte Bilder.
Implementierung : Amazon Bedrock bietet eine sofort einsatzbereite Entwicklererfahrung bei der Erstellung visuell ansprechender Darstellungen gescannter Produkte. Wenn ein Produkt beispielsweise zu viel Zucker enthält, umgibt das KI-Bild es mit einer visuellen Darstellung von Zucker und dient so als ansprechender und einprägsamer visueller Hinweis.
Strategie : Zutaten aus dem Bild extrahieren, funktioniert gut bei Obst und Gemüse.
Implementierung : Wir verwenden Anthropic Claude 3 Sonnet auf Amazon Bedrock mit seinen Vision-Funktionen, um nur Lebensmittelelemente aus dem Bild zu extrahieren. Dadurch können wir uns auf die Lebensmittelelemente konzentrieren und den Hintergrund oder andere Elemente im Bild ignorieren. Claude 3 ist ein multimodales Modell, das sowohl Text als auch Bilder verarbeiten kann. Die Ausgabe ist eine Liste der im Bild vorhandenen Zutaten.
Prompt Engineering : Um das volle Potenzial des Modells auszuschöpfen, verwenden wir einen System-Prompt. Eine Systemaufforderung ist eine Möglichkeit, Claude Kontext, Anweisungen und Richtlinien bereitzustellen, bevor ihm eine Frage oder Aufgabe gestellt wird. Durch die Verwendung einer Systemeingabeaufforderung können Sie den Rahmen für das Gespräch festlegen, indem Sie Claudes Rolle, Persönlichkeit, Tonfall oder andere relevante Informationen angeben, die ihm helfen, die Eingaben des Benutzers besser zu verstehen und darauf zu reagieren.
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"
Strategie : Generieren Sie 3 Rezepte aus den auf den Bildern passenden Zutaten:
Implementierung : Wir verwenden Claude 3 Sonnet, um die 3 Rezepte zu generieren. Jedes Rezept enthält die folgenden JSON-Informationen:
{
"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
}
Strategie : Erstellen Sie ein Schritt-für-Schritt-Rezept, dem der Benutzer folgen kann.
Umsetzung : Wir verwenden Anthropic Claude 3 Haiku auf Amazon Bedrock, um das Schritt-für-Schritt-Rezept zu erstellen. Die Schritte werden an den Benutzer gestreamt, um die Latenz der Antwort zu reduzieren. Wir nutzen Lambda-URL-Streaming. Diese Methode gewährleistet einen reibungsloseren Zugriff auf Textinhalte und verbessert die Benutzererfahrung und Interaktion.
Das Ausgabeformat ist eine Markdown-Datei, um die Anzeige des Rezepts auf der Website zu erleichtern. Es vereinfacht auch das Parsen des Rezepts durch das Frontend erheblich, wenn der Streaming-Modus verwendet wird.
Auswahl des richtigen KI-Modells
Herausforderung : Die Auswahl des Sprachmodells (LM) beeinflusste sowohl die Antwortlatenz als auch die Qualität erheblich und stellte einen entscheidenden Entscheidungspunkt dar.
Lösung : Nach einer umfassenden Bewertung verschiedener Modelle haben wir die folgenden Anthropic Claude-Modelle für verschiedene Komponenten innerhalb der App ausgewählt:
Verwenden Sie Lazy Loading, um Kosten/Bandbreite zu reduzieren
Herausforderung : Generative KI ist in Bezug auf Preis und Bandbreite teuer. Wir wollten bei überfüllten Veranstaltungen sparsam und effizient sein.
Lösung : Durch die Verwendung von Lazy Loading, wobei der Schlüssel der Hash der Eingabeaufforderung ist, können wir die Kosten senken und die Antwort schneller liefern.
Prompt Engineering für die KI-Bilderzeugung
Herausforderung : Die Erstellung einer Eingabeaufforderung zur Generierung von KI-Bildern, die Ernährungsmerkmale effektiv hervorhebt, stellte eine nuancierte Herausforderung dar.
Lösung : Mithilfe eines zweistufigen Ansatzes nutzten wir ein erstes LLM, um eine Eingabeaufforderung basierend auf den Nährwertmerkmalen des Produkts zu generieren. Diese Selbstabfragetechnik (ähnlich einem Selbstabfrageprozess für eine Vektordatenbank) wurde durch die Integration von Multi-Shot-Prompts ergänzt. Diese Methode verbesserte die Qualität und Relevanz der generierten Bilder erheblich und stellte sicher, dass Benutzer visuell ansprechende Darstellungen der Produktmerkmale erhielten.
Komplexität der Benutzerpersonalisierung
Herausforderung : Integration personalisierter Ernährungspräferenzen und -beschränkungen in das dargestellte komplexe Modell.
Lösung : Um das Verständnis des LLM zu verbessern, haben wir dynamisch eine Kopfzeile in unsere Eingabeaufforderung eingefügt, die personalisierte Eingaben zu Allergien und Ernährung enthält. Dieser Ansatz verbesserte die Genauigkeit und Relevanz der LLM-Antworten erheblich und sorgte so für ein maßgeschneidertes Erlebnis für die Benutzer. Personalisierte Eingabeaufforderungen wurden zu einem Eckpfeiler für die Bereitstellung präziser und relevanter Informationen auf der Grundlage individueller Vorlieben.
Unterstützung mehrerer Sprachen
Herausforderung : Präsentieren Sie die Anwendung in mehreren Sprachen
Lösung : Es wird die gleiche Eingabeaufforderung verwendet, der LLM wird jedoch angewiesen, die Ausgabe in einer bestimmten Sprache zu generieren und so auf die Sprachpräferenz des Benutzers (Englisch/Französisch) einzugehen.
AWS Lambda-URL und Amazon CloudFront
Herausforderung : Der Aufruf eines LLM zur Ausführung einiger Aufgaben in einem Anforderungs-Antwort-Modus kann langsam sein.
Lösung : Um die 30-Sekunden-Zeitüberschreitung eines API-Gateway-Endpunkts zu beheben, umfasst der ausgewählte Ansatz die Verwendung einer AWS Lambda-URL über Amazon CloudFront. Innerhalb von Amazon CloudFront wird für jede Anfrage eine Lambda@Edge-Funktion ausgelöst, die für die Überprüfung der Benutzerauthentifizierung gegenüber Amazon Cognito verantwortlich ist. Wenn die Authentifizierung erfolgreich ist, signiert die Lambda@Edge-Funktion die Anfrage an die Lambda-URL (die AWS_IAM
als Authentifizierungsmethode verwendet). Während die Verwendung einer Lambda-URL eine praktikable Lösung darstellt, ist es wichtig anzuerkennen, dass die Entscheidung für AWS AppSync eine Alternative mit zusätzlichen Vorteilen darstellt. AWS AppSync bietet eine alternative Lösung mit integrierten Authentifizierungs- und Autorisierungsmechanismen, die diese Anforderungen nahtlos erfüllen. Für diese Demo-App haben wir uns jedoch stattdessen für die Verwendung der Lambda-URL entschieden.
Synchrone/asynchrone Antwort von Amazon Bedrock
Herausforderung : Das Erhalten der Antwort von Amazon Bedrock kann entweder in einem Anforderungs-/Antwortmodus oder in einem Streaming-Modus erfolgen, wobei der Lambda das Streamen der Antwort initiiert, anstatt darauf zu warten, dass die gesamte Antwort generiert wird.
Lösung : Einige Abschnitte der Anwendung arbeiten im Anfrage-/Antwortmodus (z. B. Product ingredients description
oder das Abrufen der drei Rezeptvorschläge), während ein anderer Teil ( Product summary
, Getting the Step-by-Step Recipe
) den Streaming-Modus verwendet, um beide Implementierungen zu demonstrieren Methoden.
Illustrierte Anwendungsfälle der GenAi-Anwendung
npm install
us-east-1
bereit. cdk deploy
Stellen Sie vor dem Zugriff auf die Anwendung sicher, dass Sie ein Benutzerkonto in Amazon Cognito eingerichtet haben. Navigieren Sie dazu zur AWS-Konsole, dann zu Amazon Cognito und suchen Sie einen Benutzerpool mit dem Namen AuthenticationFoodAnalyzerUserPoolXXX
.
Überprüfen Sie die Stack-Ausgaben auf eine URL, Food analyzer app.domainName
ähnelt. Fügen Sie diese URL in Ihren Browser ein, melden Sie sich mit dem zuvor erstellten Benutzer an und genießen Sie die App.
Sie können diese Vite React-App lokal ausführen, indem Sie diese Schritte befolgen.
Befolgen Sie die obigen Anweisungen, um die CDK-App bereitzustellen.
Besorgen Sie sich die Datei aws-exports.json
vom Amazon CloudFront-Verteilungsendpunkt, den Sie über die CDK-Ausgabe erhalten haben, und speichern Sie sie im Ordner ./resources/ui/public/
.
Die URL sieht etwa so aus:
https://dxxxxxxxxxxxx.cloudfront.net/aws-exports.json
cd resources/ui
npm run dev
Node JS 18+ muss auf dem Bereitstellungscomputer installiert sein. (Anweisungen)
AWS CLI 2+ muss auf dem Bereitstellungscomputer installiert sein. (Anweisungen)
Fordern Sie Zugang zu Anthropic Claude-Modellen und Stable Diffusion XL auf Amazon Bedrock an
Dieses Projekt ist unter der MIT-0-Lizenz lizenziert. Siehe die LICENSE-Datei.