본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 31. 20:50

AI 검증의 4가지 계층 — 유닛 테스트에서 철학까지

요약

AI가 생성한 코드의 신뢰성을 확보하기 위한 4단계 검증 계층 프레임워크를 소개합니다. 검증 시스템이 가진 구조적 사각지대를 인정하고, 각 계층이 하위 계층의 누락된 부분을 보완하는 체계적인 접근법을 다룹니다.

핵심 포인트

  • 검증 시스템은 자기 자신을 제외한 모든 것을 검증할 수 있다는 구조적 한계가 있음
  • 사각지대를 제거하는 대신 상위 계층으로 밀어내며 보완하는 전략이 필요함
  • 도메인 지식 검증을 포함한 4가지 계층을 통해 빌드 검증 루프를 완성함
  • 단순한 버그 수정을 넘어 시스템적 사각지대를 포착하는 설계가 핵심임

이 글은 단 하나의 질문으로 시작된 시리즈의 일곱 번째 포스트입니다: "AI가 생성한 코드를 어떻게 테스트할 것인가?"

Post 1은 철학적 연쇄를 추적했습니다. Post 2는 이를 전략으로 전환했습니다. Post 3은 운영 사이클을 제공했습니다. Post 4는 5계층 프레임워크를 제시했습니다. Post 5는 압축 불가능한 세 가지 요소를 보여주었습니다. Post 6은 인식론 (Epistemology)을 정리했습니다.

이 포스트는 검증 루프를 완성합니다. 이 글은 다음 질문에 답합니다: AI가 할 수 있는 것과 할 수 없는 것을 알게 되었다면, AI의 출력을 밑바닥까지 실제로 검증 (Verify) 하는 시스템을 어떻게 구축할 것인가?

해결되지 않고 남아있는 문제

모든 검증 시스템에는 사각지대가 존재합니다. 버그가 아니라, 구조적 (Structural) 사각지대입니다.

코드를 린트 (Lint) 한다 → 린터 (Linter) 규칙이 맞는지 누가 검증하는가?
유닛 테스트 (Unit tests)를 작성한다 → 테스트가 올바른 것을 테스트하는지 누가 검증하는가?
코드 리뷰 (Code review)를 한다 → 리뷰어의 판단이 맞는지 누가 검증하는가?

검증 계층을 하나씩 추가할 때마다, 사각지대는 한 단계 위로 밀려납니다. 사각지대를 제거하는 것이 아니라, 단지 이동시킬 뿐입니다.

이것은 시스템의 버그가 아닙니다. 검증 그 자체의 속성입니다: 어떠한 검증 시스템도 자기 자신을 제외한 모든 것을 검증할 수 있습니다.

일반적인 대응 방식은 특정 단계에서 멈추고 사각지대가 존재하지 않는 척하는 것입니다. "시니어 엔지니어의 판단이 최종 결정이다." 혹은 "테스트 스위트 (Test suite)가 정답을 정의한다."와 같은 방식입니다.

두 방식 모두 실용적입니다. 하지만 두 방식 모두 구조적으로 부정직 (Structurally dishonest) 합니다. 왜냐하면 사각지대는 여전히 그곳에 존재하기 때문입니다.

이 포스트는 다른 접근 방식에 대해 다룹니다. 바로 네 가지 계층으로 구성된 빌드 검증 (build verification)이며, 각 계층은 바로 아래 계층이 무엇을 놓치고 있는지조차 모르는 부분을 포착하도록 설계되었습니다.

계층 1: 도메인 지식 검증 (Domain Knowledge Verification)

검증 내용: 이 AI 출력물이 해당 도메인 내에서 정확한가?

수행 주체: 주로 자동화됨. AI가 자체 테스트를 수행할 수 있음.

도구:

  • 형식 검사 (JSON 스키마 검증 (JSON schema validation), 타입 체크 (type checking), 린팅 (linting))
  • 속성 테스트 (Property tests) ("출력이 X와 일치하는가"가 아니라 "출력이 속성 Y를 만족하는가"를 확인)
  • 유닛 테스트 (Unit tests), 통합 테스트 (integration tests), 회귀 테스트 (regression tests)
  • 자동 리뷰 (스타일, 컨벤션, 알려진 패턴)

