생산 AI 에이전트를 GPT-5.6 Sol 로 마이그레이션

생산 AI 에이전트를 GPT-5.6 Sol 로 마이그레이션

Ploy는 마케팅 웹사이트를 계획·구축·편집하는 생산 AI 에이전트를 Claude Opus 4.8에서 GPT-5.6 Sol 로 마이그레이션했습니다. 전환 결과 빌드에 소요되는 실제 시간이 2.2배 감소하고 운영 비용이 27% 감소했으며, 시각적 품질 점수는 유지되거나 향상되었습니다.

모델 동등성을 위한 평가 하니스 최적화

평가 하니스는 종종 현재 모델에 맞게 조용히 튜닝되어 있어, 챌린저 모델을 테스트할 때 부정확한 성능 데이터를 초래합니다. Ploy는 GPT-5.6의 초기 실패 중 약 3분의 1이 모델 결함이 아니라 하니스 가정 때문이라는 것을 발견했습니다.

주요 하니스 실패

  • 툴 호출 예산: 기존 하니스는 Claude Opus의 순차적 툴 호출 방식을 위해 설계되었습니다. GPT-5.6은 병렬 툴 호출을 사용하므로, 모델이 문제를 올바르게 해결하더라도 예산이 소진되었습니다.
  • 실행기 지원: 평가 실행기는 배치 파일 읽기를 지원하지 않았습니다. 이는 GPT-5.6이 자주 사용하는 기능이지만 Opus에서는 거의 사용되지 않았습니다.
  • 암시적 임계값: 일부 데이터셋에는 명시적인 minScore 임계값이 없었으며 기본값이 1.0이었습니다. 이로 인해 GPT-5.6은 높은 품질 출력(예: 점수 0.98)을 "실패"로 처리했으며, 보다 유연한 임계값에서는 통과했을 것입니다.

성능 비교: Claude Opus 4.8 vs. GPT-5.6

완료된 빌드당 평균 Claude Opus 4.8 (n=11) GPT-5.6 (n=10)
비용 $3.06 $2.22
실제 시간 8m 00s 3m 42s
입력 토큰 2.60M 1.70M
출력 토큰 33.0K 17.1K
시각적 점수 0.936 0.970

스키마 변환을 통한 툴 호출 손상 해결

GPT-5.6은 툴 호출 시 모든 선택적 매개변수를 (예: offset: 0) 실제 값으로 채우는 특수한 동작을 보입니다. 이는 의도된 인수와 구분이 어려워 툴 실행에서 큰 실패를 초래합니다.

"가상 값" 문제

Ploy의 code 툴은 25개의 매개변수를 가지고 있는데, GPT-5.6은 호출의 100%에서 모든 25개의 키를 전송한 반면 Claude Opus 4.8은 99.9%의 경우 사용되지 않은 매개변수를 생략했습니다. 이로 인해 파일 읽기의 52%~64%가 offset: 0을 실제 인수로 보내면서 빈 결과를 반환했습니다.

해결책: Required-but-Nullable 스키마

프롬프트와 OpenAI의 strict 모드만으로는 이 동작을 해결할 수 없었습니다. Ploy는 제공자 경계에서 스키마 변환을 구현했습니다:

  1. Optional을 Nullable로 재작성: 모든 선택적 속성을 anyOf: [T, null] 형태의 필수이면서 nullable로 바꿨습니다. 이를 통해 파라미터를 사용하지 않을 경우 모델이 명시적으로 null을 반환하도록 강제합니다.
  2. Null 제거: 툴 호출 시점에 null 값을 검증 전에 제거하여, 툴 구현이 항상 동일한 입력을 받도록 합니다.

이 변경으로 빈 파일 읽기가 0%로 감소했고, 작업당 필요한 툴 호출 수가 약 30% 감소했습니다.

GPT-5.6용 프롬프트 캐싱 재구성

GPT-5.6의 프롬프트 캐싱은 Anthropic의 조직 범위 캐싱과 근본적으로 다릅니다. prompt_cache_key를 올바르게 구성하지 않으면 캐시 적중률이 0%가 되고 비용이 크게 증가합니다.

아키텍처 차이

  • Anthropic (Claude): 캐싱은 조직 범위이며, 정적 프리픽스(예: 툴 스키마 29K 토큰)가 한 번 캐시되어 모든 대화와 워크스페이스에서 공유됩니다.
  • OpenAI (GPT-5.6): 캐싱은 명시적인 prompt_cache_breakpoint 마커와 prompt_cache_key가 필요합니다. 각 키는 분당 약 15개의 요청(RPM)을 처리할 수 있는 캐시 노드에 매핑됩니다. 트래픽이 이를 초과하면 요청이 차가운 노드로 넘어가 캐시 미스가 발생합니다.

구현 전략: 워크스페이스 범위 키

적중률과 처리량을 균형 있게 유지하기 위해 Ploy는 워크스페이스 범위 키(ws:{workspaceId})를 구현했습니다:

  • Entry A (정적 프리픽스): 워크스페이스 내 모든 세션에서 공유되어 새 세션의 첫 호출을 저렴하게 만듭니다.
  • Entry B (워크스페이스 컨텍스트): 동일 워크스페이스 내 대화에서 공유되며, 워크스페이스 메모리가 변경될 때 업데이트됩니다.
  • Entry C (세션 체인): 추가 전용 대화 턴을 위한 전체 프롬프트 체인을 암시적으로 포함합니다.

이 재구성 후 첫 호출 캐시 적중률이 0%에서 83.7%로 상승했으며, 전체 비캐시 입력 토큰이 28% 감소했습니다.

추론 재생 실패 해결

GPT-5.6의 Responses API는 기본적으로 이전 턴의 추론을 서버 측 아이템 참조로 재생합니다. 이로 인해 대화 중간에 간헐적으로 Item 'rs_...' not found 오류가 발생했습니다. Ploy는 store: false를 설정하여 SDK가 암호화된 추론 내용을 요청하고, 이를 서버 상태에 대한 포인터가 아닌 자체 포함 블롭으로 재생하도록 강제함으로써 문제를 해결했습니다.

커뮤니티 인사이트 및 반론

업계 실무자들은 모델이 생산 환경에서 쉽게 교체될 수 없다고 지적했습니다. 한 개발자는 다음과 같이 말했습니다:

전체 하니스, 프롬프트, 모델을 하나의 시스템으로 생각하세요. 최적 성능을 원한다면 모듈식으로 교체할 수 있는 부품이 아니라는 점을 기억해야 합니다.

다른 비판은 GPT-5.6의 설계 품질에 초점을 맞추었으며, 일부 사용자는 Claude Opus의 브랜드 일관성을 선호하고, 또 다른 사용자들은 GPT-5.6이 이전 모델을 재포장한 것에 불과하며 Opus 4.6과 같은 구버전 대비 품질 향상이 미미하다고 주장했습니다.

Sources