
15분 만에 Amazon Bedrock에서 GPT-5.6 사용하기
요약
Amazon Bedrock을 통해 OpenAI의 GPT-5.6 모델을 사용하는 방법을 설명합니다. API 키 없이 AWS 계정의 IAM 권한과 VPC 환경을 활용하여 데이터 거주성을 유지하며 모델을 호출하는 가이드를 제공합니다.
핵심 포인트
- GPT-5.6은 Sol, Terra, Luna 세 가지 역량 티어로 제공됨
- OpenAI API 키 없이 AWS IAM 정책을 통해 모델 호출 가능
- 데이터 거주성 유지 및 기존 AWS 약정 활용 가능
- Python SDK와 AWS 자격 증명을 이용한 빠른 구축 방법 안내
OpenAI의 GPT-5.6은 Sol, Terra, Luna의 세 가지 티어(tier)로 제공되며, 이제 OpenAI API 키 없이도 본인의 AWS 계정을 통해 Amazon Bedrock에서 이를 호출할 수 있습니다.
이 과정은 가장 짧은 경로를 따릅니다: 복제(clone), 실행(run), 출력 결과 이해(understand the output). 모든 명령은 복사하여 붙여넣을 수 있으며, 아래의 모든 수치는 실제 실행 결과에서 도출되었습니다. 여러분의 계정에서도 동일한 규모의 결과를 확인할 수 있을 것입니다.
배경: 먼저 알아두어야 할 두 가지
GPT-5.6은 2026년 7월 Amazon Bedrock에서 일반적으로 사용 가능(GA)해졌습니다. 시작하기 전에 이해해야 할 두 가지 사항이 있습니다.
첫째, Sol / Terra / Luna는 버전 번호가 아닙니다. 5.6은 세대를 식별하며, Sol, Terra, Luna는 각각 독자적인 속도로 발전할 수 있는 세 가지 역량 티어(capability tiers)입니다. 따라서 선택할 때의 질문은 "어떤 것이 더 최신인가"가 아니라 "이 작업에 얼마나 많은 추론(reasoning)이 필요한가"가 되어야 합니다. OpenAI가 발표한 평가에 따르면, Sol은 현재까지 가장 강력한 추론 모델로, 이전 세대보다 더 적은 출력 토큰(output tokens)을 사용하면서도 코딩 에이전트(coding-agent) 및 보안 연구(security-research) 작업에서 확실히 앞서 있습니다. Terra는 더 낮은 비용으로 이전 세대를 능가하며, Luna는 높은 볼륨과 낮은 지연 시간(low latency)을 목표로 합니다. Sol에는 max라는 하나의 추가 추론 레벨이 제공됩니다.
둘째, 왜 OpenAI를 직접 호출하는 대신 Bedrock에서 실행하는가. 아래의 세 가지 포인트는 모두 AWS GA 발표(부록에 링크됨)에서 가져온 것입니다:
- 추론(Inference)이 지정된 AWS 리전(Region) 내에 유지되어 데이터 거주성(data residency)에 도움이 됩니다.
- 모든 호출은 본인의 VPC 내부에서 본인의 IAM 정책을 통해 이루어지며, CloudTrail에 기록됩니다.
- 가격은 OpenAI의 자체 요율과 일치하며, 사용량은 기존 AWS 약정(commitments)에 포함됩니다.
이제 구축해 보겠습니다.
필요한 사항
- Python 3.10 이상
- 작동 가능한 자격 증명(
~/.aws/credentials또는AWS_PROFILE)이 포함된 AWS 계정 - 대상 리전(Region)에서 사용 가능한 GPT-5.6 및 Bedrock을 호출할 수 있는 권한이 있는 IAM identity
자격 증명이 해결되는지 확인하십시오. AWS CLI가 있는 경우:
aws sts get-caller-identity
계정 정보와 신원(identity)이 출력된다면 성공입니다. AWS CLI는 필수 사항이 아닙니다. — 예제 코드에서 이를 호출하지 않으며, 자격 증명(credentials)은 Python SDK를 통해 읽어오기 때문입니다. AWS CLI가 없다면, 1단계(Step 1)에서 종속성(dependencies) 설치를 마친 후 다음의 동일한 확인 명령을 실행하십시오:
python -c "import botocore.session as s; print('credentials found' if s.get_session().get_credentials() else 'NO credentials')"
Step 1: 설정 (Set up)
git clone https://github.com/hanyun2019/openai-bedrock-samples.git
cd openai-bedrock-samples
...
API 키를 설정하지 않습니다. 이것이 OpenAI를 직접 호출하는 방식과의 가장 큰 차이점입니다. 코드는 매 요청 전에 사용자의 AWS 자격 증명(credentials)을 사용하여 수명이 짧은 Bedrock 토큰을 생성(mint)합니다.
openai>=2.45.0 버전은 필수 요구 사항입니다. BedrockOpenAI 클라이언트가 해당 버전에 포함되어 있기 때문입니다.
Step 2: 첫 번째 호출 (First call)
python -m src.gpt56.hello
============================================================
Tier : terra
Model ID : openai.gpt-5.6-terra
...
정상 작동합니다. 여기서 반드시 기억해야 할 한 가지는 파일 경로가 아닌 -m 옵션으로 실행해야 한다는 점입니다.
python -m src.gpt56.hello # 올바른 방법
python src/gpt56/hello.py # ImportError 발생
예제 모듈들은 상대 임포트(relative imports)를 사용하므로, 파일을 직접 실행하면 Python이 해당 파일이 어떤 패키지에 속해 있는지 알 수 없게 됩니다.
프로젝트 전체에서 핵심적인 파일은 단 하나, src/gpt56/client.py입니다. 이 파일은 두 가지 역할을 수행합니다: 티어(tier)/리전(Region) 조합을 검증하고, 토큰이 스스로 갱신되는 클라이언트를 구축합니다. 그 외의 모든 파일은 이 파일을 임포트합니다.
Step 3: 어떤 티어를 사용할 것인가? (Which tier?)
요약하자면 다음과 같습니다:
| Tier | Model ID | 사용 시점 |
|---|---|---|
| Sol | openai.gpt-5.6-sol | 복잡한 리팩토링 (refactoring), 긴 추론 체인 (reasoning chains), 보안 연구 |
| ... |
다음은 해당 모델이 사용하는 문제입니다:
이것은 정보를 의도적으로 두 부분으로 나눕니다. 꼭짓점 형태 (vertex form)는 "최댓값은 x=3에서 발생한다"는 정보를 숨기고 있으며, g(3)의 값은 표에서 찾아봐야 합니다. 모델은 단순히 패턴 매칭 (pattern matching)을 통해 답을 찾는 대신, 이 두 가지 정보를 결합해야 합니다. 정답은 B입니다.
동일한 문제를 세 가지 티어 (tiers) 모두에서 실행합니다:
python -m src.gpt56.compare_tiers
built-in text problem · effort=low · region=us-east-1
Correct answer: B (k=3, g(3)=6)
==============================================================================
...
세 가지 모두 정답을 맞혔으며, 이것이 핵심입니다: 쉬운 작업에서는 더 비싼 티어가 더 나은 답변을 보장하지 않습니다. 이번 실행에서는 Terra가 Sol보다 더 빨랐으며 출력 토큰 (output tokens)도 더 적게 사용했습니다. 티어 간의 차이는 어려운 문제에서만 나타납니다.
정확한 수치는 실행할 때마다 달라지므로 (재실행 시 Sol은 87개, Terra는 85개의 출력 토큰이 나왔으며 실행 시간 순서도 바뀌었습니다), 특정 수치 하나에 얽매이지 마세요. 중요한 것은 결론입니다: 세 가지 모두 정답을 맞혔으므로, 여기서는 더 많은 비용을 지불하는 것이 아무런 이득이 없었습니다.
따라서 위로 올라가며 작업하세요: Terra에서 시작하고, Terra로 충분하지 않을 때 Sol로 이동하십시오. 그 반대로 해서는 안 됩니다.
실제로 에러를 발생시키는 주의 사항 하나는: Sol은 us-east-1과 us-east-2에서만 존재하며, Terra와 Luna는 us-west-2를 추가로 지원합니다. client.py는 요청이 나가기 전에 이를 감지합니다:
ValueError: GPT-5.6 sol is not available in us-west-2.
Available Regions: us-east-1, us-east-2
4단계: 추론 노력 (Reasoning effort)
GPT-5.6은 답변하기 전에 추론하며, reasoning.effort가 그 강도를 조절합니다. 총 6단계가 있습니다: none, low, medium, high, xhigh, max.
이 단계에서는 대수학 문제로 전환합니다:
정확히 하나의 지수 법칙 변환(거듭제곱을 나누면 지수를 빼게 되므로, 3x - y가 그대로 대입됨)이 필요합니다. 이는 사소해 보이지만, 이 단일 변환 자체가 바로 추론(reasoning) 단계이며, 이는 effort가 실제로 무언가를 수행하고 있는지 확인하기 위한 좋은 탐침(probe)이 됩니다. D는 함정입니다. x와 y는 실제로 각각 결정되지 않은 상태이지만, 식은 오직 3x - y의 조합에만 의존하므로 유일한 답이 존재합니다. 정답은 A입니다.
전체적으로 훑어봅시다(Sweep them):
python -m src.gpt56.effort_sweep terra
Model: openai.gpt-5.6-terra @ us-east-1
Correct answer: A 1 run(s) per level
...
두 개의 열(column)이 그 내용을 말해줍니다.
reasoning 열은 0에서 46까지 상승합니다. 이것이 바로 effort를 통해 얻는 것, 즉 사고(thinking)의 양입니다.
in 열은 83으로 일정합니다. 프롬프트가 변경되지 않았으므로 입력(input) 또한 변하지 않습니다. 즉, effort는 출력(output) 측면에만 영향을 미칩니다. 이는 effort를 높이는 것은 오직 출력 비용(output cost)만을 높인다는 것을 의미합니다.
한편, sec는 매우 불규칙합니다 (3.1 → 1.2 → 2.9 → 1.1). 단 한 번의 실행 결과를 보고 "effort가 높을수록 느리다"라고 해석해서는 안 됩니다. 네트워크 지터(Network jitter)만으로도 그 차이를 압도할 수 있으며, AWS 문서에 따르면 bedrock-mantle 엔드포인트는 진행 중인 작업이 완료되고 처리량(throughput)이 확보될 때까지 요청을 잠시 대기열(queue)에 넣을 수 있습니다. 이는 설계된 방식입니다. 즉, 초기 처리량 제한을 높이기 위해 대기열을 사용하는 것이며, 결함이 아니라 단일 타이밍 측정의 의미를 더욱 퇴색시키는 요소입니다.
⚠️ reasoning 열 또한 단일 실행에서는 순서 없이 나타납니다. 다른 실행에서는 0, 0, 33, 28, 31, 40이 나왔는데, 이는 high가 medium보다 적은 값을 소비했음을 의미합니다. 상승 추세는 실재하지만, 단 하나의 샘플로는 노이즈를 제거할 수 없습니다. 이를 확인하려면 레벨당 몇 번의 실행을 평균 내야 합니다:
python -m src.gpt56.effort_sweep terra 3
effort sec in out reasoning accuracy answers
none 1.5 83 80 0 3/3 A, A, A
low 1.3 83 77 0 3/3 A, A, A
...
평균을 내면 단조 증가(monotonic)합니다: 0, 0, 22, 31, 33, 49. 이 문제는 어렵지 않습니다 — 18개 중 18개 모두 정답 — 따라서 여러분이 보고 있는 것은 정확도(accuracy)의 차이가 아니라 비용 기울기(cost gradient)입니다.
한 가지 반드시 알아두어야 할 점이 있습니다: 추론 토큰(reasoning tokens)은 출력 토큰(output tokens)으로 과금되며, 이는 max_output_tokens 예산을 소모합니다. 이 예산을 너무 낮게 설정하면 추론 과정이 예산을 모두 소모하여, 텍스트가 비어 있는 status="incomplete" 응답을 받게 될 수 있습니다. 예제에서는 이를 방지하기 위해 기본값을 32000으로 설정했습니다.
실질적인 조언: low에서 시작하세요. none은 추론 예산이 0이 되는데, 이는 추출(extraction)이나 포맷팅(formatting)에는 괜찮지만, 단 한 번의 추론 단계라도 필요한 작업은 low 이상으로 설정해야 합니다.
5단계: 프롬프트 캐싱(prompt caching)으로 비용 절감하기
동일한 긴 문서에 대해 반복적인 질문을 던지는 경우 — RAG(Retrieval-Augmented Generation) 및 문서 Q&A의 형태 — 캐싱이 효과를 발휘합니다.
python -m src.gpt56.prompt_cache
이 스크립트는 모비 딕(Moby-Dick) (1851년, 퍼블릭 도메인)의 도입부를 참조 문서로 사용하며, 동일한 접두사(prefix)에 대해 두 가지 서로 다른 질문을 던집니다:
Q1: 화자가 바다로 떠나는 이유를 두 문장으로 설명하세요.
Q2: 도입부의 분위기를 두 문장으로 묘사하세요.
하나는 사실을 묻고 다른 하나는 분위기를 묻지만, 둘 다 해당 문서의 범위 내에 있습니다. 이것이 바로 캐싱이 가장 큰 효과를 내는 형태입니다: 문서는 고정되어 있고, 질문이 변하는 경우 말입니다.
참조 문서: Moby-Dick의 처음 12000자 (퍼블릭 도메인)
[call 1 (cache write)] input=3002 cached=0 written=2980 hit_rate=0.0%
...
두 번째 호출은 **입력값의 99.4%에 대해 캐시 히트(cache hit)**를 기록했습니다. 캐시된 입력은 캐시되지 않은 요율의 **10%**로 과금되며 (쓰기 작업은 1.25배로 과금됨), 입력 TPM(Tokens Per Minute) 할당량에 포함되지 않습니다 — 이것이 바로 비용 절감이 발생하는 지점이며, 따라서 '한 번 쓰고 여러 번 읽는(write-once, read-many)' 방식이 유리합니다.
(첫 번째 실행 시 Project Gutenberg에서 전체 텍스트를 다운로드합니다. 몇 번의 IncompleteRead 재시도가 발생하는 것은 정상입니다.)
모두를 함정에 빠뜨리는 요소: 캐시된 접두사 (cached prefix)는 최소 1,024 토큰 이상이어야 합니다. 이보다 적으면 아무것도 캐시되지 않으며 에러도 발생하지 않습니다 — cached 값은 영원히 0으로 유지됩니다. 접두사가 단순히 너무 짧은 것뿐인데도 당신은 자신의 코드가 잘못되었다고 가정하게 될 것입니다.
잘못된 것처럼 보이지만 실제로는 그렇지 않은 한 가지가 더 있습니다: 방금 실행한 python -m src.gpt56.prompt_cache를 즉시 다시 실행하면, 이번에는 call 1에서도 히트(hit)가 보고됩니다:
[call 1 (cache write)] input=3002 cached=2980 written=0 hit_rate=99.3%
cache write라고 표시되어 있지만, 캐시율은 99.3%입니다. 이것은 정상입니다. 이전 실행에서 작성된 캐시가 여전히 유지 시간(최소 30분) 내에 있기 때문에, 이번 실행의 첫 번째 호출이 이를 읽어오는 것입니다. 해당 라벨은 스크립트 내에서 이것이 몇 번째 호출인지를 설명하는 것이지, 이 특정 호출이 캐시를 작성한다는 보장이 아닙니다.
6단계 (선택 사항): 함수 호출 (Function calling) 및 MCP
처음 다섯 단계는 모두 한 번 묻고 한 번 답하는 방식입니다. 이 단계는 모델이 외부 도구 (external tools)를 호출할 수 있게 해주며, 여기서부터 에이전트 (agents)가 시작됩니다. 에이전트를 구축하려는 것이 아니라면 이 단계는 건너뛰어도 됩니다.
리포지토리에는 두 가지 버전이 있습니다. 프로토콜은 동일하며, 도구의 출처만 다릅니다.
버전 1: 프로토콜을 명확하게 확인하기 위한 스텁 함수 (stub function)
python -m src.gpt56.tool_calling
Model: openai.gpt-5.6-terra @ us-east-1
-> model requested get_weather({'location': 'Seattle, US', 'unit': 'fahrenheit'}) -> returned {'location': 'Seattle, US', 'temperature': 18, 'condition': 'Partly cloudy'}
...
한 번의 전체 왕복(round trip)은 세 단계로 이루어집니다: tools=에 도구 정의를 전송합니다 → 모델이 도구 이름과 인자를 지정한 function_call로 응답합니다 → 로컬에서 이를 실행하고 그 결과를 call_id를 통해 해당 호출과 쌍을 이루는 function_call_output으로 다시 보냅니다. 도구를 실행하는 것은 항상 당신의 코드이며, 모델은 단지 도구를 호출할지 여부와 어떤 인자를 사용할지만 결정합니다.
버전 2: 실제 데이터를 반환하는 실제 MCP 서버
MCP (Model Context Protocol)는 AI 모델을 외부 도구 및 데이터 소스에 연결하는 개방형 프로토콜입니다. 이 예제에서는 AWS documentation MCP 서버를 사용합니다:
- 공개 문서에 대한 읽기 전용 액세스 - AWS 권한이 필요하지 않음
- uv/uvx 필요 (먼저 설치해야 함)
- 첫 실행 시 서버를 자동으로 다운로드함
python -m src.gpt56.mcp_tools
Starting MCP server: awslabs.aws-documentation-mcp-server ...
MCP offers 5 tools; bridging 2 to the model: ['read_documentation', 'search_documentation']
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기
