Amazon Bedrock Flows 코드 샘플 실행 - Amazon Bedrock

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon Bedrock Flows 코드 샘플 실행

다음 코드 샘플에서는 다음과 같은 사전 조건을 충족했다고 가정합니다.

  1. Amazon Bedrock 작업에 대한 권한을 갖도록 역할이 설정되어 있습니다. 이렇게 설정되어 있지 않은 경우 Amazon Bedrock 시작하기 섹션을 참조하세요.

  2. AWS API를 사용하도록 자격 증명이 설정되어 있습니다. 이렇게 설정되어 있지 않은 경우 API 시작하기 섹션을 참조하세요.

  3. 사용자를 대신하여 흐름 관련 작업을 수행하는 서비스 역할이 만들어져 있습니다. 이렇게 설정되어 있지 않은 경우 Amazon Bedrock에서 Amazon Bedrock Flows의 서비스 역할 생성 섹션을 참조하세요.

흐름을 만들려면 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용하여 CreateFlow 요청을 전송합니다. 예제 코드는 Amazon Bedrock Flows 코드 샘플 실행 항목을 참조하세요.

필수 필드는 다음과 같습니다.

필드 기본 설명
name 흐름의 이름입니다.
executionRoleArn 흐름을 만들고 관리할 수 있는 권한이 있는 서비스 역할의 ARN입니다.

다음 필드는 선택 사항입니다.

필드 사용 사례
definition 흐름을 구성하는 nodesconnections를 포함합니다.
description 흐름을 설명합니다.
tags 태그를 흐름에 연결합니다. 자세한 내용은 Amazon Bedrock 리소스 태그 지정 섹션을 참조하세요.
customerEncryptionKeyArn KMS 키를 사용하여 리소스를 암호화합니다. 자세한 내용은 Amazon Bedrock Flows 리소스 암호화 섹션을 참조하세요.
clientToken API 요청이 한 번만 완료되도록 합니다. 자세한 내용은 Ensuring idempotency를 참조하세요.

definition 필드는 선택 사항이지만 흐름이 작동하려면 필수입니다. 먼저 정의 없이 흐름을 만들도록 선택한 다음 나중에 흐름을 업데이트할 수 있습니다.

nodes 목록의 각 노드에 대해 type 필드에 노드 유형을 지정하고 config 필드에 노드의 해당 구성을 제공합니다. 다양한 노드 유형의 API 구조에 대한 자세한 내용은 흐름의 노드 유형 섹션을 참조하세요.

Amazon Bedrock Flows에 대한 일부 코드 샘플을 사용하려면 선택한 방법의 탭을 선택하고 다음 단계를 따릅니다.

