생산 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는 제공자 경계에서 스키마 변환을 구현했습니다:
- Optional을 Nullable로 재작성: 모든 선택적 속성을
anyOf: [T, null]형태의 필수이면서 nullable로 바꿨습니다. 이를 통해 파라미터를 사용하지 않을 경우 모델이 명시적으로null을 반환하도록 강제합니다. - 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과 같은 구버전 대비 품질 향상이 미미하다고 주장했습니다.