개념
모델이 아니라 파이프라인이 시험 대상이다
ISTQB CT-AI v2.0이 5장(입력 데이터 시험)·6장(모델 시험)·7장(ML 개발 시험)을 서로 다른 장으로 떼어 놓은 이유가 여기 있다. 운영에서 "모델이 이상하다"로 보고되는 사건의 상당수는 모델 가중치가 아니라 모델 앞뒤의 배관 에서 생긴다. 어제까지 멀쩡했던 추천이 오늘 망가졌을 때 바뀐 것은 가중치가 아니라 상류 테이블의 컬럼 타입, 결측 비율, 또는 사용자 구성이다. 그래서 첫 작업은 파이프라인을 구간으로 자르고 구간마다 "무엇이 깨지면 여기서 걸려야 하는가" 를 적는 것이다.
여섯 구간과 구간별 시험 지점
| 구간 | 깨지는 전형 | 시험 지점 |
|---|---|---|
| 수집 | 상류 스키마 변경, 지연 적재, 중복 이벤트 | 스키마 계약 검사, 적재 지연 SLO, 유일키 중복률 |
| 전처리·피처 | 학습·서빙 변환 코드 불일치, 결측 규칙 변경 | 피처 동등성 검사, 피처 분포 경계 검사 |
| 학습 | 분할 누수, 시간 역전, 시드·버전 미고정 | 분할 규칙 검증, 재학습 재현성, 환경 핀 |
| 평가 | 테스트 세트 오염, 단일 지표 보고 | 홀드아웃 격리 증명, 코호트별 지표 |
| 배포 | 모델·변환·전처리 버전 조합 불일치 | 세 버전 조합의 핀, 쉐도우·카나리 판정 기준 |
| 모니터링 | 경보 과다로 무시, 레이블 지연 | 검출기 임계값, 프록시 지표, 경보 소음률 |
마지막 행의 경보 소음률 이 QA가 가장 자주 놓치는 항목이다. 검출기를 붙이는 것은 데이터 엔지니어가 하지만 그 경보가 믿을 만한가 를 판정하는 것은 테스트 활동이다. 울리고도 아무 일 없던 경보가 10회 연속이면 그 검출기는 이미 꺼진 것과 같다.
피처 동등성 — 가장 자주 터지고 가장 잘 숨는 결함
학습은 배치 파이프라인에서, 서빙은 실시간 코드에서 피처를 만든다. 두 구현이 조금씩 다른 상태를 학습-서빙 스큐(training-serving skew) 라고 부른다. 전형은 이렇다.
학습 배치 0원을 log1p(0)=0 으로 / 서빙 코드 0원을 결측으로 보고 중앙값 대치
학습 배치 "미분류" 를 별도 범주로 / 서빙 코드 미지의 값으로 보고 0 벡터
학습 배치 가입 경과일을 배치 실행일 기준 / 서빙 코드 요청 시각 기준 (최대 24시간 차)오프라인 평가가 학습 쪽 피처를 쓰므로 이 결함은 평가에서 절대 안 잡힌다. 시험 방법은 하나다 — 같은 원본 레코드를 두 경로에 흘려 피처 벡터를 바이트 단위로 비교한다. 샘플 수백 건으로 충분하고, 회귀 스위트에 상시로 걸어 둔다.
드리프트 네 갈래 — 이름을 구분해야 대응이 갈린다
"드리프트"로 뭉뚱그리면 대응을 고를 수 없다. 변하는 것이 무엇인지로 나눈다.
입력 분포가 변함 P(X) 변화 데이터 드리프트(공변량 시프트)
정답 비율이 변함 P(y) 변화 사전 확률 시프트(라벨 시프트)
입력-정답 관계가 변함 P(y|X) 변화 컨셉 드리프트
구조 자체가 변함 스키마·단위 변경 상류 변경 (드리프트가 아니다)마지막 줄을 먼저 떼어 놓는다. 컬럼이 밀리거나 단위가 원에서 천원으로 바뀐 것은 통계 현상이 아니라 계약 위반 이다. 검출기가 아니라 스키마 검사로 잡고, 재학습이 아니라 상류 롤백으로 고친다. 드리프트로 분류하면 잘못된 데이터로 재학습하는 최악의 경로에 들어간다.
데이터 드리프트와 컨셉 드리프트의 차이 를 예로 못 박아 둔다.
| 구분 | 예시 | 모델이 여전히 맞는가 |
|---|---|---|
| 데이터 드리프트 | 신용 심사 모델에 20대 신청자 비중이 10%→35%로 증가 | 20대 구간을 잘 학습했다면 맞을 수 있다 |
| 컨셉 드리프트 | 금리 급등으로 같은 소득·부채 조합의 연체율이 2배가 됨 | 틀린다 — 입력은 그대로인데 정답이 변했다 |
데이터 드리프트는 "주의" 신호고, 컨셉 드리프트는 "재학습" 신호다. 데이터 드리프트만으로 재학습을 돌리면 멀쩡한 모델을 흔든다. 반대로 컨셉 드리프트를 분포 거리로만 보려 하면 영원히 못 본다 — 입력 분포는 변하지 않았으니까.
탐지 — 레이블 없이 보는 것과 레이블로 보는 것
이 둘이 완전히 다른 도구다.
1) 분포 거리 — 레이블 없이, 즉시
| 지표 | 성격 | 실무 메모 |
|---|---|---|
| PSI | 구간을 나눠 비율 차이를 합산 | 금융권 모델 모니터링의 사실상 표준. 구간 수에 민감 |
| KS 통계량 | 두 누적분포의 최대 차이 | 연속형 단변량에 간단. 꼬리 변화에 둔함 |
| JS 발산 | 분포 간 대칭 거리, 유계 | 0 빈도에 안정적. 범주형에 쓰기 좋음 |
| 도메인 분류기 | 과거·현재를 구분하는 분류기의 AUC | 다변량을 한 숫자로. 0.5에 가까우면 변화 없음 |
PSI 임계값으로 흔히 인용되는 구간(0.1 미만 안정 / 0.1~0.25 주의 / 0.25 초과 조치)은 신용 스코어링 관행에서 온 경험값 이고 표준 문서의 규정값이 아니다. 안정 기간의 자기 PSI 분포를 먼저 재서 임계값을 잡는 것이 맞다.
2) 성능 기반 — 레이블이 와야, 늦게
정확도·AUC·F1의 하락을 직접 본다. 가장 믿을 만하지만 레이블 지연(label latency) 이 벽이다. 연체 여부는 90일 뒤, 이탈은 30일 뒤에 확정된다. 그 공백을 메우는 프록시는 예측 확률 분포의 변화(출력 드리프트), 사람 검토로 뒤집힌 비율, 후속 행동 지표(추천 클릭률, 자동 승인 후 취소율)다.
프록시는 보조 신호다. 프록시가 울렸을 때 실제 성능 하락이 뒤따랐는지 를 기록으로 남겨, 프록시 자체의 적중률을 관리해야 한다. 이것이 모듈 38 레슨 3에서 LLM 판정자를 보정했던 것과 같은 구조다 — 측정 도구를 먼저 검증한다.
경보가 소음이 되는 지점
피처가 200개인 모델에 단변량 검정을 피처마다 돌리고 유의수준 0.05를 쓰면, 아무 변화가 없어도 기대상 10개가 울린다. 이것이 드리프트 모니터링이 2주 만에 무시되는 가장 흔한 경로다. 통제 장치는 세 개다 — 다중검정 보정(Bonferroni 또는 Benjamini-Hochberg FDR), 관찰 기간(1회 위반이 아니라 "5일 중 3일" 규칙), 피처 등급(모델 기여도 상위 피처만 경보, 나머지는 집계 보고).
세 번째가 특히 효과가 크다. SHAP 기여도 상위 20개 피처에만 경보를 걸면 소음이 급감하면서 놓치는 것은 거의 없다. 설명가능성 출력을 모니터링 설계에 쓰는 예인데, 그 출력 자체를 어떻게 믿을지는 레슨 4에서 다룬다.
분할이 깨지는 다섯 가지 전형
평가 숫자가 운영에서 재현되지 않는 사건은 대부분 여기서 시작한다.
| 전형 | 어떻게 생기나 | 예방 |
|---|---|---|
| 타깃 누수 | 정답을 사후에 알아야 채워지는 컬럼이 피처에 들어감 — "연체 여부"를 예측하는데 "독촉 발송 횟수"가 피처에 있다 | 피처별 시점 정의를 명시. AUC가 0.99면 기뻐할 일이 아니라 의심할 일이다 |
| 전처리 누수 | 스케일러·결측 대치를 전체 데이터로 fit 한 뒤 분할 | 분할을 먼저 하고 학습 분할만으로 적합, 테스트에는 transform 만 |
| 그룹 누수 | 같은 사용자·기기·문서가 양쪽에 들어감. 한 사용자가 행 100개를 만드는 데이터에서 무작위 분할을 하면 거의 확실히 발생 | 사용자 id 기준 그룹 분할 |
| 시간 역전 | 미래 데이터로 학습해 과거를 예측. 시계열·수요 예측에서 무작위 분할을 쓰면 자동으로 생김 | 시간 기준 분할과 전진 검증(walk-forward) |
| 중복 행 | 원본 중복으로 같은 레코드가 양쪽에 들어감 | 분할 전 유일키 중복률 측정·기록 |
QA가 할 수 있는 검사는 생각보다 구체적이다. 분할 결과물에서 (a) 사용자 id 교집합이 0인가, (b) 테스트 구간의 최소 시각이 학습 구간의 최대 시각보다 큰가, (c) 행 해시의 교집합이 0인가 를 자동 검사로 걸면 다섯 가지 중 셋을 잡는다.
재학습 루프를 시험 대상으로 보기
적응형 AI 시스템(CT-AI 4.1.1)의 핵심 위험은 모델이 바뀌는 경로 자체가 검증되지 않은 것 이다. 재학습 트리거부터 적는다.
| 트리거 | 장점 | 위험 |
|---|---|---|
| 일정 기반 | 운영이 단순, 예측 가능 | 필요 없을 때도 돌아 모델이 흔들린다 |
| 드리프트 기반 | 변화에 반응 | 오탐으로 돌면 오염 데이터로 학습한다 |
| 성능 기반 | 가장 정당한 근거 | 레이블 지연만큼 늦다 |
| 데이터량 기반 | 소량 데이터 시작 단계에 적합 | 양이 품질을 보증하지 않는다 |
실무에서는 성능 기반을 1순위로, 드리프트 기반을 보조 조건으로 두고 "성능 하락이 확인되거나, 드리프트가 연속 조건을 만족하고 데이터 품질 검사를 통과했을 때"로 합성한다. 트리거 조건식 자체가 테스트 대상이다 — 과거 데이터를 넣어 언제 돌았어야 했는가 를 역산하면 민감도가 보인다.
재학습이 오히려 악화시키는 경우
이 절이 이 레슨에서 가장 실무적이다. 재학습은 중립적인 행위가 아니다.
1) 오염된 최신 데이터로 학습한다. 상류 장애로 결측이 급증한 기간을 "최신 데이터"로 학습하면 모델이 장애를 정상으로 배운다. 재학습 입력에 데이터 품질 게이트를 먼저 걸어야 한다.
2) 피드백 루프가 자기 출력을 학습한다. 추천 모델이 노출한 항목만 클릭 로그에 남고, 그 로그로 재학습하면 노출 안 된 항목은 영원히 배우지 못한다. 사기 탐지에서 차단된 거래의 실제 결과를 알 수 없는 것도 같은 구조다. 탐색 비율(일부 무작위 노출)이 없으면 재학습이 편향을 증폭한다.
3) 레이블이 편향된 표본만 돌아온다. 사람이 검토한 건만 레이블이 생기고, 검토는 모델이 애매하다고 표시한 건에 집중된다. 그 표본으로 재학습하면 쉬운 구간이 조용히 내려간다. 최근 3개월만 쓰면 분기에 한 번 나오는 희소 클래스가 빠지는 것도 같은 계열이다.
4) 전체 평균은 올랐는데 특정 코호트가 내려간다. 가장 자주 일어나고 가장 늦게 발견된다. 챔피언-챌린저 비교를 코호트별로 하지 않으면 보이지 않는다. 새 모델을 기존 모델과 같은 평가 세트로 재지 않고 배포하는 것은 재학습이 아니라 도박이다 — 백투백 비교와 쉐도우 배포가 최소 요건이다.
롤백 가능성 — 세 가지를 같이 고정해야 돌아간다
모델만 되돌리면 복구가 안 된다. 되돌릴 대상은 (1) 모델 아티팩트 버전, (2) 학습 시점과 동일한 피처 변환·전처리 코드 버전, (3) 입력 데이터 스키마·참조 테이블 스냅샷 셋이다. 조합이 기록돼 있지 않으면 "2주 전 모델로 돌려"가 실행 불가능한 요청이 된다.
그리고 롤백은 리허설해 본 것만 작동한다. 분기마다 한 번, 운영 시간이 아닌 때에 직전 버전으로 되돌려 보고 복구 소요 시간을 잰다. 모듈 38 레슨 5의 배포 게이트 기록에 이 숫자를 함께 남긴다.
실무에서 왜 필요한가
AI 기능이 들어간 제품에서 QA가 가장 자주 받는 질문은 "지금 모델 괜찮아요?"다. 정확도 숫자 하나로 답하면 다음 질문에 막힌다. 어떤 구간이 변했는지, 변한 것이 입력인지 관계인지, 재학습을 해야 하는지가 다 다른 답을 요구한다. 구간 표와 드리프트 네 갈래가 그 질문을 답할 수 있는 크기로 쪼갠다.
조직 안에서의 효용도 분명하다. 데이터 과학자는 모델을, 데이터 엔지니어는 적재를, 플랫폼은 배포를 본다. 구간 사이의 틈 — 학습-서빙 스큐, 분할 규칙, 롤백 조합 — 은 아무도 소유하지 않는다. 그 틈이 사고가 나는 자리이고, 구간을 가로질러 보는 역할은 QA 말고 없다.
규제 쪽 요구와도 직결된다. 레슨 5에서 볼 EU AI Act의 고위험 시스템 의무에는 데이터 거버넌스와 시판 후 모니터링이 들어 있다. 드리프트 모니터링 설계와 재학습 판정 기록이 그 의무에 제출하는 증거의 실체다 — 필요해졌을 때 만드는 것이 아니라 평소에 남아 있어야 하는 것이다.