Amazon Web Services ブログ

Amazon Bedrock インテリジェントプロンプトルーティングとプロンプトキャッシュでコストとレイテンシーを削減 (プレビュー)

Amazon Bedrock は 12 月 4 日、生成 AI アプリケーションのコストとレイテンシーの削減に役立つ 2 つの機能をプレビュー版で導入しました。

Amazon Bedrock インテリジェントプロンプトルーティング – モデルを呼び出すときに、同じモデルシリーズの基盤モデル (FM) を組み合わせて使用することで、品質とコストを最適化できるようになりました。たとえば、Anthropic’s Claude モデルシリーズでは、Amazon Bedrock はプロンプトの複雑さに応じて Claude 3.5 Sonnet と Claude 3 Haiku の間でリクエストをインテリジェントにルーティングできます。同様に、Amazon Bedrock はリクエストを Meta Llama 3.1 70B と 8B の間でルーティングできます。プロンプトルーターは、応答の質とコストを最適化しながら、各リクエストに対してどのモデルが最高のパフォーマンスを提供するかを予測します。これは、単純なクエリをより小さく、より速く、より費用対効果の高いモデルで処理でき、複雑なクエリをより高性能なモデルにルーティングできるカスタマーサービスアシスタントなどのアプリケーションに特に役立ちます。インテリジェントプロンプトルーティングは、精度を損なうことなくコストを最大 30% 削減できます。

Amazon Bedrock はプロンプトキャッシュをサポートするようになりました – 複数のモデル呼び出しにわたって、頻繁に使用されるコンテキストをプロンプトにキャッシュできるようになりました。これは、ユーザーが同じドキュメントについて複数の質問をするドキュメント Q&A システムや、コードファイルのコンテキストを管理する必要があるコーディングアシスタントなど、同じコンテキストを繰り返し使用するアプリケーションに特に役立ちます。キャッシュされたコンテキストは、アクセスするたびに最大 5 分間使用できます。Amazon Bedrock のプロンプトキャッシュにより、サポートされているモデルのコストを最大 90% 削減し、レイテンシーを最大 85% 削減できます。

これらの機能により、レイテンシーを低減し、パフォーマンスとコスト効率のバランスを取ることが容易になります。それでは、これらをアプリケーションでどのように使用できるかを見てみましょう。

コンソールでの Amazon Bedrock インテリジェントプロンプトルーティングの使用
Amazon Bedrock インテリジェントプロンプトルーティングは、高度なプロンプトマッチングとモデル理解技術を使用して、すべてのリクエストにおける各モデルのパフォーマンスを予測し、応答の質とコストを最適化します。プレビュー中は、Anthropic’s Claude および Meta Llama モデルシリーズのデフォルトのプロンプトルーターを使用できます。

インテリジェントなプロンプトルーティングには、AWS マネジメントコンソールAWS コマンドラインインターフェイス (AWS CLI)AWS SDK からアクセスできます。Amazon Bedrock コンソールでは、ナビゲーションペインの [基盤モデル] セクションの [プロンプトルーター] を選択します。

コンソールのスクリーンショット。

詳細情報を得るには、Anthropic プロンプトルーターのデフォルトルーターを選択します。

コンソールのスクリーンショット。

プロンプトルーターの設定から、クロスリージョン推論プロファイルを使用して Claude 3.5 Sonnet と Claude 3 Haiku の間でリクエストをルーティングしていることがわかります。ルーティング基準は、ランタイムにルーター内部モデルによって予測された各プロンプトの最大モデルの応答と最小モデルの応答の品質差を定義します。フォールバックモデルは、選択したモデルのどれも望ましいパフォーマンス基準を満たさない場合に使用されるもので、Anthropic’s Claude 3.5 Sonnet です。

プロンプトルーターを使用してチャットするには [プレイグラウンドで開く] を選択し、次のプロンプトを入力します。

アリスには N 人の兄弟がいて、彼女には M 人の姉妹もいます。アリスの兄弟に姉妹は何人いますか?

結果はすぐに提供されます。右側の新しいルーターメトリックアイコンを選択して、プロンプトルーターでどのモデルが選択されたかを確認します。今回は、質問がかなり複雑なので、Anthropic’s Claude 3.5 Sonnet が使われました。

コンソールのスクリーンショット。

ここで、同じプロンプトルーターに簡単な質問をします。

「hello world」プログラムの目的を1行で説明してください。

今回は、Anthropic’s Claude 3 Haiku がプロンプトルーターに選ばれました。

コンソールのスクリーンショット。

メタプロンプトルーターを選択して構成を確認します。フォールバックとして、70B モデルを使用した Llama 3.1 70B および 8B のクロスリージョン推論プロファイルを使用しています。

コンソールのスクリーンショット。

