Bedrock AgentCore와 SageMaker AI를 결합한 하이브리드 구조

관리형 모델의 편의성과 자체 호스팅 모델의 비용 효율성을 동시에 확보하기 위해, Amazon Bedrock AgentCore 런타임 하나로 두 경로를 사용하는 하이브리드 구조를 구축한다. 이는 모델의 성능 요구치와 운영 비용에 따라 호스팅 방식을 섞어 써서 전체 시스템의 가성비를 높이는 구성이다.

Amazon Bedrock AgentCore 런타임 컨테이너가 세 가지 모델 호스팅 경로를 연결하는 단일 진입점 역할을 수행한다. 사용자 요청이 들어오면 런타임 내부의 오케스트레이터 에이전트가 내용을 분석해 처리 경로를 결정한다. 이때 Strands Agents의 'agents as tools' 패턴을 적용해 요청 성격에 맞는 하위 에이전트로 작업을 라우팅한다. 에이전트를 하나의 도구처럼 호출하는 이 방식은 각 에이전트의 독립성을 유지하면서 워크플로를 단순한 함수 호출 형태로 관리하게 한다.

실제 구현에서는 예산 관리와 재무 분석 에이전트를 서로 다른 모델 경로에 배치한다. 예산 에이전트는 Amazon Bedrock의 Claude Sonnet 4.6 모델을 호출해 서버 관리 부담 없는 안정성을 확보한다. 재무 분석 에이전트는 SageMaker AI 실시간 엔드포인트에 배포된 Qwen 3.5 9B 모델을 사용해 추론 비용을 최적화한다. SageMaker AI 엔드포인트는 OpenAI 호환 API를 통해 호출되므로, 별도의 SDK 수정 없이 기존 API 규격을 그대로 활용해 자체 호스팅 모델을 통합할 수 있다.

전체 요청 흐름은 오케스트레이터에서 시작해 각 전문 에이전트를 거쳐 사용자에게 돌아간다. 고성능 추론이 필요한 복잡한 작업에는 대형 관리형 모델을, 반복적이고 비용 민감한 작업에는 최적화된 소형 자체 모델을 배치하는 기준을 적용한다. 이를 통해 개발자는 프레임워크를 새로 짜지 않고도 비용과 성능의 균형을 맞출 수 있다. 전체 구현을 위한 상세 소스 코드는 함께 제공된 GitHub 저장소에서 확인할 수 있다.

Qwen 3.5 9B 배포와 OpenAI 호환 엔드포인트 통합 단계

구체적인 배포 과정에서는 인증 유지와 인프라 설정이 핵심이다. SageMaker AI의 OpenAI 호환 API는 Bearer 토큰이 만료되는 제약이 있어, 장시간 실행되는 에이전트 세션에서는 매 요청마다 토큰을 갱신해야 한다. 이를 위해 httpx의 Auth 서브클래스를 활용해 자동 갱신 로직을 구현한다. 요청 전송 전 토큰 유효성을 검사하고, 만료 시 새 토큰을 발급받아 헤더에 삽입함으로써 인증 오류로 인한 워크플로 중단을 방지한다.

Qwen 3.5 9B 모델을 서빙하기 위해 ml.g6e.2xlarge 인스턴스 타입과 vLLM DLC v0.22.1-gpu-py312-cu130 이미지를 사용한다. 해당 이미지는 CUDA 13.0과 Python 3.12 환경이 구성되어 GPU 가속을 통한 빠른 토큰 생성 속도를 확보한다. 배포는 bedrock-agentcore-starter-toolkit과 deploy_agentcore.ipynb 노트북 파일을 통해 수행하며, 모델 가중치 로드부터 엔드포인트 생성, API 게이트웨이 설정까지의 파이프라인을 단계별로 실행한다.

실제 환경 구축을 위해 필요한 라이브러리 설치 명령은 다음과 같다.

bash
pip install sagemaker-core openai httpx strands-agents[otel] yfinance pydantic bedrock-agentcore

설치된 패키지들은 SageMaker 엔드포인트 통신, OpenAI API 규격 준수, 에이전트 도구 호출 및 관측성을 담당한다. 특히 strands-agents[otel]은 OpenTelemetry를 통해 에이전트의 동작 과정을 추적한다. vLLM 컨테이너가 SageMaker AI 실시간 엔드포인트에서 구동되며 이를 OpenAI 호환 API 형태로 노출하면, 에이전트는 이를 표준 OpenAI 모델처럼 인식해 호출한다. 이 구조를 통해 데이터 보안을 위해 자체 인프라에 모델을 올리면서도 표준화된 인터페이스를 사용할 수 있다.

기본 관측성의 한계와 SageMaker 토큰 누락 원인

Bedrock AgentCore의 자동 도구화(Auto-instrumentation)는 boto3를 통해 호출되는 Bedrock 모델 추론만 생성형 AI 작업으로 인식한다. OpenTelemetry를 기반으로 하지만, SageMaker AI에서 호스팅하는 모델 호출 경로는 Bedrock의 표준 추론 경로가 아니므로 자동 인식 범위에서 제외된다. 이 때문에 멀티 모델 환경에서는 특정 호출 내역이 트레이스(Trace)에서 사라지는 현상이 발생한다.

