はじめに
こんにちは一史です。
冬にもかかわらず、自宅のモンステラが新芽を出しており、生命力に驚いています。
さて最近、Amazon Bedrock Flowsの新機能としてマルチターン形式の会話機能がサポートされました。
aws.amazon.com
従来は、ユーザーが1回のプロンプトで処理に必要な情報を全て入力する必要がありましたが、マルチターン形式の会話により不足している情報を適宜AIが聞き返すことが簡単に実現できます。
今回はこのマルチターン形式の会話機能により、対話的なフローを行ってみます。
概要
Amazon Bedrock Flowsとは?
Amazon Bedrock Flowsは、AWSが提供するGUIベースの生成AIフレームワークです。
これを利用すると、独自のAIエージェントやチャットボットを簡単に構築することができます。
詳細な説明については以下記事で紹介していますので、参考にしていただければと思います。
acro-engineer.hatenablog.com
マルチターンの会話機能とは?
今回新たにサポートされたマルチターンの会話機能は、不足している情報をユーザーに聞き返す、対話形式のフローを可能にするものです。
例えば、旅行プランの提案・予約フローがあった場合、単一ターンの会話と、マルチターンの会話では以下のような違いになります。

従来の単一ターンの会話では、入力された文章から、必要情報を取り出して処理をする場合、対象文章に必要情報が全て含まれている必要がありました。
もし必要情報が入力に含まれていなかった場合は後続処理に移行してしまいます。
そのため、処理ができなくなるか、AIが推測して必要情報を作り出し意図しない挙動になる場合があります。
一方、マルチターンの会話機能を使うことで、不足情報があれば次の処理へは行かずに、ユーザーに聞き返すようになります。
このように、マルチターンの会話機能を使うことで、より自然な対話フローを簡単に実現できます。
Amazon Bedrock Flowsでマルチターンの会話をするフローを作成
それではAmazon Bedrock Flowsでマルチターンの会話機能を使用する方法を、紹介していきます。
今回は例として、予算・PCの用途・デスクトップかノートPCか、をもとにPCを推薦するフローを作成していきます。
フローの概要
まず今回作成するフローの全体像はこちらです。

ユーザーからの入力はエージェントノードで受け取ります。
プロンプトノードもユーザーからの入力を、文章形式で受け取れますが、マルチターンの会話機能はエージェントのみの機能なためエージェントを用います。
そして、エージェントでは予算・PCの用途・デスクトップかノートPCかの情報を抽出し、後続のAWS Lambdaに渡してPCを推薦します。
Lambdaでの推薦は簡易的に、抽出した情報の組み合わせに対応するPC名を返すようにしています。
マルチターンの会話をするエージェントの作成
まず、ユーザー入力を受け取り、PC推薦に必要な情報を抽出するエージェントを作成します。
今回エージェントに渡した命令は以下です。
ユーザーの入力を分析し、以下の3つのパラメータを抽出してください。 # 抽出すべき情報 1. 価格帯(price_range) - ユーザーの予算が 15万円未満 の場合、"lower_than_150000yen" を返す - ユーザーの予算が 15万円以上 の場合、"higher_than_150000yen" を返す 2. 用途(use_case) - ゲーム用のPCが必要な場合、"game" を返す - 仕事、ドキュメント作成、メールなどのビジネス用途の場合、"business" を返す 3. PCの種類(pc_type) - デスクトップPCが必要な場合、"desktop" を返す - ノートPCが必要な場合、"laptop" を返す # 出力フォーマット 抽出すべき情報を取り出せたら、以下のJSON形式で結果を返してください。 ```json { "price_range": "lower_than_150000yen", "use_case": "game", "pc_type": "laptop" } ```
次に、マルチターンの会話をするための設定として、「その他の設定」の「ユーザー入力」を「有効」にします。
これによってマルチターンの対話が可能になります。

