3.4.3.1 JSON Schema, Pydantic 모델을 이용한 필드 유효성 검사
거대 언어 모델(LLM)이 백엔드(Backend) 시스템과 직접적으로 통신하는 B2B 소프트웨어 아키텍처에서, 가장 흔하게 사용되는 오라클(Oracle)은 ’구조 기반 정답지(Structure-based Ground Truth)’다. 앞서 다룬 사실/로직 기반 오라클이 “내용(Content)이 맞는다/틀리다“를 판별한다면, 구조 기반 오라클은 “데이터가 파이프라인을 통과할 수 있는 올바른 형태(Shape)를 띠고 있는가?“를 검증하는 방어선이다.
이러한 구조적 유효성을 강제하고 검증하기 위해 산업계의 표준으로 자리 잡은 도구가 바로 JSON Schema와 Python의 Pydantic 모델이다.
1. JSON Schema를 통한 결정론적 타입 캐스팅
기존의 자연어 기반 테스트에서는 LLM이 생성한 텍스트 뭉치에서 정규표현식(Regex)을 통해 특정 값을 긁어모았다. 이 방식은 LLM의 변덕스러운 어투 하나에 파싱 에러(Parsing Error)가 발생하기 십상이다.
구조 기반 정답지는 LLM에게 자연어 생성을 멈추고 오직 기계가 읽을 수 있는 페이로드(Payload)만을 생성하도록 강제하며, 오라클은 이 응답을 JSON Schema로 검증한다.
// Golden Dataset의 구조 기반 정답지 (JSON Schema 정의)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"user_age": { "type": "integer", "minimum": 0 },
"is_eligible": { "type": "boolean" },
"extracted_date": { "type": "string", "format": "date" }
},
"required": ["user_age", "is_eligible"],
"additionalProperties": false
}
이 스키마가 오라클에 투입되면, 시스템은 다음과 같은 결정론적 파싱을 100% 확정적으로 수행한다.
user_age에 “스물 네 살“이라는 문자열이 들어오면 실패(Fail). 반드시 정수(Integer) 데이터 타입이어야 한다.extracted_date필드는ISO 8601날짜 포맷(“YYYY-MM-DD”) 패턴을 준수해야만 통과(Pass)한다.
2. Pydantic 모델을 활용한 런타임(Runtime) 오라클 검증
JSON Schema가 데이터의 형태를 정의하는 선언적 문서라면, Pydantic은 Python 생태계 내에서 이 스키마를 실제 런타임 메모리에 올리고 강력한 형변환과 에러 핸들링을 주도하는 실행 엔진(Execution Engine)이다.
골든 데이터셋 내의 구조 기반 정답지는 스크립트 상에서 Pydantic BaseModel 클래스로 선언되어 실시간 오라클의 역할을 수행한다.
from pydantic import BaseModel, Field, ValidationError
class LoanExtractionOracle(BaseModel):
user_age: int = Field(..., ge=0, description="추출된 사용자 나이")
is_eligible: bool = Field(..., description="대출 가능 여부")
extracted_date: str | None = Field(default=None, description="YYYY-MM-DD 포맷")
# LLM이 생성한 결과물 (Mock)
llm_output = {
"user_age": "30", # 문자열이지만 Pydantic이 자동으로 int로 캐스팅 시도
"is_eligible": True,
"unwanted_field": "hacking_attempt"
}
try:
# 런타임 오라클 검증 실행
validated_data = LoanExtractionOracle(**llm_output)
except ValidationError as e:
# 오라클 에러 발생: unwanted_field는 스키마 계약에 없으므로 FAIL
trigger_fail_pipeline(e)
3. 구조 기반 오라클의 엔지니어링적 가치
- 자동 형 변화(Type Coercion): LLM이 숫자
30을 문자열"30"으로 출력하더라도, Pydantic 오라클은 스키마에 정의된 바에 따라 इसे 안전한 수리적 정수(int)로 강제 변환하여 백엔드로 넘긴다. 파서(Parser)를 망가뜨리는 사소한 토큰 차이를 극복하게 해준다. - 명시적 에러 로깅(Explicit Error Logging): 구조 위반이 발생했을 때 오라클은 단순한
False가 아니라, “필드명이 다름”, “데이터 타입이 맞지 않음“과 같이 정확히 어느 계층 구조의 어느 필드에서 에러가 났는지 알려주는 정밀한ValidationError객체를 반환한다. 이는 LLM에게 즉시 재시도(Retry)를 요청하는 피드백 루프의 가장 훌륭한 입력 데이터가 된다.
결과적으로 JSON Schema와 Pydantic이라는 구조 기반 오라클은, 자연어라는 끝없는 바다에서 헤엄치는 AI의 출력물을 백엔드의 정형화된 파이프라인 병(Bottle) 안으로 밀어 넣기 위한 강력하고 견고한 깔때기(Funnel) 역할을 완벽히 수행한다.