AWS Germany – Amazon Web Services in Deutschland

Kosten und Latenz reduzieren mit Amazon Bedrock Intelligent Prompt Routing und Prompt-Caching (Vorschau)

von Danilo Poccia übersetzt durch Marco Strauss

Heute hat Amazon Bedrock in der Vorschau zwei Funktionen eingeführt, die Ihnen helfen, Kosten und Latenz für generative KI-Anwendungen zu reduzieren:

Amazon Bedrock Intelligent Prompt Routing – Bei der Aufrufen eines Modells können Sie jetzt eine Kombination von Basis-Modellen (FMs) aus derselben Modellfamilie verwenden, um Qualität und Kosten zu optimieren. Zum Beispiel kann Amazon Bedrock bei der Anthropic’s Claude-Modellfamilie Anfragen intelligent zwischen Claude 3.5 Sonnet und Claude 3 Haiku routen, abhängig von der Komplexität des Prompts. Ebenso kann Amazon Bedrock Anfragen zwischen Meta Llama 3.1 70B und 8B routen. Der Prompt-Router sagt voraus, welches Modell für jede Anfrage die beste Leistung bietet und dabei die Qualität der Antwort und die Kosten optimiert. Dies ist besonders nützlich für Anwendungen wie Kundenservice-Assistenten, bei denen unkomplizierte Anfragen von kleineren, schnelleren und kostengünstigeren Modellen bearbeitet werden können, während komplexe Anfragen an leistungsfähigere Modelle weitergeleitet werden. Intelligent Prompt Routing kann die Kosten um bis zu 30 Prozent senken, ohne die Genauigkeit zu beeinträchtigen.

Amazon Bedrock unterstützt jetzt Prompt-Caching – Sie können nun häufig verwendeten Kontext in Prompts über mehrere Modellaufrufe hinweg zwischenspeichern. Dies ist besonders wertvoll für Anwendungen, die wiederholt denselben Kontext verwenden, wie z.B. Dokument-Q&A-Systeme, bei denen Benutzer mehrere Fragen zum selben Dokument stellen, oder Coding-Assistenten, die den Kontext von Code-Dateien beibehalten müssen. Der zwischengespeicherte Kontext bleibt bis zu 5 Minuten nach jedem Zugriff verfügbar. Prompt-Caching in Amazon Bedrock kann die Kosten um bis zu 90% und die Latenz um bis zu 85% für unterstützte Modelle reduzieren.

Diese Funktionen reduziert die Latenz und bringt die Leistung mit der Kosteneffizienz in Einklang. Lassen Sie uns ansehen, wie Sie diese in Ihren Anwendungen nutzen können.

Verwendung von Amazon Bedrock Intelligent Prompt Routing in der Konsole
Amazon Bedrock Intelligent Prompt Routing verwendet fortschrittliche Prompt-Matching- und Modellverständnistechniken, um die Leistung jedes Modells für jede Anfrage vorherzusagen und dabei die Qualität der Antworten und die Kosten zu optimieren. Während der Vorschauphase können Sie die Standard-Prompt-Router für die Modellfamilien von Anthropic’s Claude und Meta Llama verwenden.

Auf Intelligent Prompt Routing kann über die AWS Management Console, die AWS Command Line Interface (AWS CLI) und die AWS SDKs zugegriffen werden. In der Amazon Bedrock-Konsole wähle ich Prompt-Router im Abschnitt Basismodelle (Foundation Models) der Navigationsleiste aus.

Ich wähle den Standard-Router Anthropic Prompt Router aus.

Anhand der Konfiguration des Prompt-Routers sehe ich, dass er Anfragen zwischen Claude 3.5 Sonnet und Claude 3 Haiku unter Verwendung von regionsübergreifenden Inferenzprofilen routet. Die Routing-Kriterien definieren den Qualitätsunterschied zwischen der Antwort des größten Modells und des kleinsten Modells für jeden Prompt, wie er vom internen Modell des Routers zur Laufzeit vorhergesagt wird. Das Fallback-Modell, das verwendet wird, wenn keines der ausgewählten Modelle die gewünschten Leistungskriterien erfüllt, ist Anthropic’s Claude 3.5 Sonnet.

