1 AI 기반 소프트웨어 개발의 패러다임 변화와 비결정성Nondeterminism의 한계

1 AI 기반 소프트웨어 개발의 패러다임 변화와 비결정성Nondeterminism의 한계

소프트웨어 공학의 역사는 오랫동안 규정과 통제의 역사였다. 입력(Input)이 주어지면 사전에 완벽하게 정의된 절차적 로직(Procedural Logic)을 거쳐 항상 동일한 출력(Output)을 반환하는 결정론(Determinism)은 비즈니스 시스템을 지탱하는 흔들림 없는 기반이었다. 엔지니어들은 이 결정론적 규약 위에서만 단위 테스트(Unit Testing)를 작성하고, 무결성을 입증하며, 예측 가능한 디버깅 환경을 구축해 올 수 있었다.

그러나 인공지능(AI, Artificial Intelligence), 특히 거대 언어 모델(LLM, Large Language Model)이 단순한 보조 도구를 넘어 엔터프라이즈 아키텍처의 중심부이자 핵심 프로세스 제어기(Controller)로 파고들기 시작하면서, 이 견고했던 대전제는 근본적인 위협에 직면했다. AI는 코드를 엄격하게 ‘실행(Execute)’하는 것이 아니라 학습된 확률 분포에 기반하여 다음 토큰을 ‘생성(Generate)’한다. 본 장에서는 전통적 소프트웨어 공학에서 AI 주도 개발로 넘어가는 패러다임의 극단적 변화를 조명하고, AI에 내재된 비결정성이 왜 미션 크리티컬(Mission-Critical)한 실무 환경에서 심각한 한계를 드러내는지 그 기술적 요인을 철저히 해부한다.

1. 확률론적 엔진이 야기하는 통제권의 상실과 불확실성의 도입

기존의 규칙 기반(Rule-based) 소프트웨어 시스템에서 발생한 오류는 원인과 결과의 명확한 인과관계를 가졌다. 시스템에 장애가 발생하면 개발자는 콜스택(Call Stack), 힙 덤프(Heap Dump), 그리고 인프라 로그를 역추적하여 문제를 일으킨 정확한 코드 라인을 짚어낼 수 있는 온전한 통제권을 가졌다. 결함(Defect)은 본질적으로 연역적 탐구의 대상이었다.

반면, 딥러닝(Deep Learning)과 트랜스포머(Transformer) 아키텍처에 기반을 둔 대규모 언어 모델 파이프라인에서 발생하는 환각(Hallucination) 현상이나 갑작스러운 출력 데이터 형식(Output Format)의 일탈은 차원이 다른 문제다. 이는 명시적인 코드의 버그라기보다는, 수십억 개의 파라미터(Parameters)가 상호작용하며 만들어낸 거대한 다차원 확률 분포(Probability Distribution) 상에서 꼬리 현상(Tail Event)이 발현된 것에 불과하다.

이러한 확률적 특성에 기반한 오류는 동일한 입력 환경에서도 재현(Reproduction)되지 않으며, 전통적인 디버거(Debugger)로 추적하는 것 자체가 수학적으로 불가능하다.

매번 답이 달라질 수 있는 비결정론적 컴포넌트를 코어 비즈니스 로직(Core Business Logic)의 판단자로 결합하는 것은, 마천루의 기초 공사에 굳게 양생된 콘크리트 대신 스스로 모양을 바꾸는 유동성 물질을 사용하는 것과 진배없다. 이 통제 불가능한 출력을 철저히 검열하고, 일정한 격벽(Sandbox) 안에 가두어 검증할 수 있는 새로운 아키텍처 원칙이 부재한 엔지니어링 조직은, AI 도입을 통해 생산성을 획득하기도 전에 감당할 수 없는 수준의 기술 부채(Technical Debt)에 압사당할 것이다.

1.1 패러다임 진화 도식화

전통적 아키텍처와 AI 통합 아키텍처의 정보 처리 흐름의 차이를 아래의 다이어그램으로 확인할 수 있다.

graph TD
    subgraph Traditional Deterministic System
        A[Input Data] --> B[Rule-based Logic \n if/else, for loops]
        B --> C[Expected Output A]
        B --> D[Expected Output B]
        C -.- Fixed([100% Reproducible])
    end
