Chapter 2. 소프트웨어 테스트에서의 오라클(Oracle) 개념과 AI 시대의 역할
소프트웨어 시스템은 본질적으로 입력(Input)을 받아 처리한 후 출력(Output)을 반환하는 함수적 변환기(Functional Transformer)다. 전통적인 소프트웨어 공학에서 이 변환 과정은 철저히 결정론적(Deterministic)이었다. 즉, 동일한 입력에 대해서는 언제나 동일한 출력을 보장하는 것이 소프트웨어 아키텍처의 절대적인 공리(Axiom)였다.
이러한 결정론적 세계관 위에서 탄생한 것이 바로 소프트웨어 테스트(Software Testing) 방법론이다. 개발자는 assert(function(input) == expected_output) 형태의 유닛 테스트(Unit Test)를 작성하여 코드의 무결성을 증명했다. 여기서 테스트 시스템이 “이 출력이 참(True)인지 거짓(False)인지“를 판별하기 위해 의존하는 절대적인 기준점, 혹은 정답 판별 메커니즘을 소프트웨어 공학에서는 **오라클(Oracle)**이라고 정의한다.
고전컴퓨터 과학의 테스트 오라클은 파일 입출력 비교, 수학적 해답, 혹은 하드코딩된 예상 결괏값의 형태로 시스템 외부에 견고하게 존재했다. 하지만 거대 언어 모델(LLM)을 필두로 한 생성형 AI(Generative AI)가 소프트웨어 시스템의 코어로 편입되면서, 기존의 낡은 오라클 개념은 심각한 도전장(Challenge)에 직면하게 되었다.
AI 시대의 소프트웨어는 결정론을 벗어던지고 확률론(Probabilistic)적인 본성을 지향하기 때문이다. 같은 질문을 던지더라도 모델은 매번 미세하게 다른 문장을 생성하며, 때로는 창의성이라는 명분 아래 치명적인 환각(Hallucination)을 내뱉기도 한다. “대략적으로 맞음(Approximately Correct)“을 반환하는 시스템 앞에서, 단 1바이트의 오차도 허용하지 않았던 전통적인 Exact Match 오라클은 모든 응답을 무차별적으로 ’실패(Fail)’로 간주해버리는 먹통이 되고 만다.
본 장에서는 테스트 오라클의 고전적인 학술적 기원을 되짚어보고, 이 견고했던 개념이 비결정적(Nondeterministic)인 AI 파이프라인과 어떻게 충돌하는지 고찰한다. 더 나아가, 확률적 생성의 시대에 소프트웨어 엔지니어가 시스템에 대한 통제력(Controllability)을 되찾기 위해, 무너진 오라클을 새롭게 정의하고 아키텍처 레벨에서 어떻게 복원해야 하는가에 대한 패러다임적 전환을 다룬다. 기계가 정답을 유추할 수 없게 된 세상에서 인간 엔지니어가 다시금 정답의 기준을 세우는 ’결정론적 오라클의 재건’은, 신뢰할 수 있는 AI 소프트웨어 개발을 향한 첫 번째 단추가 될 것이다.