プロンプトルーターは、Amazon Bedrock ナレッジベースAmazon Bedrock エージェントなど、他の Amazon Bedrock 機能と統合されているほか、評価を実行する場合にも統合されます。たとえば、ここでは、私のユースケースでは、プロンプトルーターを別のモデルまたはプロンプトルーターと比較するのに役立つモデル評価を作成します。

コンソールのスクリーンショット。

アプリケーションでプロンプトルーターを使用するには、プロンプトルーターの Amazon リソースネーム (ARN) を Amazon Bedrock API のモデル ID として設定する必要があります。この仕組みが AWS CLI と AWS SDK でどのように機能するかを見てみましょう。

AWS CLI での Amazon Bedrock インテリジェントプロンプトルーティングの使用
Amazon Bedrock API はプロンプトルーターを処理するように拡張されました。たとえば、ListPromptRouters を使用して AWS リージョンの既存のプロンプトルートを一覧表示できます。

aws bedrock list-prompt-routers

出力には、コンソールで見たものと似た、既存のプロンプトルータの概要が表示されます。

前のコマンドの全出力は次のとおりです。

{
    "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"
        }
    ]
}

GetPromptRouter とプロンプトルータ ARN を使用すると、特定のプロンプトルータに関する情報を取得できます。たとえば、Meta Llama モデルシリーズの場合:

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"
}

Amazon Bedrock でプロンプトルーターを使用するには、API コールを行うときにプロンプトルーター ARN をモデル ID として設定しました。たとえば、ここでは AWS CLI と Amazon Bedrock Converse API で Anthropic プロンプトルーターを使用しています。

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?" } ] }]' \

出力には、プロンプトルーターを使用した呼び出しには、実際に使用されたモデルを示す新しいトレースセクションが含まれます。この場合は、Anthropic’s 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"
        }
    }
}

AWS SDK による Amazon Bedrock インテリジェントプロンプトルーティングの使用
AWS SDK をプロンプトルーターで使用することは、以前のコマンドラインエクスペリエンスと似ています。モデルを呼び出すときに、モデル ID をプロンプトモデル ARN に設定しました。たとえば、次の Python コードでは、ConverseStream API でメタラマルーターを使用しています。

import json
import boto3

bedrock_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))

このスクリプトは、応答テキストとトレースの内容を応答メタデータに出力します。この単純なリクエストに対して、プロンプトルーターはより高速で手頃なモデルを選択しました。

「Hello World」プログラムは、プログラミング言語の基本的な構文と機能を示す基本的な例となるシンプルな入門プログラムで、通常は開発環境が正しく設定されていることを確認するために使用されます。
{
  "promptRouter": {
    "invokedModelId": "arn:aws:bedrock:us-east-1:123412341234:inference-profile/us.meta.llama3-1-8b-instruct-v1:0"
  }
}

AWS SDK でのプロンプトキャッシュの使用
Amazon Bedrock Converse API ではプロンプトキャッシュを使用できます。キャッシュするコンテンツにタグを付けて初めてモデルに送信すると、モデルは入力を処理し、中間結果をキャッシュに保存します。同じコンテンツを含む後続のリクエストでは、モデルは前処理された結果をキャッシュから読み込み、コストと待ち時間の両方を大幅に削減します。

プロンプトキャッシュは、いくつかの手順でアプリケーションに実装できます。

  1. プロンプトの中で頻繁に再利用される部分を特定します。
  2. 新しい cachePoint ブロックを使用して、これらのセクションをメッセージのリストにキャッシュするようにタグ付けします。
  3. レスポンスメタデータの使用状況セクションで、キャッシュの使用状況とレイテンシーの改善を監視してください。

ドキュメントを操作するときのプロンプトキャッシュの実装例を次に示します。

まず、AWS のウェブサイトから 3 つの意思決定ガイドを PDF 形式でダウンロードします。これらのガイドは、お客様のユースケースに合った AWS サービスを選択するのに役立ちます。

次に、Python スクリプトを使用して、ドキュメントについて 3 つの質問をします。このコードでは、モデルとの会話を処理する converse() 関数を作成します。この関数を初めて呼び出すときに、ドキュメントのリストと cachePoint ブロックを追加するためのフラグを含めます。

import json

import boto3

MODEL_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.")

スクリプトは、呼び出しごとに応答と使用状況カウンターを出力します。

ドキュメントの追加: bedrock-or-sagemaker.pdf
ドキュメントの追加: generative-ai-on-aws-how-to-choose.pdf
ドキュメントの追加: machine-learning-on-aws-how-to-choose.pdf
応答テキスト:
AWS Trainium は機械学習トレーニングに最適化されており、AWS Inferentia は低コストで高性能な機械学習推論向けに設計されています。
使用方法:
{
  "inputTokens": 4,
  "outputTokens": 34,
  "totalTokens": 29879,
  "cacheReadInputTokenCount": 0,
  "cacheWriteInputTokenCount": 29841
}
応答テキスト:
Amazon Textract はドキュメントからテキストとデータを抽出し、Amazon Transcribe はオーディオファイルまたはビデオファイルからオーディオをテキストに変換します。
使用方法:
{
  "inputTokens": 59,
  "outputTokens": 30,
  "totalTokens": 29930,
  "cacheReadInputTokenCount": 29841,
  "cacheWriteInputTokenCount": 0
}
応答テキスト:
Amazon Q Business はエンタープライズデータを使用して質問に回答し、Amazon Q Developer は AWS のアプリケーションとサービスの構築と運用を支援します。
使用方法:
{
  "inputTokens": 108,
  "outputTokens": 26,
  "totalTokens": 29975,
  "cacheReadInputTokenCount": 29841,
  "cacheWriteInputTokenCount": 0
}