Ich wähle Open in playground um mit dem Prompt-Router zu chatten und gebe diesen Prompt ein:

Alice has N brothers and she also has M sisters. How many sisters does Alice’s brothers have?

Das Ergebnis wird schnell geliefert. Ich wähle das neue Symbol Router Metrics auf der rechten Seite, um zu sehen, welches Modell vom Prompt-Router ausgewählt wurde. In diesem Fall wurde Anthropic’s Claude 3.5 Sonnet verwendet, da die Frage recht komplex ist.

Jetzt stelle ich eine einfache Frage an denselben Prompt-Router:

Describe the purpose of a 'hello world' program in one line.

Diesmal wurde Anthropic’s Claude 3 Haiku vom Prompt-Router ausgewählt.

Ich wähle den Meta Prompt Router aus, um seine Konfiguration zu überprüfen. Er verwendet die regionsübergreifenden Inferenzprofile für Llama 3.1 70B und 8B mit dem 70B-Modell als Fallback.

Prompt-Router sind mit anderen Amazon Bedrock-Funktionen integriert, so z.B. Amazon Bedrock Knowledge BasesAmazon Bedrock Agents, oder Modelevaluierungen. Hier erstelle ich beispielsweise eine Modellevaluierung, um für meinen Anwendungsfall einen Prompt-Router mit einem anderen Modell oder Prompt-Router zu vergleichen.

Um einen Prompt-Router in einer Anwendung zu verwenden, muss ich den Amazon Resource Name (ARN) des Prompt-Routers als Modell-ID in der Amazon Bedrock API festlegen. Schauen wir uns an, wie das mit der AWS CLI und einem AWS SDK funktioniert.

Verwendung von Amazon Bedrock Intelligent Prompt Routing mit der AWS CLI
Die Amazon Bedrock API wurde erweitert, um Prompt-Router zu handhaben. Zum Beispiel kann ich die vorhandenen Prompt-Routen in einer AWS-Region mit ListPromptRouters auflisten:

aws bedrock list-prompt-routers

Als Ausgabe erhalte ich eine Zusammenfassung der vorhandenen Prompt-Router, ähnlich wie ich es in der Konsole gesehen habe.

Hier ist die vollständige Ausgabe des vorherigen Befehls:

{    "promptRouterSummaries": [        {            "promptRouterName": "Anthropic Prompt Router",            "routingCriteria": {                "responseQualityDifference": 0.26            },            "description": "Routes requests among models in the Claude family",            "createdAt": "2024-11-20T00:00:00+00:00",            "updatedAt": "2024-11-20T00:00:00+00:00",            "promptRouterArn": "arn:aws:bedrock:us-east-1:123412341234:default-prompt-router/anthropic.claude:1",            "models": [                {                    "modelArn": "arn:aws:bedrock:us-east-1:123412341234:inference-profile/us.anthropic.claude-3-haiku-20240307-v1:0"                },                {                    "modelArn": "arn:aws:bedrock:us-east-1:123412341234:inference-profile/us.anthropic.claude-3-5-sonnet-20240620-v1:0"                }            ],            "fallbackModel": {                "modelArn": "arn:aws:bedrock:us-east-1:123412341234:inference-profile/us.anthropic.claude-3-5-sonnet-20240620-v1:0"            },            "status": "AVAILABLE",            "type": "default"        },        {            "promptRouterName": "Meta Prompt Router",            "routingCriteria": {                "responseQualityDifference": 0.0            },            "description": "Routes requests among models in the LLaMA family",            "createdAt": "2024-11-20T00:00:00+00:00",            "updatedAt": "2024-11-20T00:00:00+00:00",            "promptRouterArn": "arn:aws:bedrock:us-east-1:123412341234:default-prompt-router/meta.llama:1",            "models": [                {                    "modelArn": "arn:aws:bedrock:us-east-1:123412341234:inference-profile/us.meta.llama3-1-8b-instruct-v1:0"                },                {                    "modelArn": "arn:aws:bedrock:us-east-1:123412341234:inference-profile/us.meta.llama3-1-70b-instruct-v1:0"                }            ],            "fallbackModel": {                "modelArn": "arn:aws:bedrock:us-east-1:123412341234:inference-profile/us.meta.llama3-1-70b-instruct-v1:0"            },            "status": "AVAILABLE",            "type": "default"        }    ]}

