
"JSON 형식으로 출력해줘"
프롬프트에 이 한 줄 넣고 퇴근하셨습니까?
축하합니다. 당신은 지금 시한폭탄을 배포했습니다.
서비스 장애는 거창한 할루시네이션 때문에 터지는 게 아닙니다.
대부분은 닫는 중괄호 `}` 하나 빼먹거나, 따옴표 `"` 짝이 안 맞아서 발생합니다.

현업에서 LLM을 다루면서 가장 뼈저리게 느낀 점이 있습니다.
LLM은 확률적 앵무새입니다. 앵무새한테 "문법에 완벽하게 맞는 코드를 뱉어라"라고 시키는 건 엔지니어링이 아니라 기도 메타입니다.
오늘 공유할 내용은 우리 팀 신입들이 들어오면 무조건 1주일 동안 읽히는 '구조화된 출력(Structured Outputs)' 관련 내부 가이드의 핵심 요약입니다.
어디 가서 "프롬프트 깎아서 JSON 만들어요"라고 하지 마세요. 부끄러운 일입니다.
---
**[팩트] 당신의 'AI 에이전트'가 멍청한 이유**
대부분의 주니어들이 LLM으로 API를 호출하거나 DB에 데이터를 넣으려 합니다.
문제는 LLM이 텍스트 생성기라는 점입니다.
--> 텍스트는 구조가 없습니다.
--> 시스템은 구조(JSON, XML)가 필요합니다.
이 간극을 메우려고 `try-catch`로 에러 잡고 재요청(Retry) 보내고 계시죠?
그게 다 돈입니다.
재요청 1회당 GPU 비용은 2배로 뜁니다. 레이턴시는 2배로 늘어납니다.
이건 장사가 안 되는 모델입니다.
---
**Constrained vs Unconstrained: 돈 버는 엔지니어의 선택**
출력을 제어하는 방법은 크게 두 가지입니다.
**1. Unconstrained (비제약적 방법)** :: 프롬프트 엔지니어링 - "제발 JSON으로 줘"라고 비는 방식. - 퓨샷(Few-shot) 예제 넣고 토큰 낭비함. - 결과: 가끔 실패함. 실패하면 서비스 중단.
**2. Constrained (제약적 방법)** :: 로짓(Logit) 레벨 제어 - 모델이 다음 토큰을 뱉을 때, 문법에 맞지 않는 토큰은 아예 후보에서 지워버림(Masking). - 스키마(Schema)에 정의된 형식이 아니면 생성 자체가 안 됨. - 결과: 수학적으로 100% 유효한 JSON 보장.
B2B 솔루션 팔면서 1번 쓰는 건 직무 유기입니다.
---
**트레이드오프(Trade-off): 공짜 점심은 없다**
"그럼 무조건 제약(Constrained) 걸면 되나요?"
아니요. 여기서 엔지니어의 역량이 갈립니다.
제약을 걸면 추론 속도가 느려질 수 있습니다. FSM(Finite State Machine)을 돌려가며 검증해야 하니까요.
하지만 생각해보세요.
파싱 에러 나서 재요청(Retry) 보내는 시간 vs 추론 단계에서 0.05초 더 쓰는 시간.
압도적으로 후자가 쌉니다.
게다가 쓸데없는 `Please output only JSON` 같은 설명 문구를 프롬프트에서 뺄 수 있습니다.
--> 입력 토큰 절약.
--> 비용 감소.
결국 구조화된 출력은 '안전' 때문이 아니라 '비용 효율' 때문에 하는 겁니다.
---
**현실적인 조언: 바퀴를 다시 발명하지 마라**
지금 당장 깃허브 뒤져서 정규식(Regex)으로 JSON 고치는 함수 짜고 있다면 멈추세요.
이미 이 문제를 해결하기 위한 라이브러리와 방법론은 차고 넘칩니다. (Instructor, Outlines 등)
최근 업데이트되는 핸드북들을 보면 단순히 JSON을 만드는 걸 넘어, 스트리밍(Streaming) 처리는 어떻게 할지, 복잡한 중첩 구조는 어떻게 풀지 이미 답이 나와 있습니다.
개발자는 코드를 짜는 사람이기 전에, '문제를 해결하는 도구'를 잘 고르는 사람이어야 합니다.
---
**결론**
"그건 생성형 AI가 아니라 엑셀로 하셔야죠"
제가 클라이언트에게 가장 자주 하는 말입니다.
하지만 굳이 LLM을 써야겠다면, 그리고 그 결과를 시스템에 태워야 한다면 '확률'에 기대지 마세요.
구조화된 출력은 선택이 아니라 필수입니다.
밤새 파싱 에러 로그 보면서 디버깅하기 싫다면, 지금 당장 여러분의 파이프라인에 스키마(Schema) 강제 로직을 심으세요.
이런 실수는 한 번으로 족합니다.


![[브루킹스 연구소] 50개국 현장 조사: AI가 인간의 뇌를 '퇴화'시킨다는 결정적 증거](/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fpoooling-blog%2Fblog-images%2F2026%2F02%2F02%2F2620_b8418316.png&w=3840&q=75)