91% 통과율. 게이트 통과(Green). 배포 완료. 역대 최악의 회귀(Regression).
의도 분류(intent-classification) 테스트에서 91%의 통과율을 기록했습니다. 임계값(threshold)은 90%였습니다. 기준을 통과했고, 코드를 배포했습니다.
그것은 이번 분기 최악의 회귀(regression)였습니다.
문제는 우리의 계산 방식이었습니다. 평가 점수는 몇 주 동안 96% 또는 97%를 유지했습니다. 그러다 한 변경 사항이 특정 슬라이스(slice) 하나를 망가뜨렸습니다. 바로 모호한 환불 요청(ambiguous refund requests) 슬라이스였습니다. 해당 슬라이스의 점수는 98%에서 74%로 급락했습니다.
해당 슬라이스는 전체 트래픽의 4%를 차지합니다. 우리는 평균값만 확인했기 때문에 전체 점수는 91%로만 떨어졌습니다. 게이트는 여전히 통과(green) 상태였습니다.
집계 데이터(Aggregates)는 노이즈 속에 실패를 숨깁니다.
해당 슬라이스의 사용자들은 91%를 경험한 것이 아니라 74%를 경험했습니다. 정적인 임계값(static threshold)은 시스템 전체가 낭떠러지로 떨어지는지는 알려주지만, 시스템의 한 부분이 죽어가고 있는지는 알려주지 않습니다. 96개의 슬라이스가 괜찮고 하나가 무너진다면, 높은 평균값이 그 붕괴를 가려버립니다. 결국 테스트 도구가 아닌 고객 지원 티켓을 통해 오류를 발견하게 됩니다.
우리는 전략을 바꿨습니다. 절대적인 수치로 게이트를 통과시키는 방식을 중단했습니다. 이제는 마지막 성공한 실행(last successful run)을 기준으로 게이트를 설정합니다.
우리는 두 가지 규칙을 사용하며, 두 가지 모두 통과해야 합니다:
- 단일 슬라이스의 점수가 베이스라인(baseline) 대비 3포인트 이상 하락하지 않을 것.
- 전체 집계 점수가 베이스라인 대비 1.5포인트 이상 하락하지 않을 것.
최근의 실패 사례에서 환불 슬라이스는 24포인트나 하락했습니다. 첫 번째 규칙이 있었다면 즉시 잡아냈을 것입니다.
델타 게이팅(delta gating)의 함정을 주의하십시오. 베이스라인이 매 실행마다 업데이트된다면, 서서히 실패를 향해 표류할 수 있습니다. 매일 0.5포인트씩 하락한다면 모든 테스트를 통과하게 됩니다. 그렇게 당신은 서서히 나쁜 제품으로 미끄러져 들어갑니다.
테스트를 개선하려면 다음 단계를 따르십시오:
- 메인 브랜치가 통과(green) 상태일 때만 베이스라인을 업데이트하십시오.
- 점수가 의도적으로 하락하는 경우에는 반드시 사람의 승인을 거치도록 하십시오.
- 베이스라인은 단순히 '마지막에 일어난 일'이 아니라, '정상적으로 작동하는 상태'의 기록이어야 합니다.
- 최근 통과한 5번의 실행 결과에 대한 분산(variance)을 확인하십시오. 특정 슬라이스의 변동 폭이 임계값보다 크다면, 그 임계값은 노이즈에 불과합니다.
- 가장 작은 슬라이스를 테스트하십시오. 집계 데이터가 감지하기 전까지 해당 슬라이스가 얼마나 더 떨어질 수 있는지 확인하십시오. 만약 그 수치가 크다면, 당신의 집계 데이터는 오류를 숨기고 있는 것입니다.
Optional learning community: https://t.me/GyaanSetuAi
