피드로 돌아가기
"Return JSON only" doesn't force JSON. Here's what actually forces it.
Dev.toDev.to
AI/ML

Prompt Nudge를 넘어 Constrained Decoding으로 구현한 100% JSON 보장 아키텍처

"Return JSON only" doesn't force JSON. Here's what actually forces it.

Natnael Alemseged2026년 5월 6일8intermediate

Context

Prompt 내 JSON 출력 지시문은 토큰 확률 분포를 조정하는 Soft Mechanism에 불과하여 1~5%의 확률로 Preamble이 포함된 비정형 데이터가 생성됨. 이러한 불확실성이 Production 환경에서 json.loads() 파싱 에러 및 하위 시스템으로의 None 전파로 인한 데이터 오염을 야기함.

Technical Solution

  • Inference 단계에서 Schema 기반의 Constrained Decoding을 도입하여 유효하지 않은 토큰의 Logit을 $-\infty$로 설정하는 Hard Exclusion 구현
  • JSON Schema를 Finite-State Machine으로 컴파일하여 각 디코딩 스텝마다 $O(1)$ 시간 복잡도로 Vocabulary를 마스킹하는 구조 설계
  • Pydantic 모델을 통한 Type-safe한 데이터 파싱 구조를 적용하여 try-except 기반의 예외 처리 의존성 제거
  • LLM Judge 파이프라인의 신뢰성 확보를 위해 Prompt Engineering이 아닌 Token-level Schema Enforcement를 기술적 계약(Contract)으로 설정
  • Safety Refusal 및 Content Filter로 인한 비정형 응답 발생 가능성을 고려한 경계 코드 설계 유지

- 구조화된 출력이 시스템의 핵심 로직(Scoring, Routing)에 영향을 주는 경우 반드시 Constrained Decoding 라이브러리(Outlines, llama.cpp GBNF 등) 도입 검토 - LLM 응답이 시스템 코드로 진입하는 모든 지점을 Trust Boundary로 정의하고, 파싱 실패 시 Silent Failure가 아닌 Explicit Error를 발생시키도록 설계 - Constrained Decoding 사용 시에도 모델의 출력 품질 향상을 위해 Prompt 내 포맷 지시문을 힌트 형태로 유지

원문 읽기