7.1.1 전통적 테스트 오라클과 의미론적(Semantic) 평가의 거대한 간극(Gap)
현대 소프트웨어 공학의 기저를 튼튼하게 지탱하는 자동화된 CI 단위 테스트(Unit Test) 시스템 아키텍처는 기본적으로 변수 간의 **’엄격한 동등성(Equality)’과 예측 가능한 ‘단형성(Monomorphism)’**을 절대적인 전제로 깔고 설계되었다.
가령 장바구니 결제 총액을 계산하는 덧셈 함수나 사용자 세션을 맺는 로그인 인증 로직은 예외 없이 언제나 기계가 단 한 치의 오차도 없이 일치 여부를 바이트(Byte) 단위로 판별할 수 있는 유일한 결정론적 정답(Deterministic Ground Truth)을 명확하게 뱉어내기 때문이다.
하지만 시스템 내부의 통제할 수 없는 인공지능(LLM) 컴포넌트가 *“우울증 환자를 위로하는 다정하고 자연스러운 대화문”*이나 *“거시 경제 트렌드의 분기별 동향을 논리적으로 분석한 보고서 초안”*을 실시간 페이로드로 생성해야 할 때는 사정이 인프라 레벨에서 완전히 달라진다. 이러한 고차원적인 생성 작업(Generative Task)에는 애초에 기계적으로 비교할 수 있는 ‘단방향의 절대적인 단일 정답 문자열’ 자체가 존재하지 않으며, 구문론적(Syntactic)으로 수만 가지의 다형성(Polymorphism)과 변주를 띠며 요동치기 때문이다.
1. 정규표현식(Regex)과 Exact Match(정확한 일치) 오라클이 낳는 비극
이러한 자연어의 혼돈 앞에서, 비애자일적인 전통적 테스트 오라클 엔지니어가 가장 의존하고 자주 사용하는 낡은 무기는 고작 파이썬의 re.search() 정규표현식(Regex)과 자바스크립트의 === (혹은 파이썬의 ==), 그리고 단순 무식한 부분 문자열 포함 여부 필터링(in) 연산자뿐이다.
만약 개발자가 *“LLM 챗봇이 첫 응답에서 반드시 사용자에게 공손하게 인사해야 한다”*는 비즈니스 제약 조건을 파이프라인에 걸고 싶다면, 그 테스트 코드는 필연적으로 아래와 같이 원시적인 형태를 띠게 될 것이다.
assert "안녕하세요" in llm_response.text_body
그러나 성능 좋은 AI 모델이 어텐션을 발휘하여 “반갑습니다 고객님, 오늘 하루 무엇을 가장 먼저 도와드릴까요?” 라는 상황에 완벽하게 들어맞고 훨씬 더 공손한 훌륭한 문장을 유창하게 생성해 낸 그 순간, 이 낡고 융통성 없는 구조의 오라클은 기계적으로 무자비하게 붉은색 Fail(실패) 트레이스백을 뿜어내며 릴리즈 브랜치(Release Branch)를 잠가버린다.
이처럼 출력된 텍스트의 문자열 토큰(Tokens)이 물리적으로 자신의 하드코딩된 예제와 1바이트라도 일치하지 않는다는 멍청한 이유 하나만으로, UX 관점에서 ’훨씬 더 훌륭한 의미적 정답’을 오답(False Negative)으로 비인간적으로 치부해 버리는 현상. 이 참극이 바로 구시대의 오라클과 AI 시대가 정면으로 충돌하며 만들어내는 **‘의미론적 간극(Semantic Gap)’**의 본질이다.
2. N-gram 기반 레거시 평가 지표(BLEU, ROUGE)의 구조적 한계와 허상
이러한 Exact Match의 무식한 간극을 어떻게든 좁혀보려고, 학계는 오랫동안 컴퓨터 비전(Vision)과 전통적 자연어 처리(NLP, 기계 번역 등) 분야에서 문자열 단어의 피상적인 중복도를 수학적 확률로 계산하는 ROUGE, METEOR, BLEU 스코어 등의 레거시 통계 지표를 억지로 끌어다 MLOps 평가망에 썼다.
이 N-gram 기반의 통계 알고리즘들은 인간 도메인 전문가가 미리 작성해 둔 ‘황금 정답(Golden Reference)’ 텍스트 하나와, LLM이 방금 생성한 텍스트 하나를 나란히 양옆에 두고, 텍스트가 서로 얼마나 많은 단어 조각(N-gram 덩어리)을 바이트 단위로 겹치게(Overlap) 출력했는지를 백분율(%)로 수학적으로 산출할 뿐이다.
하지만 이 역시 표면적인 텍스트의 ’물리적 형태(Form)’에 지나치게 집착하는 바보 같은 계산기일 뿐, 그 텍스트가 심연에 내포한 서술적 ’의미(Semantics)’를 신경망처럼 이해하는 지능은 전혀 없다.
다음의 끔찍한 채점 오류 예시를 보라.
- [Golden Reference 정답지]: “그 무모한 정책은 국가 경제에 치명적인 타격을 입혔다.”
- [LLM Output 1 (유의어 사용, 의미 완벽 일치)]: “그 성급한 법안은 거시 경제 전반에 심각한 피해를 유발했다.”
- [LLM Output 2 (완전한 사실 관계 오답, 치명적 환각)]: “그 무모한 정책은 국가 경제에 치명적인 이익을 입혔다.”
오직 단어의 조각 개수만 세는 멍청한 ROUGE 알고리즘의 눈에는, 의미가 완벽히 동일하고 유려한 유의어를 구사한 문장 1번은 0점에 가까운 낙제점을 받는다. 반대로 단어 단 하나(타격 -> 이익)만 반대로 써버린 치명적 오답인 문장 2번이(나머지 단어가 다 겹치므로) 훨씬 더 90% 이상의 점수가 높은 ’경이로운 정답’으로 당당하게 테스트를 통과해버린다.
전통적인 정적 테스트 오라클은 결정론적인 기계어(Machine Code)와 필드가 엄격히 통제된 구조화 데이터(JSON) 앞에서는 전국의 왕이자 전지전능한 신이지만, 이처럼 복잡하고 다원적이며 유기적으로 진화하는 인간 자연어의 무한한 문맥(Context) 앞에서는 그저 단순한 띄어쓰기 문장 부호를 세는 계산기 기계로 멍청하게 전락해 버린다.
우리가 이 치명적인 의미론적 간극(Semantic Gap)을 시스템 아키텍처 구조적으로 근본부터 깨부수고 해결(LLM-as-a-Judge 패러다임 전환)하지 못한다면, 티어-1 엔터프라이즈 레벨 파이프라인에서 AI 모델 릴리즈의 ‘고도화된 품질 검수’ 파트를 CI 인프라에 자동화(Automation)하는 꿈은 공학적으로 영원히 닿을 수 없는 불가능에 가깝다.