유효한 Draft-07 JSON Schema가 LLM API에서 HTTP 400으로 실패하는 이유
제약 디코딩 엔진은 생성을 시작하기 전에 JSON Schema를 문맥 자유 문법이나 유한 상태 토큰 마스크로 컴파일합니다. 문법 컴파일을 빠르고 유한하게 유지하기 위해 OpenAI, Anthropic, Google는 각각 표준 Ajv, Zod, Pydantic이 기본 출력하는 것보다 더 엄격한 JSON Schema 하위 집합을 강제합니다.
예를 들어 OpenAI의 strict: true 모드는 additionalProperties: false가 빠지거나 required 배열에서 누락된 속성이 있는 객체를 거부하므로, 선택적 필드도 required에 넣되 ["string", "null"] 같은 nullable 유니온으로 표현해야 합니다. 반대로 Google Gemini의 generationConfig.responseSchema는 additionalProperties 키워드 자체를 아예 거부합니다.
| 스키마 규칙 | OpenAI Strict (strict: true) | Anthropic 엄격 도구 / JSON | Gemini responseSchema |
|---|---|---|---|
| 루트 type이 "object"여야 함 | 필수 | 필수 | 권장 |
| 모든 객체에 "additionalProperties": false | 필수 (누락 시 400) | 필수 (누락 시 400) | 거부됨 (포함 시 400) |
| 모든 속성을 "required"에 포함 | 필수 (선택 항목은 [type, "null"] 사용) | 선택 키 생략 허용 | 선택 키 생략 허용 |
| 정규식 pattern / minLength / format | strict 문법에서 미지원 | 제한적; description 및 앱 검증 권장 | 대부분의 문자열 format 미지원 |