12.12.2 테이블/컬럼 매핑 사전을 활용한 스키마 기반 논리적 동등성(Semantic Equivalence) 평가 로직
앞선 12.12.1절에서 SQL 구문 파서(Parser) 기반의 AST(추상 구문 트리) 정규화를 통해 MySQL, PostgreSQL 등 난해한 벤더 특정 SQL 방언(Dialect)의 종속성을 완벽히 중립화하고 노드 연산자의 순서 위상 정렬까지 마쳤다 하더라도, 텍스트 기반 오라클 시스템을 우롱하고 속이는 또 다른 교묘한 LLM의 환각(Semantic Hallucination)이 백엔드에 은밀히 존재한다.
바로 AI 모델이 내부 지식에서 멋대로 지어낸 식별자(Identifier: 테이블명, 컬럼명) 구조가, 우연히 정답 골든 쿼리의 AST 문법 트리 윤곽과 골격은 완벽히 동일할 때 발생하는 치명적인 ‘가짜 동등성(False Equivalence)’ 문제다.
예를 들어, 평가 기준인 정답 쿼리(Golden Query)에서 데이터베이스 전문 엔지니어는 명확하게 users.age > 20이라고 논리를 명시했다. 하지만 프롬프트의 맥락을 잘못 파악한 AI 에이전트는 환각 상태에 빠져 customers.user_age > 20이라는, 현재 스키마에는 존재하지도 않는 엉뚱한 테이블과 허구의 컬럼을 자신만만하게 호출하여 텍스트를 생성했을 수 있다.
이때 평가 오라클 시스템이 식별자의 실존 여부를 따지지 않고 맹목적인 AST 위상(Topology) 골격 비교 로직만 아둔하게 수행한다면, 이 두 쿼리 브랜치를 “왼쪽에 테이블-컬럼 식별자가 있고, 중간에 > 연산자가 있으며, 오른쪽에 숫자 20 리터럴이 존재하는 구조가 완벽하게 동일한 조건식 브랜치(Condition Branch)“라고 오판석하여 100점 만점을 부여하는 대참사가 발생한다.
이러한 의미론적 공백(Semantic Void) 환각을 원천 차단하기 위해, 오프라인 오라클 평가지 모델 인스턴스 내부에 타겟 프로덕션 데이터베이스의 실제 DDL 메타데이터(Metadata)를 1:1로 본뜬 **‘가상 스키마 매핑 사전(Schema Mapping Dictionary/Registry)’**을 메모리 구조체로 주입해야만 한다. 그리고 생성된 쿼리 AST 트리에 등장하는 모든 말단 노드 식별자가, 물리적 스키마 도메인 구조와 거짓 없이 합치하는지 O(1) 시간 복잡도로 정밀하게 교차 대조(Cross-Validation)하는 파이프라인 단계가 반드시 추가되어야 한다.
1. 인메모리 스키마 메타 매핑 사전(Schema Meta-Dictionary)의 주입 및 초기화
오프라인 SQL 평가 파이프라인이 구동되는 오라클 인스턴스의 초기화(Initialization) 단계에서, 무거운 실제 DB 파서 커넥션 풀(Connection Pool)을 맺어 런타임 콜을 날리는 대신, 메모리 딕셔너리에 대상 샌드박스 데이터베이스의 물리적 스키마 트리 정보를 가볍게 정적 로드(Load)한다.
class SemanticOracleSchemaValidator:
def __init__(self):
# 벤치마크 평가 오프라인 실행을 위한 인메모리 스키마 메타 사전 로컬 구축 (Mocking)
self.schema_registry = {
"users": ["id", "name", "age", "created_at"],
"orders": ["order_id", "user_id", "amount", "status", "product_id"]
}
def validate_node_schema(self, table_name: str, column_name: str) -> bool:
""" 파서의 말단 노드 식별자가 실제 물리 도메인에 명백히 존재하는지 O(1) 해시로 즉각 판별한다 """
if table_name not in self.schema_registry:
return False
return column_name in self.schema_registry[table_name]
2. AST 재귀 순회(Recursive Traversal)를 통한 메타 유효성(Meta-Validity) 검증 방어선
정답 쿼리와 AI 생성 쿼리의 1차 AST 골격 위상 구조가 수학적으로 완벽히 동일하다고 판별된 직후 섣불리 Pass를 선언하지 않는다. 오라클 스레드는 다시 한번 트리의 SELECT, WHERE, JOIN, GROUP BY 절 내부를 파고들어, 모든 하위 컬럼 추출 노드(Terminal Nodes)를 깊이 우선 탐색(DFS) 방식으로 재귀적으로 스캔한다. 이를 통해 해당 컬럼들이 메모리 스키마 레지스트리에 존재하는 **“물리적으로 쿼리가 가능한 진짜 식별자”**인지 2차 판별한다.
특히, AI 모델이 SELECT age FROM orders 처럼 실제 orders 테이블에는 물리적으로 존재하지 않는 age라는 유령 컬럼을 매핑 시도하는 조인 논리적 환각(Join Semantic Hallucination)을 범했을 경우, 파이프라인은 이를 런타임 SQL 컴파일 에러 확정 상태로 간주하여 자비 없이 즉각 0점으로 요격한다.
import sqlglot
from typing import Dict
def analyze_semantic_equivalence(self, ast_tree) -> Dict[str, str]:
# SQLGlot 파서를 통해 생성된 프로방언 중립 트리에서, 모든 식별자 명칭(Column) 객체를 전수 추출
for column_node in ast_tree.find_all(sqlglot.exp.Column):
table_ref = column_node.table # 명시된 테이블 노드
col_name = column_node.name # 명시된 컬럼명 노드
# (심화) 만약 명시적인 테이블 별칭(Table Alias)이 생략되었다면,
# 쿼리의 FROM/JOIN 풀(Scope)을 스캔하여 식별자의 출처를 동적으로 레졸브(Resolve) 해야 함
# (본 예시 코드에서는 추론 생략된 단순 1:1 조인 명시 모델로 가정함)
if table_ref:
is_valid = self.validate_node_schema(table_ref, col_name)
if not is_valid:
# 환각 식별자 발각 시 즉시 에러 반환 및 평가 종료 루틴 격발
return {
"status": "FAIL",
"reason": f"Semantic Error: The hallucinated column '{col_name}' absolutely does not exist in table '{table_ref}'."
}
return {"status": "PASS", "reason": "All identifiers are physically and semantically valid in the strict schema."}
3. 소결: 인지 과학적 초자아(Super-ego)를 획득한 결정론적 오라클
이 고도화된 스키마 메타 매핑 사전 기반의 논리 추적 파이프라인을 구축함으로써, SemanticOracleSchemaValidator 컴포넌트는 오프라인 오라클 아키텍처 내에서 거대한 도약(Leap)을 달성한다.
시스템은 비용이 발생하고 속도가 느린 실제 무거운 타겟 백엔드 데이터베이스 엔진의 옵티마이저 EXPLAIN 런타임 쿼리 플랜 실행(Execution) 단계를 물리적으로 전혀 겪지 않고도, SQL의 문법적 구문을 훌쩍 뛰어넘어 런타임 스키마 바인딩 에러를 파이썬 로컬 메모리상 인퍼런스 머신단에서 100%에 수렴하는 완벽한 확률로 요격할 수 있는 인프라스트럭처의 **‘인지 과학적 초자아(Cognitive Super-ego)’**를 획득하게 조립된 것이다. 이는 수백만 건의 LLM 프롬프트 평가 벤치마크 테스트를 비동기적으로(Asynchronously) 비용 소모 없이 CI 파이프라인 안에서 수 초 만에 끝낼 수 있게 해주는 거대한 분산 처리의 핵심 원동력이 된다.