レスポンスの使用状況セクションには、cacheReadInputTokenCountcacheWriteInputTokenCount という 2 つの新しいカウンターが含まれています。呼び出しのトークンの総数は、入力トークンと出力トークンの合計に、キャッシュに読み書きされたトークンを加えたものです。

呼び出しのたびに、メッセージのリストが処理されます。最初の呼び出しのメッセージには、ドキュメント、最初の質問、およびキャッシュポイントが含まれます。キャッシュポイントより前のメッセージは現在キャッシュにないため、キャッシュに書き込まれます。使用状況カウンターによると、29,841 個のトークンがキャッシュに書き込まれています。

"cacheWriteInputTokenCount": 29841

次の呼び出しでは、前の応答と新しい質問がメッセージのリストに追加されます。cachePoint の前のメッセージは変更されず、キャッシュ内にあります。

予想どおり、使用状況カウンターから、以前に書き込まれたのと同じ数のトークンがキャッシュから読み取られることがわかります。

"cacheReadInputTokenCount": 29841

私のテストでは、最初の呼び出しと比較して、次の呼び出しが完了するまでにかかる時間が 55% 短くなりました。ユースケース(キャッシュされたコンテンツが多い場合など)にもよりますが、プロンプトキャッシュによってレイテンシが最大 85% 改善されます。

モデルによっては、メッセージのリストに複数のキャッシュポイントを設定できます。ユースケースに適したキャッシュポイントを見つけるには、さまざまな構成を試して、報告された使用状況への影響を確認してください。

知っておくべきこと
Amazon Bedrock インテリジェントプロンプトルーティングは、米国東部 (バージニア北部) および米国西部 (オレゴン) の AWS リージョンで 12 月 4 日プレビュー版をご利用いただけます。プレビュー中は、デフォルトのプロンプトルーターを使用できます。プロンプトルーターを使用しても追加料金はかかりません。選択したモデルの費用を支払います。プロンプトルーターは、評価の実行ナレッジベースの使用エージェントの設定など、他の Amazon Bedrock 機能とともに使用できます。

プロンプトルーターが使用する内部モデルはプロンプトの複雑さを理解する必要があるため、インテリジェントプロンプトルーティングは現在英語プロンプトのみをサポートしています。

Amazon Bedrock によるプロンプトキャッシュのサポートは、米国西部 (オレゴン) で Anthropic’s Claude 3.5 Sonnet V2 と Claude 3.5 Haiku のプレビュー版が提供されています。米国東部 (バージニア北部) では Amazon Nova Micro、Amazon Nova Lite、および Amazon Nova Pro のプロンプトキャッシュも利用できます。

プロンプトキャッシュを使用すると、キャッシュ読み取りは、キャッシュされていない入力トークンと比較して 90% 割引されます。キャッシュストレージに追加のインフラストラクチャ料金はかかりません。Anthropic モデルを使用する場合、キャッシュに書き込まれたトークンには追加料金がかかります。Amazon Nova モデルでは、キャッシュ書き込みに追加コストはかかりません。詳細については、Amazon Bedrock の料金をご覧ください。

プロンプトキャッシュを使用する場合、コンテンツは最大 5 分間キャッシュされ、キャッシュヒットするたびにカウントダウンがリセットされます。プロンプトキャッシュは、クロスリージョン推論を透過的にサポートするために実装されています。これにより、アプリケーションでは、クロスリージョン推論の柔軟性を利用して、プロンプトキャッシュによるコスト最適化とレイテンシーのメリットを享受できます。

これらの新機能により、費用対効果が高く高性能な生成 AI アプリケーションを簡単に構築できます。リクエストをインテリジェントにルーティングし、頻繁に使用されるコンテンツをキャッシュすることで、アプリケーションのパフォーマンスを維持し、さらに向上させると同時に、コストを大幅に削減できます。

これらの新機能の詳細を確認して今すぐ使用を開始するには、Amazon Bedrock のドキュメントにアクセスし、AWS re:Post for Amazon Bedrock にフィードバックを送信してください。community.aws では、詳しい技術コンテンツを検索し、ビルダーコミュニティが Amazon Bedrock を使用する方法を見出すことができます。

Danilo

原文はこちらです。