프로덕션 환경에서 GPT-5.6으로 전환하기: 모델 교체가 아닌 스키마, 캐시, 그리고 하네스(Harness)의 문제
요약
GPT-5.6 Sol로 모델을 전환할 때 발생하는 스키마, 캐시, 평가 하네스(Harness)의 기술적 문제를 다룹니다. 모델 교체 시 기존 모델의 동작 방식에 맞춰진 평가 체계와 도구 스키마가 새로운 모델의 성능을 왜곡할 수 있음을 경고합니다.
핵심 포인트
- 모델 교체 시 기존 모델의 동작 방식에 맞춘 평가 하네스 수정 필수
- 새 모델의 병렬 호출 및 배치 처리 특성을 반영한 평가 환경 구축 필요
- 제공업체별로 상이한 도구 스키마(Tool Schema) 대응 및 검증 필요
- 단순 통과율(Pass rate)보다 트레이스(Traces) 분석을 통한 실패 원인 분류 중요
Ploy는 AI 에이전트를 사용하여 프로덕션 마케팅 웹사이트를 구축합니다. 그들은 몇 달 동안 모든 프론티어(Frontier) 모델의 릴리스를 벤치마킹해 왔습니다. GPT-5.6 Sol이 나오기 전까지는 Claude Opus를 능가하는 것이 없었습니다. GPT-5.6 Sol은 2.2배 더 빠르고, 27% 더 저렴하며, 더 나은 시각적 점수를 보여주었습니다.
그 후 그들은 실제로 이를 배포하려고 시도했습니다. 바로 그 지점에서 흥미로운 일이 발생했습니다.
"우리는 Vercel의 AI SDK를 사용하지만, Claude Opus 4.8에서 GPT-5.6 Sol로 전환하는 과정에서도 여전히 스택 전반에 걸쳐 제공업체(Provider)별 가정이 드러났습니다."
수치가 보여주는 것
| Claude Opus 4.8 | GPT-5.6 Sol | |
|---|---|---|
| 비용 (빌드당) | $3.06 | $2.22 |
| ... |
GPT-5.6은 또한 그 결과에 도달하기 위해 훨씬 적은 양의 코드를 작성했습니다. Opus의 17,957자에 비해 GPT-5.6은 2,508자의 CSS를 작성했습니다. 더 적은 토큰(Token), 더 적은 출력, 더 나은 결과입니다.
단 하나의 숫자라도 신뢰하기 전에 평가 하네스(Eval Harness)를 수정하세요
이 모든 것이 사용 가능해지기 전에, Ploy는 평가 스위트(Evaluation suite)를 수정해야 했습니다.
도구 호출(Tool-call) 예산은 Opus의 순차적(Sequential) 스타일에 맞춰 설정되어 있었습니다. GPT-5.6은 병렬 호출(Parallel calls)을 수행하며, 올바르게 해결하고 있는 케이스에서도 해당 예산을 초과했습니다. 평가 실행기(Eval executor)는 배치 파일 읽기(Batched file reads)를 지원하지 않았는데, 이는 Opus는 거의 사용하지 않았지만 GPT-5.6은 끊임없이 사용하는 기능이었습니다. 한 데이터셋에는 명시적인 minScore 임계값이 누락되어 기본값이 0.98이 아닌 1.0으로 조용히 설정되어 있었고, 이로 인해 GPT-5.6은 0.98점을 받은 히어로 이미지(Hero image)에서 "실패" 판정을 받았습니다.
첫 번째 실행에서 발생한 원시 실패(Raw failures)의 약 3분의 1은 모델의 동작이 아닌 하네스(Harness)의 가정에서 비롯되었습니다. 이러한 실패들은 GPT-5.6을 실제보다 더 나쁘게 보이게 만들 정도로 불균형하게 분포되어 있었습니다.
교훈: 기존 모델(Incumbent)에 맞서 도전 모델(Challenger)을 평가하고 있다면, 통과율(Pass rate)을 신뢰하기 전에 트레이스(Traces)를 분류(Triage)하십시오. 새 모델이 기존 모델처럼 행동하는 것에 보상을 주는 평가는 역량을 측정하는 것이 아니라 익숙함을 측정하는 것입니다.
도구 스키마(Tool schemas)는 제공업체별로 재고가 필요합니다
Ploy의 code 도구는 25개의 파라미터(Parameter)를 가지고 있습니다. Claude는 실제로 사용하는 2~3개만 보냅니다. GPT-5.6은 25개 모두를 보내며, 사용하지 않는 슬롯을 그럴듯해 보이는 가공의 값(offset: 0, timeout: 120000, siteId: "00000000-...")으로 채웁니다.
그것은 단순한 외관상의 불편함처럼 들릴 수도 있습니다. 하지만 그렇지 않았습니다. 도구 구현(tool implementation)이 가공된 값과 실제 값을 구분할 수 없었기 때문에, 파일 읽기의 52~64%가 빈 값을 반환했습니다. 그럼에도 도구는 여전히 success: true를 반환했습니다. 모델은 성공으로 인지하고 빈 결과를 읽은 뒤, 이를 보완하기 위해 더 많은 호출을 시도하며 성능이 저하되었습니다.
프롬프팅(Prompting)으로도 해결되지 않았습니다. strict 모드 역시 해결책이 되지 않았습니다(또한 이를 사용하려면 스키마 검증(schema validation)을 제거해야 합니다). 실제 작동하는 해결책은 프로바이더 경계(provider boundary)에서 선택적 파라미터(optional parameters)를 anyOf: [T, null]로 다시 쓰는 스키마 변환(schema transform)이었습니다. GPT-5.6은 사용되지 않는 파라미터에 대해 명시적인 null을 보내는데, 이를 도구가 실행되기 전에 제거했습니다. 그 결과 빈 읽기(empty reads) 비율이 52%에서 0%로 떨어졌습니다.
프롬프트 캐싱(Prompt caching)은 다른 노브(knob)가 아니라 다른 API입니다
캐싱을 수정하기 전, GPT-5.6은 Opus보다 약 50% 더 비싼 것처럼 보였습니다. 하지만 캐싱을 수정한 후에는 더 저렴해졌습니다. 비용 차이의 전체 원인은 캐시 설정 오류(cache misconfiguration)였습니다.
핵심적인 차이점은 다음과 같습니다: Anthropic은 조직(organisation) 수준에서 캐싱을 수행하며, 어떤 대화든 공유된 접두사(prefix) 항목에 접근할 수 있습니다. 반면 GPT-5.6은 암시적인 부분 접두사 매칭(implicit partial-prefix matching) 기능을 제거했습니다. 명시적인 prompt_cache_key 설정 없이는, Ploy의 29K 정적 접두사를 공유하는 새로운 대화라 할지라도 캐시된 항목이 0%였으며 매번 전체 미캐시(uncached) 요율을 지불해야 했습니다. 또한 GPT-5.6은 캐시되지 않은 모든 프롬프트에 대해 1.25배의 추가 요금을 부과합니다.
Ploy는 결국 워크스페이스별 캐시 키(per-workspace cache keys)와 계층적 중단점 구조(layered breakpoint structure)를 도입했습니다. 즉, 정적 도구/프롬프트를 하나의 항목으로, 워크스페이스 컨텍스트를 두 번째 항목으로, 세션별 컨텍스트를 세 번째 항목으로 분리했습니다. 첫 번째 호출 적중률(First-call hit rates)은 약 0%에서 83.7%로 상승했습니다. 총 미캐시 입력 토큰(total uncached input tokens)은 28% 감소했습니다.
세 번째 해결책: 추론 재생(reasoning replay)
한 가지 주의사항이 더 있습니다. GPT-5.6의 Responses API는 기본적으로 이전 턴의 추론(reasoning)을 서버 측 항목 참조(server-side item references)로 재생합니다. 이로 인해 프로덕션 대화에서 간헐적으로 Item 'rs_...' not found 오류가 발생하며 실패했습니다. store: false로 설정하면 SDK가 암호화된 추론 콘텐츠를 요청하고, 서버 포인터 대신 독립적인 블롭(self-contained blobs)을 재생합니다. 간헐적인 컨텍스트 오류가 발생한다면 확인해 볼 가치가 있습니다.
해야 할 일
- 현재 모델과 GPT-5.6을 비교 평가 중인가요? 먼저 평가 하네스(eval harness)를 감사하십시오. 도구 예산(tool budgets), 암묵적 임계값(implicit thresholds), Opus 전용 설정 등을 확인해야 합니다. 집계된 통과율(aggregate pass rates)보다는 추적(traces)을 신뢰하십시오.
- 복잡한 도구 스키마(tool schemas)를 사용 중인가요? 구현 방식이 완전히 채워진 파라미터(fully-filled params)를 처리할 수 있는지 확인하십시오. 프롬프팅(prompting)을 사용하는 것보다 Nullable 스키마 변환(nullable schema transform)을 사용하는 것이 더 깔끔한 해결책입니다.
- 프롬프트 캐싱(prompt caching)을 실행 중인가요? API 레벨에서 실제 캐시 히트율(cache hit rate)을 테스트하십시오. 제공업체마다 캐싱 방식이 다릅니다. Anthropic에서 작동하는 설정이 OpenAI에서는 0%를 기록할 수도 있습니다.
- 추론(reasoning) 기능과 함께 Responses API를 사용 중인가요? 긴 대화에서 서버 상태 포인터 오류(server-state pointer failures)를 방지하려면
store: false로 설정하십시오.
모델 벤치마크는 실제입니다. 마이그레이션 작업 또한 실제입니다. 두 가지 모두를 계획하십시오.
출처: Ploy — Migrating a production AI agent to GPT-5.6
✏️ KewBot (AI)로 초안 작성, Drew가 편집 및 승인.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기