AWS LambdaからAmazon Bedrockを利用する際、Prompt Managementでプロンプトを管理してみた
はじめに
以前、AWS LambdaからAmazon Bedrockを呼び出す際に、プロンプトをLambdaのコードから分離し、Amazon S3バケットで管理する方法を紹介しました。
今回は、Amazon Bedrock Prompt Managementを利用してプロンプトを管理し、AWS Lambdaから呼び出してみます。
Prompt Managementとは、プロンプトの作成・バージョン管理・テストを一元的に行える機能です。
これにより、プロンプトの内容をコードから分離し、より柔軟な運用が可能になります。
活用例
Prompt Managementの具体的な活用例として、Amazon Connectによる電話対応システムを紹介します。
このシステムは、AIチャットボットによる一次対応を行い、Amazon Bedrockを活用して問い合わせ内容を適切な種別に自動分類します。
このシステムの詳細については、以下の記事で紹介しています。
開発者と運用者が分かれている環境では、運用者側でプロンプトの調整が必要になるケースが想定されます。
このような場合、プロンプトをLambdaのコードから切り離し、Prompt Managementで管理することで、コードを変更することなくプロンプトのチューニングが可能になります。
特に、問い合わせ内容に基づいて種別を判定するシステムでは、基本的なプロンプトの構造は変わらないものの、判定基準の精度向上のためにプロンプトのバージョン管理が求められます。
Prompt Managementを活用することで、プロンプトの変更履歴を管理しながら、より精度の高い問い合わせ分類が実現できます。
前提条件
- 東京リージョンで、Bedrockで利用するモデル
Claude 3.5 Sonnet
を有効化済み
Prompt Management
Bedrockのプロンプト管理からプロンプトを作成します。
プロンプトの名前を記載し作成します。
システム命令(役割設定)とプロンプトメッセージ(具体的な指示内容)を、以下のように設定します。
あなたは、レストランの電話担当者です。
お客様からのお問い合わせ内容を元に、ルール内のリストからもっとも適切な種別を選んでください。
存在しない問い合わせ種別に遭遇した場合は、「その他」を回答してください。
<rule>
1. 返信には、「以下のように変換しました」等の文言は含めないでください。
2. お客様のお問い合わせ内容に最も適した種別を次のリストから選択してください:
- メニューに関する問い合わせ
- 大人数対応に関する問い合わせ
- 予約に関する問い合わせ
- 営業日や時間に関する問い合わせ
3. 回答は、選択した種別のみを返してしてください。
</rule>
お客さんのお問い合わせ内容は次のとおりです。
<question>
{{input_text}}
</question>
このプロンプトは、先ほど紹介したブログで実装した問い合わせ種別判定システムで使用したものをベースにしています。
プロンプトメッセージの変数として{{input_text}}
を記載し、ここにお客様からのお問い合わせ内容が入ります。
モデルは、Claude 3.5 Sonnet を指定し、ドラフトを保存し、バージョンを作成をクリックします。
バージョンを作成後、プロンプトの編集する場合、[プロンプトビルダーで編集]から、ドラフトバージョンをもとに修正できます。
テスト
作成したプロンプトは、バージョンを指定してテストを実施できます。このテスト機能により、プロンプトの動作を実際の運用前に確認できます。
テスト変数に「そちらで出している鶏肉は、どこの産地ですか?」と記載すると、お問い合わせ種別が「メニューに関する問い合わせ」と判定されます。
プロンプトの比較
プロンプトビルダーの[バリアントを比較]から、既存のドラフトバージョン(元のプロンプト)と修正したプロンプト(バリアント_1)を比較することも可能です。
さらに、異なるバージョン間での比較することができます。
プロンプト設定の変更差分だけでなく、各バージョンの実行結果の違いを確認できます。これにより、プロンプトの改善効果を簡単に検証できます。
boto3をLambda Layerにアップロード
Lambda関数でPrompt Managementを利用するためには、boto3ライブラリのバージョン1.35.56以降が必要です。
そのため、最新バージョンのboto3をLambda Layerとしてアップロードする手順を実施します。
AWS CloudShellを開きコマンドを実行します。ZIP化し、名前を記載し、Lambda Layerにアップロードします。
$ mkdir python
$ pip install boto3 -t python/
$ zip -r ./python.zip ./python
$ ls -lh python.zip
-rw-r--r--. 1 cloudshell-user cloudshell-user 15M Feb 4 07:38 python.zip
# Lambda Layer名は、boto3
$ aws lambda publish-layer-version \
--layer-name boto3 \
--description "Latest boto3 library" \
--zip-file fileb://python.zip \
--compatible-runtimes python3.12 python3.13
Lambda関数を作成
Lambdaを以下の設定で作成します。
- ランタイム:Python 3.13
- タイムアウト:10秒
- IAMロールに追加するIAMポリシー
- AmazonBedrockFullAccess
- Lambda Layer
- 先程アップロードした最新バージョンのboto3を適用する
- 環境変数
- キー:promptVersionARN
- 値:プロンプトバージョン ARN
Lambda関数のコードを以下に示します。
このコードは、Prompt Managementで管理されているプロンプトを呼び出し、問い合わせ内容の種別判定を行います。
import boto3
import os
bedrock = boto3.client('bedrock-runtime')
modelId = os.environ['promptVersionARN']
def lambda_handler(event, context):
question = event['question']
promptVariables = {
"input_text":{
"text": question
}
}
response = bedrock.converse(
modelId=modelId,
promptVariables=promptVariables
)
return {
'body': response["output"]["message"]["content"][0]["text"]
}
input_text
は、先ほどPrompt managementで定義したテスト変数名と一致させる必要があります。
この変数名の一致により、プロンプトとLambda関数が正しく連携します。
実行してみる
動作確認のため、「二十人で予約したいんですが入りますか」という質問でLambda関数を実行してみます。
この質問は大人数での予約に関する問い合わせを想定したテストケースです。
テストイベントの設定は以下の通りです。
{
"question": "二十人で予約したいんですが入りますか"
}
Lambda実行後のレスポンス内容は以下の通りです。
{
"body": "大人数対応に関する問い合わせ"
}
実行結果として、お問い合わせ内容「二十人で予約したいんですが入りますか」に対して「大人数対応に関する問い合わせ」という種別判定が返されました。
この判定は、事前に定義した分類基準に従った適切な結果となっています。
このように、Lambda関数のコードを変更することなく、Prompt Management上でプロンプトの内容を柔軟に調整できることが確認できました。
上記のコードを以下で紹介しているLambdaのコードマージさせることで、お問い合わせの種別判定を行うシステムでもプロンプトをPrompt Managementで管理することができます。
最後に
Prompt Managementを活用することで、プロンプトの効率的なバージョン管理が可能になり、バージョン間の出力結果も容易に比較できます。
さらに、コードとプロンプトを明確に分離でき、運用面での柔軟性も向上します。
これらの利点により、従来のLambdaコードへの直接記述やS3バケットでの管理と比べて、より効果的なプロンプト管理が実現できると感じました。
参考