Ich kann Informationen über einen bestimmten Prompt-Router mit GetPromptRouter und einem Prompt-Router-ARN abrufen. Zum Beispiel für die Meta Llama-Modellfamilie:

aws bedrock get-prompt-router --prompt-router-arn arn:aws:bedrock:us-east-1:123412341234:default-prompt-router/meta.llama:1
{    "promptRouterName": "Meta Prompt Router",    "routingCriteria": {        "responseQualityDifference": 0.0    },    "description": "Routes requests among models in the LLaMA family",    "createdAt": "2024-11-20T00:00:00+00:00",    "updatedAt": "2024-11-20T00:00:00+00:00",    "promptRouterArn": "arn:aws:bedrock:us-east-1:123412341234:default-prompt-router/meta.llama:1",    "models": [        {            "modelArn": "arn:aws:bedrock:us-east-1:123412341234:inference-profile/us.meta.llama3-1-8b-instruct-v1:0"        },        {            "modelArn": "arn:aws:bedrock:us-east-1:123412341234:inference-profile/us.meta.llama3-1-70b-instruct-v1:0"        }    ],    "fallbackModel": {        "modelArn": "arn:aws:bedrock:us-east-1:123412341234:inference-profile/us.meta.llama3-1-70b-instruct-v1:0"    },    "status": "AVAILABLE",    "type": "default"}

Um einen Prompt-Router mit Amazon Bedrock zu verwenden, setze ich den Prompt-Router-ARN als Modell-ID des API-Aufrufs. Hier verwende ich beispielsweise den Anthropic Prompt-Router mit der AWS CLI und der Amazon Bedrock Converse API:

aws bedrock-runtime converse \    --model-id arn:aws:bedrock:us-east-1:123412341234:default-prompt-router/anthropic.claude:1 \    --messages '[{ "role": "user", "content": [ { "text": "Alice has N brothers and she also has M sisters. How many sisters does Alice’s brothers have?" } ] }]' \

In der Ausgabe erhalte ich einen neuen trace-Abschnitt, der angibt, welches Modell tatsächlich verwendet wurde. In diesem Fall ist es Anthropics Claude 3.5 Sonnet:

{    "output": {        "message": {            "role": "assistant",            "content": [                {                    "text": "To solve this problem, let's think it through step-by-step:\n\n1) First, we need to understand the relationships:\n   - Alice has N brothers\n   - Alice has M sisters\n\n2) Now, we need to consider who Alice's brothers' sisters are:\n   - Alice herself is a sister to all her brothers\n   - All of Alice's sisters are also sisters to Alice's brothers\n\n3) So, the total number of sisters that Alice's brothers have is:\n   - The number of Alice's sisters (M)\n   - Plus Alice herself (+1)\n\n4) Therefore, the answer can be expressed as: M + 1\n\nThus, Alice's brothers have M + 1 sisters."                }            ]        }    },    . . .    "trace": {        "promptRouter": {            "invokedModelId": "arn:aws:bedrock:us-east-1:123412341234:inference-profile/us.anthropic.claude-3-5-sonnet-20240620-v1:0"        }    }}

Verwendung von Amazon Bedrock Intelligent Prompt Routing mit einem AWS SDK
Die Verwendung eines AWS SDK mit einem Prompt-Router ähnelt dem CLI Vorgehen. Beim Aufru eines Modells setze ich für die Modell-ID den Prompt-Modell-ARN. In diesem Python-Code verwende ich beispielsweise den Meta Llama-Router mit der ConverseStream API:

