깨진 출력 하나가 파이프라인을 멈춘다
자동 루프는 LLM 출력을 파싱해 다음 단계로 넘깁니다. 그런데 JSON이 한 글자만 깨져도 파이프라인 전체가 멈춥니다. 구조화 출력은 응답이 미리 정의한 JSON 스키마를 항상 지키도록 보장하는 장치입니다. 일반 텍스트나 JSON 모드와 달리, 제약 디코딩으로 모든 필드·타입·제약을 지키게 만듭니다.
핵심은 실패를 두 종류로 나누는 것입니다. 구조가 깨지는 실패와 값이 규칙을 위반하는 의미 실패는 서로 다른 방식으로 다뤄야 합니다.
제약 디코딩과 검증
제약 디코딩은 토큰 샘플링 전에 로짓 마스크를 적용해, 스키마상 유효하지 않은 토큰의 확률을 0으로 만들어 유효한 토큰만 생성되게 합니다. Outlines, XGrammar, vLLM, LM Format Enforcer 같은 도구가 이 방식으로 잘못된 JSON을 원천 차단합니다. JSON 스키마는 어떤 필드가 있어야 하는지, 타입과 범위, 필수 여부를 선언적으로 정의합니다.
A4 분량 상세 가이드: 기획부터 운영까지
기획 단계에서는 출력 안정성을 수치로 정의합니다. 예를 들어 구조 파싱 실패율 0에 수렴, 의미 규칙 위반율 상한, 복구 성공률을 지표로 둡니다. 구조 오류는 제약 디코딩으로 사실상 제거할 수 있으므로, 스키마를 먼저 엄밀히 정의하는 것이 가장 큰 효과를 냅니다. 다만 제약 디코딩은 구조만 보장할 뿐, 값이 업무 규칙에 맞는지는 보장하지 않습니다.
실패 패턴의 대부분은 구조는 맞지만 의미가 틀린 경우입니다. 예를 들어 날짜 형식은 맞지만 과거 날짜가 와야 할 곳에 미래 날짜가 오는 식입니다. 이를 막으려면 복구 루프를 둡니다. 값이 업무 규칙을 위반하면 게이트웨이가 구체적 문제를 적어 모델에 다시 요청하거나 더 강한 모델로 에스컬레이션합니다. 구조 오류에 대한 백업으로도, 파싱 불가한 출력을 다시 모델에 주고 올바른 JSON으로 고치게 하는 자가 치유를 둡니다. 복구 전략에는 재시도 상한이 포함되어, 무한 재요청이 비용을 태우지 않게 합니다.
운영 체크리스트에는 실패 유형별 처리를 남깁니다. 어떤 필드가 구조로 실패했는지, 어떤 값이 의미로 실패했는지, 복구가 몇 회 만에 성공했는지를 표준 필드로 기록합니다. 관측 항목으로는 구조 실패율, 의미 위반율, 복구 성공률, 에스컬레이션 비율을 둡니다. 출력에 개인정보가 스키마 밖으로 새지 않도록 필드 화이트리스트도 유지합니다.
지속 개선 루프는 주간 단위로 복구에 실패했거나 반복 위반한 필드를 분석합니다. 자주 위반되는 규칙은 스키마 제약으로 승격하거나 프롬프트를 보완합니다. 구조화 출력은 한 번 설정하는 스키마가 아니라, 새로운 의미 오류를 흡수하며 계속 정교해지는 계약이어야 합니다.
실행 요약
정리하면 구조화 출력은 파이프라인 안정성의 기반입니다. 제약 디코딩으로 구조 오류를 제거하고, 복구 루프로 의미 오류를 처리하며, 재시도 상한과 상위 모델 에스컬레이션을 두어야 합니다. 구조·의미 실패율과 복구 성공률을 관측하고 자주 위반되는 규칙을 스키마로 승격하면 깨진 출력이 파이프라인을 멈추지 않습니다.