Amazon Bedrock Flows が一般提供されたので、フローを作って AWS Lambda から呼び出してみた
はじめに
こんにちは、フクナガです。
Amazon Bedrock でプレビュー提供されていた「Prompt Flows」が「Amazon Bedrock Flows」として提供開始されました!
Amazon Bedrock Flows is now generally available with enhanced safety and traceability
生成 AI アプリケーションの処理フローを GUI で定義できるというもので、非常に便利そうでしたので早速使ってみました。
本記事では、サンプルアーキテクチャの構築を通して、使用感やできることなどをご紹介できればと思います。
このブログで取り扱うアーキテクチャについて
今回のブログでは、下記を実現するアプリケーションを実装します!
天気情報(天気、気温)を受け取って適切な服装をサジェストしてくれる生成 AI コーディネーター
Amazon Bedrock Flows で構築したフローを AWS Lambda から実行する、という処理の流れを実装していきます。
Amazon Bedrock Flows とは
実装に入る前に、Amazon Bedrock Flows について特徴や価格などをご紹介させていただきます。
(1) 特徴
- 生成 AI ワークフローを視覚的に素早く構築可能
フロービルダーと呼ばれる GUI 画面で、各項目をドラッグアンドドロップで組み合わせることが可能です。 - Amazon Lex や AWS Lambda、Amazon Bedrock の各機能との統合を簡単に実現可能
本来は各サービスを横断して設定が必要でしたが、Amazon Bedrock Flows のフロービルダーで視覚的に組み合わせることが可能です。 - 構築した生成 AI ワークフローのテストをすぐにできる
画面右の「フローをテスト」画面から、構築したフローのテストが可能です。
試す→テストする、のサイクルを素早く回せるのは非常に魅力的ですよね。
実際の画面や使い方を学ぶためのデモ動画もコンテンツとして用意されています。
お時間ある方はぜひ見てみてください!
Amazon Bedrock Flows Demo | Amazon Web Services
(2) 料金体系
Amazon Bedrock Flows では、「node transitions」という単位での課金が発生します。
公式ドキュメントによると、 Amazon Bedrock Flows は定義したワークフロー内の「node」が実行される回数をカウントしていて、それらの合計実行回数によって課金されるようです。
参考:Amazon Bedrock Pricing
※2024/11/27(執筆時点)では、英語版のドキュメントにのみ記載があります
料金は、1000 node transitions ごとに $0.035 発生します。
(2024/11時点で、約 5 円程度)
1 つのワークフローに node が 3 つ設定されているとすると、下記のような試算になります。
100 回/日(実行回数)× 30 日/月 × 3 node/workflow ÷ 1000 × $0.035/1000 node = $0.315
1 日 100 回程度の実行回数なら、1 か月で 50 円程度の課金ですね。
注意点
Amazon Bedrock Flows では、様々なサービスや機能を組み合わせてワークフローを構築できます。
実行時にそれらの課金は発生しますので、試算する際は忘れないように気を付けましょう。
例)言語モデル利用にかかるトークン料金、ナレッジベース用のベクトルデータベース、ガードレールポリシー
事前準備
今回は、 Claude 3.5 Sonnet を利用するため、下記ブログなどを参考にして対象モデルのモデルアクセスを有効化しておきましょう!
Amazon Bedrock Flows でのフロー構築
1. Amazon Bedrock コンソール左側「フロー」を選択する
2. 「フローを作成」を押下する
3. 下記を選択、入力し「作成」を押下する
名前:任意の名前を入力
サービスロール名:「新しいサービスロールを作成して使用」を選択
フローの作成が完了すると「フロービルダー」画面に遷移します。
かわいい UI ですね!
ここからは実際のフローづくりに進んでいきたいのですが、今回は簡単に下記のようなアプリを作るとお伝えしました。
- 天気情報(天気、気温)を受け取って適切な服装をサジェストしてくれる生成 AI コーディネーター
上記を実装するための手順をご紹介します。
4. 「Flow input」ノードを選択し、左側「設定」内「出力」の「タイプ」を「Object」へ変更する
5. 左側メニューを「ノード」に変更し、「プロンプト」をビルダー画面にドラッグアンドドロップする
6. プロンプトノードの設定を変更する
プロンプト名:任意ですが、今回は「Prompt_Weather」としました
定義方法(プロンプト名直下の選択):「ノードで定義」を選択
モデルを選択:何を選んでもよいのですが、今回は「Claude 3.5 Sonnet」を選択しました
メッセージ:
今日の天気に合わせた服装をおすすめしてください。 天気:{{weather}} 気温:{{temperature}}
入力:
(1) weather
タイプ:String
式:$.data.weather
(2) temperature
タイプ:Number
式:$.data.temperature
7. キャプチャ画像のように各ノードをつなげる
8. 画面上部の「保存」を押下する
保存完了時に、下記キャプチャ画像のような注意書きが出ます。
これは、「権限足りなかったから追加しておいたよ!」という報告ですので、気にしなくて大丈夫です。
これでフローの準備は完了です!非常に簡単ですね!
続いて、フローをテストしてみましょう!
9. 「フローをテスト」画面で下記jsonを入力し、「実行」を押下する
{"weather": "晴れ", "temperature": 20}
しばらくすると回答が返ってきました!
慣れないうちは難しいかもしれませんが、生成AIアプリケーションをこんなにも簡単に作れるのは素晴らしいですね!
様々な AWS サービスとの統合も提供されているので、次回以降の記事でご紹介できればと思います。
AWS Lambda から呼び出してみた
Amazon Bedrock Flows でワークフローを作ったところで、ここからは実際にコードから実行する方法をご紹介していきます!
1. Amazon Bedrock Flows 画面で作成したフローを選択する
2. フロー画面の右上「エイリアスを作成」を選択する
3. 任意で「エイリアス名」を入力し、「エイリアスを作成」を押下する
作成が完了すると、フロー画面に下部に「バージョン」と「エイリアス」が表示されます。
これで、Amazon Bedrock Flows 側の設定は完了となります。
AWS Lambda のようにバージョン管理ができることは、トラブルシューティングや開発時に役立ちそうですね。
4. 呼び出し元の AWS Lambda を構築する
通常の AWS Lambda と違う点にフォーカスしてご紹介しますので、 AWS Lambda の構築方法などは割愛いたします。
本ブログでは、ランタイムを Python 3.13 とします。
(1) AWS Lambda の IAM ロールを設定する
今回は、AWS Lambda が Amazon Bedrock Flows を実行できる必要があります。
そのために、「bedrock:InvokeFlow」という権限を AWS Lambda の IAM ロールに対して設定します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "[IDとして任意の値を入力]", "Effect": "Allow", "Action": "bedrock:InvokeFlow", "Resource": "arn:aws:bedrock:us-east-1:[アカウントID]:flow/[フローID]/alias/*" } ] }
(2) AWS Lambda の タイムアウト時間を変更する
デフォルト 3 秒だと生成 AI からの返答を待つことができないため、タイムアウトをそれなりの時間に変更します。
※今回は 1 分を採用していますが、アプリケーションによってベストなタイムアウト時間は異なります。
(3) AWS Lambda のコードを記述する
呼び出すためのコードは下記です。
各パラメータについては、ご自身の環境に合わせて変更をしてください。
なお、Amazon Bedrock Flows の呼び出しには「invoke_flow」を利用します。
import json import boto3 client = boto3.client('bedrock-agent-runtime') def lambda_handler(event, context): # TODO implement weather = event.get('weather') temperature = event.get('temperature') response = client.invoke_flow( flowAliasIdentifier='[作成したエイリアスの ID]', flowIdentifier='[作成したフローの ID]', inputs=[ { 'content': { 'document': { "weather": weather, "temperature": temperature } }, 'nodeName': 'FlowInputNode', 'nodeOutputName': 'document' }, ] ) for event in response['responseStream']: if 'flowOutputEvent' in event: content = event['flowOutputEvent']['content']['document'] print(content) break return { 'statusCode': 200, 'body': content }
コード内の下記の変数については、環境によって変更いただく必要があります。
- nodeName
フロー内の呼び出すノード名を記載しています。
今回の場合は、FlowInputNode という名前です。 - nodeOutputName
呼び出すノードの出力名を記載します。
今回は、document となります。
これで環境は完成です!
実際に挙動をテストしてみましょう!!
5. AWS Lambda の「コード」コンソールで「Deploy」を押下する
※新しいエディターを使っていただいている方は、UI が異なりますのでご注意ください。
6. AWS Lambda の「テスト」コンソールで下記を入力し、「保存」を押下する
イベントアクションをテスト:「新しいイベントを作成」を選択
イベント名:任意の名前を入力
イベント共有の設定:「プライベート」を選択
テンプレート:hello-world(デフォルト)
イベントJSON:
{ "weather": "雨", "temperature": 10 }
7. AWS Lambda の「テスト」コンソールで「テスト」を押下する
実行に成功すると、下記のようにログからフローから帰ってきた出力を確認できると思います!
※失敗した方は、フローやエイリアスの ID を確認し、再度デプロイなどを試しましょう!
非常に短いコードでシンプルに呼び出すことができましたね!
まとめ
本記事では、Amazon Bedrock Flows で構築したフローを AWS Lambda から実行する、という処理の流れの実装方法をご紹介しました。
生成 AI アプリケーションを簡単に実装するためのサービスがどんどんリリースされるのはとても素晴らしいことですね!
Amazon Bedrock Flows では、もっともっと発展的な実装ができると思いますので、引き続きキャッチアップしていきたいと思います!
テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!
Follow @twitterインフラエンジニア歴5年のフクナガです。2024 Japan AWS Top Engineers / Google Cloud Partner Top Engineer 2025 に選出されました! 生成 AI 多めで発信していますが、CI/CDやIaCへの関心も高いです。休日はベースを弾いてます。
Recommends
こちらもおすすめ
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28
AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16