import jsonimport boto3bedrock_runtime = boto3.client(    "bedrock-runtime",    region_name="us-east-1",)MODEL_ID = "arn:aws:bedrock:us-east-1:123412341234:default-prompt-router/meta.llama:1"user_message = "Describe the purpose of a 'hello world' program in one line."messages = [    {        "role": "user",        "content": [{"text": user_message}],    }]streaming_response = bedrock_runtime.converse_stream(    modelId=MODEL_ID,    messages=messages,)for chunk in streaming_response["stream"]:    if "contentBlockDelta" in chunk:        text = chunk["contentBlockDelta"]["delta"]["text"]        print(text, end="")    if "messageStop" in chunk:        print()    if "metadata" in chunk:        if "trace" in chunk["metadata"]:            print(json.dumps(chunk['metadata']['trace'], indent=2))

Dieses Skript gibt den Antworttext und den Inhalt als Trace in den Antwortmetadaten aus. Für diese unkomplizierte Anfrage wurde das schnellere und kostengünstigere Modell vom Prompt-Router ausgewählt:

A "Hello World" program is a simple, introductory program that serves as a basic example to demonstrate the fundamental syntax and functionality of a programming language, typically used to verify that a development environment is set up correctly.{  "promptRouter": {    "invokedModelId": "arn:aws:bedrock:us-east-1:123412341234:inference-profile/us.meta.llama3-1-8b-instruct-v1:0"  }}

Verwendung von Prompt-Caching mit einem AWS SDK
Sie können Prompt-Caching mit der Amazon Bedrock Converse API verwenden. Wenn Sie Inhalte zum Caching markieren und sie zum ersten Mal an das Modell senden, verarbeitet das Modell die Eingabe und speichert die Zwischenergebnisse in einem Cache. Bei nachfolgenden Anfragen mit demselben Inhalt lädt das Modell die vorverarbeiteten Ergebnisse aus dem Cache, was sowohl die Kosten als auch die Latenz erheblich reduziert.

Sie können Prompt-Caching in Ihren Anwendungen mit wenigen Schritten implementieren:

  1. Identifizieren Sie die Teile Ihrer Prompts, die häufig wiederverwendet werden.
  2. Markieren Sie diese Abschnitte zum Caching in der Liste der Nachrichten mit dem neuen cachePoint-Block.
  3. Überwachen Sie die Cache-Nutzung und Latenzverbesserungen im usage-Abschnitt der Antwortmetadaten.

Hier ist ein Beispiel für die Implementierung von Prompt-Caching bei der Arbeit mit Dokumenten.

Zunächst lade ich drei Entscheidungsleitfäden im PDF-Format von der AWS-Website[EN] herunter.

bedrock-or-sagemaker.pdf[EN]
generative-ai-on-aws-how-to-choose.pdf[EN]
machine-learning-on-aws-how-to-choose.pdf[EN]

Diese Leitfäden helfen bei der Auswahl der AWS-Dienste, die zu Ihrem Anwendungsfall passen.

Dann verwende ich ein Python-Skript, um drei Fragen zu den Dokumenten zu stellen. Im Code erstelle ich eine converse()-Funktion, um die Konversation mit dem Modell zu handhaben. Beim ersten Aufruf der Funktion füge ich eine Liste von Dokumenten und ein Flag hinzu, um einen cachePoint-Block hinzuzufügen.

