Bedrock 태깅하는 방법

AWS Bedrock의 Boto3를 사용하여 태그 지정된 추론 프로필 생성 및 ConverseAPI 호출로 비용 추적 가능.

Bedrock 태깅하는 방법
Photo by Angèle Kamp / Unsplash

개요

boto3를 활용하여 태그를 지정한 애플리케이션 추론 프로필을 생성하고, 조회 호출하는 방법까지 확인합니다.

이후 ConverseAPI를 사용하여 호출하고 태그를 통한 비용 확인 및 추적을 확인합니다.

지원하는 모델과 리전, 서비스는 다음과 같습니다.

https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html

Notion Image

Bedrock CreateInferenceProfile

import boto3

# 인스턴스 프로파일을 생성합니다.
bedrock = boto3.client('bedrock')

# 리전 확인 및 추론 프로파일 조회
# print(bedrock.list_foundation_models())

def create_inference_profile(profile_name, model_arn, tags):
    """Create Inference Profile using base model ARN"""
    response = bedrock.create_inference_profile(
        inferenceProfileName=profile_name,
        description="test",
        modelSource={'copyFrom': model_arn},
        tags=tags
    )

    print("CreateInferenceProfile Response:", response['ResponseMetadata']['HTTPStatusCode']),
    print(f"{response}\n")
    return response


# 태그 선언
tags = [{'key': 'map-migrated', 'value': ''}]

# model의 ARN을 전달합니다.
base_model_arn = "arn:aws:bedrock:us-east-1:.......:inference-profile/us.anthropic.claude-3-sonnet-20240229-v1:0"
bjchoi_claude_3_sonnet_profile = create_inference_profile("bjchoi_claude_3_sonnet_profile", base_model_arn, tags)

정상적으로 생성되었다면 response를 확인했을 때 ID 조회가 가능합니다.

bjchoi_claude_3_sonnet_profile['inferenceProfileArn']

생성한 inference_profiles들은 list를 참조하여 확인할 수 있으며 해당 profiles 에 지정된 태그들은 리스트를 확인하여 사용할 수 있습니다.

response = bedrock.list_inference_profiles(
    typeEquals='APPLICATION'
)

response = bedrock.list_tags_for_resource(
    resourceARN="arn:aws:bedrock:us-east-1:<ACCOUNT_NUMBER>:application-inference-profile/<ID>"
)

print(response["tags"])

Bedrock Invoke

converse() , InvokeMode() 또한 마찬가지로 동작하며 각 Arguments로 전달하는 부분을 이전에 확인했던 ARN으로 교체합니다.

bedrock_client = boto3.client(
    service_name='bedrock-runtime',
    region_name='us-east-1'
)

# converse API
response = bedrock_client.converse(
  modelId=bjchoi_claude_3_sonnet_profile['inferenceProfileArn'],
  messages=[ 
      {
          'role': 'user',
          'content': [  # content를 리스트로 수정
              {
                  'text': '너 모델 명이 뭐야'
              }
          ]
      }
  ],
  inferenceConfig={
      "temperature": 0.5,
      "topP": 0.9,
  },
)

print(response)

정상적으로 호출되는 것까지 확인합니다.

{
    "ResponseMetadata": {
        "RequestId": "cf84-4527-a8aa-491245badd16",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "date": "Thu, 16 Jan 2025 05:00:19 GMT",
            "content-type": "application/json",
            "content-length": "334",
            "connection": "keep-alive",
            "x-amzn-requestid": "cf84-4527-a8aa-491245badd16"
        },
        "RetryAttempts": 0
    },
    "output": {
        "message": {
            "role": "assistant",
            "content": [
                {
                    "text": "안녕하세요. 저는 Claude라는 인공지능 모델입니다. Anthropic에서 개발한 대화형 AI 모델이에요. 무엇을 도와드릴까요?"
                }
            ]
        }
    },
    "stopReason": "end_turn",
    "usage": {
        "inputTokens": 20,
        "outputTokens": 66,
        "totalTokens": 86
    },
    "metrics": {
        "latencyMs": 1318
    }
}

Reference