기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
도구를 사용하여 Amazon Bedrock 모델 응답 완성
Amazon Bedrock API를 사용하여 모델에 전송하는 메시지에 대한 응답을 생성하는 데 도움이 되는 도구에 대한 액세스 권한을 모델에 제공할 수 있습니다. 예를 들어, 사용자가 라디오 방송국에서 재생되는 가장 인기 있는 노래를 찾을 수 있는 채팅 애플리케이션이 있을 수 있습니다. 가장 인기 있는 노래에 대한 요청에 답변하려면 모델에 노래 정보를 쿼리하고 반환할 수 있는 도구가 필요합니다.
참고
이제 도구 사용과 함께 구조화된 출력을 사용할 수 있습니다. 자세한 내용은 모델에서 검증된 JSON 결과 가져오기 섹션을 참조하세요.
Amazon Bedrock에서는 모델이 도구를 직접 호출하지 않습니다. 대신 모델에 메시지를 전송할 때 모델이 응답을 생성하는 데 잠재적으로 도움이 될 수 있는 하나 이상의 도구에 대한 정의를 함께 제공합니다. 이 예제에서는 지정된 라디오 방송국에서 가장 인기 있는 노래를 반환하는 도구에 대한 정의를 제공합니다. 모델에 메시지에 대한 응답을 생성하는 데 도구가 필요하다고 판단되면 모델은 모델을 호출하는 데 사용되는 API에 따라 클라이언트 측 호출을 수행하거나 Bedrock에 서버 측 도구 호출을 사용하여 도구를 호출하도록 요청할 수 있습니다. 이 두 가지 옵션에 대해 자세히 살펴보겠습니다.
클라이언트 측 도구 호출
응답 API, 채팅 완료 API, Converse API 또는 InvokeModel API를 사용하여 요청을 보내는 경우 모델은 클라이언트 측 도구 호출을 사용합니다. 즉, 코드에서 모델을 대신하여 도구를 호출합니다. 이 시나리오에서는 도구 구현이 API라고 가정합니다. 이 도구는 데이터베이스, Lambda 함수 또는 기타 소프트웨어처럼 쉽게 사용할 수 있습니다. 도구를 구현할 방법을 결정합니다. 그런 다음 도구의 결과가 포함된 메시지를 제공하여 모델과의 대화를 계속합니다. 마지막으로 모델은 모델로 전송한 도구 결과가 포함된 원본 메시지에 대한 응답을 생성합니다.
도구 사용에 사용할 도구를 정의해 보겠습니다. 다음 Python 예제에서는 가상 라디오 방송국에서 가장 인기 있는 노래를 반환하는 도구를 사용하는 방법을 보여줍니다.
def get_most_popular_song(station_name: str) -> str: stations = { "Radio Free Mars": "Starman – David Bowie", "Neo Tokyo FM": "Plastic Love – Mariya Takeuchi", "Cloud Nine Radio": "Blinding Lights – The Weeknd", } return stations.get(station_name, "Unknown Station – No chart data available")
클라이언트 측 도구에 응답 API 사용
OpenAI에서 제공하는 함수 호출
from openai import OpenAI import json client = OpenAI() response = client.responses.create( model="oss-gpt-120b", input="What is the most popular song on Radio Free Mars?", tools=[ { "type": "function", "name": "get_most_popular_song", "description": "Returns the most popular song on a radio station", "parameters": { "type": "object", "properties": { "station_name": { "type": "string", "description": "Name of the radio station" } }, "required": ["station_name"] } } ] ) if response.output and response.output[0].content: tool_call = response.output[0].content[0] args = json.loads(tool_call["arguments"]) result = get_most_popular_song(args["station_name"]) final_response = client.responses.create( model="oss-gpt-120b", input=[ { "role": "tool", "tool_call_id": tool_call["id"], "content": result } ] ) print(final_response.output_text)
클라이언트 측 도구에 Chat Completions API 사용
채팅 완료 API를 사용할 수도 있습니다. 다음은 채팅 완료를 사용하기 위한 Python 코드입니다.
from openai import OpenAI import json client = OpenAI() completion = client.chat.completions.create( model="oss-gpt-120b", messages=[{"role": "user", "content": "What is the most popular song on Neo Tokyo FM?"}], tools=[{ "type": "function", "function": { "name": "get_most_popular_song", "description": "Returns the most popular song on a radio station", "parameters": { "type": "object", "properties": { "station_name": {"type": "string", "description": "Name of the radio station"} }, "required": ["station_name"] } } }] ) message = completion.choices[0].message if message.tool_calls: tool_call = message.tool_calls[0] args = json.loads(tool_call.function.arguments) result = get_most_popular_song(args["station_name"]) followup = client.chat.completions.create( model="oss-gpt-120b", messages=[ {"role": "user", "content": "What is the most popular song on Neo Tokyo FM?"}, message, {"role": "tool", "tool_call_id": tool_call.id, "content": result} ] ) print(followup.choices[0].message.content)
응답에서 함수 호출 API 및 채팅 완료 API를 사용하는 방법에 대한 자세한 내용은 OpenAI에서 함수 호출을
클라이언트 측 도구에 Converse API 사용
Converse API를 사용하여 모델이 대화에서 도구를 사용하도록 할 수 있습니다. 다음 Python 예제에서는 가상 라디오 방송국에서 가장 인기 있는 노래를 반환하는 도구를 사용하는 방법을 보여줍니다.
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """Shows how to use tools with the Converse API and the Cohere Command R model.""" import logging import json import boto3 from botocore.exceptions import ClientError class StationNotFoundError(Exception): """Raised when a radio station isn't found.""" pass logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) def get_top_song(call_sign): """Returns the most popular song for the requested station. Args: call_sign (str): The call sign for the station for which you want the most popular song. Returns: response (json): The most popular song and artist. """ song = "" artist = "" if call_sign == 'WZPZ': song = "Elemental Hotel" artist = "8 Storey Hike" else: raise StationNotFoundError(f"Station {call_sign} not found.") return song, artist def generate_text(bedrock_client, model_id, tool_config, input_text): """Generates text using the supplied Amazon Bedrock model. If necessary, the function handles tool use requests and sends the result to the model. Args: bedrock_client: The Boto3 Bedrock runtime client. model_id (str): The Amazon Bedrock model ID. tool_config (dict): The tool configuration. input_text (str): The input text. Returns: Nothing. """ logger.info("Generating text with model %s", model_id) # Create the initial message from the user input. messages = [{"role": "user", "content": [{"text": input_text}]}] response = bedrock_client.converse(modelId=model_id, messages=messages, toolConfig=tool_config) output_message = response['output']['message'] messages.append(output_message) stop_reason = response['stopReason'] if stop_reason == 'tool_use': # Tool use requested. Call the tool and send the result to the model. tool_requests = response['output']['message']['content'] for tool_request in tool_requests: if 'toolUse' in tool_request: tool = tool_request['toolUse'] logger.info("Requesting tool %s. Request: %s", tool['name'], tool['toolUseId']) if tool['name'] == 'top_song': tool_result = {} try: song, artist = get_top_song(tool['input']['sign']) tool_result = {"toolUseId": tool['toolUseId'], "content": [{"json": {"song": song, "artist": artist}}]} except StationNotFoundError as err: tool_result = {"toolUseId": tool['toolUseId'], "content": [{"text": err.args[0]}], "status": 'error'} tool_result_message = {"role": "user", "content": [{"toolResult": tool_result}]} messages.append(tool_result_message) # Send the tool result to the model. response = bedrock_client.converse(modelId=model_id, messages=messages, toolConfig=tool_config) output_message = response['output']['message'] # print the final response from the model. for content in output_message['content']: print(json.dumps(content, indent=4)) def main(): """Entrypoint for tool use example.""" logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") model_id = "cohere.command-r-v1:0" input_text = "What is the most popular song on WZPZ?" tool_config = { "tools": [ { "toolSpec": { "name": "top_song", "description": "Get the most popular song played on a radio station.", "inputSchema": { "json": { "type": "object", "properties": { "sign": { "type": "string", "description": "The call sign for the radio station for which you want the most popular song. Example calls signs are WZPZ, and WKRP." } }, "required": ["sign"] } } } } ] } bedrock_client = boto3.client(service_name='bedrock-runtime') try: print(f"Question: {input_text}") generate_text(bedrock_client, model_id, tool_config, input_text) except ClientError as err: message = err.response['Error']['Message'] logger.error("A client error occurred: %s", message) print(f"A client error occured: {message}") else: print(f"Finished generating text with model {model_id}.") if __name__ == "__main__": main()
클라이언트 측 도구 사용에 APIs 호출 사용
기본 추론 작업(InvokeModel 또는 InvokeModelWithResponseStream)과 함께 도구를 사용하는 것이 가능합니다. 요청 본문에서 전달하는 추론 파라미터를 찾으려면 사용하려는 모델의 추론 파라미터를 참조하세요.
서버 측 도구 호출
응답 API를 사용하여 모델을 호출하는 경우 이전에 설명한 클라이언트 측 도구 호출 외에도 서버 측 도구 호출을 사용할 수 있습니다. 서버 측 도구 호출은 도구(APIs, 함수, 워크플로)가 클라이언트가 아닌 신뢰할 수 있는 백엔드 환경에서 실행되는 메커니즘입니다. 이렇게 하면 애플리케이션의 보안, 신뢰성 및 거버넌스 태세가 향상됩니다. Amazon Bedrock은 도구 사용을 구현하는 Lambda 함수를 실행하기 전에 Lambda 함수가 이를 호출하는 애플리케이션과 동일한 IAM 정책을 갖도록 합니다. Amazon Bedrock이 도구 실행을 주도함에 따라 클라이언트는 도구 기능을 추가하는 대신 비즈니스 로직을 구현하는 데 집중할 수 있습니다. Amazon Bedrock은 ISO, SOC 및 HIPAA 적격과 같은 가장 높은 거버넌스 표준도 지원합니다. 고객은 자체 사용자 지정 Lambda 함수를 제출하여 도구를 실행하거나 메모 및 작업과 같은 기존 사전 정의된 도구를 사용할 수 있습니다. 응답 API를 사용하는 서버 측 도구는 OpenAI의 GPT OSS 20B/120B 모델부터 사용할 수 있으며 다른 모델에 대한 지원이 곧 제공될 예정입니다. 모델 API를 사용하여 응답 API와 함께 사용할 수 있는 사용 가능한 모델을 검색할 수 있습니다. 응답 API에 대한 자세한 내용은 OpenAI APIs.
Amazon Bedrock과 함께 사용할 수 있는 도구에는 Lambda를 사용하는 사용자 지정 도구 또는 Bedrock에서 지원하는 사전 정의된 도구라는 두 가지 유형이 있습니다. 이 섹션에서는 응답 API를 사용하여 사용자 지정 Lambda 도구를 생성하는 방법을 검토합니다. 두 가지를 모두 자세히 살펴보겠습니다.
응답 API에서 Lambda를 사용하는 사용자 지정 도구
Bedrock에서 Lambda 함수를 사용자 지정 도구로 사용하면 사용자 지정 AWS Lambda 함수를 도구로 통합하여 에이전트의 기능을 확장할 수 있습니다. 이를 통해 모델 컨텍스트 프로토콜(MCP)을 통해 AI 어시스턴트 및 기타 애플리케이션에서 호출할 수 있는 확장 가능한 서버리스 도구를 생성할 수 있습니다. 이 기능의 장점은 다음과 같습니다.
기능 확장: 사용자 지정 비즈니스 로직, API 통합 또는 데이터 처리 기능을 추가합니다.
도구를 안전하게 실행: Lambda를 사용하면 도구가 전체 VPC 액세스 권한을 부여하지 않고도 VPC 내의 리소스에 액세스할 수 있습니다.
서버리스 아키텍처: 인프라 관리가 없는 Lambda는 조정을 자동으로 처리합니다.
비용 효율성: 유휴 리소스가 아닌 실행 시간에 대해서만 비용을 지불합니다.
간편한 통합: Lambda 함수는 기본 제공 도구와 함께 원활하게 나타납니다.
Amazon Bedrock의 모델이 도구를 사용하여 메시지에 대한 응답을 완료하도록 하려면 메시지와 하나 이상의 도구에 대한 정의를 모델에 전송합니다. 애플리케이션의 프롬프트에 따라 모델이 도구 중 하나가 응답을 생성하는 데 도움이 될 수 있다고 판단하면 Bedrock이 도구를 사용하고 도구 결과를 모델로 다시 보내라는 요청을 반환합니다. 그런 다음 모델은 결과를 사용하여 원본 메시지에 대한 응답을 생성합니다.
다음 단계에서는 응답 API와 함께 도구를 사용하는 방법을 보여줍니다.
작동 방식
Lambda 함수: MCP 프로토콜을 구현하는 Lambda 함수 생성
도구 검색: Bedrock이 Lambda 함수를 호출하여 사용 가능한 도구를 검색합니다.
도구 등록: 도구가 Bedrock에 등록되어 있습니다.
도구 실행: 에이전트가 도구를 요청하면 Bedrock은 Lambda 함수를 호출합니다.
응답 처리: 표준 인터페이스를 통해 에이전트에 결과가 반환됩니다.
1단계: 가장 인기 있는 노래를 가져오도록 Lambda 함수 정의
MCP 프로토콜을 구현하는 Lambda 함수를 생성합니다. 다음은 간단한 Python 예제입니다.
import json def lambda_handler(event, context): # Parse JSON-RPC request method = event.get('method') params = event.get('params', {}) request_id = event.get('id') if method == 'tools/list': return { "jsonrpc": "2.0", "id": request_id, "result": { "tools": [ { "name": "my_custom_tool", "description": "My custom business logic tool", "inputSchema": { "type": "object", "properties": { "input": { "type": "string", "description": "Input text to process" } }, "required": ["input"] } } ] } } elif method == 'tools/call': tool_name = params.get('name') arguments = params.get('arguments', {}) if tool_name == 'my_custom_tool': # Your custom logic here result = f"Processed: {arguments.get('input', '')}" return { "jsonrpc": "2.0", "id": request_id, "result": { "content": [ { "type": "text", "text": result } ] } } # Error response for unsupported methods return { "jsonrpc": "2.0", "id": request_id, "error": { "code": -32601, "message": "Method not found" } }
2단계: Lambda 함수 배포
그런 다음 IAM 역할을 사용하여이 Lambda 함수를 배포하여 ARN을 가져옵니다. Lambda 함수 배포에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
# Example using AWS CLI aws lambda create-function \ --function-name my-custom-tool \ --runtime python3.14 \ --role arn:aws:iam::YOUR-ACCOUNT:role/lambda-execution-role \ --handler lambda_function.lambda_handler \ --zip-file fileb://function.zip
ARN이 다음과 같다고 가정해 보겠습니다. arn:aws:lambda:us-west-2:123456789012:function:my-custom-tool
3단계: 추론 요청에서 메시지 및 도구 정의 정의
메시지 및 도구 정의를 보내려면 응답 API 작업을 사용합니다. Amazon Bedrock은 응답 API의 커넥터 및 원격 MCP 서버 기능을connector_id 필드에서 이전 단계에서 생성한 Lambda ARN을 전달할 수 있습니다. Bedrock은 모델을 호출하는 애플리케이션에 사용되는 것과 동일한 IAM 역할 및 정책을 사용하므로 권한 부여 자격 증명을 제공할 필요가 없습니다. 다음은 라디오 방송국에서 재생되는 가장 인기 있는 노래를 가져오는 도구의 예제 스키마입니다.
from openai import OpenAI client = OpenAI() resp = client.responses.create( model="oss-gpt-120b", tools=[ { "type": "mcp", "server_label": "xamzn_arn", "connector_id": "arn:aws:lambda:us-west-2:123456789012:function:my-custom-tool", "require_approval": "never", }, ], input="My custom prompt.", ) print(resp.output_text)
4단계: Bedrock이 도구를 호출하고 응답을 모델에 다시 전달합니다.
커넥터 도구 사용 기능은 응답 API를 지원하는 모델에서 사용할 수 있습니다
tools 파라미터에서 Lambda 함수를 지정하면 API는 서버에서 도구 목록을 가져오려고 시도합니다. 도구 목록을 성공적으로 검색하면 모델 응답 mcp_list_tools 출력에 새 출력 항목이 나타납니다. 이 객체의 tools 속성에는 성공적으로 가져온 도구가 표시됩니다. 모델이 이러한 도구 정의에 액세스할 수 있게 되면 모델 컨텍스트의 내용에 따라 이를 호출하도록 선택할 수 있습니다. 모델이 Lambda 도구를 호출하기로 결정하면 API는 Lambda 함수에 요청하여 도구를 호출하고 출력을 모델의 컨텍스트에 넣습니다. OpenAI 설명서
{ "jsonrpc": "2.0", "id": 1, "error": { "code": -32000, "message": "Tool execution failed", "data": "Additional error details" } }
응답 API에서 AWS 제공 도구 사용
Bedrock에는 메모 작성 기능(노트 도구)과 작업 관리(작업 도구)라는 두 가지 AWS 제공 도구가 있습니다. 둘 다 자세히 살펴보겠습니다.
참고 도구 개요
notes 도구를 사용하면 동일한 대화 세션 내에 키-값 페어를 저장하고 검색할 수 있습니다. 이는 여러 상호 작용에서 컨텍스트를 유지하기 위한 간단한 메모리 메커니즘을 제공합니다. 키는 대소문자를 구분하는 문자열이며 키 길이 또는 이름 지정 규칙에 제한이 없습니다. 시스템은 동일한 키의 이전 값을 덮어씁니다. 값은 문자열(JSON, URLs 등)로 저장되며 도구 수준에서 적용되는 크기 제한은 없습니다. 값은 전체 대화 세션을 통해 유지됩니다. 메모리는 현재 대화로만 범위가 지정됩니다.
파라미터
| 파라미터 | Type | 필수 | 설명 |
|---|---|---|---|
operation |
문자열 | 예 | 수행할 작업: "store" 또는 "recall" |
key |
문자열 | 예 | 메모리 항목의 키 식별자입니다. |
value |
문자열 | 조건부 | 저장할 값("store"작업에만 필요) |
유효한 작업
store: 키-값 페어를 메모리에 저장recall: 키로 값 검색
자연어(예: "좋아하는 색상이 파란색이라고 기억하세요", "좋아하는 색상에 대해 무엇을 말했나요?", "아침 회의를 선호한다는 사실을 저장하세요", "회의 기본 설정에 대해 말한 내용을 기억하세요")를 사용하거나 프롬프트에서 직접 도구 호출을 사용할 수 있습니다("메모 도구를 사용하여 내 이메일을 john@example.com으로 저장하세요", "이메일 주소에 대한 메모 확인").
작업 도구 개요
도구는 대화 세션 내에서 작업을 관리하기 위한 LIFO(Last-In-First-Out) 스택을 tasks 제공합니다. 이렇게 하면 태스크를 스택에 푸시하고 역순으로 팝업할 수 있으므로 중첩된 워크플로, 임시 알림 또는 계층적 태스크 관리를 관리하는 데 적합합니다. 작업은 전체 대화 세션 동안 지속됩니다. 스택 상태는 여러 상호 작용에서 유지됩니다. 메모리는 현재 대화로만 범위가 지정됩니다.
| 파라미터 | Type | 필수 | 설명 |
|---|---|---|---|
operation |
문자열 | 예 | 수행할 작업: "push" 또는 "pop" |
description |
문자열 | 조건부 | 작업 항목에 대한 설명("push"작업에만 필요) |
summary |
문자열 | No | 작업 항목에 대한 선택적 요약("push"작업에만 해당) |
자연어(예: '예산을 검토하기 위해 작업 추가', '클라이언트를 호출하기 위해 미리 알림 푸시', '다음 작업은 해야 합니까?', '최신 작업 건너뛰기', ' 스택에서 최신 작업 가져오기')를 사용하여 작업 도구를 호출하거나 프롬프트에서 직접 도구를 호출할 수 있습니다('작업 도구를 사용하여 '완료 프레젠테이션' 푸시', '스택에서 작업 건너뛰기', '작업 목록에 회의 예약' 추가').
AgentCore Gateway와의 서버 측 도구 사용 통합
Amazon Bedrock은 이제 통합 유형을 호출하는 서버 측 도구로 AgentCore Gateway를 지원합니다. 이 기능을 사용하면 모델을 AgentCore Gateway 엔드포인트에 직접 연결하여 게이트웨이 인프라를 통해 관리되는 도구에 원활하게 액세스할 수 있습니다.
AgentCore Gateway 통합은 Lambda 함수 통합과 동일한 패턴을 따르며 한 가지 주요 차이점이 있습니다.
Lambda 통합:
Lambda 함수 ARNs 사용
AWS Lambda 함수를 직접 호출합니다.
AgentCore 게이트웨이 통합:
AgentCore 게이트웨이 ARNs 사용
AgentCore Gateway 인프라를 통해 도구 호출 라우팅
중앙 집중식 도구 관리 및 검색 제공
구성
요청 구조
AgentCore Gateway를 도구 소스로 구성할 때는 응답 API 요청의 tools 배열에 다음 구조를 사용합니다.
{ "type":"mcp", "server_label":"agentcore_tools", "connector_id":"arn:aws:bedrock-agentcore:us-west-2:342789630635:gateway/agentcore-intro-gateway-v2-swvq44sovp", "server_description":"AgentCore Gateway providing custom tools", "require_approval":"never" }
파라미터
| 파라미터 | Type | 필수 | 설명 |
|---|---|---|---|
type |
문자열 | 예 | mcp로 설정해야 합니다. |
server_label |
문자열 | 예 | 요청 내이 도구 커넥터의 고유 식별자 |
connector_id |
문자열 | 예 | AgentCore 게이트웨이의 ARN |
server_description |
문자열 | No | 이 게이트웨이에서 제공하는 도구에 대한 사람이 읽을 수 있는 설명 |
require_approval |
문자열 | 예 | 필드는 여야 합니다. "never" |
요청 완료 예제
{ "model":"openai.gpt-oss-120b", "stream":true, "background":false, "store":false, "tools": [ { "type":"mcp", "server_label":"agentcore_tools", "connector_id":"arn:aws:bedrock-agentcore:us-west-2:342789630635:gateway/agentcore-intro-gateway-v2-swvq44sovp", "server_description":"AgentCore Gateway providing custom tools", "require_approval":"never" } ], "input": [ { "type":"message", "role":"user", "content": [ { "type":"input_text", "text":"What is the weather in Seattle?" } ] } ] }
사전 조건
AgentCore Gateway 통합을 사용하기 전에 다음이 있는지 확인합니다.
구성된 대상(Lambda 함수, API Gateway 단계, OpenAPI 스키마 또는 MCP 서버)이 있는 AgentCore Gateway를 생성했습니다. OpenAPI
Bedrock 서비스 역할이 게이트웨이를 호출할 수 있도록 IAM 권한을 구성했습니다. Bedrock은 IAM 인증을 사용하는 게이트웨이만 지원합니다.
올바른 형식의 게이트웨이 ARN
AgentCore Gateway 통합의 이점
중앙 집중식 도구 관리: 단일 게이트웨이 엔드포인트를 통해 모든 도구 관리
도구 검색: 에이전트는 게이트웨이를 통해 사용 가능한 도구를 동적으로 검색할 수 있습니다.
보안: IAM 및 게이트웨이 정책을 통한 기본 제공 인증 및 권한 부여
관찰성: 도구 호출의 포괄적인 모니터링 및 로깅
유연성: 여러 대상 유형(Lambda, API Gateway, OpenAPI, MCP 서버) 지원
IAM 권한
Bedrock 실행 역할에는 AgentCore 게이트웨이를 호출할 수 있는 권한이 필요합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "bedrock-agentcore:InvokeGateway" ], "Resource": "arn:aws:bedrock-agentcore:us-west-2:342789630635:gateway/agentcore-intro-gateway-v2-swvq44sovp" } ] }
다음 단계
AgentCore 게이트웨이 생성에 대해 자세히 알아보기
게이트웨이 대상 유형 탐색