본문으로 건너뛰기

SageMaker Qwen을 AgentCore에 연결하는 법

Qwen 3.5 9B를 SageMaker에 배포하고 AgentCore의 멀티 에이전트 흐름과 token trace에 연결하는 구현법입니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

Amazon Bedrock AgentCore runtime과 Amazon SageMaker AI의 OpenAI 호환 엔드포인트를 결합하면 Claude 계열 모델과 SageMaker의 Qwen 3.5 9B를 하나의 Strands Agents 멀티 에이전트 시스템에서 함께 사용할 수 있습니다. Orchestrator agent가 요청을 Budget agent와 Financial analysis agent로 분배하고, 각 전문 에이전트가 작업에 맞는 모델과 도구를 호출하는 구조입니다. SageMaker 호출에는 기본 token telemetry가 없으므로 gen_ai.chat OpenTelemetry span을 직접 만들고 result.metrics.accumulated_usage를 기록해야 하며, vLLM의 stream_options에 include_usage를 켜야 token 수가 채워집니다. 예시 trace에는 입력 1391개, 출력 1432개, 전체 2823개의 token이 기록됐고, AgentCore 배포와 AWS X-Ray 샘플링 설정까지 갖추면 비용·지연 시간·호출 흐름을 함께 추적할 수 있습니다.

섹션별 상세

Amazon Bedrock의 관리형 foundation model과 Amazon SageMaker AI의 자체·도메인 특화 모델을 하나의 에이전트 프레임워크에서 함께 쓰려면 모델 호출 방식과 배포 경로를 연결해야 합니다. 이 구조에서는 Amazon Bedrock AgentCore runtime 안에 Orchestrator agent를 배치하고, Strands Agents의 agents as tools 패턴으로 Budget agent와 Financial analysis agent에 요청을 나눕니다. 그 결과 작업별로 Claude Haiku 4.5, Claude Sonnet 4.6, Qwen 3.5 9B를 선택하면서 비용 최적화와 모델 유연성을 함께 확보할 수 있습니다.
Amazon Bedrock AgentCore runtime 안에서 Orchestrator agent가 Budget agent와 Financial Analysis agent로 작업을 라우팅하고, Claude 모델은 Bedrock에서 Qwen 3.5 9B는 SageMaker에서 호출하는 구조도입니다.
Diagram사용자 요청은 인증된 token과 함께 AgentCore runtime으로 들어가며 Orchestrator agent가 두 전문 에이전트 중 하나를 선택합니다. Budget agent는 Claude Sonnet 4.6과 예산 계산 도구를 사용하고 Financial Analysis agent는 SageMaker의 Qwen 3.5 9B 및 주식 분석 도구를 사용하며, Amazon Bedrock AgentCore Observability와 Guardrails가 공통 실행 경로에 연결됩니다.
Qwen 3.5 9B는 vLLM Deep Learning Container를 이용해 Amazon SageMaker AI 실시간 엔드포인트에 배포됩니다. 글의 설정은 vllm:0.22.1-gpu-py312-cu130 이미지와 ml.g6e.2xlarge 인스턴스, 1개의 GPU, 최대 모델 길이 32768을 사용하며 OpenAI 호환 API 경로를 엽니다. 이 방식은 Financial analysis agent가 주식 분석과 포트폴리오 구성 도구를 호출하면서 SageMaker에서 호스팅한 모델을 기존 Strands Agents 흐름에 연결하게 합니다.
python
region = "us-west-2"
model_id = "Qwen/Qwen3.5-9B"
instance_type = "ml.g6e.2xlarge" # 1x L40S (48GB VRAM)
num_gpu = 1 # vLLM 0.22.1, Python 3.12, CUDA 13.0, Ubuntu 22.04
inference_image = f"763104351884.dkr.ecr.{region}.amazonaws.com/vllm:0.22.1-gpu-py312-cu130-ubuntu22.04-sagemaker"
env = {
    "SM_VLLM_MODEL": model_id,
    "SM_VLLM_TENSOR_PARALLEL_SIZE": "1",
    "SM_VLLM_MAX_MODEL_LEN": "32768",
}
# Create Model
sm.create_model(
    ModelName=model_name,
    ExecutionRoleArn=role,
    PrimaryContainer={"Image": inference_image, "Environment": env},
)
# Create Endpoint Config + Endpoint
sm.create_endpoint_config(
    EndpointConfigName=endpoint_config_name,
    ProductionVariants=[{
        "VariantName": "v1",
        "ModelName": model_name,
        "InstanceType": instance_type,
        "InitialInstanceCount": 1,
        "ContainerStartupHealthCheckTimeoutInSeconds": 1200,
        "InferenceAmiVersion": inference_ami_version,
    }],
)
sm.create_endpoint(EndpointName=endpoint_name, EndpointConfigName=endpoint_config_name)