Python
  1. 다음 노드가 있는 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용하여 CreateFlow 요청으로 흐름을 만듭니다.

    • 입력 노드

    • 두 가지 변수(genrenumber)를 사용하여 음악 재생 목록을 만드는 프롬프트가 인라인으로 정의된 프롬프트 노드

    • 모델 완성을 반환하는 출력 노드

    다음 코드 스니펫을 실행하여 AWS SDK for Python (Boto3)을 로드하고, Amazon Bedrock Agents 클라이언트를 만들고, 노드를 사용하여 흐름을 만듭니다(흐름을 위해 만든 서비스 역할의 ARN으로 executionRoleArn 필드를 바꿉니다).

    # Import Python SDK and create client import boto3 client = boto3.client(service_name='bedrock-agent') # Replace with the service role that you created. For more information, see https://docs.aws.amazon.com/bedrock/latest/userguide/flows-permissions.html FLOWS_SERVICE_ROLE = "arn:aws:iam::123456789012:role/MyFlowsRole" # Define each node # The input node validates that the content of the InvokeFlow request is a JSON object. input_node = { "type": "Input", "name": "FlowInput", "outputs": [ { "name": "document", "type": "Object" } ] } # This prompt node defines an inline prompt that creates a music playlist using two variables. # 1. {{genre}} - The genre of music to create a playlist for # 2. {{number}} - The number of songs to include in the playlist # It validates that the input is a JSON object that minimally contains the fields "genre" and "number", which it will map to the prompt variables. # The output must be named "modelCompletion" and be of the type "String". prompt_node = { "type": "Prompt", "name": "MakePlaylist", "configuration": { "prompt": { "sourceConfiguration": { "inline": { "modelId": "amazon.nova-lite-v1:0", "templateType": "TEXT", "inferenceConfiguration": { "text": { "temperature": 0.8 } }, "templateConfiguration": { "text": { "text": "Make me a {{genre}} playlist consisting of the following number of songs: {{number}}." } } } } } }, "inputs": [ { "name": "genre", "type": "String", "expression": "$.data.genre" }, { "name": "number", "type": "Number", "expression": "$.data.number" } ], "outputs": [ { "name": "modelCompletion", "type": "String" } ] } # The output node validates that the output from the last node is a string and returns it as is. The name must be "document". output_node = { "type": "Output", "name": "FlowOutput", "inputs": [ { "name": "document", "type": "String", "expression": "$.data" } ] } # Create connections between the nodes connections = [] # First, create connections between the output of the flow input node and each input of the prompt node for input in prompt_node["inputs"]: connections.append( { "name": "_".join([input_node["name"], prompt_node["name"], input["name"]]), "source": input_node["name"], "target": prompt_node["name"], "type": "Data", "configuration": { "data": { "sourceOutput": input_node["outputs"][0]["name"], "targetInput": input["name"] } } } ) # Then, create a connection between the output of the prompt node and the input of the flow output node connections.append( { "name": "_".join([prompt_node["name"], output_node["name"]]), "source": prompt_node["name"], "target": output_node["name"], "type": "Data", "configuration": { "data": { "sourceOutput": prompt_node["outputs"][0]["name"], "targetInput": output_node["inputs"][0]["name"] } } } ) # Create the flow from the nodes and connections response = client.create_flow( name="FlowCreatePlaylist", description="A flow that creates a playlist given a genre and number of songs to include in the playlist.", executionRoleArn=FLOWS_SERVICE_ROLE, definition={ "nodes": [input_node, prompt_node, output_node], "connections": connections } ) flow_id = response.get("id")
  2. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용해 ListFlows 요청을 수행하여 방금 만든 흐름을 포함한 계정의 흐름을 나열합니다.

    client.list_flows()
  3. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용해 GetFlow 요청을 수행하여 방금 만든 흐름에 대한 정보를 가져옵니다.

    client.get_flow(flowIdentifier=flow_id)
  4. 규격 초안의 최신 변경 사항이 적용되고 버전 지정할 수 있도록 흐름을 준비합니다. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용해 PrepareFlow 요청을 수행합니다.

    client.prepare_flow(flowIdentifier=flow_id)
  5. 흐름의 규격 초안을 버전 지정하여 흐름의 정적 스냅샷을 만든 후, 다음 작업을 통해 해당 내용에 대한 정보를 검색합니다.

    1. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용해 CreateFlowVersion 요청을 수행하여 버전을 만듭니다.

      response = client.create_flow_version(flowIdentifier=flow_id) flow_version = response.get("version")
    2. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용해 ListFlowVersions 요청을 수행하여 흐름의 모든 버전을 나열합니다.

      client.list_flow_versions(flowIdentifier=flow_id)
    3. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용해 GetFlowVersion 요청을 수행하여 버전에 대한 정보를 가져옵니다.

      client.get_flow_version(flowIdentifier=flow_id, flowVersion=flow_version)
  6. 생성한 흐름의 버전을 가리키는 별칭을 만든 후, 다음 작업을 통해 해당 별칭에 대한 정보를 검색합니다.

    1. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용해 CreateFlowAlias 요청을 수행하여 별칭을 만들고 방금 생성한 버전을 가리킵니다.

      response = client.create_flow_alias( flowIdentifier=flow_id, name="latest", description="Alias pointing to the latest version of the flow.", routingConfiguration=[ { "flowVersion": flow_version } ] ) flow_alias_id = response.get("id")
    2. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용해 ListFlowAliass 요청을 수행하여 흐름의 모든 별칭을 나열합니다.

      client.list_flow_aliases(flowIdentifier=flow_id)
    3. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용해 GetFlowAlias 요청을 수행하여 방금 만든 별칭에 대한 정보를 가져옵니다.

      client.get_flow_alias(flowIdentifier=flow_id, aliasIdentifier=flow_alias_id)
  7. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents Runtime 클라이언트를 만들고 흐름을 간접적으로 호출합니다. 요청은 흐름의 프롬프트에 있는 변수를 채우고 모델의 응답을 반환하여 Amazon Bedrock Agents 런타임 엔드포인트를 사용해 InvokeFlow 요청을 수행합니다.

    client_runtime = boto3.client('bedrock-agent-runtime') response = client_runtime.invoke_flow( flowIdentifier=flow_id, flowAliasIdentifier=flow_alias_id, inputs=[ { "content": { "document": { "genre": "pop", "number": 3 } }, "nodeName": "FlowInput", "nodeOutputName": "document" } ] ) result = {} for event in response.get("responseStream"): result.update(event) if result['flowCompletionEvent']['completionReason'] == 'SUCCESS': print("Flow invocation was successful! The output of the flow is as follows:\n") print(result['flowOutputEvent']['content']['document']) else: print("The flow invocation completed because of the following reason:", result['flowCompletionEvent']['completionReason'])

    응답은 3개의 노래가 포함된 팝 음악 재생 목록을 반환해야 합니다.

  8. 다음 작업으로 만든 별칭, 버전, 흐름을 삭제합니다.

    1. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용해 DeleteFlowAlias 요청을 수행하여 별칭을 삭제합니다.

      client.delete_flow_alias(flowIdentifier=flow_id, aliasIdentifier=flow_alias_id)
    2. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용해 DeleteFlowVersion 요청을 수행하여 버전을 삭제합니다.

      client.delete_flow_version(flowIdentifier=flow_id, flowVersion=flow_version)
    3. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents 빌드 타임 엔드포인트를 사용해 DeleteFlow 요청을 수행하여 흐름을 삭제합니다.

      client.delete_flow(flowIdentifier=flow_id)