はじめに
夏真っ盛りのこの時期、いかがお過ごしでしょうか。日々の暑さに負けない、データ分析エンジニアの木介です。
今回は、2024年7月にプレビューとして発表された、「Amazon Bedrock Prompt Flows」を利用して、LLMワークフローを構築してみたいと思います。
Amazon Bedrock Prompt Flowsとは?
1. 概要
Amazon Bedrock Prompt Flowsとは生成AIワークフローをGUIにより簡単に作成できる機能です。
具体的には、以下のようなGUIでAmazon Bedrock サービスと AWS Lambda などの他の AWS サービスを簡単に統合し、ワークフローをデプロイし、APIとして利用することが出来ます。
※現在(2024/8月)Previewであるため将来的に仕様が変更される可能性があります。
今回は特に上記のAWSからのデモでも紹介されていたPrompt flowsを用いてKnowledge Bases for Amazon Bedrockと連携し、RAGアプリを作成するところまでを紹介したいと思います。
使い方
ではPrompt flowsの使い方を紹介するために簡単な生成AIワークフローを作成したいと思います。
以下はPrompt flowsでの用語をまとめた表です。
Prompt flowsではNode同士をConnectionでつなぐことで様々なフローを作成することが出来ます。
Node | 処理の単位 |
Connection | Nodeの出力と入力同士を接続する |
Prompt flow builder | Prompt flowsが提供しているフローを組めむためのGUI |
まずは以下のBedrockのメニューの「Prompt flows」からPrompt flowsへ遷移することが出来ます。
「Create Prompt flows」から新しいフローの作成を行います。
以下のような画面が表示されますので、フロー名と概要を入力します。
また今回Service roleについては新しく作成をしていきます。
以上で新しいフローが作成できます。
1. Prompt flow builderによるフローの構築
フローの構築
作成したフローから以下のようなフローの編集画面へ移ることが出来ます。
この右上にある「Edit in prompt flow builder」よりフローの編集を行うことが出来ます。
以下のような画面でフローの編集が可能です。
Prompt flow buildersでは処理を行うNodeとそれをつなぐConnectionという単位で構成されています。
各NodeのOutputとInputをConnectionでつないでいくことでフローを構築することが出来ます
Prompt flowsの作成
現在Prompt flowsで利用できるNodeとしては以下の種類があります。
docs.aws.amazon.com
Logic Node
Collector | 配列に統合する反復 |
Iterator | 次のNodeを各メンバーに反復的に適用 |
Condition | 条件に基づいてデータを送信 |
Orchestration
Agents | Bedrockで定義したAgentsにより回答 |
Prompts | Bedrockで利用できるFM(基盤モデル)やPrompt Managementにより回答 |
Code
Lambda | Lambdaによる処理が可能 |
Data
Knowledge base | Bedrockで作成したKnowledge baseにより回答 |
S3 Retrieval | S3からオブジェクトを取得 |
S3 Storage | S3にオブジェクトを格納 |
AI Services
Lex | Lexとの連携が可能 |
上記Nodeを利用することで様々なフローが構築可能です。
今回は簡単な生成AIワークフローの構築が目的ですので、Flow input ⇒Prompts Node ⇒Flow outputというシンプルな構成でフローを作成します。
では実際に生成AIを使って回答する処理である フローを編集していきましょう。
まずPrompts Nodeを選択すると左側に以下のような設定が出てきます。
今回はシンプルに一つのNodeだけを設定するので、「Define in node」を選択します。
「モデルを選択」から回答の生成に利用するFM(基盤モデル)を選択することが出来ます。
今回はClaude 3 Sonnetを利用していきます。
Nodeの設定
Nodeは入力に文字列、数値、ブール値、配列、オブジェクトをサポートしており、これらをプロンプトの入力時にまとめてjson形式で渡すことが可能です。
詳細は以下のドキュメントに詳しく書かれていますが、$.dataで入力全体を指定でき、$.data.nameという形で更に入れ子となっている部分にアクセスすることが出来ます。
この入力より受け取った変数を{{value}}のように囲むことでプロンプトに埋め込むことが出来ます。
では実際に定義してみましょう。
Prompts NodeのMessageよりFM(基盤モデル)に入力するプロンプトを編集することが出来ます。
今回は以下のように定義しました。
{{country}}に{{price}}円の予算で旅行に行く時の最適なプランを教えてください
上記のプロンプトを「Message」に設定します。
想定する入力としては以下の形となります。
{
“country”:”US”,
“price”:200000
}
上記の入力より受け取ったcountryキーとpriceキーから値をそれぞれ取り出し、プロンプトに埋め込んでいます。
さて「Message」に上記のプロンプトを設定することで、変数部分が自動的にNodeの「Input」にアサインされます。
今回はTypeのみ編集し、以下のようにしました。
最後に以下のようにそれぞれのNodeのOutput、InputをConnectionでつなげばフローの完成です。
2. 作成したフローを試す
では早速作成したフローを試してみようと思います。
右上の「Save」よりフローを保存後、「Test Prompt flow」よりチャット形式で簡単に試すことが可能です。
以下を入力として送信してみます。
以下が回答になります。
それらしい回答が得られています。
韓国は魅力的な観光地が多く、50,000円の予算で楽しい旅行ができます。以下が一例の最適なプランです。
1. 航空運賃
- 成田 - 仁川 往復航空券: 約20,000円
2. 宿泊
- ソウル市内のゲストハウスまたは格安ホテル(2泊): 約10,000円
3. 観光
- 景福宮、昌徳宮、南山公園、明洞などのソウル市内の主要観光地を巡る: 無料
- 南大門市場や東大門市場での買い物: 交通費のみ
4. 食事
- 市場の屋台や路地裏の食堂で現地料理を堪能: 1食あたり3,000円程度
5. 交通
- 地下鉄やバスを利用して市内を移動: 1日あたり3,000円程度
6. 雑費: 5,000円程度
上記のようなプランで、ソウルの魅力を十分に味わえると思います。現地の人々との交流を深めたり、ちょっとした思い出の品を買ったりするのもおすすめです。旅行の目的や好みに合わせて、プランを調整することができます。
3. APIとしてフローを呼び出す
作成したフローはAliasを指定してデプロイすることでAPIとして呼び出すこともできます。
フローの以下の画面の右上の「Create alias」よりデプロイが可能です。
デプロイが完了したら、フローのIDとAliasのIDを指定し、Amazon Bedrock APIのInvokeFlowで呼び出すことでAPIとして利用が可能になります。
今回はpythonとboto3を使って呼び出してみました。
以下のコードでAPIとして利用が出来ます。
import boto3 import json client = boto3.client("bedrock-agent-runtime") response = client.invoke_flow( flowIdentifier="フローのID", flowAliasIdentifier="AliasのID", inputs=[ { "content": { "document": json.dumps({"country": "韓国", "price": 20000}, ensure_ascii=False) }, "nodeName": "FlowInputNode", "nodeOutputName": "document", } ], ) event_stream = response["responseStream"] for event in event_stream: print(event)
以下がレスポンスになります。
{'flowOutputEvent': {'content': {'document': '20,000円の予算で韓国旅行を計画するのは大変ですが、上手に工夫すれば楽しい旅行ができると思います。以下が一案です。\n\n交通費:\n- 航空運賃が高額なので、釜山や大邱など地方都市に行くのがおすすめ。東京⇔釜山が往復で1万円前後。\n- 現地では地下鉄や路線バスを利用するのが賢い選択。\n\n宿泊費:\n- ゲストハウスなら1泊1,000~2,000円程度で泊まれる。\n- エアビーなどで個室を借りるのも手。\n\n食費:\n- 屋台の路線やフードコートを活用すれば500円前後で食事ができる。\n- 市場で食材を調達して自炊するのも賢い選択。\n\n観光:\n- 無料の観光スポットを中心に回る。例:南山公園、甘川文化村、釜山タワーなど。\n- 博物館や遺跡なども比較的安価。\n\n旅行期間は3泊4日がベストでしょう。現地ツアーに参加したり、お土産を買うなら予算に余裕を持たせた方が良いでしょう。時期を選べば航空券が安くなるのでチェックしてみてください。'}, 'nodeName': 'FlowOutputNode'}}
{'flowCompletionEvent': {'completionReason': 'SUCCESS'}}
APIとして利用できていることが分かります。
以上でPrompt flowsの使い方の説明になります。
GUIでBedrockのモデルを使った生成AIワークフローを簡単に作成し、デプロイまで行うことが出来ました。
Knowledge Bases for Amazon Bedrockとの連携
では次にKnowledge Bases for Amazon Bedrockと連携をしてみようと思います。
前提条件として、S3バケットに「安全なウェブサイト運営にむけて」のPDFを配置したものをデータソースとして設定したKnowledge Baseを用意しています。
以下の記事を参考にしています。
先ほどと同様にPrompt flow builderでフローの編集を行っていきます。
まずフローとしては先ほどのPrompts NodeをKnowledge base Nodeに置き換える形で以下のように配置します。
Knowledge base Nodeを選択し、設定をしていきます。
まず、「Knowledge base」よりBedrockで作成したKnowledge baseを選択します。
またKnowledge baseの回答をそのまま返すか、FM(基盤モデル)で整形するかを選択することが出来ます。
今回は「Generate responses based on retrieved results」を選択し、Claude 3 Sonnetで回答を整形してもらうことにします。
上記で設定は以上となります。
右上の「Save」よりフローを保存し、早速試してみましょう。
以下が質問と回答です。
S3にアップロードしたPDFより回答が生成出来ていることが分かります。
以上がKnowledge Bases for Amazon Bedrockとの連携になります。
非常に簡単にBedrockサービスと連携することが出来ました。
このほかにもS3やLambdaもフローに組み込むことが出来るので、様々な生成AIワークフローを簡単に構築することが出来そうです。
まとめ
今回はGUIで生成AIワークフローを構築可能なAmazon Bedrock Prompt Flowsを試してみました。
GUIで生成AIとAWSサービスと連携したワークフローが簡単に構築できるサービスとなっていました。
現在はPreview版であるため連携できるサービスも増えると思いますので、是非皆さんも利用してみてください。
Acroquest Technologyでは、キャリア採用を行っています。
- Azure OpenAI/Amazon Bedrock等を使った生成AIソリューションの開発
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- マイクロサービス、DevOps、最新のOSSやクラウドサービスを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
www.wantedly.com