적응형 사고(adaptive thinking)를 끈 Opus 4.6이 켠 Opus 4.7보다 성능이 좋음
Opus 4.6 without adaptive thinking outperforms Opus 4.7 with adaptive thinking
핵심 요약
Opus 4.7의 적응형 사고는 단순한 질문을 오판해 잘못된 답을 내놓는 경우가 많아, 일관된 추론이 필요한 작업에는 Opus 4.6을 사용하는 것이 더 낫습니다.
- 적응형 사고의 한계 — Opus 4.7은 질문의 복잡도를 서버 측에서 판단하여 사고 과정을 생략하므로, 트릭 질문에 취약함
- 강제 사고의 부재 — 시스템 프롬프트나 사용자 메시지로 사고를 강제하려 해도 서버 측 로직을 우회할 수 없음
- Opus 4.6의 우위 — 환경 변수를 통해 사고 기능을 강제로 활성화할 수 있어 훨씬 예측 가능한 성능을 보여줌
- 실무적 권장 사항 — 일관된 추론이 필요한 작업에는 Opus 4.6을 사용하는 것이 비용과 성능 면에서 더 효율적임
CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1을 적용한 Opus 4.6(medium effort)은 Opus 4.7(xhigh effort)이 틀리는 질문들을 제대로 맞힘. 여기서 말하는 실패 사례는 겉보기엔 쉬워 보이지만 논리적 추론이 필요한 함정 질문들임(예: "세차하려고 하는데 50m 앞에 세차장이 있어. 걸어갈까, 차 타고 갈까?"). Opus 4.7은 이런 질문에서 아예 생각(thinking) 과정을 건너뛰고 자신 있게 틀린 답을 내뱉음.
우리가 시도한 것들
1. 적응형 사고(adaptive thinking) 비활성화를 위한 바이너리 패치
Claude Code는 CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING 환경 변수를 확인하긴 하는데, 모델 이름을 체크하는 로직이 걸려 있음. 이 환경 변수는 opus-4-6이나 sonnet-4-6이 포함된 모델에서만 먹힘:
// Decompiled from v2.1.112
let z_ = VH(process.env.CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING)
&& (Y.includes("opus-4-6") || Y.includes("sonnet-4-6"));
if (DE_(T.model) && !z_)
QH = {type: "adaptive", display: bH}; // forced for opus-4-7
else {
let J_ = kxq(T.model); // 127999 for opus-4-7
QH = {budget_tokens: J_, type: "enabled", display: bH};
}
그래서 patches/0003_disable_adaptive_thinking_all_models.py를 짜서 모델 체크 로직을 날려버리고 모든 모델에 환경 변수가 적용되게 만들었음. 패치는 깔끔하게 들어갔고 Claude Code는 API로 {type: "enabled", budget_tokens: 127999}를 보냄.
결과: API는 요청을 받아줬음(문서에는 거부될 거라고 적혀있지만 400 에러 안 뜸). 근데 응답에 생각 블록이 아예 없음. 서버가 Opus 4.7에 대해서는 type:enabled를 그냥 무시함. 에러도 안 내고 그냥 생각을 안 해버림. 이건 적응형 사고보다 더 최악임. 모델이 아예 생각을 안 하니까. 결국 패치는 롤백함.
2. API 트래픽 확인을 위한 MITM 프록시
mitm-proxy.py를 만들어서 localhost:9999에 리버스 프록시를 띄우고, 요청/응답 바디를 로깅하면서 api.anthropic.com으로 쏴주게 함. Claude Code는 ANTHROPIC_BASE_URL=http://localhost:9999로 연결함.
개발 중에 문제 두 가지 발생:
urllib.request가 SSE 스트림을 버퍼링해서 실시간 이벤트 로깅이 안 됨.http.client로 바꿈.- Opus 4.7 응답이 gzip/brotli로 압축돼서 로그에 외계어만 찍힘. 업스트림에
Accept-Encoding: identity를 보내서 평문으로 받게 수정함.