PC推薦Lambdaの作成
次に、エージェントが作成したJSONを受け取り、推薦するPCを返すLambdaを作成します。
今回は簡易的に、関数の中にPCの一覧を定義しておきます。
# PC推薦マップ PC_RECOMMENDATION_MAP = { "lower_than_150000yen.game.desktop": "ASUS ROG Strix G15", "lower_than_150000yen.game.laptop": "Dell G15 Ryzen Edition", "lower_than_150000yen.business.desktop": "HP Pavilion Desktop TP01", "lower_than_150000yen.business.laptop": "Lenovo ThinkPad E14", "higher_than_150000yen.game.desktop": "Alienware Aurora R15", "higher_than_150000yen.game.laptop": "Razer Blade 15 Advanced", "higher_than_150000yen.business.desktop": "Apple Mac Studio", "higher_than_150000yen.business.laptop": "Apple MacBook Pro 16-inch", } def lambda_handler(event, context): # 入力パラメータの取得 input_str = event.get("node", {}).get("inputs", [])[0].get("value", "") # エージェントが出力した文字列からJSONを抽出しパースする match = re.search(r'\{.*?\}', input_str, re.DOTALL) json_str = match.group(0) if match else None pc_params = json.loads(json_str) # PCの推薦 recommend_key = f"{pc_params['price_range']}.{pc_params['use_case']}.{pc_params['pc_type']}" recommended_pc = PC_RECOMMENDATION_MAP.get(recommend_key, "no_recommended_pc") if recommended_pc == "no_recommended_pc": response = "お勧めできるPCはありませんでした。" else: response = f"{recommended_pc} がお薦めです。" return response
マルチターンの対話を行ってみる
それでは、作成したフローと対話をしてみます。
曖昧な質問に対して、具体的な内容を聞き返すか
ユーザーの曖昧な質問に対して、具体的な内容を聞き返すかを見てみます。
まず、マルチターンの会話機能がOFFの場合の結果と、この時のエージェントが後続に渡した出力は以下です。
ここでは、「お手頃価格のPCが欲しい」と値段を曖昧に伝えてみます。

ありがとうございます。仕事用のお手頃価格のPCをお探しですね。より適切なおすすめができるように、もう少し詳しくお聞きしたいことがあります。 デスクトップPCとノートPCのどちらをお考えでしょうか?それぞれ特徴が異なりますので、ご希望をお聞かせいただけると助かります。
これを見ると、マルチターンの会話機能がOFFでもエージェントは聞き返そうとしているようですが、その内容がユーザーにではなく後続の処理に渡ってしまいエラーしたようです。
一方、マルチターンの会話機能をONにした場合の結果は以下です。

結果をみると、エージェントは次の処理へは進まず、ユーザーからの曖昧な質問に対して具体的な内容を聞き返していることがわかります。
また、Lambdaで定義した推薦するPCは以下表の通りで、期待通り「Lenovo ThinkPad E14」が推薦されています。
価格帯 | 用途 | PCの種類 | 推薦PC |
---|---|---|---|
15万円未満 | ゲーム | デスクトップ | ASUS ROG Strix G15 |
15万円未満 | ゲーム | ノートPC | Dell G15 Ryzen Edition |
15万円未満 | ビジネス | デスクトップ | HP Pavilion Desktop TP01 |
15万円未満 | ビジネス | ノートPC | Lenovo ThinkPad E14 |
15万円以上 | ゲーム | デスクトップ | Alienware Aurora R15 |
15万円以上 | ゲーム | ノートPC | Razer Blade 15 Advanced |
15万円以上 | ビジネス | デスクトップ | Apple Mac Studio |
15万円以上 | ビジネス | ノートPC | Apple MacBook Pro 16-inch |
1度のやり取りだけではなく、複数回のやり取りを踏まえて回答できるか
では次に、会話の往復が何度も発生した場合でも、それまでの会話全てをもとに回答ができるかを見ていきます。
以下ではPCの情報を小出しにして渡してみました。

これをみると情報が3回の会話に分割されてしまっていますが、最初のユーザーメッセージにあった「20万円いかないくらい」という情報も含めて、期待するPCが推薦できていることがわかります。
まとめ
Amazon Bedrock Flowsのマルチターンの会話機能により、ユーザーの入力があいまいな場合や、会話が複数回往復しても適切に必要な情報が抽出できることがわかりました。
自然な対話形式のAIサービスを簡単に作成することができるため、是非お試しください。
Acroquest Technologyでは、キャリア採用を行っています。
- Azure OpenAI/Amazon Bedrock等を使った生成AIソリューションの開発
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- マイクロサービス、DevOps、最新のOSSやクラウドサービスを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。