vLLM 컨테이너를 사용해 Qwen 3.5 9B를 Amazon SageMaker AI 엔드포인트로 배포합니다.

SageMaker OpenAI 호환 엔드포인트는 bearer token을 요구하고 token이 만료되므로 장시간 실행되는 에이전트에서는 요청마다 인증 정보를 갱신해야 합니다. httpx.Auth를 상속한 SageMakerAuth가 generate_token()으로 새 token을 만들고 AsyncOpenAI client의 http_client에 연결하는 방식으로 인증을 처리합니다. 따라서 AgentCore runtime 내부에서도 OpenAI SDK 기반 호출을 유지하면서 SageMaker 엔드포인트에 접근할 수 있습니다.
python
import httpx
from openai import AsyncOpenAI
from sagemaker.core.token_generator import generate_token

class SageMakerAuth(httpx.Auth):
    def __init__(self, region):
        self.region = region
    def auth_flow(self, request):
        request.headers["Authorization"] = f"Bearer {generate_token(region=self.region)}"
        yield request

strands_client = AsyncOpenAI(
    base_url=f"https://runtime.sagemaker.{REGION}.amazonaws.com/endpoints/{ENDPOINT_NAME}/openai/v1",
    api_key="sagemaker",
    http_client=httpx.AsyncClient(auth=SageMakerAuth(region=REGION)),
)

SageMaker OpenAI 호환 엔드포인트에 요청할 때마다 갱신되는 bearer token을 주입합니다.

python
qwen_model = OpenAIModel(
    client=strands_client,
    model_id="",
    params={"temperature": 0.7, "max_tokens": 4096, "stream_options": {"include_usage": True}},
)

vLLM streaming 응답의 마지막 usage chunk에서 token 수를 받을 수 있도록 설정합니다.

Amazon Bedrock 호출은 AgentCore runtime의 OpenTelemetry 자동 계측을 통해 generative AI span과 token 수가 수집되지만, Strands의 OpenAIModel을 거치는 SageMaker 호출에는 같은 계측이 적용되지 않습니다. 이 누락 때문에 Qwen 3.5 9B의 비용, 지연 시간, token 사용량을 기본 trace에서 확인할 수 없습니다. 해결책은 SageMaker 에이전트 호출을 수동 gen_ai.chat span으로 감싸고 result.metrics.accumulated_usage의 inputTokens, outputTokens, totalTokens 값을 span 속성에 기록하는 것입니다.
python
with tracer.start_as_current_span("gen_ai.chat", attributes={
    "gen_ai.system": "openai",
    "gen_ai.request.model": f"qwen3.5-9b ({SAGEMAKER_ENDPOINT_NAME})",
    "gen_ai.operation.name": "chat",
}) as span:
    fa_agent = Agent(
        model=OpenAIModel(
            client=strands_client,
            model_id="",
            params={"temperature": 0.7, "max_tokens": 4096, "stream_options": {"include_usage": True}},
        ),
        system_prompt=FINANCIAL_ANALYSIS_PROMPT,
        tools=[get_stock_analysis, create_diversified_portfolio, compare_stock_performance],
        callback_handler=None,
    )
    result = fa_agent(query)
    # Extract token usage from Strands agent metrics
    usage = result.metrics.accumulated_usage
    span.set_attribute("gen_ai.usage.input_tokens", usage.get("inputTokens", 0))
    span.set_attribute("gen_ai.usage.output_tokens", usage.get("outputTokens", 0))
    span.set_attribute("gen_ai.usage.total_tokens", usage.get("totalTokens", 0))
    return str(result)

SageMaker 모델 호출을 수동 gen_ai.chat span으로 감싸고 Strands 내부 metric에서 token 수를 기록합니다.

근거
  • Amazon SageMaker AI의 OpenAI 호환 엔드포인트는 Strands OpenAIModel을 통해 호출해도 token telemetry가 자동으로 생성되지 않는다. Configure observability for SageMaker endpoints의 Invisible token usage 및 Root cause 단락
  • result.metrics.accumulated_usage에서 inputTokens, outputTokens, totalTokens를 읽어 수동 gen_ai.chat span의 속성으로 기록할 수 있다. The solution: Custom OpenTelemetry spans의 코드 블록 및 Key detail 단락
  • Amazon Bedrock AgentCore runtime은 Bedrock 모델 호출을 자동 계측하지만 SageMaker OpenAI 엔드포인트에는 수동 span이 필요하다. Key learnings 목록