포착하는 것: 명백한 것들. 구문 오류 (Syntax errors), 누락된 필드, 일관되지 않은 형식, 위반된 제약 조건. 명확하고 이진적인(binary) 정답/오답이 존재하는 것들.

사각지대: 도메인에 적합함 ≠ 정확함.

SQL 쿼리가 모든 구문 검사를 통과하고 적절한 인덱싱을 사용하더라도 여전히 잘못된 결과를 반환할 수 있습니다. 왜냐하면 "이 비즈니스 맥락에서 이 쿼리가 무엇을 의미 하는가"라는 도메인 지식이 그 어떤 린터(linter) 규칙에도 인코딩되어 있지 않기 때문입니다.

이 사각지대는 계층 1에서 해결할 수 없습니다. 규칙을 아무리 추가해도 이를 포착할 수 없습니다. 누락된 지식이 규칙 시스템 안에 없기 때문입니다.

계층 2: 메타-도메인 검증 (Meta-Domain Verification)

검증 내용: 검증 루프(verification loop) 자체가 올바른 실패 모드 (failure modes)를 포착하도록 설계되었는가?

수행 주체: 검증 루프는 인간에 의해 설계됩니다 (계층 3 이상의 판단). 실행은 부분적으로 자동화가 가능합니다 — 속성 검사기 (property checkers), 캘리브레이션 트래커 (calibration trackers), 적대적 테스터 (adversarial testers).

도구:

  • 검증 루프 아키텍처 (L1-L4 자체가 하나의 예시임)
  • 캘리브레이션 트래킹 (Calibration tracking) (우리의 "통과" 결정이 운영 환경에서도 유효했는가?)
  • 속성 검사기 설계 (우리가 올바른 속성을 검사하고 있는가?)
  • 적대적 테스트 스위트 (Adversarial test suites) (경계 탐색 (boundary probing), 일관성 공격 (consistency attacks), 성능 저하 탐지 (degradation detection))
  • 교차 모델 리뷰 (Cross-model review) (서로의 사각지대를 포착하기 위해 서로 다른 모델을 사용)

무엇을 포착하는가: 검증 전략의 허점, 누락된 점검 범주, 테스트 접근 방식의 체계적인 사각지대.

구체적인 예시 — 우리가 구축한 ai-qc 패키지:

# 아님: 출력이 올바른가?
# 오히려: 출력이 우리가 중요하게 생각하는 속성을 만족시키는가?
pipeline = QualityCheckPipeline()
...

레이어 2는 단순히 출력의 정확성만을 확인하지 않습니다. 점검 자체가 작동하고 있는지를 확인합니다. 캘리브레이션 트래커(calibration tracker)는 모든

Layer 2와 Layer 3 사이의 사각지대 (blind spot gap):

Layer 2는 다음과 같이 질문합니다: "우리의 테스트 스위트(test suite)가 이러한 유형의 SQL 쿼리에 대해 알려진 모든 실패 모드(failure modes)를 커버하는가?"
Layer 3는 다음과 같이 질문합니다: "이것이 '표준 SQL 쿼리'라는 *가정(assumption)*이 이 특정 문맥(context)에서도 유효한가?"

Layer 2는 테스트를 테스트합니다. Layer 3는 테스트가 구축된 *프레임(frame)*을 테스트합니다.

실제 사례:

한 AI가 데이터베이스 쿼리를 최적화하기 위한 계획을 생성합니다. Layer 1은 구문(syntax)이 통과되는지, 인덱싱(indexing)이 올바른지를 확인합니다. Layer 2는 테스트 스위트가 일반적인 데이터 분포와 에지 케이스(edge-case) 데이터 분포를 모두 커버하는지 확인합니다. 둘 다 통과합니다.

Layer 3는 무언가를 포착합니다: AI의 최적화 방식은 데이터가 균등 분포(uniformly distributed)라고 가정하고 있습니다. 하지만 실제 데이터는 심하게 왜곡(skewed)되어 있습니다. 이 최적화는 상황을 개선하는 것이 아니라 악화시킬 것입니다.