import jsonimport boto3MODEL_ID = "us.anthropic.claude-3-5-sonnet-20241022-v2:0"AWS_REGION = "us-west-2"bedrock_runtime = boto3.client(    "bedrock-runtime",    region_name=AWS_REGION,)DOCS = [    "bedrock-or-sagemaker.pdf",    "generative-ai-on-aws-how-to-choose.pdf",    "machine-learning-on-aws-how-to-choose.pdf",]messages = []def converse(new_message, docs=[], cache=False):    if len(messages) == 0 or messages[-1]["role"] != "user":        messages.append({"role": "user", "content": []})    for doc in docs:        print(f"Adding document: {doc}")        name, format = doc.rsplit('.', maxsplit=1)        with open(doc, "rb") as f:            bytes = f.read()        messages[-1]["content"].append({            "document": {                "name": name,                "format": format,                "source": {"bytes": bytes},            }        })    messages[-1]["content"].append({"text": new_message})    if cache:        messages[-1]["content"].append({"cachePoint": {"type": "default"}})    response = bedrock_runtime.converse(        modelId=MODEL_ID,        messages=messages,    )    output_message = response["output"]["message"]    response_text = output_message["content"][0]["text"]    print("Response text:")    print(response_text)    print("Usage:")    print(json.dumps(response["usage"], indent=2))    messages.append(output_message)converse("Compare AWS Trainium and AWS Inferentia in 20 words or less.", docs=DOCS, cache=True)converse("Compare Amazon Textract and Amazon Transcribe in 20 words or less.")converse("Compare Amazon Q Business and Amazon Q Developer in 20 words or less.")

Für jeden Aufruf gibt das Skript die Antwort und die usage-Zähler aus.

Adding document: bedrock-or-sagemaker.pdfAdding document: generative-ai-on-aws-how-to-choose.pdfAdding document: machine-learning-on-aws-how-to-choose.pdfResponse text:AWS Trainium is optimized for machine learning training, while AWS Inferentia is designed for low-cost, high-performance machine learning inference.Usage:{  "inputTokens": 4,  "outputTokens": 34,  "totalTokens": 29879,  "cacheReadInputTokenCount": 0,  "cacheWriteInputTokenCount": 29841}Response text:Amazon Textract extracts text and data from documents, while Amazon Transcribe converts speech to text from audio or video files.Usage:{  "inputTokens": 59,  "outputTokens": 30,  "totalTokens": 29930,  "cacheReadInputTokenCount": 29841,  "cacheWriteInputTokenCount": 0}Response text:Amazon Q Business answers questions using enterprise data, while Amazon Q Developer assists with building and operating AWS applications and services.Usage:{  "inputTokens": 108,  "outputTokens": 26,  "totalTokens": 29975,  "cacheReadInputTokenCount": 29841,  "cacheWriteInputTokenCount": 0}

Der usage-Abschnitt der Antwort enthält zwei neue Zähler: cacheReadInputTokenCount und cacheWriteInputTokenCount. Die Gesamtzahl der Token für einen Aufruf ist die Summe der Eingabe- und Ausgabe-Token plus die Token, die in den Cache gelesen und geschrieben wurden.

Jeder Aufruf verarbeitet eine Liste von Nachrichten. Die Nachrichten im ersten Aufruf enthalten die Dokumente, die erste Frage und den Cache-Punkt. Da die Nachrichten vor dem Cache-Punkt derzeit nicht im Cache sind, werden sie in den Cache geschrieben. Laut den usage-Zählern wurden 29.841 Token in den Cache geschrieben.

"cacheWriteInputTokenCount": 29841

Bei den nächsten Aufrufen werden die vorherige Antwort und die neue Frage an die Liste der Nachrichten angehängt. Die Nachrichten vor dem cachePoint werden nicht geändert und im Cache gefunden.

Wie erwartet, können wir anhand der usage-Zähler erkennen, dass die gleiche Anzahl von zuvor geschriebenen Token nun aus dem Cache gelesen wird.

"cacheReadInputTokenCount": 29841

In meinen Tests benötigen die nächsten Aufrufe 55 Prozent weniger Zeit zum Abschluss im Vergleich zum ersten. Je nach Anwendungsfall (zum Beispiel mit mehr gecachtem Inhalt) kann Prompt-Caching die Latenz um bis zu 85 Prozent verbessern.