token 수집에는 vLLM streaming 응답의 마지막 usage chunk가 필요합니다. OpenAIModel의 params에 stream_options: {"include_usage": True}를 넣으면 Strands가 usage 데이터를 받아 accumulated_usage를 채우며, 이 설정이 없으면 span의 token 수가 0으로 남습니다. 예시 trace에서는 입력 1391개, 출력 1432개, 전체 2823개의 token과 37237386894의 durationNano 값이 기록됩니다.
SageMaker에서 호스팅한 Qwen 모델 호출을 포함한 AgentCore observability trace에서 gen_ai.chat span과 에이전트·도구 실행 흐름을 확인하는 대시보드입니다.
Screenshottrace에는 execute_event_loop_cycle, chat, 금융 분석 도구 호출, 주식 분석과 포트폴리오 구성 도구 실행이 연결되어 있으며 gen_ai.chat span이 별도로 강조됩니다. 이는 수동 OpenTelemetry span과 stream_options 설정을 통해 SageMaker 모델 호출의 token 정보를 AgentCore trace에 포함한 결과와 연결됩니다.
근거
  • stream_options: {"include_usage": True}를 설정하지 않으면 vLLM streaming 응답에서 usage가 전달되지 않아 accumulated_usage가 0으로 남는다. Why stream_options is mandatory for vLLM 단락과 코드 블록
  • 예시 trace에 입력 1391개, 출력 1432개, 전체 2823개의 token이 기록됐다. Example trace output 코드 블록
전체 워크플로는 bedrock-agentcore-starter-toolkit으로 AgentCore runtime에 배포하고 AGENT_OBSERVABILITY_ENABLED=true를 설정해 관측 기능을 켭니다. Amazon CloudWatch Transaction Search와 AWS X-Ray 샘플링 비율도 구성해야 하며, 글은 개발 중 대부분의 trace가 누락되지 않도록 샘플링 비율을 100%로 설정하도록 안내합니다. 동시 호출 오류를 피하려면 요청마다 새 에이전트 인스턴스를 만들고, 사용이 끝난 뒤 AgentCore runtime과 SageMaker 모델·엔드포인트 리소스를 삭제해야 합니다.

용어 해설

에이전틱 워크플로(Agentic Workflow)
에이전틱 워크플로는 여러 AI 에이전트가 사용자의 요청을 분류하고 필요한 도구와 모델을 선택해 작업을 이어 가는 구조입니다. 이 글에서는 Orchestrator agent가 Budget agent와 Financial analysis agent로 작업을 분배하며, 각 에이전트가 Amazon Bedrock 또는 Amazon SageMaker AI의 모델을 호출합니다.
OpenAI 호환 API(OpenAI-Compatible API)
OpenAI 호환 API는 OpenAI SDK가 사용하는 요청 형식과 인터페이스를 다른 모델 호스팅 환경에서도 사용할 수 있게 하는 API 방식입니다. Amazon SageMaker AI 엔드포인트는 이 인터페이스를 통해 Qwen 3.5 9B를 호출하며, bearer token 인증과 streaming 응답을 사용합니다.
vLLM
vLLM은 대규모 언어 모델 추론을 제공하는 오픈소스 엔진으로, 이 글에서는 Qwen 3.5 9B를 Amazon SageMaker AI 실시간 엔드포인트에 배포하는 Deep Learning Container로 사용됩니다. streaming 응답에 token usage를 포함하려면 별도의 stream_options 설정이 필요합니다.
OpenTelemetry
OpenTelemetry는 애플리케이션의 호출 흐름과 지연 시간 같은 텔레메트리를 수집하는 표준 프레임워크입니다. Amazon Bedrock AgentCore runtime은 에이전트를 자동 계측하지만 SageMaker의 OpenAIModel 호출은 자동으로 gen_ai.chat span을 만들지 않아 수동 span 생성이 필요합니다.
gen_ai.chat span(gen_ai.chat Span)
gen_ai.chat span은 생성형 AI 모델 호출을 추적하는 OpenTelemetry span으로, 모델명과 입력·출력·전체 token 수 같은 속성을 담습니다. 이 글에서는 SageMaker 에이전트 호출을 직접 감싸고 result.metrics.accumulated_usage에서 token 수를 읽어 추적 데이터에 기록합니다.

기술

  • Amazon SageMaker AI
  • Amazon Bedrock AgentCore runtime
  • Amazon Bedrock
  • Strands Agents
  • Qwen 3.5 9B
  • Claude Haiku 4.5
  • Claude Sonnet 4.6
  • vLLM
  • OpenAI-compatible API
  • httpx.Auth
  • AsyncOpenAI
  • OpenTelemetry
  • AWS X-Ray
  • Amazon CloudWatch Transaction Search
  • Python 3.12
  • Pydantic

활용 사례

  • 예산 배분을 위한 Budget agent와 주식 분석·포트폴리오 구성을 위한 Financial analysis agent의 협업
  • Amazon Bedrock 모델과 Amazon SageMaker AI 호스팅 모델을 함께 사용하는 개인 금융 에이전트
  • SageMaker에서 호스팅한 모델의 token 사용량, 비용, 지연 시간 추적
  • 기본 모델과 Fine-tuned 모델의 A/B 테스트
  • 질의 복잡도에 따른 비용 인식형 모델 라우팅
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 08. 15.수집 2026. 08. 15.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.