구조화된 출력
구조화된 출력(Structured Output)은 LLM이 지정된 스키마(주로 JSON 스키마)에 반드시 부합하는 응답만 생성하도록 강제하는 기능입니다. '파싱 가능한 JSON이기를 바라는' 대신, 추론 엔진 단에서 토큰 샘플링을 제한해 스키마 검증을 항상 통과시킵니다.
구조화된 출력(Structured Output)은 LLM이 지정된 스키마(주로 JSON 스키마)에 반드시 부합하는 응답만 생성하도록 강제하는 기능입니다. '파싱 가능한 JSON이기를 바라는' 대신, 추론 엔진 단에서 토큰 샘플링을 제한해 스키마 검증을 항상 통과시킵니다.
왜 중요한가
LLM의 자유 텍스트 출력은 프로그램에서 소비하기 어렵습니다. "JSON으로 반환해"라고 해도 가끔은 설명을 섞거나, 필드를 누락하거나, 타입을 할루시네이션합니다. 이런 실수는 파이프라인 하류 코드를 깨뜨리고 방어적 파싱을 강요합니다. 구조화된 출력은 이 문제를 디코딩 층에서 해결합니다 — 95%가 아닌 100% 유효한 JSON을 보장합니다. OpenAI·Anthropic·Google과 vLLM·Outlines 같은 오픈소스 엔진이 네이티브로 지원하면서, 안정적인 LLM 파이프라인의 기본값이 됐습니다.
작동 원리
제약 디코딩(Constrained Decoding): 생성의 각 단계에서, 스키마를 위반할 토큰의 확률을 0으로 마스킹해 선택될 수 없게 만듭니다.
스키마 명세: 필수 필드·타입·enum을 JSON 스키마(또는 Pydantic·Zod·TypeScript 타입)로 전달합니다.
검증 없는 파싱: 호출자는 잘못된 출력에 대한 try/catch 없이 JSON.parse 할 수 있습니다.
JSON 모드 vs 구조화된 출력
| 항목 | JSON 모드 | 구조화된 출력 |
|---|---|---|
| 보장 수준 | 유효한 JSON 문법 | 스키마에 맞는 유효 JSON |
| 스키마 강제 | 없음 | 완전 |
| 필드 존재 | 보장 안 됨 | 보장됨 |
| 할루시네이션 필드 | 가능 | 불가능 |
| 지연 오버헤드 | 거의 0 | 작음(문법 컴파일) |
JSON 모드는 '파싱이 된다'만 보장합니다. 구조화된 출력은 '파싱이 되고, 원하는 정확한 모양'까지 보장합니다. 프로덕션에서는 가능하면 항상 구조화된 출력을 씁니다.
언제 쓰는가
텍스트에서 데이터 추출: 비정형 입력에서 이름·날짜·주소 등을 뽑아낼 때.
도구를 호출하는 에이전트: 도구 호출 인자는 도구의 파라미터 스키마와 정확히 일치해야 합니다.
enum 분류: 고정된 라벨 집합 중 하나를 선택하도록 강제합니다.
다필드 응답 생성: 제목·요약·태그·점수를 한 번에 받습니다.
현재 모델 출력을 정규식으로 파싱하고 있는 모든 곳: 그건 터지기를 기다리는 버그입니다.
트레이드오프
약간의 지연 오버헤드: 디코더가 문법 상태를 추적해야 합니다. 대부분 무시할 수준입니다.
창의성 감소: 과도한 스키마 제약은 생성이 기계적이 될 수 있습니다. 창작 글쓰기는 자유 형식이 낫습니다.
스키마 설계가 중요: 20개 필드를 전부 required로 두면 모델이 값을 지어냅니다. 정말 필수인 것만 필수로 둡니다.
모든 모델이 지원하는 것은 아님: 구형·일부 오픈소스 모델은 네이티브 지원이 없습니다. Outlines 같은 라이브러리로 보강할 수 있습니다.
예시
스키마:
{
"type": "object",
"properties": {
"title": { "type": "string" },
"tags": { "type": "array", "items": { "type": "string" } },
"sentiment": { "enum": ["positive", "negative", "neutral"] }
},
"required": ["title", "tags", "sentiment"]
}
보장된 출력:
{ "title": "Launch recap", "tags": ["product", "Q2"], "sentiment": "positive" }
파싱 에러 없음. 누락 필드 없음. enum 밖의 값 없음.
Sources:
관련 인블로그 게시물
inblog에서 활용하기
inblog의 AI 기반 메타데이터 자동 생성(제목·메타 설명·태그·카테고리)은 내부적으로 구조화된 출력을 사용해, 어떤 블로그 포스트에서도 필드가 누락되거나 타입이 깨지지 않습니다. 덕분에 사용자가 일일이 메타 필드를 채우지 않아도 SEO에 최적화된 메타가 항상 안정적으로 생성됩니다.