12.4 SQL 실행 결과 비교를 위한 데이터 정규화(Normalization) 기법

12.4 SQL 실행 결과 비교를 위한 데이터 정규화(Normalization) 기법

SQL 생성 AI(Text-to-SQL)를 평가하는 오라클(Oracle)의 핵심 메커니즘은 AI가 생성한 쿼리와 골든 데이터셋(Golden Dataset)의 정답 쿼리를 각각 샌드박스(Sandbox) 데이터베이스에서 실행하고, 두 쿼리가 반환한 **‘결과표(Result Set)’**의 동등성을 검증하는 것이다.

그러나 문제는 SQL 언어의 유연성에서 비롯된다. “동일한” 데이터를 반환하더라도 반환되는 형식(Format), 자료형(Type), 심지어는 행(Row)과 열(Column)의 배치까지 철저하게 비결정적(Nondeterministic)일 수 있다. 물리적으로 완벽히 동일한 의미를 가진 두 결과표가 시스템 관점에서는 서로 다른 바이트 배열로 인식되어 무수히 많은 거짓 음성(False Negative)을 유발하게 된다. 오라클이 인간의 개입 없이 100% 자동화된 결정을 내리기 위해서는, 난립하는 결과표들을 비교 가능한 수학적 동일 상태로 변환하는 ‘데이터 정규화(Normalization)’ 계층이 반드시 선행되어야 한다.

1. 차원(Dimension) 무결성 보장

가장 먼저 선행되어야 할 작업은 두 결과표의 형태적 통일성을 확보하는 것이다. 정답 쿼리(SELECT name, age)와 AI 쿼리(SELECT age, name)는 논리적으로 동일한 데이터를 담고 있지만, 컴퓨터 배열(Array) 체계에서는 완전히 다른 구조로 간주된다.

  • 컬럼(Column) 정렬 및 별칭(Alias) 무효화: 결과 집합의 스키마를 비교할 때, 오라클은 쿼리문 내의 AS 별칭을 무시하고 반환된 컬럼들을 알파벳 순으로 강제 정렬(Sorting)해야 한다.
  • 로우(Row) 순서 독립성 확보: 질의 지시문에 ORDER BY가 명시적으로 요구되지 않은 쿼리라면, 각 로우의 반환 순서는 RDBMS의 내부 옵티마이저(Optimizer) 스캔 방식에 따라 매번 달라질 수 있다. 오라클 파이프라인은 결과표를 리스트(List) 형태가 아닌 사본들의 집합(Set) 또는 컬럼 단위로 정렬된 해시(Hash) 구조로 변환하여 순서 불일치로 인한 오답 처리를 방어해야 한다.

2. 자료형 변환(Type Casting)과 도메인 캐싱

데이터베이스 언어의 복잡한 추상화 벽(Abstraction Barrier)은 AI와 오라클 간 통신에서 또 다른 장벽을 형성한다. 동일한 ’숫자 1’이라도 엔진에 따라 정수형(Integer), 큰 수(BigInt), 혹은 문자형 열거타입(Enum)으로 반환될 수 있다.

오라클의 비교 로직은 엄격한 타입 체크(Strict Type Checking) 대신 구조적인 ’느슨한 비교(Loose Comparison)’를 위한 정규화된 캐스팅 파이프라인을 적용해야 한다.

  • 문자/숫자 통합: 100.0(Float), 100(Int), "100"(String) 구별을 피하기 위해, 모든 스칼라 값을 1차적으로 통일된 시스템 자료형(예: Python의 Decimal 객체)으로 업캐스팅(Up-casting)하여 비교한다.
  • 부동 소수점(Floating Point) 공차(Tolerance) 허용: 집계 함수(AVG, SUM)를 수행할 때 발생하는 부동 소수점 연산 오류를 방지하기 위해, 오라클은 math.isclose(a, b, rel_tol=1e-5)와 같이 사전에 엄격히 정의된 오차 범위(\epsilon) 내에서의 수학적 동등성(Mathematical Equivalence)을 참(True)으로 수용해야 한다.

3. 포맷 정규화: 날짜와 문자열

가장 많은 오탐(False Positive)을 발생시키는 구간은 날짜(Datetime)와 문자열(String)의 표현 방식이다.

  • Timezone 및 Date 포맷 평탄화: AI 모델이 YYYY-MM-DD로 출력한 결과를, 시스템 정답지가 YYYY/MM/DD HH:MM:SS 로 설정된 결과와 비교하면 필연적으로 충돌한다. 오라클은 들어오는 모든 날짜형 데이터를 ISO 8601 형식과 UTC 시간대로 강제 정규화하여 시스템 틱(Tick) 수준에서 비교해야 한다.
  • 문자열 화이트스페이스(Whitespace) 및 대소문자 제거: 사용자의 자연어 처리에 의해 의도치 않게 추가된 공백(Padding)이나 대소문자 불일치(USA vs usa)를 제거하기 위해, 오라클은 비교 직전에 모든 문자열 피연산자에 대해 .strip().lower() 트리밍(Trimming) 파이프라인을 통과시켜야 한다.

결론적으로 SQL 오라클의 완성도는 AI 쿼리 파서의 추론 능력이 아니라, 방어적인 방파제 역할을 하는 데이터 정규화 엔진의 촘촘함에 달려 있다. 오라클은 생성된 데이터를 단순히 눈으로 비교하는 것이 아니라, 컴퓨터 공학적으로 완벽히 동일한 구조적 단층으로 깎아낸 뒤(Normalization) 그 교집합을 묻는 무자비한 분쇄기(Grinder)가 되어야 한다.