12.5.2 백(Bag) 시멘틱스(중복 허용)와 세트(Set) 시멘틱스의 구분 처리
관계 대수학(Relational Algebra)을 다루는 소프트웨어 공학의 심연에서 가장 중요하고 민감하게 제어되어야 하는 논리적 갈래 중 하나는, 처리 중인 데이터 집합 차원이 중복된 튜플(Tuple 레코드)의 존재를 관대하게 허용하는 ‘백(Bag, 혹은 분산 다중 집합 Multiset)’ 논리를 따르느냐, 아니면 순수한 이산수학의 엄격한 정의처럼 모든 중복 원소를 물리적으로 배제해 버리는 고결한 ‘세트(Set)’ 논리를 따르느냐를 시스템 차원에서 엄격하게 통제하는 것이다.
표준 SQL 언어는 놀랍게도 이 두 가지 상반된 시맨틱스를 쿼리의 키워드에 따라 런타임에 동적으로 모두 지원하도록 설계되어 있다. 따라서 오라클의 최종 판별기(Comparator) 엔진은 AI가 생성한 코드가 이 미묘한 다차원적 차이를 정확히 의도하고 구현해 냈는지 냉혹하게 구분하여 채점해야만 한다.
1. SQL 연산자 키워드에 따른 시맨틱스 분기 (UNION vs UNION ALL)
가장 대표적이고 치명적인 시맨틱스의 차이는 집합 결합(Combination) 연산이나 프로젝션(Projection) 단계에서 발현된다.
- 세트(Set) 시맨틱스 유발자 (
DISTINCT,UNION,INTERSECT): 데이터베이스 엔진이 디스크에서 결과를 1차적으로 인출한 뒤, 내부적으로 눈에 보이지 않는 거대한 해시 테이블(Hash Table)이나 정렬 엔진을 백그라운드에 가동하여 중복된 행(Duplicate Rows)을 파괴하고 유일한 레코드 단 하나씩만 남기는 무거운 연산을 강제한다. - 백(Bag) 시맨틱스 유발자 (일반
SELECT,UNION ALL): 컴퓨팅 리소스의 낭비를 막고 속도를 극대화하기 위해 값의 중복 검사를 완전히 생략한다. 그 결과, 시스템 내부의 B-Tree 인덱스에 존재하는 모든 잡다한 튜플을 그 질량과 중복된 횟수 그대로 세상 밖으로 쏟아낸다.
예를 들어, “전국 지점의 우수 직원 이름을 모두 조회하라. (단, 동명이인은 한 번만 표기할 것)“이라는 극도로 구체적인 프롬프트가 주어졌을 때, 정답 쿼리는 반드시 SELECT DISTINCT name 이라는 세트 시맨틱스를 요구한다. 만약 AI가 이 비즈니스적 뉘앙스를 파악하지 못하고 DISTINCT 키워드를 빼먹어 결과 텐서에 [Alice, Alice, Bob] (백 시맨틱스)이 담겨버렸고, 정답 텐서는 깔끔한 [Alice, Bob] (세트 시맨틱스)이라면, 이 두 텐서는 엄연히 다른 수학적 세계선을 반환한 오답이다.
2. 억울한 오검증(False Positive)을 막는 빈도수 해시맵(Counter) 방어막
만약 이 오라클을 구축하는 주니어 개발자가 파이썬의 편리함에 속아 두 거대 텐서를 단순한 파이썬의 내장 set(Tensor) 객체로 캐스팅(Casting)하여 묶어버린 뒤 비교(set(A) == set(B))한다면 어떤 파국적 대참사가 일어날까?
AI 모델 에이전트가 멍청하게 DISTINCT를 빼먹고 수천 명의 중복 쓰레기 데이터를 반환했음에도 불구하고, 파이썬의 무자비한 set() 함수가 이를 강제로 중복 제거하여 교집합 덩어리인 {'Alice', 'Bob'}으로 만들어버릴 것이다. 그 참담한 결과, 오라클 판별기는 AI가 ’동명이인 표기 제한’이라는 DISTINCT 조건을 명백하게 위반했다는 비즈니스적 결함을 영영 깨닫지 못한 채, 이 오답 쿼리에게 100점 만점(False Positive)의 월계관을 씌워주는 치명적인 버그를 저지르게 된다.
이러한 지능 평가 시스템의 재앙적 붕괴를 원천 방어하기 위해, 앞선 12.4.1.2절에서 설계한 최고 수준의 오라클 알고리즘은 비교 판별 트리의 가장 깊은 곳에서 절대 네이티브 set() 객체를 쓰지 않고, 무조건적으로 파이썬의 collections.Counter와 같은 정밀한 빈도수 해시맵(Frequency Hash Map) 메커니즘을 영구 유지해야만 한다.
생성된 Counter 객체는 AI의 오답인 [Alice, Alice, Bob]을 {'Alice': 2, 'Bob': 1} 이라는 백 시맨틱스 해시 공간으로 영구 매핑하고, 정답인 [Alice, Bob]을 {'Alice': 1, 'Bob': 1} 이라는 세트 시맨틱스 해시 공간으로 분리 구별해 낸다. 두 딕셔너리를 최후의 등호(==)로 맞부딪히는 순간, Alice 문자열이 내포한 논리적 해시 빈도수(2 != 1)가 수학적으로 일치하지 않으므로 이 위대한 오라클은 즉각적으로 기계의 DISTINCT 제약 위반을 적발해 내어 가차 없이 0점(False, EX=0)을 선고할 수 있는 신의 권능을 온전히 보존하게 되는 것이다.