Abhängig vom Modell können Sie mehr als einen Cache-Punkt in einer Liste von Nachrichten setzen. Um die richtigen Cache-Punkte für Ihren Anwendungsfall zu finden, probieren Sie verschiedene Konfigurationen aus und beobachten Sie die Auswirkungen auf die gemeldete Nutzung.

Wichtige Informationen
Amazon Bedrock Intelligent Prompt Routing ist heute als Vorschau in den AWS-Regionen US East (N. Virginia) und US West (Oregon) verfügbar. Während der Vorschau können Sie die Standard-Prompt-Router verwenden, und es fallen keine zusätzlichen Kosten für die Verwendung eines Prompt-Routers an. Sie zahlen die Kosten für das ausgewählte Modell. Sie können Prompt-Router mit anderen Amazon Bedrock-Funktionen wie Durchführung von Evaluierungen, Verwendung von Wissensdatenbanken und Konfiguration von Agenten verwenden.

Intelligentes Prompt-Routing unterstütz derzeit nur englischsprachige Prompts.

Die Amazon Bedrock-Unterstützung für Prompt-Caching ist in der Vorschau in US West (Oregon) für Anthropics Claude 3.5 Sonnet V2 und Claude 3.5 Haiku verfügbar. Prompt-Caching ist auch in US East (N. Virginia) für Amazon Nova Micro, Amazon Nova Lite und Amazon Nova Pro verfügbar. Sie können hier Zugang zur Amazon Bedrock Prompt-Caching-Vorschau anfordern [EN].

Mit Prompt-Caching erhalten Cache-Lesezugriffe einen Rabatt von 90 Prozent im Vergleich zu nicht gecachten Eingabe-Tokens. Es fallen keine zusätzlichen Infrastrukturkosten für die Cache-Speicherung an. Bei der Verwendung von Anthropic-Modellen zahlen Sie zusätzliche Kosten für im Cache geschriebene Tokens. Bei Amazon Nova-Modellen entstehen keine zusätzlichen Kosten für Cache-Schreibvorgänge. Weitere Informationen finden Sie unter Amazon Bedrock Preisgestaltung.

Bei der Verwendung von Prompt-Caching wird der Inhalt bis zu 5 Minuten lang zwischengespeichert, wobei jeder Cache-Hit diesen Countdown zurücksetzt. Prompt-Caching wurde implementiert, um regionsübergreifende Inferenz transparent zu unterstützen. Auf diese Weise können Ihre Anwendungen von der Kostenoptimierung und dem Latenzvorteilen des Prompt-Cachings profitieren und gleichzeitig die Flexibilität der regionsübergreifenden Inferenz nutzen.

Diese neuen Funktionen erleichtern den Aufbau kosteneffizienter und leistungsstarker generativer KI-Anwendungen. Durch intelligentes Routing von Anfragen und Caching häufig verwendeter Inhalte können Sie Ihre Kosten erheblich senken und gleichzeitig die Anwendungsleistung aufrechterhalten oder sogar verbessern.

Um mehr zu erfahren und diese neuen Funktionen ab heute zu nutzen, besuchen Sie die Amazon Bedrock-Dokumentation und senden Sie Feedback an AWS re:Post für Amazon Bedrock. Tiefgehende technische Inhalte und Einblicke, wie unsere Builder-Communities Amazon Bedrock nutzen, finden Sie auf community.aws[EN].

Über die Autoren

Danilo Poccia arbeitet mit Startups und Unternehmen jeder Größe zusammen, um deren Innovation zu unterstützen. In seiner Rolle als Chief Evangelist (EMEA) bei Amazon Web Services nutzt er seine Erfahrung, um Menschen dabei zu helfen, ihre Ideen zum Leben zu erwecken. Dabei konzentriert er sich auf serverlose Architekturen und ereignisgesteuerte Programmierung sowie auf die technischen und geschäftlichen Auswirkungen von maschinellem Lernen und Edge Computing. Er ist der Autor von „AWS Lambda in Action“ aus dem Manning-Verlag.