2.4.1. 결정론적(Deterministic) 출력에서 확률적(Stochastic) 출력으로의 전환

2.4.1. 결정론적(Deterministic) 출력에서 확률적(Stochastic) 출력으로의 전환

소프트웨어 시스템을 평가하는 가장 강력하고 보편적인 잣대는 ’멱등성(Idempotency)’과 ’재현성(Reproducibility)’이었다. 데이터베이스에서 동일한 조건으로 SELECT 쿼리를 던지거나, 동일한 인자(Argument)로 정렬 알고리즘 함수를 호출했다면, 첫 번째 결과와 1만 번째 결과는 바이트(Byte) 단위까지 정확히 일치해야만 한다. 이러한 결정론적(Deterministic) 성질은 우리가 컴퓨터를 신뢰할 수 있는 가장 든든한 기술적 근간이었다.

그러나 거대 언어 모델(LLM)과 생성형 AI 모델이 시스템의 코어 로직으로 이식되면서, 이 보편적인 공학적 상식은 폐기 처분되었다. 언어 모델의 본질은 특정 텍스트 다음에 올 ’가장 적절한 단어의 확률 분포(Probability Distribution)’를 예측하는 통계적 엔진이기 때문이다.

본 절에서는 코드가 산출하는 결과가 결정론에서 확률론(Stochastic)으로 전환됨으로써 발생한 근원적인 테스팅 패러다임의 붕괴 현상과, 이로 인해 참 오라클(True Oracle)이 수학적으로 무력화되는 메커니즘을 해부한다.

1. 샘플링(Sampling)과 온도(Temperature) 파라미터가 낳은 비결정성

전통적 알고리즘이 정해진 분기(Branch)를 따라 단 하나의 목표값을 향해 수렴(Convergence)한다면, LLM은 매 토큰(Token)을 생성할 때마다 다면적인 확률의 주사위를 굴린다. 이 비결정성을 통제하는 핵심 변수가 바로 온도(Temperature)Top-P/Top-K 샘플링 전략이다.

  • 온도(Temperature) T = 0.0: 외관상 가장 결정론에 가까운 상태다. 모델은 매번 확률이 가장 높은(Max Probability) 단어만을 기계적으로 채택한다. (Greedy Decoding)
  • 온도(Temperature) T > 0.0: 모델의 응답에 ‘창의성’ 혹은 ’다양성’을 부여하기 위해 확률 분포를 평탄화(Smoothing)한다. 이 작은 파라미터 조정만으로도 시스템은 동일한 프롬프트 x 에 대해 y_1, y_2, y_3, \dots, y_n 이라는 예측 불가능한 변주곡을 뱉어내기 시작한다.

이러한 확률적 샘플링 기법은 챗봇이 인간처럼 자연스럽게 말하도록 돕는 핵심 요소지만, 테스팅 파이프라인의 관점에서는 시스템의 재현성(Reproducibility)을 영구적으로 파괴하는 원흉이 된다.

2. 멱등성의 붕괴와 회귀 테스트(Regression Test)의 죽음

확률적 출력으로의 전환이 가져온 가장 뼈아픈 타격은 회귀 테스트(Regression Test) 아키텍처의 붕괴다. 회귀 테스트의 본질은 과거에 성공했던 테스트 케이스들의 결과(Golden Output)를 현재 시스템의 결과와 1:1로 대조(Assert Equals)하여 퇴행 여부를 감지하는 데 있다.

비교 속성결정론적 시스템 (예: RDBMS, Rule Engine)확률적 시스템 (예: LLM, GenAI)
입력과 출력의 관계1:1 매핑 (f(x) = y)1:N 매핑 (f(x) \subset \{y_1, y_2, \dots, y_n\})
결과의 일관성1만 번 실행해도 문자열 단위로 완벽히 동일함실행할 때마다 어투, 길이, 구조가 달라짐
테스트 실패 판독과거 결과와 1 Byte라도 다르면 즉시 FAIL과거 결과와 다르다고 해서 FAIL이라고 단정할 수 없음
회귀 테스트 전략단순 문자열 정합성 비교 (String Match)의미론적 동치성(Semantic Equivalence) 검증 필요

LLM 기반의 고객 응대 시스템에서 “비밀번호 초기화 방법 알려줘“라는 입력에 대해, 어제는 “설정 메뉴에서 재설정을 누르세요“라고 답했고, 오늘은 “사용자 환경설정 창에서 비밀번호 변경을 클릭하시면 됩니다“라고 답했다고 가정해 보자.

두 답변은 의미상 완벽히 동일(Pass)하지만, 텍스트 일치 여부(Exact Match)만을 따지는 고전적 체계에서는 이를 가차 없이 ’퇴행(Regression Fail)’으로 오진탈락을 내리게 된다. 확률적 출력 앞에서는 단순 무식한 1:1 비교 오라클이 작동을 멈추는 것이다.

graph TD
    subgraph Deterministic Testing (Traditional)
        I1[$Input_x$] --> SUT1(Rule-based System)
        SUT1 --> O1["Expected Output 'A'"]
        SUT1 -. "Run #2" .-> O1
        SUT1 -. "Run #3" .-> O1
        O1 --> Match{Exact String Match}
        Match -->|True| Pass1((PASS))
    end

    subgraph Stochastic Testing (GenAI)
        I2[$Input_x$] --> SUT2(LLM Engine \n <i>T = 0.7</i>)
        SUT2 --> O2A["Output 1: 'A'"]
        SUT2 -. "Run #2" .-> O2B["Output 2: 'A*'"]
        SUT2 -. "Run #3" .-> O2C["Output 3: 'A**'"]
        
        O2A --> FailMatch{Exact Match?}
        O2B --> FailMatch
        O2C --> FailMatch
        
        FailMatch -->|False Negative| Broken((BROKEN \n False Alarm))
    end
    
    style Pass1 fill:#efe,stroke:#3c3,stroke-width:2px;
    style Broken fill:#fdd,stroke:#d00,stroke-width:2px;

3. 확률론적 공간에서의 오라클 재정의 필요성

과거의 공학자들은 소프트웨어의 품질을 높인다는 것을 **“예외 공간(Variance)을 줄여나가 단 하나의 결정론적 정점(Point)으로 로직을 수렴시키는 과정”**으로 이해했다. 그러나 확률적 출력을 발생시키는 LLM의 시대에는 이 관점 자체가 폐기되어야 한다.

LLM을 사용하는 이상, 아무리 프롬프트(Prompt)를 교묘하게 깎아내고 온도를 0.0 에 수렴하게 만들더라도 GPU 클러스터의 비동기적 부동소수점 병렬 연산 특성에 의해 미세한 비결정성이 필연적으로 새어 나온다.

따라서 현대의 QA 파이프라인과 오라클 아키텍처는 시스템 출력이 하나의 스칼라 값(Scalar)이 아니라, 일정한 확률적 분포도(Probability Distribution)나 의미론적 허용 반경(Semantic Radius) 안에 존재하는 이상 현상(Anomaly)이 아님을 인정하는 쪽으로 방향타를 꺾어야 한다.

결정론의 죽음을 애도하는 대신, 이 확률의 변동성을 어떻게 그물처럼 건져 올려 ’허용 가능한 동치성(Equivalence)’으로 치환할 것인가가 바로 다음 세대 테스트 전략의 핵심이다. 이어지는 절들에서는 이 막막한 확률의 바다 위에서 ’무엇이 과연 정답인가’를 규정하는 모호성(Ambiguity)의 심연을 정면으로 탐구할 것이다.