6.2.2 데이터 타입(Types) 정의와 엄격함의 정도

6.2.2 데이터 타입(Types) 정의와 엄격함의 정도

JSON Schema를 설계할 때 엔지니어가 겪는 가장 큰 내적 갈등은 “이 필드의 타입을 어디까지 엄격하게 조일 것인가?“에 대한 고민이다. 타입(Type)을 정의하는 방식과 그 엄격함의 정도(Strictness)는 오라클(Oracle)의 성능, 즉 ’결정론적 정합성’과 반비례하는 관계를 갖는다. 너무 느슨하면 환각이 새어 들어오고, 너무 엄격하면 LLM이 답변을 생성하지 못하고 추론을 포기해(Reject) 버리기 때문이다.

1. 타입 정의의 세 가지 스펙트럼

오라클 기반의 AI 파이프라인에서 데이터 타입의 엄격함은 크게 세 가지 레벨로 나눌 수 있다.

1.1 Level 1: 느슨한 타이핑 (Loose Typing / AnyOf)

  • 구조: "type": ["string", "integer", "null"]
  • 특징: 여러 개의 타입을 동시에 허용(Union Type)하거나, 값을 생략해도 되도록 허용한다.
  • 위험성: 거대 언어 모델(LLM)에게 다형성(Polymorphism)을 허용하는 것은 구조적 환각에 초대장을 보내는 것과 같다. age 필드에 숫자 25가 올지 문자열 "twenty-five"가 올지 예측할 수 없게 되며, 파서(Parser) 로직 안에 또다시 복잡한 예외 처리 코드가 필요해진다. 결정론적 시스템에서는 최대한 지양해야 할 패턴이다.

1.2 Level 2: 원시 타입 강제 (Primitive Type Enforcement)

  • 구조: "type": "integer"
  • 특징: 단 하나의 원시 데이터 타입만을 강력하게 허용한다. LLM은 해당 키(Key) 뒤에 따옴표(")를 생성하려는 충동을 시스템 레벨에서 억제당한다.
  • 효용성: 이 단계부터 동형(Isomorphic) DTO 매핑이 가능해지며, 런타임의 TypeError를 99% 이상 예방할 수 있다.

1.3 Level 3: 제약 조건 기반의 극한 통제 (Constrained & Enumerable Typing)

  • 구조: "type": "string", "enum": ["APPROVED", "REJECTED"] 혹은 "type": "number", "minimum": 0, "maximum": 100
  • 특징: 타입(Type)을 넘어, 그 안에 담길 ’값(Value)의 범위’까지 수학적으로 난도질한다.
  • 절대적 지위: 유닛 테스트 오라클 시스템에서 가장 사랑받는 설계다. 모델은 무제한의 자연어가 아니라 사전에 정의된 enum 배열의 인덱스 중 하나만을 골라야 하므로, 소프트웨어 파이프라인의 if-else 분기 처리가 완벽한 결정론 속에서 작동하게 된다.

2. OpenAI의 ’Strict Mode’와 그 이면

클라우드 벤더들이 제공하는 최신 API 스펙을 살펴보면, 단순히 JSON Schema를 넘겨받는 것을 넘어 strict: true라는 불리언(Boolean) 플래그를 추가로 제공하는 경우가 잦다.

(예: OpenAI의 Structured Outputs 옵션)

strict: true를 활성화할 경우, 서버 뒷단에서는 개발자가 넘긴 JSON Schema를 기반으로 컨텍스트 프리 그래머(CFG, Context-Free Grammar) 규칙을 실시간으로 컴파일한다. 모델이 다음 토큰을 예측(Sampling)할 때, 이 CFG 규칙에 어긋나는 토큰(예: 정수를 써야 할 자리에 알파벳 생성)의 확률(Logit)을 강제로 음의 무한대(-inf)로 마스킹(Masking)해 버린다.

이러한 하드웨어적인 제어는 99.9%가 아닌 100%의 무결성을 보장하지만, 대가가 존재한다. 강하게 압박받은 LLM은 추론의 자유도를 잃어버려 때때로 “생성 지연(Latency 증가)“을 일으키거나, 스키마에 끼워 맞출 논리를 찾지 못할 경우 아예 응답을 거부(Refusal)하는 현상이 짙어진다.

3. 엄격함(Strictness)의 설계 철학

엔지니어는 모든 필드에 Level 3의 극한 통제를 가해서는 안 된다.

  • 사용자에게 그대로 보여줄 ‘요약문(Summary)’ 등은 {"type": "string", "maxLength": 500} 수준의 느슨한 공간(Sandbox)으로 열어주어 LLM의 번역/생성 능력을 십분 발휘하게 하라.
  • 하지만 데이터베이스의 상태를 변경하는 ‘카테고리(Category)’, ‘금액(Amount)’, ‘플래그(Boolean)’ 필드에는 가차 없이 enumStrict Mode를 투입하여 자유 의지를 완벽히 말살해야 한다.

이처럼 하나의 JSON DTO 뼈대 안에서 느슨함과 엄격함을 전략적으로 교차 배치하는 기술이, 똑똑하면서도 결코 선을 넘지 않는(Deterministic) AI 파이프라인을 구축하는 으뜸가는 비결이다.