AWS Germany – Amazon Web Services in Deutschland
Wie generative KI und AWS Serverless einen Chat mit Dokumenten ermöglichen
von Pascal Vogel und Martin Sakowski, im Original erschienen im AWS Compute Blog
Große Sprachmodelle (Large Language Models, LLMs) sind wirksam bei der Lösung allgemeiner Aufgaben wie Texterstellung, -analyse und -zusammenfassung, Übersetzung und vielem mehr. LLMs werden mit großen Datensätzen trainiert und können dadurch auf ein breites Allgemeinwissen zurückgreifen. Da dieses Training jedoch offline und mit öffentlich verfügbaren Daten erfolgt, sind die Fähigkeiten von LLMs, auf spezialisierte, nicht-öffentliche und tagesaktuelle Informationen zuzugreifen, begrenzt.
Eine Möglichkeit, das Wissen von LLMs in einem spezifischen Bereich zu verbessern, besteht darin, sie auf domänenspezifischen Datensätzen abzustimmen (fine-tuning). Dieser Vorgang ist jedoch zeit- und ressourcenintensiv, erfordert spezialisiertes Wissen und ist möglicherweise nicht für alle Anforderungen geeignet. Beispielsweise ermöglicht auch eine Feinabstimmung keinen Zugang zu tagesaktuellen Informationen.
Um diese Wissenslücken auszugleichen, erweist sich Retrieval Augmented Generation (RAG) als wirksamer Ansatz. Mit RAG werden externe Daten genutzt, um die Nutzereingaben im Kontext, der an ein LLM gesandt wird, zu ergänzen. Dies ermöglicht die Integration unterschiedlicher externer Datenquellen und separiert Modell und Datenquelle.
Tools wie LangChain oder LlamaIndex gewinnen an Beliebtheit, da sie LLMs flexibel mit einer Vielzahl von Datenquellen wie (Vektor-)Datenbanken, Suchmaschinen und tagesaktuellen öffentlichen Datenquellen integrieren.
Im Kontext von LLMs ist die semantische Suche ein effektiver Suchansatz, da sie – im Gegensatz zu einer traditionellen wörtlichen Suche – den Kontext und die Absicht der vom Benutzer getätigten Eingaben berücksichtigt. Semantische Suche basiert auf Worteinbettungen, mit deren Hilfe Sätze oder Dokumente als Vektoren dargestellt werden. Dementsprechend müssen Dokumente mit einem Einbettungsmodell als Grundlage für die semantische Suche zunächst in Worteinbettungen umgewandelt werden. Da dieser Einbettungsprozess nur stattfinden muss, wenn ein Dokument zum ersten Mal hinzugefügt oder aktualisiert wird, eignet er sich hervorragend für die ereignisgesteuerte Compute-Plattform AWS Lambda.
Dieser Blogbeitrag stellt eine Lösung vor, die einen natürlichsprachlichen Chat mit hochgeladenen PDF-Dokumenten ermöglicht. Die vorgestellte Beispielanwendung kombiniert die Textgenerierungs- und Analysefähigkeiten eines LLMs mit einer Vektorsuche im Inhalt eines Dokuments. Die Lösung verwendet serverlose Dienste wie AWS Lambda zur Ausführung von LangChain und Amazon DynamoDB für das konversationelle Gedächtnis.
Amazon Bedrock ist ein vollständig verwalteter Service, der Basismodelle (foundation models) von Amazon und führenden KI-Unternehmen wie Anthropic, Cohere, Meta und Stability AI über eine API zur Verfügung stellt. Das GitHub-Repository zu diesem Blogbeitrag bietet weitere Informationen zu den verfügbaren LLMs sowie detaillierte Bereitstellungsanweisungen.
In diesem Blogbeitrag wird erläutert, wie die Lösung funktioniert, welche Design-Entscheidungen getroffen wurden und wie sie als Blaupause verwendet werden kann, um eigene serverlose Lösungen auf Basis von LangChain und Amazon Bedrock zu erstellen.
Lösungsüberblick
Das folgende Diagramm zeigt eine vereinfachte Ansicht der Lösungsarchitektur und hebt ihre wichtigsten Elemente hervor:
Die Interaktion mit der Webanwendung läuft folgendermaßen ab:
- Ein Benutzer lädt über ein statisches Frontend ein PDF-Dokument in einen Amazon Simple Storage Service (Amazon S3) Bucket hoch.
- Dieser Upload löst über einen Trigger das Auslesen von Metadaten sowie die Generierung von Worteinbettungen aus. Dieser Prozess konvertiert den Text im Dokument in Vektoren, die wiederum in einen Vektorindex geladen und für die spätere Verwendung in Amazon S3 gespeichert werden.
- Wenn ein Benutzer mit einem PDF-Dokument chattet und eine Eingabe an das Backend sendet, ruft eine Lambda-Funktion den Vektorindex aus Amazon S3 ab und sucht nach Informationen, die mit der Eingabe zusammenhängen.
- Ein LLM verwendet dann die Ergebnisse dieser Vektorsuche, frühere Nachrichten im Gesprächsverlauf und seine allgemeinen Fähigkeiten, um eine Antwort an den Benutzer zu formulieren.
Wie auf dem folgenden Screenshot zu sehen ist, ermöglicht die als Teil der Lösung bereitgestellte Webanwendung das Hochladen von Dokumenten und das Auflisten hochgeladener Dokumente. Zudem werden Metadaten wie Anzahl der Seiten, Dateigröße und Hochladedatum angezeigt. Der Dokumentstatus zeigt an, ob ein Dokument erfolgreich hochgeladen wurde, gerade verarbeitet wird oder für einen Chat bereit ist.
Mit einem Klick auf eines der verarbeiteten Dokumente öffnet sich die Chatansicht, auf der Eingabeaufforderungen an das Backend gesendet werden können. Es ist möglich, mit jedem Dokument mehrere unabhängige Gespräche mit separater Nachrichtenhistorie zu führen.
Worteinbettungen generieren
Wenn ein neues Dokument in den S3-Bucket hochgeladen wird, löst eine S3-Ereignisbenachrichtigung (S3 event notification) eine Lambda-Funktion aus. Diese Funktion extrahiert Metadaten, wie Dateigröße und Anzahl der Seiten, aus der PDF-Datei und speichert diese in einer DynamoDB-Tabelle.
Sobald die Extraktion abgeschlossen ist, wird eine Nachricht mit dem Dokumentenstandort in eine Amazon Simple Queue Service (Amazon SQS)-Warteschlange gelegt. Eine andere Lambda-Funktion überwacht diese Warteschlange mit Hilfe von Lambda Event Source Mappings. Durch die Anwendung dieses Decouple-Messaging-Patterns auf die Metadatenextraktion und die Worteinbettung wird eine lockere Kopplung zwischen Architekturelementen (loose coupling) gewährleistet und die rechenintensivere nachgelagerte Einbettungsfunktion geschützt.
Die Einbettungsfunktion lädt die PDF-Datei von Amazon S3 und verwendet ein Texteinbettungsmodell, um eine Vektorrepräsentation des enthaltenen Textes zu generieren. LangChain ist mit Texteinbettungsmodellen verschiedener LLM-Anbieter integriert.
Die resultierende Vektorrepräsentation des Textes wird in einen FAISS-Index geladen. FAISS ist ein Open-Source-Vektorspeicher, der mit dem Python-Paket faiss-cpu im Lambda-Funktionsspeicher ausgeführt werden kann. Schließlich wird ein Export dieses FAISS-Indexes im S3-Bucket neben dem ursprünglichen PDF-Dokument gespeichert.
Antworten generieren
Wenn eine Chat-Eingabe für ein bestimmtes Dokument über den Amazon API Gateway REST API-Endpunkt ankommt, wird sie an eine Lambda-Funktion via Proxy weitergeleitet, die:
- Den FAISS-Index-Export der entsprechenden PDF-Datei von Amazon S3 lädt und in den Funktionsspeicher legt.
- Eine Ähnlichkeitssuche (similarity search) im FAISS-Vektorspeicher auf der Grundlage der Eingabe durchführt.
- Vorherige Nachrichten in derselben Konversation über die DynamoDBChatMessageHistory-Integration abruft. Diese Integration kann Nachrichtenverläufe in DynamoDB speichern.
- Schließlich übergibt eine LangChain ConversationalRetrievalChain die Kombination aus der vom Benutzer eingereichten Aufforderung, dem Ergebnis der Vektorsuche und dem Nachrichtenverlauf an ein LLM, um eine Antwort zu generieren.
Webanwendung und Dateiuploads
Eine statische Webanwendung dient als Frontend für diese Lösung. Sie ist mit React, TypeScript, Vite und TailwindCSS umgesetzt und über AWS Amplify Hosting bereitgestellt. Amplify Hosting ist ein vollständig verwalteter CI/CD- und Hosting-Service für schnelle, sichere und zuverlässige statische und serverseitig gerenderte Anwendungen.
Um die Anwendung vor unbefugtem Zugriff zu schützen, ist sie mit einem Amazon Cognito-Benutzerpool integriert. Das Amazon API Gateway verwendet einen Amazon Cognito-Authorizer, um Anfragen zu authentifizieren.
Benutzer laden PDF-Dateien direkt in den S3-Bucket hoch, indem sie S3-Presigned-URLs über die REST-API erhalten. Mehrere weitere Lambda-Funktionen implementieren die API-Endpunkte, die verwendet werden, um Metadaten der Dokumente und weitere Anwendungsdaten in einer DynamoDB-Tabelle zu erstellen, zu lesen und zu aktualisieren.
Die Anwendung erweitern und anpassen
Die bereitgestellte Lösung dient als Blaupause, die verbessert und erweitert werden kann, um eigenen Anwendungsfälle mit Hilfe von LLMs umzusetzen. Die Lösung kann beispielsweise erweitert werden, damit Benutzer Fragen über mehrere PDF-Dokumente hinweg oder andere Datentypen stellen können. LangChain erleichtert das Laden verschiedener Datentypen in Vektorspeicher, die für die semantische Suche verwendet werden können.
Sobald ein Anwendungsfall das Durchsuchen mehrerer Dokumente umfasst, sollte ein Wechsel vom Laden von Vektoren in den Speicher mit FAISS hin zu einer dedizierten Vektordatenbank in Betracht gezogen werden. Es gibt mehrere Optionen für Vektordatenbanken auf AWS, unter anderem Amazon Aurora Serverless v2 mit der pgvector-Erweiterung für PostgreSQL. Alternativ können Vektordatenbanken, die von AWS-Partnern wie Pinecone oder MongoDB Atlas Vector Search entwickelt wurden, mit LangChain integriert werden. Neben der Vektorsuche integriert sich LangChain auch mit traditionellen externen Datenquellen, wie Amazon Kendra, Amazon OpenSearch und vielen anderen Datenquellen.
Die in diesem Blogbeitrag vorgestellte Lösung verwendet eine Ähnlichkeitssuche, um Informationen in einer Vektordatenbank zu finden, die Benutzereingaben ähneln. Obwohl dies im vorgestellten Anwendungsfall gut funktioniert, können auch andere Ansätze verwenden, um die relevantesten Informationen für das LLM zu finden, zum Beispiel die maximale Randrelevanz (maximal marginal relevance). Bei der Suche über viele Dokumente hinweg mit vielen Ergebnissen können Techniken wie MapReduce die Qualität der LLM-Antworten weiter verbessern.
Je nach Anwendungsfall kann auch ein anderes LLM ausgewählt werden, um ein ideales Gleichgewicht zwischen Qualität der Ergebnisse und Betriebskosten zu erreichen. Amazon Bedrock ist ein vollständig verwalteter Dienst, der Basismodelle von führenden KI-Startups und Amazon über eine API zur Verfügung stellt, sodass aus einer Vielzahl von FMs das am besten für einen Anwendungsfall geeignete ausgewählt werden kann.
Um das Benutzererlebnis der Anwendung zu optimieren, können LLM-Antworten in Echtzeit über Lambda Response Streaming an ein Frontend gestreamt werden. Alternativ können Updates in Echtzeit mit AWS AppSync Subscriptions oder Amazon API Gateway WebSocket-APIs implementiert werden.
Fazit
AWS Serverless-Dienste erleichtern die Implementierung von KI-Anwendungen, indem sie automatische Skalierung, integrierte Hochverfügbarkeit und ein nutzungsabhängiges Abrechnungsmodell bieten. Die ereignisgesteuerte Compute-Plattform AWS Lambda eignet sich gut für rechenintensive, bedarfsgesteuerte Aufgaben wie die Generierung von Worteinbettungen und eine flexible LLM-Orchestrierung.
Die in diesem Blogbeitrag vorgestellte Lösung kombiniert die Fähigkeiten von LLMs und semantischer Suche und ermöglicht damit einen natürlichsprachlichen Chat mit PDF-Dokumenten. Die Lösung dient außerdem als Blaupause, die erweitert und angepasst werden kann, um weitere generative KI-Anwendungsfälle umzusetzen.
Eine detaillierte Anleitung für die Bereitstellung der Lösung ist im zugehörigen GitHub-Repository verfügbar.
Weitere Lernressourcen zum Thema Serverless bietet Serverless Land.