

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Bedrock フローと会話する
<a name="flows-multi-turn-invocation"></a>

**注記**  
Amazon Bedrock フローのマルチターン会話は Amazon Bedrock のプレビューリリースに含まれており、変更される可能性があります。

Amazon Bedrock フローのマルチターン会話では、自然な対話のように、ユーザーとフロー間の動的な相互の会話が可能です。エージェント ノードが説明や追加のコンテキストを必要とする場合、フローの実行をインテリジェントに一時停止し、ユーザーに特定の情報の入力を求めることができます。これにより、ノードはユーザーの応答に基づいて動作を適応させることができるため、よりインタラクティブでコンテキスト対応のエクスペリエンスを実現できます。例えば、最初のユーザークエリがあいまいであったり不完全であったりすると、ノードは必要な詳細を収集するためにフォローアップの質問をすることができます。ユーザーが要求された情報を提供すると、フローは拡充された入力を使用してシームレスに実行を再開し、より正確で関連性の高い結果が保証されます。この機能は、1 回のやり取りだけではユーザーのニーズを完全に理解し対応することが難しい複雑な状況において、特に価値があります。

**Topics**
+ [フローでマルチターン会話を処理する方法](#flows-multi-turn-invocation-how)
+ [フローの例の作成と実行](#flows-multi-turn-invocation-example-flow)

## フローでマルチターン会話を処理する方法
<a name="flows-multi-turn-invocation-how"></a>

フローでマルチターン会話を使用するには、Amazon Bedrock エージェントに接続された[エージェントノード](flows-nodes.md#flows-nodes-agent)が必要です。フローを実行すると、エージェントが続行する前にユーザーからのさらなる情報を必要とする場合、マルチターン会話が発生します。このセクションでは、次の手順でエージェントを使用するフローについて説明します。

```
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 エージェントを使用してアプリケーションのタスクを自動化する](agents.md)」を参照してください。

### ステップ 1: フローを開始する
<a name="flows-multi-turn-invocation-start-flow"></a>

フローを開始するには、[InvokeFlow](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_InvokeFlow.html) オペレーションを呼び出します。フローに送信する初期コンテンツを含めます。次の例では、`document` フィールドに*プレイリストを作成する*ためのリクエストが含まれています。各会話には、フロー内の会話を特定する一意の ID (*実行 ID*) があります。実行 ID を取得するには、`InvokeFlow` への最初の呼び出しで `executionID` フィールドを送信しないでください。`InvokeFlow` からの応答には実行 ID が含まれています。コードでは、識別子を使用して複数の会話を追跡し、`InvokeFlow` オペレーションへの以降の呼び出しで会話を特定します。

`InvokeFlow` へのリクエストに関する JSON の例を次に示します。

```
{
  "flowIdentifier": "XXXXXXXXXX",
  "flowAliasIdentifier": "YYYYYYYYYY",
  "inputs": [
    {
      "content": {
        "document": "Create a playlist."
      },
      "nodeName": "FlowInputNode",
      "nodeOutputName": "document"
    }
  ]
}
```

### ステップ 2: エージェントリクエストを取得する
<a name="flows-multi-turn-invocation-retrieve-requests"></a>

フロー内のエージェントノードがユーザーからのさらなる情報が必要であると判断した場合、`InvokeFlow` からの応答ストリーム (`responseStream`) には `FlowMultiTurnInputRequestEvent` イベントオブジェクトが含まれます。イベントには、`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` を出力します。`FlowCompletionEvent` イベントの `completionReason` の値が `INPUT_REQUIRED` の場合、フローを続行するには詳細が必要です。

`FlowCompletionEvent` JSON オブジェクトの例を次に示します。

```
{
    "completionReason": "INPUT_REQUIRED"
}
```

### ステップ 3: ユーザー応答をフローに送信する
<a name="flows-multi-turn-invocation-continue"></a>

`InvokeFlow` オペレーションを再度呼び出して、ユーザー応答をフローに戻します。会話の `executionId` を必ず含めてください。

`InvokeFlow` へのリクエストに関する JSON の例を次に示します。`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: フローを終了する
<a name="flows-multi-turn-invocation-end"></a>

詳細が不要となった時点で、フローは最終的な応答を含む `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"
}
```

次のシーケンス図は、マルチターンフローのステップを示しています。

![\[マルチターン会話のフローステップ。\]](http://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/images/flows/flows-multi-turn-steps.png)


## フローの例の作成と実行
<a name="flows-multi-turn-invocation-example-flow"></a>

この例では、エージェントを使用してラジオステーションのプレイリストを作成するフローを作成します。エージェントは明確な質問をして、プレイリストの曲数、音楽ジャンル、テーマを決めるために明確な質問をします。

**フローを作成する方法**

1. 「[エージェントを手動で作成および設定する](agents-create.md)」の手順を実行して、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* では、**[ユーザー入力]** で **[有効]** を選択します。これを行っておくと、エージェントは必要に応じて詳細をリクエストできるようになります。

1. 「[Amazon Bedrock でフローを作成および設計する](flows-create.md)」の手順に実行してフローを作成します。フローに入力ノード、エージェントノード、出力ノードがあることを確認します。

1. エージェントノードをステップ 1 で作成したエージェントにリンクします。フローは次の画像のようになります。  
![\[フローのマルチターン会話\]](http://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/images/flows/flows-multi-turn.png)

1. Amazon Bedrock コンソールでフローを実行します。テスト用に、フローがたどるステップを追跡できます。詳細については、「[Amazon Bedrock でフローをテストする](flows-test.md)」を参照してください。

次 Python コードサンプルは、フローの使用方法を示しています。

コードを実行するには、次を指定します。
+ `region_name` – フローを実行している AWS リージョン。
+ `FLOW_ID` – フローの ID。
+ `FLOW_ALIAS_ID` – フローのエイリアス ID。

ID の取得方法については、「[Amazon Bedrock でフローに関する情報を表示する](flows-view.md)」を参照してください。コードは、フローに送信する最初のリクエストのプロンプトを表示し、フローの必要に応じて追加の入力を要求します。このコードは、 AWS Lambda 関数を呼び出すリクエストなど、エージェントからの他のリクエストを管理しません。詳細については、「[Amazon Bedrock エージェントの仕組み](agents-how.md)」を参照してください。実行中、コードは、入力からフローが返す応答までのパスを追跡するために使用できる `FlowTraceEvent` オブジェクトを生成します。詳細については、「[Amazon Bedrock の証跡を表示してフローの各ステップを追跡するフローの各ステップを証跡を表示して追跡する](flows-trace.md)」を参照してください。

```
"""
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)})
```