翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
注記
Amazon Bedrock Flows マルチターン会話は Amazon Bedrock のプレビューリリースであり、変更される可能性があります。
Amazon Bedrock Flows のマルチターン会話は、自然な対話と同様に、ユーザーとフロー間の動的でback-and-forthの会話を可能にします。エージェントノードが明確化または追加のコンテキストを必要とする場合、フローの実行をインテリジェントに一時停止し、ユーザーに特定の情報を求めることができます。これにより、ノードはユーザーのレスポンスに基づいて動作を調整できるため、よりインタラクティブでコンテキスト対応のエクスペリエンスが作成されます。たとえば、最初のユーザークエリがあいまいまたは不完全である場合、ノードはフォローアップの質問をして必要な詳細を収集できます。ユーザーがリクエストされた情報を提供すると、フローはエンリッチされた入力で実行をシームレスに再開し、より正確で関連する結果を確保します。この機能は、ユーザーのニーズを完全に理解して対処するには 1 回の操作では不十分な複雑なシナリオで特に役立ちます。
フローでマルチターン会話を処理する方法
フローでマルチターン会話を使用するには、Amazon Bedrock エージェントに接続されたエージェントノードが必要です。フローを実行すると、マルチターン会話は、エージェントが続行する前にユーザーからさらに情報を必要としたときに発生します。このセクションでは、エージェントを使用するフローを次の手順で説明します。
You are a playlist creator for a radio station. When asked to create a playlist, ask for the number of songs, the genre of music, and a theme for the playlist.
エージェントの作成については、「」を参照してくださいAI エージェントを使用してアプリケーションのタスクを自動化する。
ステップ 1: フローを開始する
フローを開始するには、InvokeFlow オペレーションを呼び出します。フローに送信する初期コンテンツを含めます。次の例では、 document
フィールドにプレイリストを作成するリクエストが含まれています。各会話には、フロー内の会話を識別する一意の識別子 (実行 ID) があります。実行 ID を取得するには、 へのexecutionID
最初の呼び出しで フィールドを送信しませんInvokeFlow
。からのレスポンスには、実行 ID InvokeFlow
が含まれます。コードで、 アイデンティティを使用して複数の会話を追跡し、 InvokeFlow
オペレーションへのさらに呼び出しで会話を識別します。
へのリクエストの JSON の例を次に示しますInvokeFlow
。
{
"flowIdentifier": "XXXXXXXXXX",
"flowAliasIdentifier": "YYYYYYYYYY",
"inputs": [
{
"content": {
"document": "Create a playlist."
},
"nodeName": "FlowInputNode",
"nodeOutputName": "document"
}
]
}
ステップ 2: エージェントリクエストを取得する
フロー内のエージェントノードがユーザーからの追加情報が必要であると判断した場合、 からのレスポンスストリーム (responseStream
) にはFlowMultiTurnInputRequestEvent
イベントオブジェクトInvokeFlow
が含まれます。イベントには、リクエストされた情報が content
(FlowMultiTurnInputContent
) フィールドにあります。次の例では、 document
フィールドのリクエストは、プレイリストの曲数、ジャンル、テーマに関する情報です。コードでは、その情報をユーザーから取得する必要があります。
FlowMultiTurnInputRequestEvent
JSON オブジェクトの例を次に示します。
{
"nodeName": "AgentsNode_1",
"nodeType": "AgentNode",
"content": {
"document": "Certainly! I'd be happy to create a playlist for you. To make sure it's tailored to your preferences, could you please provide me with the following information:
1. How many songs would you like in the playlist?
2. What genre of music do you prefer?
3. Is there a specific theme or mood you'd like for the playlist? Once you provide these details, I'll be able to create a customized playlist just for you."
}
}
フローはより多くの入力を受信するまで続行できないため、フローはFlowCompletionEvent
イベントも出力します。フローは常に FlowMultiTurnInputRequestEvent
の前に を出力しますFlowCompletionEvent
。completionReason
FlowCompletionEvent
イベントの の値が の場合INPUT_REQUIRED
、フローは続行する前により多くの情報を必要とします。
FlowCompletionEvent
JSON オブジェクトの例を次に示します。
{
"completionReason": "INPUT_REQUIRED"
}
ステップ 3: ユーザーレスポンスをフローに送信する
InvokeFlow
オペレーションを再度呼び出して、ユーザーレスポンスをフローに戻します。会話executionId
には必ず を含めてください。
へのリクエストの JSON の例を次に示しますInvokeFlow
。document
フィールドには、ユーザーからのレスポンスが含まれます。
{
"flowIdentifier": "AUS7BMHXBE",
"flowAliasIdentifier": "4KUDB8VBEF",
"executionId": "b6450554-f8cc-4934-bf46-f66ed89b60a0",
"inputs": [
{
"content": {
"document": "1. 5 songs 2. Welsh rock music 3. Castles"
},
"nodeName": "AgentsNode_1",
"nodeInputName": "agentInputText"
}
]
}
フローに詳細情報が必要な場合、フローはさらにFlowMultiTurnInputRequestEvent
イベントを作成します。
ステップ 4: フローを終了する
これ以上の情報が必要ない場合、フローは最終レスポンスを含むFlowOutputEvent
イベントを出力します。
FlowOutputEvent
JSON オブジェクトの例を次に示します。
{
"nodeName": "FlowOutputNode",
"content": {
"document": "Great news! I've created a 5-song Welsh rock playlist centered around the theme of castles.
Here's the playlist I've put together for you: Playlist Name: Welsh Rock Castle Anthems
Description: A 5-song Welsh rock playlist featuring songs about castles
Songs:
1. Castell y Bere - Super Furry Animals
2. The Castle - Manic Street Preachers
3. Caerdydd (Cardiff Castle) - Stereophonics
4. Castell Coch - Catatonia
5. Chepstow Castle - Feeder
This playlist combines Welsh rock bands with songs that reference castles or specific Welsh castles.
Enjoy your castle-themed Welsh rock music experience!"
}
}
フローはFlowCompletionEvent
イベントも出力します。completionReason
の値はSUCCESS
です。
FlowCompletionEvent
JSON オブジェクトの例を次に示します。
{
"completionReason": "SUCCESS"
}
次のシーケンス図は、マルチターンフローのステップを示しています。