Strands의 OTEL 통합 방식은 도구 호출이나 에이전트 생명주기 스팬(Span)만 생성하며, OpenAIModel 제공자를 통한 호출 시 생성되어야 할 gen_ai.chat 스팬을 생성하지 않는다. gen_ai.chat 스팬은 모델이 소비한 입력 및 출력 토큰 속성을 담고 있는 핵심 기록 단위다. SageMaker AI에서 호출한 Qwen 3.5 9B 모델의 경우, 추론 결과는 반환되지만 비용 산출의 근거가 되는 토큰 소비량은 트레이스 상에서 누락된다.

토큰 데이터가 없으면 실무적인 운영 지표 관리가 불가능하다. 모델별 토큰 사용량을 집계할 수 없어 실제 인프라 지출 비용을 추적할 수 없고, 프롬프트 수정 후 토큰 사용량 변화나 응답 길이 변동을 확인하는 회귀 탐지가 어렵다. 또한 전체 응답 시간 중 모델 추론이 차지하는 순수 시간과 토큰 생성 속도를 분리해 분석할 수 없어 병목 구간을 찾기 어렵다.

토큰 수준 관측성 확보를 위한 vLLM 설정과 수동 스팬 구현

vLLM의 기본 설정으로 스트리밍 응답을 받으면 토큰 사용량 데이터가 누락되어 `accumulated_usage` 수치가 0으로 유지된다. vLLM은 스트리밍 모드에서 텍스트 청크만 전송하고 최종 사용량 객체를 포함하지 않는 기본 동작을 가지기 때문이다. Strands는 모델 제공자가 반환하는 데이터를 기반으로 사용량을 추적하므로, 데이터가 오지 않으면 누적 수치를 0으로 기록한다.

이 누락을 막으려면 vLLM 설정의 `stream_options` 항목에 `{"include_usage": True}`를 명시해야 한다. 이 설정을 추가하면 vLLM은 모든 텍스트 전송 후 토큰 수가 포함된 마지막 청크를 추가로 전송한다. 이 옵션은 관측성 도구의 데이터 수집 여부를 결정하는 핵심 설정이며, 해당 파라미터가 없으면 이후 어떤 수동 스팬을 구성하더라도 보고되는 토큰 수는 0으로 고정된다.

데이터 수신 경로가 확보되면 SageMaker 에이전트 호출을 감싸는 `gen_ai.chat` 스팬을 수동으로 생성한다. 자동 추적만으로는 Strands 내부의 상세 메트릭에 접근하기 어렵기 때문에, 수동 스팬을 통해 `AgentResult.metrics.accumulated_usage` 딕셔너리에서 값을 직접 추출한다. 이 딕셔너리의 inputTokens, outputTokens, totalTokens 키를 통해 사용량을 분리 기록함으로써 요청당 정확한 비용 산출이 가능해진다.

해당 워크플로는 Strands Agents 프레임워크와 vLLM DLC v0.22.1-gpu-py312-cu130 환경에서 검증되었다. vLLM의 사용량 포함 옵션으로 데이터를 생성하고 수동 스팬으로 이를 기록하는 구조를 통해, 개별 호출마다 정확한 토큰 수치를 표시하여 인프라 비용과 모델 효율성을 계산할 정량적 근거를 마련한다.

모델 혼합 전략과 리소스 관리 기준

이러한 기술적 구현을 바탕으로 실제 운영 환경에서의 모델 배치 전략을 세울 수 있다. SageMaker AI 자체 호스팅 모델을 결합하면 데이터 거주성(Data Residency) 확보와 비용 최적화가 가능하다. 민감한 데이터를 다루거나 법적 규제가 엄격한 환경에서는 모델 구동 위치와 데이터 이동 경로를 직접 제어해야 한다. 범용 추론은 Amazon Bedrock의 관리형 모델에 맡기고, 특정 도메인 지식이 집약된 소형 모델은 SageMaker AI에 배치해 추론 비용을 낮추는 전략이 효율적이다.

자체 호스팅 모델 도입 시 고려할 점은 OpenTelemetry 수동 구현에 들어가는 엔지니어링 공수다. Bedrock과 같은 관리형 서비스와 달리, 자체 호스팅 모델은 토큰 사용량과 지연 시간을 추적하는 로직을 직접 설계해야 한다. vLLM 엔진의 `stream_options` 설정과 `gen_ai.chat` 수동 스팬 구현은 운영 단계에서 모델별 비용 효율성을 측정하기 위한 필수적인 가시성 확보 작업이다.

리소스 관리 측면에서는 SageMaker AI 실시간 엔드포인트의 비용 청구 방식을 주의해야 한다. 실시간 엔드포인트는 요청 유무와 상관없이 할당된 인스턴스가 24시간 구동되므로 사용하지 않는 시간에도 비용이 누적된다. 테스트 환경에서 엔드포인트를 방치할 경우 예산 범위를 초과할 리스크가 크다. 따라서 검증 단계가 끝난 후에는 반드시 엔드포인트와 관련 리소스를 삭제하는 절차를 워크플로에 포함하고, 인프라 삭제 스크립트를 통해 리소스 누수를 차단해야 한다.

데이터 거주성 요구사항이 엄격하거나 특정 도메인 모델의 추론 비용을 낮춰야 하는 환경이라면, 수동 관측성 구현 공수를 감수하고 SageMaker AI와 Bedrock을 혼합한 하이브리드 구성을 선택하는 것이 효율적이다.

결과적으로 이번 설계법은 단순한 모델 교체를 넘어, 인프라 제어권과 비용 효율성, 그리고 운영 가시성이라는 세 가지 토끼를 동시에 잡기 위한 실무적인 접근법을 제시한다.