“형식은 완벽한데 내용은 틀렸다”—이게 가능한 일일까요? AI에게 구조화된 형식으로 답변을 요구하면 JSON Schema에 딱 맞는 예쁜 출력을 받을 수 있습니다. 하지만 그 안에 담긴 내용의 정확성은 누가 보장할까요?

Boundary ML의 CTO Sam Lijin이 작성한 글에서, OpenAI의 Structured Outputs API나 Anthropic의 tool use 같은 구조화된 출력 기능이 실제로는 AI의 응답 품질을 떨어뜨릴 수 있다는 경고를 담고 있습니다. 형식적 완성도와 내용적 정확성 사이의 trade-off, 그리고 프로덕션 환경에서 이것이 왜 위험한지를 실제 사례와 함께 설명합니다.
출처: Structured Outputs Create False Confidence – Boundary ML Blog
완벽한 형식, 틀린 답변
저자는 간단한 실험으로 문제를 보여줍니다. 영수증에서 바나나 0.46개(0.46 lb)를 추출하는 작업입니다. OpenAI의 최신 모델 GPT-5.2에 Structured Outputs API를 사용하면 이렇게 답합니다:
{
"items": [
{
"name": "Bananas",
"quantity": 1
}
]
}형식은 완벽하지만 수량이 틀렸습니다. 같은 모델에 자유형식 출력을 허용하면 정확하게 0.46을 반환하죠. 더 극단적인 예시로 코끼리 사진을 주면 어떻게 될까요? 구조화된 출력을 강제하면 AI는 “이건 영수증이 아니에요”라고 말할 기회를 잃고, 무의미한 데이터로 JSON 필드를 채워 반환합니다.
문제의 핵심은 이겁니다. JSON Schema는 “형식”만 보장하지 “정확성”은 보장하지 않는다는 점이죠.
왜 이런 일이 생길까?
LLM은 다음 토큰을 예측하며 텍스트를 생성합니다. Constrained decoding(제약된 디코딩)이라는 기법은 이 과정에서 특정 토큰만 선택하도록 필터를 겁니다. 예를 들어 {"quantity": 51까지 생성한 상태에서:
.7은 정수 스키마를 위반하므로 선택 불가,는 가능0도 가능 (하지만510이 정답일 확률은 낮음)
LLM이 실제로 51.7이라고 답하고 싶어도 스키마 제약 때문에 불가능합니다. 모델의 “지능 예산”을 형식 준수에 낭비하게 만드는 셈이죠.
더 큰 문제는 Chain-of-Thought(단계별 추론)와의 충돌입니다.
보통 AI에게 “단계별로 설명해줘”라고 하면 이렇게 자연스럽게 답합니다:
단계별로 생각해보면:
1. 이메일은 아마존에서 왔고
2. 제목에 "주문이 발송되었습니다"라고 써있네요
3. 따라서 주문 상태는 'SHIPPED'입니다
결론적으로 답은:
{"order_status": "SHIPPED"}추론 과정이 자연스럽죠. 하지만 구조화된 출력을 강제하면 모든 내용이 JSON 안에 들어가야 합니다. 그러면 개행(\n), 따옴표(\"), 쉼표 같은 특수문자를 전부 이스케이프해야 하죠:
{
"reasoning": "단계별로 생각해보면:\n\n1. 이메일은 아마존에서 왔고\n2. 제목에 \"주문이 발송되었습니다\"라고 써있네요..."
}AI 입장에선 “사고 과정을 설명하라”는 본질적 작업 외에 “JSON 형식에 맞게 특수문자를 처리하라”는 부가 작업까지 떠안게 됩니다. 마치 보고서 쓰면서 동시에 워드 파일 서식 맞추는 것처럼요. 연구에 따르면 이런 형식 제약이 AI의 추론 품질을 실제로 떨어뜨린다고 합니다.
에러 처리의 딜레마
“그럼 스키마를 더 잘 설계하면 되지 않나요?” 라고 물을 수 있습니다. { receipt_data } or { error } 형태로 만들면 되지 않냐는 거죠.
하지만 모든 종류의 에러를 미리 정의할 수 있을까요? 영수증에 합계가 없으면? 8개 항목 중 7개만 파싱 가능하면? 코끼리 사진이 들어오면? 에러 케이스를 자세히 열거할수록 pink elephant problem에 빠집니다—에러를 많이 언급할수록 AI가 에러를 더 자주 반환하게 되는 현상이죠.
일반 프로그래밍에서 모든 함수에 try-catch를 쓰지 않고 에러를 위로 전파시키듯, LLM도 자유롭게 에러를 표현할 수 있어야 합니다.
그럼 어떻게 해야 할까?
저자의 해법은 단순합니다. LLM에게 자유롭게 답하게 하고, 출력을 파싱하세요.
자유형식 출력을 허용하면:
- AI가 리스트 개수 세기를 거부할 수 있고
- 모순된 정보를 받았을 때 경고할 수 있고
- 잘못된 접근법을 쓰려 할 때 올바른 방법을 제안할 수 있습니다
실제로 Boundary ML팀은 작년 벤치마크에서 GPT-4o를 자유형식으로 쓸 때 93.63% 정확도를, Constrained decoding으로 쓸 때 91.37%를 기록했습니다. GPT-4o-mini도 자유형식으로 쓰면 baseline GPT-4o보다 나은 성능을 보였죠.
물론 이 방식은 복잡합니다. JSON을 찾아내고, 인용 부호나 개행 처리가 엉망인 걸 바로잡고, float를 int로 변환하는 등의 작업이 필요하니까요. 하지만 이런 파싱 복잡성의 대가로 얻는 건 높은 품질의 답변입니다.
의미와 한계
구조화된 출력은 편리합니다. API 응답을 즉시 타입 안전한 객체로 받을 수 있으니까요. 하지만 이 편의성이 “형식은 맞는데 내용이 틀린” 에러를 가려버릴 수 있습니다. JSON.parse 실패 같은 눈에 보이는 에러가 “유저가 이상한 결과를 받았다”는 조용한 품질 저하로 바뀌는 거죠.
프로덕션 환경에서 AI를 사용한다면 이 trade-off를 명확히 이해해야 합니다. 때로는 “완벽한 JSON”보다 “정확한 답변”이 더 중요할 테니까요. 형식과 정확성 사이의 균형—이게 AI 시스템 설계의 핵심입니다.
참고자료:

답글 남기기