의미 체계 커널
중요합니다
같은 BedrockAgent
단일 에이전트 기능은 현재 실험 단계에 있습니다. 이러한 기능은 현재 개발 중이며 일반 공급에 도달하기 전에 변경 될 수 있습니다.
이 설명과 관련된 자세한 API 설명서는 다음에서 확인할 수 있습니다.
BedrockAgent API 설명서는 곧 제공될 예정입니다.
BedrockAgent API 설명서는 곧 제공될 예정입니다.
현재 Java에서 기능을 사용할 수 없습니다.
BedrockAgent
이란 무엇입니까?
Bedrock 에이전트는 Amazon Bedrock의 에이전트 서비스와 통합하도록 설계된 의미 체계 커널 내의 전문 AI 에이전트입니다. OpenAI 및 Azure AI 에이전트와 마찬가지로 Bedrock 에이전트는 원활한 도구(작업) 통합을 통해 고급 다중 턴 대화형 기능을 사용할 수 있지만 AWS 에코시스템에서 전적으로 작동합니다. 함수/도구 호출(Bedrock의 작업 그룹이라고 함)을 자동화하므로 작업을 수동으로 구문 분석하고 실행할 필요가 없으며 세션을 통해 AWS의 대화 상태를 안전하게 관리하여 애플리케이션에서 채팅 기록을 유지할 필요가 줄어듭니다.
Bedrock 에이전트는 몇 가지 주요 방법으로 다른 에이전트 유형과 다릅니다.
AWS 관리되는 실행: OpenAI의 클라우드를 사용하는 OpenAI Assistant 또는 Azure의 Foundry 서비스를 사용하는 Azure AI 에이전트와 달리 Bedrock 에이전트는 Amazon Bedrock에서 실행됩니다. 이를 사용하려면 Bedrock(및 적절한 IAM 권한)에 대한 액세스 권한이 있는 AWS 계정이 있어야 합니다. 에이전트의 수명 주기(만들기, 세션, 삭제) 및 특정 도구 실행은 AWS 서비스에서 관리되며 함수 호출 도구는 사용자 환경 내에서 로컬로 실행됩니다.
기초 모델 선택: Bedrock 에이전트를 만들 때 사용할 기본 모델(예: Amazon Titan 또는 파트너 모델)을 지정합니다. 액세스 권한이 부여된 모델만 사용할 수 있습니다. 이는 직접 모델 엔드포인트로 인스턴스화하는 채팅 완료 에이전트와 다릅니다. Bedrock을 사용하면 에이전트 생성 시 모델이 에이전트의 기본 기능으로 선택됩니다.
IAM 역할 요구 사항: Bedrock 에이전트를 생성할 때 IAM 역할의 ARN을 제공해야 합니다. 이 역할에는 사용자 대신 선택한 모델(및 모든 통합 도구)을 호출할 수 있는 권한이 있어야 합니다. 이렇게 하면 에이전트가 AWS 계정에서 해당 작업(예: 코드 실행 또는 다른 AWS 서비스 액세스)을 수행하는 데 필요한 권한을 갖습니다.
기본 제공 도구(작업 그룹): Bedrock은 에이전트에 연결할 수 있는 기본 제공 "작업 그룹"(도구)을 지원합니다. 예를 들어 코드 인터프리터 작업 그룹을 사용하도록 설정하여 에이전트가 Python 코드를 실행할 수 있도록 하거나 사용자 입력 작업 그룹을 사용하여 에이전트에서 설명을 요청할 수 있습니다. 이러한 기능은 OpenAI의 코드 인터프리터 플러그 인 또는 함수 호출과 유사하지만 AWS에서는 에이전트에서 명시적으로 구성됩니다. 다른 에이전트와 마찬가지로 도메인별 도구에 대한 사용자 지정 의미 체계 커널 플러그 인(함수)을 사용하여 Bedrock 에이전트를 확장할 수도 있습니다.
세션 기반 스레드: Bedrock 에이전트와의 대화는 AWS의 Bedrock 세션과 연결된 스레드에서 발생합니다. 각 스레드(세션)는 Bedrock 서비스에서 제공하는 고유 ID로 식별되며 대화 기록은 처리 중이 아닌 서비스에 의해 저장됩니다. 즉, 다중 턴 대화는 AWS에서 유지되며 세션 ID를 통해 컨텍스트를 가져옵니다. 의미 체계 커널
BedrockAgentThread
클래스는 이 세부 정보를 추상화합니다. 이 클래스를 사용하면 에이전트의 백그라운드에서 Bedrock 세션을 만들거나 계속합니다.
요약하면, BedrockAgent
는 의미 체계를 통해 Amazon Bedrock의 강력한 에이전트 및 도구 프레임워크를 활용하여 AWS가 호스팅하는 모델 및 도구와 목표 지향적인 대화를 제공할 수 있게 해줍니다. Bedrock 에이전트 API(에이전트 생성, 세션 관리, 도구 호출)의 복잡성을 자동화하여 고급 언어 간 SK 인터페이스에서 상호 작용할 수 있습니다.
개발 환경 준비
BedrockAgent
로 개발을 시작하려면, 적절한 Semantic Kernel 패키지를 사용하여 환경을 설정하고 AWS 필수 구성 요소가 충족되는지 확인해야 합니다.
팁 (조언)
Bedrock API를 사용하도록 환경을 구성하는 방법에 대한 AWS 설명서를 확인하세요.
.NET 프로젝트에 의미 체계 커널 Bedrock 에이전트 패키지를 추가합니다.
dotnet add package Microsoft.SemanticKernel.Agents.Bedrock --prerelease
이렇게 하면 Bedrock용 AWS SDK에 대한 종속성을 포함하여 Bedrock에 대한 의미 체계 커널 SDK 지원이 제공됩니다. 또한 AWS 자격 증명(예: 환경 변수 또는 기본 AWS 구성을 통해)을 구성해야 할 수도 있습니다. AWS SDK는 구성된 자격 증명을 사용합니다. 환경 또는 AWS 프로필에 사용자 AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
및 기본 지역이 설정되어 있는지 확인합니다. 자세한 내용은 자격 증명 구성에 대한 AWS 설명서를 참조하세요.
AWS 엑스트라를 사용하여 의미 체계 커널 패키지를 설치합니다.
pip install semantic-kernel[aws]
이렇게 하면 필요한 AWS 라이브러리(예: boto3)가 의미 체계 커널과 함께 설치됩니다. Python에서 Bedrock 에이전트를 사용하기 전에 AWS 자격 증명 및 지역이 올바르게 구성되었는지 확인합니다(예: 환경 변수를 설정하거나 AWS CLI를 사용하여).
AWS_ACCESS_KEY_ID
, AWS_SECRET_ACCESS_KEY
, 및 AWS_DEFAULT_REGION
(또는 AWS 프로필)이 설정되어 있어야 boto3가 인증할 수 있습니다.
현재 Java에서 기능을 사용할 수 없습니다.
BedrockAgent
을 만들기
Bedrock 에이전트를 만들려면 두 가지 단계를 따릅니다. 첫째, Amazon Bedrock에서 모델을 선택하고 초기 지침을 제공하여 에이전트를 정의합니다. 둘째, Semantic Kernel 에이전트 객체를 인스턴스화하여 그것과 상호 작용합니다. AWS에서 에이전트를 만들면 준비되지 않은 상태로 시작되므로 사용할 수 있도록 추가 "준비" 작업이 수행됩니다.
using Amazon.Bedrock;
using Amazon.Bedrock.Model;
using Amazon.BedrockRuntime;
using Microsoft.SemanticKernel.Agents.Bedrock;
// 1. Define a new agent on the Amazon Bedrock service
IAmazonBedrock bedrockClient = new AmazonBedrockClient(); // uses default AWS credentials & region
var createRequest = new CreateAgentRequest
{
AgentName = "<foundation model ID>", // e.g., "anthropic.claude-v2" or other model
FoundationModel = "<foundation model ID>", // the same model, or leave null if AgentName is the model
AgentResourceArn = "<agent role ARN>", // IAM role ARN with Bedrock permissions
Instruction = "<agent instructions>"
};
CreateAgentResponse createResponse = await bedrockClient.CreateAgentAsync(createRequest);
// (Optional) Provide a description as needed:
// createRequest.Description = "<agent description>";
// After creation, the agent is in a "NOT_PREPARED" state.
// Prepare the agent to load tools and finalize setup:
await bedrockClient.PrepareAgentAsync(new PrepareAgentRequest
{
AgentId = createResponse.Agent.AgentId
});
// 2. Create a Semantic Kernel agent instance from the Bedrock agent definition
IAmazonBedrockRuntime runtimeClient = new AmazonBedrockRuntimeClient();
BedrockAgent agent = new BedrockAgent(createResponse.Agent, bedrockClient, runtimeClient);
위의 코드에서는 먼저 AWS SDK(AmazonBedrockClient
)를 사용하여 Bedrock에 에이전트를 만들고, 에이전트가 가정해야 하는 IAM 역할의 기본 모델, 이름, 지침 및 ARN을 지정합니다. Bedrock 서비스는 에이전트 정의(고유한 AgentId 포함)로 응답합니다. 그런 다음 PrepareAgentAsync
을(를) 호출하여 에이전트를 준비 상태로 전환합니다 (에이전트가 생성 중 상태에서 NOT_PREPARED, 준비 완료로 이동). 마지막으로 반환된 BedrockAgent
정의와 AWS 클라이언트를 사용하여 개체를 생성합니다. 이 BedrockAgent
인스턴스는 메시지를 보내고 응답을 받는 데 사용됩니다.
import boto3
from semantic_kernel.agents import BedrockAgent
# 1. Define and prepare a new agent on Amazon Bedrock
agent = await BedrockAgent.create_and_prepare_agent(
name="<agent name>",
instructions="<agent instructions>",
foundation_model="<foundation model ID>",
agent_resource_role_arn="<agent role ARN>"
)
위의 BedrockAgent.create_and_prepare_agent
예제에서는 전체 만들기 흐름을 처리합니다. AWS 구성(boto3을 통해)을 사용하여 지정된 이름, 기본 모델 및 지침으로 Bedrock에 에이전트를 만든 다음 에이전트가 준비 상태에 도달할 때까지 자동으로 대기합니다(내부적으로 준비 단계 수행). 결과는 사용할 준비가 된 BedrockAgent
인스턴스입니다. 내부적으로 이 방법은 기본 자격 증명을 사용하여 AWS 클라이언트(Bedrock 및 Bedrock 런타임용)를 만들므로 AWS 환경이 설정되었는지 확인합니다. 사용자 지정 구성이 필요한 경우 AWS 클라이언트를 수동으로 구성하고 매개 변수(예: client= boto3.client("bedrock")
및 runtime_client= boto3.client("bedrock-runtime")
)로 호출에 create_and_prepare_agent
전달할 수도 있습니다.
현재 Java에서 기능을 사용할 수 없습니다.
기존 항목 검색 BedrockAgent
Bedrock에서 에이전트를 만든 후에는 해당 고유 식별자(에이전트 ID)를 사용하여 나중에 검색할 수 있습니다. 이를 통해 시맨틱 커널에서 BedrockAgent
를 처음부터 다시 만들지 않고 다시 인스턴스화할 수 있습니다.
.NET의 경우 Bedrock 에이전트의 식별자는 agent.Id
를 통해 액세스할 수 있는 문자열입니다. ID로 기존 에이전트를 검색하려면 AWS Bedrock 클라이언트를 사용한 다음 새 BedrockAgent
에이전트를 생성합니다.
string existingAgentId = "<your agent ID>";
var getResponse = await bedrockClient.GetAgentAsync(new GetAgentRequest { AgentId = existingAgentId });
BedrockAgent agent = new BedrockAgent(getResponse.Agent, bedrockClient, runtimeClient);
여기서는 에이전트의 IAmazonBedrock
정의(이름, 모델, 명령 등)를 반환하는 알려진 ID를 사용하여 클라이언트를 호출 GetAgentAsync
합니다. 그런 다음 해당 정의와 동일한 클라이언트를 사용하여 새 BedrockAgent
것을 초기화합니다. 이 에이전트 인스턴스는 기존 Bedrock 에이전트에 연결됩니다.
Python에서 AWS Bedrock boto3 클라이언트를 사용하여 ID로 에이전트를 검색한 후 BedrockAgent
로 감쌀 수 있습니다.
import asyncio, boto3
from semantic_kernel.agents import BedrockAgent
agent_id = "<your agent ID>"
bedrock_client = boto3.client("bedrock") # Bedrock service client
# Fetch the agent's definition from AWS
agent_info = await asyncio.to_thread(bedrock_client.get_agent, AgentId=agent_id)
# Create the BedrockAgent instance from the retrieved definition
agent = BedrockAgent(agent_model=agent_info["agent"])
이 코드 조각에서는 boto3을 사용하여 Bedrock 서비스를 호출 get_agent
합니다. boto3이 동작을 막으므로, 이를 스레드 asyncio.to_thread
에서 실행합니다. 반환 agent_info["agent"]
된 항목에는 BedrockAgent 생성자에 전달하는 에이전트의 세부 정보(ID, 이름, 상태 등)가 포함됩니다. AWS 클라이언트를 BedrockAgent
명시적으로 제공하지 않았기 때문에 내부적으로 기본 설정을 사용하여 새 클라이언트를 만듭니다. (필요에 따라 클라이언트가 있다면 client=
및 runtime_client=
을 제공하여 다시 사용할 수 있습니다.)
현재 Java에서 기능을 사용할 수 없습니다.
BedrockAgent와 상호 작용
BedrockAgent 인스턴스가 있으면 상호 작용(사용자 메시지 보내기 및 AI 응답 수신)은 간단합니다. 에이전트는 스레드를 사용하여 대화 컨텍스트를 관리합니다. Bedrock 에이전트의 경우 스레드는 AWS Bedrock 세션에 해당합니다. 의미 체계 커널 BedrockAgentThread
클래스는 세션 생성 및 추적을 처리합니다. 새 대화를 시작하면 새 Bedrock 세션이 시작되고 메시지를 보낼 때 Bedrock은 교대로 사용자/도우미 메시지 기록을 유지 관리합니다. (Bedrock을 사용하려면 채팅 기록이 사용자와 도우미 메시지 간에 대체되어야 합니다. 의미 체계 커널의 채널 논리는 이 패턴을 적용하는 데 필요한 경우 자리 표시자를 삽입합니다.) 스레드를 지정하지 않고 에이전트를 호출하거나(이 경우 SK가 자동으로 새 BedrockAgentThread
스레드를 만들거나) 여러 호출에서 대화를 계속하려면 스레드를 명시적으로 만들거나 유지 관리할 수 있습니다. 각 호출은 하나 이상의 응답을 반환하며 스레드 수명(예: AWS 세션을 종료할 때 삭제)을 관리할 수 있습니다.
Bedrock 에이전트 스레드의 세부 정보는 BedrockAgentThread
클래스에 의해 추상화되며, 이 클래스는 공통 AgentThread
인터페이스를 구현합니다.
BedrockAgent
현재 BedrockAgentThread
형식의 스레드만 지원합니다.
BedrockAgent agent = /* (your BedrockAgent instance, as created above) */;
// Start a new conversation thread for the agent
AgentThread agentThread = new BedrockAgentThread(runtimeClient);
try
{
// Send a user message and iterate over the response(s)
var userMessage = new ChatMessageContent(AuthorRole.User, "<your user input>");
await foreach (ChatMessageContent response in agent.InvokeAsync(userMessage, agentThread))
{
Console.WriteLine(response.Content);
}
}
finally
{
// Clean up the thread and (optionally) the agent when done
await agentThread.DeleteAsync();
await agent.Client.DeleteAgentAsync(new DeleteAgentRequest { AgentId = agent.Id });
}
이 예제에서는 명시적으로 BedrockAgentThread
를 생성하며, 여기에 runtimeClient
를 전달하여 Bedrock 런타임 서비스와 통신합니다. 그런 다음, 사용자의 메시지를 나타내는 ChatMessageContent
을 사용하여 agent.InvokeAsync(...)
을 호출합니다.
InvokeAsync
는 응답의 비동기 스트림을 반환합니다. 실제로 Bedrock 에이전트는 일반적으로 호출당 하나의 최종 응답을 반환합니다(중간 도구 동작은 별도로 처리되므로) 일반적으로 루프에서 단일 ChatMessageContent
응답을 가져옵니다. 도우미의 회신(response.Content
)을 출력합니다. 마지막 블록에서는 스레드를 삭제하여 AWS에서 Bedrock 세션을 종료합니다. 또한 이 경우 에이전트 자체를 삭제합니다(이 예제에 대해서만 만들었으므로). 이 단계는 선택 사항이며 에이전트를 다시 사용하지 않으려는 경우에만 필요합니다(아래 BedrockAgent 삭제 참조).
후속 호출에 대해 동일하게 agentThread
다시 사용하여 기존 대화를 계속할 수 있습니다. 예를 들어 사용자 입력을 읽고 동일한 스레드로 InvokeAsync
을 호출하여 매번 다중 턴 대화를 계속 진행할 수 있습니다. 알려진 세션 ID를 사용하여 BedrockAgentThread를 만들어 이전에 저장된 대화를 다시 시작할 수도 있습니다.
string sessionId = "<existing Bedrock session ID>";
AgentThread thread = new BedrockAgentThread(runtimeClient, sessionId);
// Now `InvokeAsync` using this thread will continue the conversation from that session
Python에서 Bedrock 에이전트를 사용하는 것은 세션을 관리하는 것과 비슷합니다 BedrockAgentThread
. 새 스레드를 시작하거나 기존 스레드를 전달하여 대화를 계속할 수 있습니다.
from semantic_kernel.agents import BedrockAgentThread
# Assume `agent` is your BedrockAgent instance
USER_INPUTS = ["Hello", "What's your name?"]
thread = BedrockAgentThread() # start a new conversation thread (session)
try:
for user_input in USER_INPUTS:
response = await agent.get_response(messages=user_input, thread=thread)
print(response) # print the assistant's reply
thread = response.thread # update thread (BedrockAgentThread) for next turn
finally:
await thread.delete() if thread else None
이 코드에서는 몇 가지 사용자 입력을 반복합니다. 각 반복에서 사용자 메시지와 현재 스레드를 사용하여 호출 agent.get_response(...)
합니다. 첫 번째 호출은 Bedrock 세션을 시작하고 도우미의 대답을 AgentResponseItem
포함하는 (또는 ChatMessageContent
)를 반환합니다. 응답을 인쇄한 다음, 새로운 메시지 문맥으로 업데이트된 동일한 BedrockAgentThread
을 캡처하여 response.thread
다음 턴에 사용합니다. 대화 후(이 예제에서는 두 번 회전) AWS에서 세션을 종료하기 위해 스레드를 삭제합니다.
호출 시 매개 변수 thread
를 생략하면, agent.get_response
또는 agent.invoke
가 자동으로 해당 호출에 대한 새 스레드를 만들고 이를 응답에 포함시킵니다.
필요에 따라 메시지 목록을 get_response
에 전달하거나, 비동기 스트리밍 호출을 통해 한꺼번에 메시지를 전송할 수도 있습니다. 예를 들어 단일 프롬프트에 대한 도우미의 응답(토큰별 토큰)을 스트리밍하려면 다음을 수행합니다.
# Streaming a single response from the Bedrock agent
async for partial in agent.invoke_stream(messages="Tell me a joke.", thread=thread):
print(partial.content, end="")
메서드는 응답을 생성하는 동안 ChatMessageContent
개체를 invoke_stream(...)
반환합니다. 이를 반복하여 도우미의 대답을 증분 방식으로 출력할 수 있습니다(여기서는 전체 응답을 형성하기 위해 줄 바꿈 없이 문자를 인쇄합니다).
현재 Java에서 기능을 사용할 수 없습니다.
BedrockAgent
를 삭제하는 중
Bedrock 에이전트는 AWS 계정의 영구 리소스입니다. 삭제될 때까지 유지되며(잠재적으로 서비스 제한에 대한 비용 또는 카운트가 발생할 수 있습니다) 만든 에이전트가 더 이상 필요하지 않은 경우 Bedrock 서비스 API를 통해 삭제해야 합니다.
Bedrock 클라이언트를 사용하여 에이전트 ID로 삭제합니다. 다음은 그 예입니다.
await bedrockAgent.Client.DeleteAgentAsync(new() { AgentId = bedrockAgent.Id });
이 호출 후에는 에이전트의 상태가 변경되고 더 이상 사용할 수 없습니다. 삭제된 에이전트를 호출하려고 하면 오류가 발생합니다.
에이전트의 삭제 메서드를 호출합니다. 예를 들면 다음과 같습니다.
await agent.delete_agent()
이렇게 하면 Bedrock 서비스를 호출하여 에이전트를 삭제하고 내부적으로 개체를 BedrockAgent
삭제된 것으로 표시합니다.
agent.id
을 확인하거나 제공된 경우(예: _is_deleted
) 플래그를 확인하여 인증할 수 있습니다.
메모: Bedrock 에이전트를 삭제해도 진행 중인 세션이 자동으로 종료되지는 않습니다. 장기 실행 세션(스레드)이 있는 경우 스레드(내부적으로 Bedrock의 EndSession 및 DeleteSession 호출)를 삭제하여 종료해야 합니다. 실제로 위의 예제와 같이 스레드를 삭제하면 세션이 종료됩니다.
현재 Java에서 기능을 사용할 수 없습니다.
중간 메시지를 BedrockAgent
로 처리하기
Bedrock 에이전트가 응답에 도착하기 위해 도구(작업 그룹)를 호출하는 경우 해당 중간 단계(함수 호출 및 결과)는 기본적으로 내부적으로 처리됩니다. 에이전트의 최종 답변은 해당 도구의 결과를 참조하지만 자세한 단계별 세부 정보를 자동으로 포함하지는 않습니다. 그러나 의미 체계 커널을 사용하면 콜백을 제공하여 로깅 또는 사용자 지정 처리를 위해 이러한 중간 메시지를 활용할 수 있습니다.
agent.invoke(...)
또는 agent.invoke_stream(...)
중에는 on_intermediate_message
콜백 함수를 제공할 수 있습니다. 이 콜백은 최종 응답을 작성하는 과정에서 생성된 각 중간 메시지에 대해 호출됩니다. 중간 메시지에는 FunctionCallContent
(에이전트가 함수/도구를 호출하기로 결정한 경우) 및 FunctionResultContent
(도구가 결과를 반환할 때)이 포함될 수 있습니다.
예를 들어 Bedrock 에이전트가 OpenAI Assistant와 함께 사용되는 예제와 유사하게 메뉴 정보에 대한 간단한 플러그 인(또는 기본 제공 도구)에 액세스할 수 있다고 가정합니다.
from semantic_kernel.contents import ChatMessageContent, FunctionCallContent, FunctionResultContent
from semantic_kernel.functions import kernel_function
# Define a sample plugin with two functions
class MenuPlugin:
@kernel_function(description="Provides a list of specials from the menu.")
def get_specials(self) -> str:
return "Soup: Clam Chowder; Salad: Cobb Salad; Drink: Chai Tea"
@kernel_function(description="Provides the price of a menu item.")
def get_item_price(self, menu_item: str) -> str:
return "$9.99"
# Callback to handle intermediate messages
async def handle_intermediate_steps(message: ChatMessageContent) -> None:
for item in (message.items or []):
if isinstance(item, FunctionCallContent):
print(f"Function Call:> {item.name} with arguments: {item.arguments}")
elif isinstance(item, FunctionResultContent):
print(f"Function Result:> {item.result} for function: {item.name}")
else:
print(f"[Intermediate] {item}")
# Create the BedrockAgent with the plugin (assuming agent is not yet created above)
agent = await BedrockAgent.create_and_prepare_agent(
name="MenuAgent",
instructions="You are a restaurant assistant.",
foundation_model="<model ID>",
agent_resource_role_arn="<role ARN>",
plugins=[MenuPlugin()] # include our custom plugin
)
# Start a conversation with intermediate callback
thread = BedrockAgentThread()
user_queries = [
"Hello!",
"What are the specials today?",
"What is the special drink?",
"How much is that?"
]
try:
for query in user_queries:
print(f"# User: {query}")
async for response in agent.invoke(messages=query, thread=thread, on_intermediate_message=handle_intermediate_steps):
print(f"# Assistant: {response}")
thread = response.thread
finally:
await thread.delete() if thread else None
await agent.delete_agent()
이 코드에서 에이전트가 함수 MenuPlugin
를 호출해야 할 때마다(예: get_specials
) get_item_price
handle_intermediate_steps
콜백은 함수 호출에 대한 줄과 함수 결과에 대한 다른 줄을 출력합니다. 그런 다음 각 사용자 쿼리에 대한 최종 도우미 응답이 정상적으로 인쇄됩니다. 중간 콘텐츠를 관찰하여 에이전트가 응답에 어떻게 도착했는지(사용된 도구, 반환된 도구 등)를 추적할 수 있습니다.
예를 들어 출력은 다음과 같이 표시될 수 있습니다.
# User: Hello!
# Assistant: Hello! How can I assist you today?
# User: What are the specials today?
Function Call:> MenuPlugin-get_specials with arguments: {}
Function Result:> Soup: Clam Chowder; Salad: Cobb Salad; Drink: Chai Tea for function: MenuPlugin-get_specials
# Assistant: The specials today include Clam Chowder for the soup, Cobb Salad, and Chai Tea as a special drink.
# User: What is the special drink?
# Assistant: The special drink is Chai Tea.
# User: How much is that?
Function Call:> MenuPlugin-get_item_price with arguments: {"menu_item": "Chai Tea"}
Function Result:> $9.99 for function: MenuPlugin-get_item_price
# Assistant: The special drink (Chai Tea) costs $9.99.
위의 상호 작용에서 중간 인쇄는 에이전트가 적절한 시간에 성공적으로 호출 MenuPlugin.get_specials
하고 MenuPlugin.get_item_price
결과를 사용하여 사용자에게 응답했음을 보여 줍니다. 이러한 중간 세부 정보는 필요에 따라 애플리케이션 논리에 기록하거나 사용할 수 있습니다(예: 에이전트가 수행한 단계를 표시하기 위해).
BedrockAgent(C#)의 중간 메시지에 대한 콜백 지원은 비슷한 패턴을 따르지만 정확한 API는 개발 중입니다. (이후 릴리스에서는 InvokeAsync
중에 FunctionCallContent
및 FunctionResultContent
를 처리할 대리자를 등록할 수 있게 됩니다.)
현재 Java에서 기능을 사용할 수 없습니다.
선언적 YAML을 사용하여 Bedrock 에이전트 정의
의미 체계 커널의 에이전트 프레임워크는 YAML(또는 JSON)을 통해 에이전트를 정의하기 위한 선언적 스키마를 지원합니다. 이렇게 하면 파일에서 에이전트의 구성(형식, 모델, 도구 등)을 지정한 다음, 명령적 코드를 작성하지 않고 런타임에 해당 에이전트 정의를 로드하여 생성할 수 있습니다.
메모: YAML 기반 에이전트 정의는 새로운 기능이며 실험적일 수 있습니다. YAML 에이전트 로드를 지원하는 의미 체계 커널 버전을 사용하고 있는지 확인하고 형식 변경에 대한 최신 문서를 참조하세요.
선언적 사양을 사용하면 특히 에이전트 설정을 쉽게 전환하거나 구성 파일 접근 방식을 사용하려는 경우 구성을 간소화할 수 있습니다. Bedrock 에이전트의 경우 YAML 정의는 다음과 같습니다.
type: bedrock_agent
name: MenuAgent
description: Agent that answers questions about a restaurant menu
instructions: You are a restaurant assistant that provides daily specials and prices.
model:
id: anthropic.claude-v2
agent_resource_role_arn: arn:aws:iam::123456789012:role/BedrockAgentRole
tools:
- type: code_interpreter
- type: user_input
- name: MenuPlugin
type: kernel_function
이 (가상) YAML에서는 형식 bedrock_agent
의 에이전트를 정의하고, 이름과 지침을 제공하고, ID별로 기초 모델을 지정하고, 사용해야 하는 역할의 ARN을 제공합니다. 또한 기본 제공 코드 인터프리터를 사용하도록 설정하는 도구, 기본 제공 사용자 입력 도구를 사용하도록 설정하는 도구, 사용자 지정 MenuPlugin(코드에서 별도로 정의되고 커널 함수로 등록됨)을 선언합니다. 이러한 파일은 에이전트의 설정을 사람이 읽을 수 있는 형식으로 캡슐화합니다.
YAML에서 에이전트를 인스턴스화하려면 적절한 팩터리에서 정적 로더를 사용합니다. 다음은 그 예입니다.
string yamlText = File.ReadAllText("bedrock-agent.yaml");
var factory = new BedrockAgentFactory(); // or an AggregatorAgentFactory if multiple types are used
Agent myAgent = await KernelAgentYaml.FromAgentYamlAsync(kernel, yamlText, factory);
YAML을 구문 분석하여 주어진 커널과 팩토리를 사용해 BedrockAgent
인스턴스(또는 type
필드를 기반으로 한 다른 유형)를 생성합니다.
BedrockAgent 선언적 사양 처리가 곧 제공될 예정입니다.
현재 Java에서 기능을 사용할 수 없습니다.
선언적 스키마를 사용하는 것은 코드를 변경하는 대신 구성 파일을 편집하여 모델 또는 지침을 교환할 수 있으므로 시나리오 구성 및 테스트에 특히 강력할 수 있습니다. 기능이 발전함에 따라 YAML 에이전트 정의에 대한 자세한 내용은 의미 체계 커널의 설명서 및 샘플을 확인하세요.
추가 리소스
- AWS Bedrock 설명서: Amazon Bedrock의 에이전트 기능에 대한 자세한 내용은 AWS 설명서(예: 기본 모델 액세스 및 IAM 역할을 구성하는 방법)에서 Amazon Bedrock 에이전트를 참조하세요. 기본 서비스를 이해하면 올바른 사용 권한을 설정하고 기본 제공 도구를 최대한 활용하는 데 도움이 됩니다.
-
의미 체계 커널 샘플: 의미 체계 커널 리포지토리에는 Bedrock 에이전트에 대한 개념 샘플 이 포함되어 있습니다. 예를 들어 Python 샘플의 Bedrock 에이전트 기본 채팅 샘플 은 간단한 Q&A를
BedrockAgent
보여 줍니다. 코드 인터프리터가 있는 Bedrock 에이전트 샘플 은 코드 인터프리터 도구를 사용하도록 설정하고 사용하는 방법을 보여 줍니다. 작동 중인BedrockAgent
를 볼 수 있는 좋은 출발점이 될 수 있는 샘플들입니다.
Amazon Bedrock 에이전트가 통합되어 의미 체계 커널을 사용하면 진정한 다중 플랫폼 AI 솔루션을 사용할 수 있습니다. OpenAI, Azure OpenAI 또는 AWS Bedrock을 사용하든 간에 일관된 프레임워크를 사용하여 도구 통합을 통해 풍부한 대화형 애플리케이션을 빌드할 수 있습니다. AWS BedrockAgent
의 최신 기본 모델을 활용하고 의미 체계 커널 프로젝트 내에서 안전하고 확장 가능한 에이전트 패러다임을 활용할 수 있는 문이 열립니다.