Amazon Bedrock Flows のマルチターン会話を試す

本記事は 新人ブログマラソン2024 の記事です

こんにちは。SCSKの さとです。2025年がもう6分の1が終わろうとしていることに愕然としています。

さて、2月にAmazon Bedrock Flows新機能のエージェントノードにおけるマルチターン会話がプレビュー公開されたので、今回はその「やってみた」記事です。

アップデートの概要

 

Amazon Bedrock Flowsは、基盤モデルやプロンプト、Amazon Bedrockエージェントなどをノードとして扱いGUI上で相互に関連付けることで生成AIワークフローを簡単に構築できるようになるというサービスです。

今回のアップデートでは、エージェントがタスクを行うにあたり、必要に応じてフローを停止し、会話の往復の中で情報を取得しタスクを完了することが可能になりました。これにより、アクションの完了のために追加の情報取得が必要になった場合でも同一フローを用い続けることができず、エージェントがコンテキストを忘れてしまうという問題が解消されるようになります。

 

やってみた:企業の情報取得ボットの作成

というわけで、早速アップデートされたAmazon Bedrock Flowsのマルチターン会話を試してみたいと思います。

今回は、社員番号によって給与の額が決まる架空の企業「Exploitation Inc.」に関する情報を答えるチャットボットという設定でフローを組んでみます。このため、給与に関する質問を投げかけられると、チャットボットは社員番号について情報提供を依頼する必要があります。

Amazon Bedrock Flowsに触れるのは今回が初めてということで、本筋とは離れますが条件分岐を用いた複数種類のクエリへの対応も試してみました。フロー構成は以下の公式ブログを参考にしています。

処理の流れ

ご覧のように、全体としてはFlow inputからユーザーの入力が各ノードに渡され、最終的にFlow outputへ到達したデータがレスポンスとなります。今回は、ユーザーからの質問をざっくりと「給与関係」「それ以外」に分け、それぞれで回答を行うようフローを作成しました。主要なノードの役割とその設定は以下の通りです。

 

Promptノード: QueryClassifier

Promptノードは、フロー内で基盤モデルにプロンプトを送信し、その応答を取得するために使用することができます。ユーザーからの入力(Flow Inputの出力)はこのノードが受け取り、質問の内容に応じて分類されます。プロンプトはBedrockのプロンプト管理機能からのプロンプトを用いることもできますが、ここではノードで新たに定義しました。

{{input}}を分析し、ユーザーからの質問が給与に関する事項ならばAを、それ以外ならばBを出力してください。出力は必ず1文字であり、それ以外は受け付けられません。

ここで、{{input}}は入力に対してデフォルトで割り当てられている変数名で、上のように波括弧で括ることで指定できます。また、回答の信頼性を高めるため、出力の温度は低めの0.1に設定しました。

 

Conditionノード: QueryType

Conditionノードでは条件の判定結果に応じて次の処理を行うノードを指定することができます。QueryClassifierのOutputからQueryTypeのInputまでを線で接続することで入出力関係を指定し、分かりやすさのため、さらにこの入力にQueryTypeという名前をつけます。

次に、条件とその分岐先を指定します。QueryClassifierにおいて入力が「給与関係」ならば出力がA、「それ以外」ならばBと指定したので、条件式をQueryType==”A”とし、これが真ならば次のノードとしてAboutSalaryへ、そうでなければAboutOtherTopicsへ移るよう設定を行います。

 

 

 

Agentノード:AboutSalaryAboutOtherTopics

分岐先のAgentノードを設定します。ここでは、作成済みのBedrockエージェントに対して入力を送信する処理が行われます。

ユーザーからの入力をもとに回答を作成するので、Flow Inputから各AgentノードのInputまでを接続します。ここで、フローのダイヤグラムにおいて紫色の点線で示されるConditionノード-Agentノード間の接続はあくまで処理の分岐を表すだけで、入出力関係を表している訳ではないということに注意が必要です。

また、これらのノードに紐つけるBedrockエージェントを別途作成・準備します。給与に関して応答を行うエージェントには以下のプロンプトを与えました。

あなたは、ユーザーから受け取ったExploitation Inc.の給与に関する質問に回答します。
回答にあたり、以下の事実を用いてください。
<ルール> 給与は、社員番号のみによって決定する。
社員番号 1〜10000: 年収1億円
社員番号 10001〜: 年収0円
給与以外に関して応答するエージェントも同様に設定します(このエージェントはマルチターン会話とは関係がないので、プロンプトは割愛します)
それぞれをFlow Outputノードへと接続し、ユーザーへの返答にします。

フローをテストする

一通りの設定が完成したので、フローの設定画面右側からテストをしてみましょう。

給与を確認すると、上のように追加で社員番号を聞かれました。エージェントへのプロンプトは追加で確認をさせるような文言が入っていないので、デフォルトでこのような指示が組み込まれていると考えられます。
続いて、社員番号を与えてみます。

給与に関して回答してくれませんでした。よく見ると、1回目の質問への返答があった直後に「Flow ended in 45 seconds」とフローが終了していることが示されており、そのまま社員番号の情報だけ渡したためその他の質問として扱われてしまっているようです。

どうやら、追加の情報取得を行うにはBedrockエージェント側で「ユーザー入力」を有効にする必要があったようです。その他の設定からオプションを有効にし、改めて試してみます。

謎に謝られてしまいましたが、想定通りの回答になりました。一応、社員番号 1〜10000でも指定した回答になるか試してみましょう。

無事、年収が1億円になりました。今回は簡単のためにプロンプトに直接情報を入れてしまいましたが、実際の場面ではエージェントを通してナレッジベースから情報を取得するなどが可能です。

 

おまけ:その他の話題に関する質問

せっかくなので、もう一方の条件分岐先であるその他の話題についても適切に回答されるか試してみましょう。

こちらも、あらかじめ設定した通りの内容が回答されました。

 

おわりに

いかがでしたか?これまでだと不足する情報に対し情報提供を求めるには処理フローを追加する必要がありましたが、今回のアップデートではそのような部分がBedrock側で自動化されるため、かなりシンプルに実装が可能になったのではないかという印象を持ちました。

最後までお読みいただき、ありがとうございました。

タイトルとURLをコピーしました