6.2 JSON Schema: 데이터 계약(Contract)으로서의 역할
자연어 파싱의 브리틀니스(Brittleness)와 정규표현식의 위험성을 극복하기 위한 근본적인 해답은, 소프트웨어 공학의 ‘계약에 의한 설계(Design by Contract)’ 기법을 거대 언어 모델(LLM)의 출력 계층에 물리적으로 주입하는 것이다. 그 계약서의 역할을 수행하는 가장 완벽한 수학적 명세서가 바로 JSON Schema다.
1. 데이터 계약(Data Contract)이란 무엇인가?
마이크로서비스 아키텍처(MSA)에서 두 개의 서로 다른 서비스가 통신할 때, 송신 측과 수신 측은 반드시 주고받을 데이터의 형태를 사전에 약속한다. “나는 당신에게 {"user_id": 123} 이라는 정수형(Integer) 데이터를 보낼 테니, 당신은 나에게 {"status": "OK"} 형식의 이메일 전송 결과를 반환하라“는 식의 엄격한 약속을 데이터 계약(Data Contract)이라고 부른다.
LLM을 소프트웨어의 한 모듈로 취급할 때, JSON Schema는 바로 이 수신자(백엔드 로직)가 송신자(LLM)에게 들이미는 절대적인 데이터 계약서다.
프롬프트를 통해 “JSON 형태로 대답해 주세요“라고 부탁하는 것은 그저 신사협정에 불과하다면, 시스템 파라미터로 JSON Schema를 던져주는 행위는 “이 스키마를 단 1바이트라도 어길 시 당신의 출력을 수신 아키텍처 단에서(혹은 생성 단에서) 즉시 파기하겠다“는 강제성을 띤다.
2. JSON Schema의 선언적 강력함
JSON Schema(표준 명세)는 개발자가 프로그래밍 언어의 if-else 검증 로직을 짜지 않고도, 데이터의 생김새를 선언적(Declarative)으로 통제할 수 있게 해준다. LLM에 주입되는 전형적인 스키마 계약서는 다음과 같은 강력한 제약 조건들을 포함한다.
{
"type": "object",
"properties": {
"sentiment": {
"type": "string",
"enum": ["POSITIVE", "NEGATIVE", "NEUTRAL"],
"description": "리뷰의 전반적인 감성을 세 가지 중 하나로 분류하라"
},
"confidence_score": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0
},
"keywords": {
"type": "array",
"items": { "type": "string" },
"minItems": 1,
"maxItems": 5
}
},
"required": ["sentiment", "confidence_score", "keywords"],
"additionalProperties": false
}
이 짧은 JSON Schema 객체 안에는 결정론적 오라클을 구축하기 위한 핵심 검문소가 모두 들어 있다.
- Enums (열거형): 환각을 일으켜 “SLIGHTLY_BAD” 같은 임의의 감성 상태를 뱉는 것을 원천 봉쇄한다.
- Boundary Constraints (경계값 제약):
confidence_score가1.5같은 범위를 초과한 수치로 생성되는 것을 막는다. - Array Constraints (배열 제약): 무의미하게 길어지는 토큰 생성을 막기 위해, 핵심 키워드를 최대 5개까지만 뽑아내도록 제한(
maxItems)한다. - Strictness (엄격성):
additionalProperties: false선언은 모델이 묻지도 않은 필드(예:summary_text)를 자의적으로 추가하여(Structure Hallucination) 파서를 혼란스럽게 만드는 것을 차단한다.
3. 확률론의 지배에서 결정론의 지배로
이처럼 강력한 JSON Schema를 API 스펙이나 강제 구조화 출력(Structured Outputs) 매커니즘을 통해 LLM 엔진에 바인딩하는 순간, 모델은 더 이상 자유로운 작가가 아니라 철저하게 통제받는 데이터 변환 함수로 전락한다.
LLM이 뱉어낸 JSON 객체를 jsonschema 파이썬 라이브러리나 Zod 같은 검증기에 던져 넣었을 때 에러가 나지 않는다는 사실이 수학적으로 증명된다면, 백엔드 엔지니어는 더 이상 텍스트 조각을 파싱하느라 밤을 새울 필요가 없다.
오라클(Oracle) 설계자에게 JSON Schema는, 비결정성이라는 끝없는 안개 속에서 구조체(Struct)라는 확고한 결정론적 진지를 구축할 수 있게 해주는 가장 든든한 설계도다. 이어지는 절들에서는 이러한 스키마를 어떻게 코드로 정의하고 LLM의 내부 디코딩 과정에 이식하는지 구체적인 메커니즘을 살펴볼 것이다.