이것은 Layer 1의 실패가 아닙니다 (SQL은 유효합니다). Layer 2의 실패도 아닙니다 (테스트 스위트는 일반적인 분포에 대해 잘 설계되었습니다). 이것은 **프레임 실패(frame failure)**입니다. AI와 테스트 스위트 모두 확인 절차 없이 균등 분포를 가정했습니다.

그 사각지대: 자연 철학(Natural philosophy)은 프레임 내의 인과관계(causality)와 논리를 점검할 수 있지만, 프레임 자체에 의문을 제기할 수는 없습니다. "우리가 여기서 인과적 추론(causal reasoning)을 사용하는 것이 과연 정당한가?" — 이 질문은 다음 계층의 영역입니다.

Layer 4: 철학적 메타 검증 (Philosophical Meta-Verification)

점검 내용: 우리의 검증 표준(verification standards) 자체가 유효한가? 우리는 애초에 올바른 질문을 던지고 있는가?

수행 주체: 철학적 사고를 훈련받은 인간. 이는 자동화될 수 없습니다. 이 계층의 핵심 목적 자체가 인간에 의해 설계된 프레임워크(frameworks)에 의문을 제기하는 것이기 때문입니다.

도구:

  • 논리적 일관성 (Logical consistency) — AI의 출력물에서 명제(propositions)를 추출하여 숨겨진 모순이 있는지 확인합니다. 단순히 표면적인 'A이면서 동시에 A가 아닌' 상태가 아니라, 함축된 의미를 확인합니다. 예: A이면 B이다(A→B)라고 했는데, 동시에 B가 아니라고(not-B) 한다면, 시스템은 A를 거부해야 합니다.
  • 인식론적 교정 (Epistemological calibration) — AI의 확신(confidence)이 실제 증거를 바탕으로 합리적인 사람이 부여할 법한 수준과 일치하는가? 아니면 '교정된 확신(calibrated confidence)'이 아니라 단지 말투만 확신에 찬 '스타일적 확신(style confidence)'인가?
  • 프레임 분석 (Frame analysis) — AI가 문제를 설정하는 방식(framing)에 어떤 가정이 내재되어 있는가? 누구의 관점이 기본값(default)으로 취급되는가? 언급되지 않음으로써 보이지 않게 된 트레이드오프(trade-offs)는 무엇인가?
  • 변증법적 테스트 (Dialectical testing) — AI의 결론에 대해 가능한 가장 강력한 반론을 생성하여, AI의 논리가 이를 견뎌낼 수 있는지 확인합니다.

포착하는 것: 가장 깊은 수준의 실패 — 출력물 자체의 오류가 아니라, 우리가 '정답(correctness)'을 어떻게 _정의_하는가에 대한 실패.

구체적인 예시:

한 AI가 다음과 같은 비즈니스 전략을 생성합니다: "효율성을 높이기 위해 인력의 15%를 해고하십시오." 아래의 모든 계층은 통과합니다: 데이터는 유효하고, 재무 모델은 작동하며, 논리는 일관적입니다.

4계층은 다음과 같이 질문합니다: "이 권고안에는 어떤 윤리적 프레임워크(ethical framework)가 내재되어 있는가?"

단순히 "해고가 윤리적인가"를 묻는 것이 아닙(이는 지나치게 단순한 해석입니다). 4계층은 **누구의 관점이 기본값인가?**를 묻습니다. AI의 학습 데이터에는 "비상장 기업의 해고 없는 성공적인 회생 사례"보다 "상장 기업의 성공적인 해고 사례"가 더 많이 포함되어 있습니다. AI는 선택지들에 대한 중립적인 분석을 바탕으로 권고하는 것이 아니라, 학습 데이터에 존재하는 사례의 분포를 바탕으로 권고하고 있는 것입니다.