サンプルフローの作成と実行
この例では、エージェントを使用してラジオステーションのプレイリストを作成するフローを作成します。エージェントは明確な質問をして、曲の数、音楽のジャンル、プレイリストのテーマを決定します。
フローを作成するには
-
「」の手順に従って、Amazon Bedrock コンソールでエージェントを作成しますエージェントを手動で作成および設定する。
ステップ 2.d では、「」と入力します
You are a playlist creator for a radio station. When asked to create a playlist, ask for the number of songs, the genre of music, and a theme for the playlist.
。-
ステップ 2.e では、ユーザー入力で Enabled を選択します。これにより、エージェントは必要に応じて詳細情報をリクエストできます。
-
「」の手順に従ってフローを作成しますAmazon Bedrock でフローを作成して設計する。フローに入力ノード、エージェントノード、および出力ノードがあることを確認します。
エージェントノードをステップ 1 で作成したエージェントにリンクします。フローは次の図のようになります。
Amazon Bedrock コンソールでフローを実行します。テストでは、フローが行うステップをトレースできます。詳細については、「Amazon Bedrock でフローをテストする」を参照してください。
次の Python コード例は、フローの使用方法を示しています。
コードを実行するには、以下を指定します。
region_name
– フローを実行している AWS リージョン。FLOW_ID
– フローの ID。FLOW_ALIAS_ID
– フローのエイリアス ID。
IDs「」を参照してくださいAmazon Bedrock のフローに関する情報を表示する。コードは、フローに送信する最初のリクエストをプロンプトし、フローの必要に応じてより多くの入力をリクエストします。このコードは、 AWS Lambda 関数を呼び出すリクエストなど、エージェントからの他のリクエストを管理しません。詳細については、「Amazon Bedrock エージェントの仕組み」を参照してください。実行中、コードは入力からフローが返すレスポンスへのパスを追跡するために使用できるFlowTraceEvent
オブジェクトを生成します。詳細については、「Amazon Bedrock でトレースを表示してフローの各ステップを追跡する」を参照してください。
"""
Runs an Amazon Bedrock flow and handles muli-turn interaction for a single conversation.
"""
import logging
import boto3
import botocore
import botocore.exceptions
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def invoke_flow(client, flow_id, flow_alias_id, input_data, execution_id):
"""
Invoke an Amazon Bedrock flow and handle the response stream.
Args:
client: Boto3 client for Amazon Bedrock agent runtime
flow_id: The ID of the flow to invoke
flow_alias_id: The alias ID of the flow
input_data: Input data for the flow
execution_id: Execution ID for continuing a flow. Use the value None on first run.
Returns:
Dict containing flow_complete status, input_required info, and execution_id
"""
response = None
request_params = None
if execution_id is None:
# Don't pass execution ID for first run.
request_params = {
"flowIdentifier": flow_id,
"flowAliasIdentifier": flow_alias_id,
"inputs": [input_data],
"enableTrace": True
}
else:
request_params = {
"flowIdentifier": flow_id,
"flowAliasIdentifier": flow_alias_id,
"executionId": execution_id,
"inputs": [input_data],
"enableTrace": True
}
response = client.invoke_flow(**request_params)
if "executionId" not in request_params:
execution_id = response['executionId']
input_required = None
flow_status = ""
# Process the streaming response
for event in response['responseStream']:
# Check if flow is complete.
if 'flowCompletionEvent' in event:
flow_status = event['flowCompletionEvent']['completionReason']
# Check if more input us needed from user.
elif 'flowMultiTurnInputRequestEvent' in event:
input_required = event
# Print the model output.
elif 'flowOutputEvent' in event:
print(event['flowOutputEvent']['content']['document'])
elif 'flowTraceEvent' in event:
logger.info("Flow trace: %s", event['flowTraceEvent'])
return {
"flow_status": flow_status,
"input_required": input_required,
"execution_id": execution_id
}
if __name__ == "__main__":
session = boto3.Session(profile_name='default', region_name='YOUR_FLOW_REGION')
bedrock_agent_client = session.client('bedrock-agent-runtime')
# Replace these with your actual flow ID and alias ID
FLOW_ID = 'YOUR_FLOW_ID'
FLOW_ALIAS_ID = 'YOUR_FLOW_ALIAS_ID'
flow_execution_id = None
finished = False
# Get the intial prompt from the user.
user_input = input("Enter input: ")
flow_input_data = {
"content": {
"document": user_input
},
"nodeName": "FlowInputNode",
"nodeOutputName": "document"
}
logger.info("Starting flow %s", FLOW_ID)
try:
while not finished:
# Invoke the flow until successfully finished.
result = invoke_flow(
bedrock_agent_client, FLOW_ID, FLOW_ALIAS_ID, flow_input_data, flow_execution_id)
status = result['flow_status']
flow_execution_id = result['execution_id']
more_input = result['input_required']
if status == "INPUT_REQUIRED":
# The flow needs more information from the user.
logger.info("The flow %s requires more input", FLOW_ID)
user_input = input(
more_input['flowMultiTurnInputRequestEvent']['content']['document'] + ": ")
flow_input_data = {
"content": {
"document": user_input
},
"nodeName": more_input['flowMultiTurnInputRequestEvent']['nodeName'],
"nodeInputName": "agentInputText"
}
elif status == "SUCCESS":
# The flow completed successfully.
finished = True
logger.info("The flow %s successfully completed.", FLOW_ID)
except botocore.exceptions.ClientError as e:
print(f"Client error: {str(e)}")
logger.error("Client error: %s", {str(e)})
except Exception as e:
print(f"An error occurred: {str(e)}")
logger.error("An error occurred: %s", {str(e)})
logger.error("Error type: %s", {type(e)})