graph TD
    subgraph AI Nondeterministic System
        E[Input Data / Prompt] --> F[LLM Probabilistic Engine \n Next Token Prediction]
        F --> G[Output A]
        F --> H[Output A']
        F --> I[Output A'']
        F --> J[Hallucinated Output X]
        G -.- Prob([Variable Distribution])
        J -.- Danger([Risk of System Failure])
    end

2. ‘작동하는 것 같은’ 소프트웨어와 ‘검증된’ 소프트웨어의 치명적 간극

최근 수많은 개발 도구, 프레임워크, 그리고 심지어 AI 코딩 어시스턴트(AI Coding Assistants)들이 자연어 프롬프트 몇 줄로 수십 개의 API를 오케스트레이션(Orchestration)하는 화려한 데모 시스템을 경쟁적으로 쏟아내고 있다. 이러한 AI 기반 기능들은 통상적인 상황, 즉 확률 공간의 중심부(Distribution Center)에 해당하는 90%의 케이스에서는 인간을 능가할 만큼 훌륭하게 작동하는 것처럼 보인다.

그러나 금융(Finance), 의료(Healthcare), 자율 주행, 핵심 인프라 제어 등 나머지 10%, 혹은 단 0.1%의 엣지 케이스(Edge Case)가 전체 비즈니스의 사활(Life and Death)과 직결되는 영역에서는 AI의 기저에 깔린 이 불완전성이 곧 파괴적인 재앙으로 치환된다.

“거의 항상 맞다(Mostly Correct)” 혹은 “대체로 유용하다(Generally Helpful)”는 수식어는 엄밀한 공학(Engineering)의 세계에서 가장 기만적이고 위험한 속임수다. 우리에게 필요한 것은 99번 화려하고 창의적인 정답을 도출하다가 1번 계좌 송금 금액을 임의의 숫자로 오기입하는 AI가 아니다. 우리는 기계가 스스로 확신에 차지 못한 결과나 구조적 결함을 포함한 응답을 생성했을 때, 결코 백엔드의 다음 프로세스로 비정상 데이터를 넘기지 않고 조용히, 그리고 안전하게 파이프라인을 멈춰 세울 수 있는 ‘검증된(Verified)’ 강건한 안전장치(Failsafe)를 구축해야만 한다.

3. 결정론적 오라클(Deterministic Oracle)의 필연성

이러한 안전장치, 즉 파운데이션 모델(Foundation Model)의 무작위적 폭주를 시스템의 경계에서 막아내고 결정론적 정답을 비즈니스 로직에 강제하는 검문소가 바로 본 서적 전체를 관통하여 다루게 될 핵심 개념인 **‘오라클(Oracle)’**이다.

소프트웨어 테스트 이론에서 유래한 ‘오라클(Test Oracle)’은 주어진 입력에 대한 참된(True) 예상 결과를 판별하는 메커니즘을 뜻한다. 확률에 기대어 코드를 생성하고 데이터를 파싱하는 AI 주도 개발의 시대에서, 오라클의 개념은 단순한 테스트 단계를 넘어 시스템의 런타임(Runtime) 생존을 책임지는 방파제(Breakwater)로 격상되어야만 한다.

우리는 이제 AI의 화려한 텍스트 및 코드 생성 능력에 맹목적으로 의존하는 환상을 거두고, 공학자 본연의 차갑고 엄밀한 구조적 설계의 시선으로 기조를 선회해야 한다. 기계가 뱉어내는 모호하고 변덕스러운 응답들을 어떻게 잘게 쪼개고(Decompose), 억압하며(Constrain), 기계가 읽을 수 있는 명세(Machine-readable Specification)로 강제하여 다시 인간의 완벽한 통제(Control) 하에 둘 것인가?

미래의 소프트웨어 엔지니어링 패러다임과 서비스의 성패는 모델의 훈련 데이터 양이나 파라미터의 크기가 아니라, 우리가 모델의 입력과 출력 양단에 엮어 치밀하게 방어할 결정론적 오라클 그물망의 강도에 전적으로 달려 있다.