이것이 권고 자체를 틀렸다고 만드는 것은 아닙니다. 다만 그 권고를 **검토되지 않은 상태(unexamined)**로 만듭니다. 4계층은 암묵적인 것을 명시적으로 드러내어, 인간이 다음과 같이 결정할 수 있게 합니다:

"알겠습니다. 이 권고안은 주주 가치를 최우선 지표로 가정하고 있군요. 저는 직원의 복지와 조직 지식의 유지(retention) 또한 주요 요인으로 고려하고 싶습니다. 수정해서 다시 실행하세요."

전체 스택 (The Full Stack)

   출력물 진입
        │
        ▼
...

피드백 루프 (The Feedback Loop)

이것은 일방향 파이프라인이 아닙니다. 모든 계층은 아래 계층으로 피드백을 전달합니다:

  • 현실(Reality)이 L4에게 말합니다: "당신의 철학적 프레임워크(Philosophical framework)가 무언가를 놓쳤습니다." → L4는 프레임 분석(Frame analysis)을 업데이트합니다.
  • L4가 L3에게 말합니다: "당신은 여기서 인과적 추론(Causal reasoning)이 유효하다고 가정하고 있습니다 — 그 가정을 확인하세요." → L3는 인과성 검증(Causality-validation) 단계를 추가합니다.
  • L3가 L2에게 말합니다: "수학적 증명(Math proofs)은 통과했지만, AI가 한 섹션에서 다른 단위 체계(Unit system)를 사용한 것을 발견했습니다." → L2는 속성 검사기(Property checker)에 단위 일관성(Unit-consistency)을 추가합니다.
  • L2가 L1에게 말합니다: "보정 추적(Calibration tracking) 결과, 우리의 단순 타입 체크(Simple type checks)가 실패 사례의 12%를 놓치고 있습니다." → L1은 세 가지 새로운 체크 카테고리를 추가합니다.

이것이 바로 "학습 시스템으로서의 검증(Verification as a learning system)" — 그 완전한 버전입니다.

각 계층은 단순히 아래 계층을 검사하는 것에 그치지 않습니다. 아래 계층을 가르칩니다. 그리고 현실은 모든 계층을 가르칩니다.

왜 이것이 철학으로 이어져야 하는가

이 4계층 구조는 설계상의 선택이 아닙니다. 검증의 본질에 의해 강제된 것입니다.

계층 1은 "출력이 올바른가"를 다룹니다 → 하지만 올바름은 맥락(Context)에 달려 있습니다 → 계층 2는 "맥락이 일치하는가"를 다룹니다 → 하지만 맥락은 프레임(Frame)에 의해 정의됩니다 → 계층 3은 "프레임이 논리적으로 타당한가"를 다룹니다 → 하지만 논리는 공리(Axioms)에 달려 있습니다 → 계층 4는 "우리의 공리가 정당한가"를 다룹니다 → 공리는... 현실에 의해 정당화됩니다.

각 계층은 아래 계층이 해당 계층 수준에서는 해결할 수 없는 사각지대(Blind spot)를 가지고 있기 때문에 존재합니다. 계층 1의 규칙을 더 많이 추가한다고 해서 계층 1을 완벽하게 만들 수는 없습니다. 왜냐하면 그 사각지대는 누락된 규칙의 문제가 아니라, 분석 수준(Level of analysis) 자체가 누락된 문제이기 때문입니다.

이 재귀(Recursion)는 철학에서 종료됩니다. 왜냐하면 철학은 프레임워크를 체계적으로 질문하는 학문이기 때문입니다. 프레임워크를 파괴하기 위해서가 아니라, 그 가정을 명시적으로 드러내어 가정이 기본값으로 상속되는 대신 검토되고 선택될 수 있도록 하기 위함입니다.

그리고 철학은 현실에서 종료됩니다. "나의 철학적 프레임워크가 올바른가"에 대한 최종적인 답은 언제나 다음과 같습니다: "그것을 세상에 내놓고, 어떤 일이 일어나는지 지켜보라." 이것은 철학의 실패가 아닙니다. 그것은 어떤 검증 시스템이라도 내놓을 수 있는 가장 정직한 답변입니다.

지금까지의 시리즈

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0