
LLM 구조화된 출력은 언어 모델의 응답이 사전 정의된 스키마를 준수하도록 보장하는 메커니즘입니다. 단순히 유효한 JSON이 아니라 정확히 지정한 필드, 타입, 제약 조건을 갖춘 스키마 검증 JSON을 얻습니다. 이제 모든 주요 제공업체가 기본적으로 지원하며, 이는 프로덕션 LLM 애플리케이션 구축 방식을 완전히 바꿨습니다.
빠른 요약: 구조화된 출력 한눈에 보기
시간이 부족하다면 2026년의 현황은 다음과 같습니다.
이제 각 부분을 자세히 살펴보겠습니다.
LLM 구조화된 출력이란?
구조화된 출력은 LLM이 유효한 JSON을 반환하길 바라는 것과 그것을 보장하는 것의 차이입니다. 구조화된 출력을 활성화하면 모델은 스키마를 위반하는 토큰을 생성할 수 없습니다. JSON 스키마(또는 Pydantic 모델, Zod 스키마)를 정의하고 API에 전달하면 매번 일치하는 응답을 받습니다.
왜 이것이 중요한가요? 구조화된 출력이 없기 전에 개발자들은 취약한 정규표현식 파서를 작성했고, 모든 LLM 호출을 try/catch JSON.parse 블록으로 감싸고, 여전히 "거의 맞는" 응답들을 다루었습니다. 유효한 JSON이지만 필드가 누락되었거나 타입이 잘못되었던 것들 말입니다. 이런 종류의 버그는 완전히 사라졌습니다.
구조 적용에는 세 가지 수준이 있으며, 명확한 진화를 나타냅니다:
- 프롬프트 엔지니어링 - "이 필드들이 포함된 JSON을 반환해주세요." 신뢰할 수 없습니다. 모델은 80-90% 정도만 준수할 수 있습니다.
- JSON 모드 - 구문상 유효한 JSON은 보장하지만 스키마는 적용하지 않습니다.
{"foo": "bar"}를 받을 수 있습니다. 반면{"name": string, "age": number}를 기대했다면 말입니다. - 엄격 모드 / 제약된 디코딩 - 100% 스키마 준수를 보장합니다. 모델은 문자 그대로 유효하지 않은 토큰을 출력할 수 없습니다. 이것이 2026년 "구조화된 출력"이 의미하는 바입니다.
2026년 초 현재 OpenAI, Anthropic, Google Gemini 모두 기본 구조화된 출력을 지원합니다. 생태계가 수렴했습니다.
결론: 프로덕션에서 정규표현식이나 JSON.parse로 LLM 응답을 파싱하고 있다면 어려운 방식으로 하고 있는 것입니다. 기본 구조화된 출력은 이 전체 실패 모드를 제거합니다.
JSON 모드 vs 엄격 모드: 실제로 무엇이 바뀌었나?
이 구분은 이름이 비슷해 보여서 많은 개발자를 혼동시킵니다. 하지만 다릅니다.
타임라인: OpenAI는 2023년 말 JSON 모드를 도입했습니다. 이것은 진전이었지만 개발자들은 빠르게 "유효한 JSON"만으로는 부족하고 스키마 검증 JSON이 필요하다는 것을 깨달았습니다. 2024년 8월 OpenAI는 제약된 디코딩을 사용하여 스키마 준수를 보장하는 엄격 모드를 갖춘 구조화된 출력을 출시했습니다. 2025-2026년까지 모든 주요 제공업체가 동일한 접근 방식을 채택했습니다.
JSON 모드는 여전히 좁은 사용 사례가 있습니다: 응답의 형태를 미리 알 수 없고 구조화되지 않은 탐색을 위해 단순히 유효한 JSON이 필요할 때입니다. 하지만 프로덕션에서는 드뭅니다.
결론: 프로덕션의 모든 것에 엄격 모드를 사용하세요. JSON 모드는 스키마 바운드 사용 사례에서 사실상 더 이상 사용되지 않습니다. 스키마가 있다면(그리고 있어야 한다면), type: "json_schema"와 strict: true를 사용하세요.
제약된 디코딩은 실제로 어떻게 작동하나?
100% 스키마 준수를 가능하게 하는 메커니즘입니다. 99.9%가 아니라 문자 그대로 100%입니다.
JSON 스키마를 엄격 모드 활성화 상태로 제공업체에 보내면 스키마는 유한 상태 머신(FSM)으로 컴파일됩니다. 이 FSM은 스키마를 통과하는 모든 유효한 경로를 나타냅니다. 각 토큰 생성 단계에서 추론 엔진은 어떤 토큰이 유효한 경로를 유지할 것인지, 어떤 토큰이 그렇지 않을 것인지 확인합니다. 유효하지 않은 토큰의 로짓은 샘플링 전에 음의 무한대로 설정되어 선택될 확률이 0입니다.
자동완성 기능의 강화 버전이라고 생각하면 됩니다. 모델이 {"rating":을 출력했고 스키마에서 rating이 정수여야 한다고 했다면, 다음에 허용되는 토큰은 숫자 토큰뿐입니다. 따옴표, 문자, 괄호 모두 마스킹됩니다. 모델은 "five"를 출력할 수 없습니다. 비록 그것을 "원한다" 해도요.
이것은 XGrammar(vLLM, SGLang, 대부분의 로컬 추론 서버 뒤의 엔진)와 Outlines(제약된 생성을 위한 오픈소스 Python 라이브러리)에서 사용되는 동일한 핵심 메커니즘입니다. API 제공업체들은 단순히 추론 인프라에 이를 내장했을 뿐입니다.
알아야 할 한 가지 트레이드오프: 새 스키마가 있는 첫 번째 요청은 FSM이 구축되는 동안 컴파일 지연 (일반적으로 50-200ms)이 발생합니다. 동일한 스키마로의 후속 요청은 캐시된 FSM을 사용하고 거의 제로 오버헤드를 추가합니다. 또한 미묘한 품질 고려사항이 있습니다. 토큰 어휘를 제약하면 창의적이거나 자유형 필드에서 출력 품질이 때때로 감소할 수 있으므로 스키마를 진정한 구조화된 데이터에만 집중하세요.
결론: 제약된 디코딩은 "보통 작동한다"와 "항상 작동한다"를 구분하는 것입니다. 이것이 구조화된 출력을 프로덕션 준비 상태로 만드는 엔지니어링입니다.
다중 제공업체 구현: OpenAI, Anthropic, Gemini
다른 가이드가 보여주지 않는 것이 있습니다: 세 주요 제공업체 모두에서 구현된 동일한 추출 작업입니다. 구조화되지 않은 텍스트에서 구조화된 제품 리뷰를 추출하겠습니다.
모든 제공업체에서 공유되는 Pydantic 스키마:
OpenAI 구현
OpenAI의 구현이 가장 성숙합니다. parse() 메서드는 Pydantic 모델을 직접 수락하고 타입이 지정된 객체를 반환합니다. 한 가지 제약: OpenAI의 엄격 모드는 JSON 스키마의 부분집합을 지원합니다. $ref 없음, 제한된 anyOf, 그리고 모든 필드는 additionalProperties: false로 필수여야 합니다.
Anthropic 구현
Anthropic의 기본 구조화된 출력은 output_config.format과 JSON 스키마를 사용합니다. 2026년 초 GA에 도달했습니다. Anthropic은 또한 "가짜" 도구를 정의하고 tool_use를 통해 추출하는 구형 패턴을 지원합니다. 이것은 여전히 작동하지만 순수 추출의 경우 기본 구조화된 출력이 더 깔끔합니다.
Gemini 구현
Gemini는 Python SDK의 response_schema를 통해 Pydantic 모델을 직접 지원합니다. 고유한 특징: Gemini는 스키마의 propertyOrdering을 존중하므로 필드 출력 순서를 제어할 수 있습니다(추론-우선 패턴에 유용함).
제공업체 비교
결론: OpenAI는 parse() 메서드를 통해 가장 세련된 개발자 경험을 갖춥니다. Anthropic은 가장 유능한 기반 모델을 제공합니다. Gemini의 속성 순서 지정은 고유하게 유용합니다. 셋 다 일을 처리합니다. 기존 제공업체 관계에 따라 선택하세요.
Python 개발자를 위한 Pydantic 패턴
Pydantic은 Python에서 구조화된 출력 스키마를 정의하기 위한 사실상 표준입니다. 중요한 패턴들입니다.
설명이 있는 기본 스키마
이러한 설명 문자열들은 단순한 문서화용이 아니라 모델로 전송되는 JSON 스키마의 일부가 되어 모델이 생성하는 내용에 직접 영향을 미칩니다. 스키마 내의 프롬프트 엔지니어링이라고 생각하면 됩니다.
중첩 모델
중첩을 최대 2-3 수준으로 유지하세요. 깊게 중첩된 스키마는 오류율을 증가시키고 스키마 컴파일을 느리게 합니다.
추론-우선 패턴
이것이 가장 영향력 있는 스키마 설계 패턴입니다. 응답 필드 앞에 추론 필드를 놓으세요:
LLM은 왼쪽에서 오른쪽으로 토큰을 생성합니다. category가 먼저 오면 모델이 카테고리를 선택한 다음 이를 정당화합니다. reasoning이 먼저 오면 모델은 문제를 풀어가고 카테고리에 커밋합니다. 스키마에 구워진 chain-of-thought입니다.
JSON 스키마 내보내기
결론: Pydantic + 설명이 있는 필드 + 추론-우선 순서는 Python 구조화된 출력 3대 조합입니다. 이 세 가지 패턴을 마스터하면 90% 사용 사례를 처리할 것입니다.
TypeScript 개발자를 위한 Zod 패턴
Zod는 Pydantic의 TypeScript 동등물이며 구조화된 출력 워크플로우에서 마찬가지로 중앙입니다.
설명이 있는 기본 스키마
Pydantic의 Field(description=...)와 마찬가지로 Zod의 .describe()는 JSON 스키마의 일부가 되어 모델의 출력을 안내합니다.
OpenAI Node SDK와의 통합
Vercel AI SDK와의 통합
Vercel AI SDK는 generateObject()를 통해 Zod를 기본적으로 사용하며 가장 깔끔한 TypeScript 통합을 제공합니다. OpenAI, Anthropic, Gemini 및 기타 제공업체와 통합 API를 통해 작동합니다.
JSON 스키마 변환
...