LLMOps 33
드리프트, 운영 리스크로 감지하고 대응하기
드리프트를 모델이 낡았다는 말 하나로만 이해하면 대응 지점이 흐려진다.
근거 · 교안 p123-p127
1장: 드리프트, 단순한 노후화 그 이상의 위험
솔라의 시선이 모니터 화면의 한 문장에 머물러 있었다.
드리프트(Drift): 시간이 지남에 따라 데이터나 모델의 통계적 특성이 변화하는 현상.
분명히 아는 단어고, 이해할 수 있는 문장이었다. 하지만 솔라는 어쩐지 개운하지 않은 기분으로 화면을 껐다. 방금 전 스터디 그룹에서 이 주제로 잠시 이야기가 오갔지만, ‘모델 성능이 떨어지면 재학습하면 된다’는 결론으로 싱겁게 마무리되었던 참이다.
“결국 모델이 낡았다는 소리 아닌가? 그럼 그냥 새 데이터로 다시 학습시키면 해결되는 거 아냐? 왜 이렇게 복잡한 용어를 쓰는 거지?”
혼잣말처럼 중얼거리는 솔라의 목소리에는 답답함이 묻어났다. 그때, 조용히 책을 읽고 있던 언니 루나가 고개를 들었다. 솔라의 표정만 보고도 무슨 생각을 하는지 짐작한 듯했다. 루나는 말없이 일어나 서랍에서 깨끗한 빈 종이 한 장을 꺼내 솔라 앞의 테이블에 놓았다.
“우리, 작년에 아주 성공적인 ‘연말 선물 추천 모델’을 만들었다고 상상해 보자.”
루나가 종이 맨 위에 연말 선물 추천 모델 (작년 버전)이라고 적었다.
“작년엔 경제가 좋아서, 사람들이 비싸고 화려한 선물을 많이 찾았어. 우리 모델은 그 패턴을 정확히 학습해서, 관련 상품을 추천할 때마다 높은 클릭률과 구매 전환율을 기록했지.”
솔라는 고개를 끄덕였다. 거기까진 이상적인 머신러닝 모델의 성공 사례였다.
“자, 그럼 올해가 됐어.”
루나는 종이의 다른 한쪽에 올해 운영 환경이라고 적었다.
“그런데 올해는 상황이 좀 달라. 경기가 위축되면서 사람들이 비싼 선물 대신, 실용적이고 가성비 좋은 상품을 더 많이 찾는다고 가정해 보자. 하지만 우리 모델은 여전히 작년의 데이터를 기반으로 하고 있어.”
“아.” 솔라가 짧은 탄성을 뱉었다. “모델은 계속 비싼 상품을 추천할 테고, 사용자들은 관심이 없을 테니… 모델 성능, 그러니까 예측 정확도가 떨어지겠네. 그럼 이제…”
솔라는 당연하다는 듯 말을 이었다. “새로운 사용자 구매 패턴 데이터를 모아서 모델을 재학습시키면 되겠네.”
그것이 솔라가 생각한 ‘드리프트’에 대한 가장 명쾌한 대응이었다. 하지만 루나는 고개를 젓는 대신, 펜으로 솔라를 가리켰다.
“‘성능 저하’에서 멈추지 말고, 한 걸음만 더 들어가 봐. 솔라 네가 이 추천 서비스를 운영하는 담당자라면, 대시보드에서 어떤 숫자들이 변하는 걸 보게 될까? 그리고 그게 비즈니스에 어떤 의미일까? 이 종이에 한번 그려봐.”
솔라는 잠시 망설이다 펜을 들었다. ‘성능 저하’ 너머의 세상이라니. 막연했다. 그녀는 올해 운영 환경이라고 적힌 부분 아래에 화살표를 그리고 고민하며 적어 내려가기 시작했다.
모델->계속 비싼 선물 추천사용자 반응->추천 상품 불만족, 클릭 X지표 변화->클릭률(CTR) 감소, 구매 전환율 급락
거기까지는 쉽게 예상할 수 있었다. 하지만 루나가 말한 ‘비즈니스 의미’를 생각하자, 다음 단계가 보이기 시작했다. 솔라의 펜 끝이 조금 더 빨라졌다.
매출 영향->주력 추천 상품 매출 급감고객 이탈->'나와 맞지 않는 쇼핑몰' 인식, 재방문율 하락재고 문제->모델이 추천하는 고가 상품 재고는 쌓이고, 정작 고객이 찾는 실속 상품은 품절…
빈 종이 위에 펼쳐진 가상의 시나리오는 생각보다 훨씬 심각했다. 단순한 ‘정확도 하락’이라는 기술적 지표 뒤에는 매출 감소, 고객 이탈, 재고 관리 실패라는 구체적인 비즈니스 손실이 도미노처럼 연결되어 있었다. 솔라는 자기도 모르게 미간을 찌푸렸다.
”…이건 그냥 모델이 낡은 문제가 아니구나.”
한 박자 늦게, 솔라가 입을 열었다.
“단순히 성능이 떨어졌으니 재학습하자는 말로 넘길 게 아니었어. 언제, 어떻게, 그리고 ‘왜’ 성능이 떨어지는지 제대로 파악하지 못하면, 비즈니스에 구멍이 나고 있는데도 원인조차 모른 채 지나칠 수 있겠어. 이걸 감지하고 대응하는 게 MLOps의 핵심 과제라는 말이 이제야 실감 나네.”
솔라의 시선이 처음의 막연한 정의를 떠올릴 때와는 완전히 달라져 있었다. ‘드리프트’는 더 이상 추상적인 개념이 아니었다. 그것은 언제든 터질 수 있는 ‘운영 리스크’ 그 자체였다.
그때, 솔라의 머릿속에 새로운 질문이 떠올랐다. 그녀는 방금 자신이 그린 시나리오를 가리켰다.
“언니, 그런데 이 경우는 ‘사람들의 취향이 변해서’ 생긴 문제잖아. 만약에, 사용자들의 취향이나 경제 상황은 그대로인데, 갑자기 새로운 연령대의 사용자들이 대거 유입되면서 모델의 예측이 빗나가기 시작했다면? 이것도 똑같은 드리프트일까? 원인이 다른데, 그냥 뭉뚱그려서 ‘드리프트’라고 부르고 똑같이 대응해도 되는 걸까?“
2장: 무엇이 변했는가? 데이터, 개념, 모델 드리프트의 본질
솔라의 질문이 채 끝나기도 전에, 루나는 조용히 움직였다. 솔라가 방금 비즈니스 손실 시나리오를 그려냈던 바로 그 종이. 루나는 그 옆의 비어있는 공간에 자를 대고 반듯한 표 하나를 그리기 시작했다. 복잡한 표는 아니었다. 세 개의 행과 세 개의 열로 이루어진, 아홉 개의 빈칸이 전부였다.
루나는 첫 번째 열의 맨 위에 구성요소라고 적고, 그 아래로 입력 (X), 정답 (Y), 관계 (X→Y)라고 채워 넣었다. 그리고 나머지 두 열의 제목으로는 솔라가 방금 던진 두 가지 상황을 간결하게 요약해 적었다. 시나리오 A: 선호도 변화, 시나리오 B: 신규 사용자 유입. 아홉 개의 빈칸이 솔라의 질문에 대한 답을 기다리고 있었다. 어떤 설명도 없이, 루나는 펜을 솔라에게 건넸다.
“언니, 이건…?”
“솔라 네가 답을 한번 채워봐. 각 시나리오에서, 작년 학습 시점과 비교했을 때 이 세 가지 요소가 각각 어떻게 되었을지. ‘변화 없음’ 또는 ‘변화 있음’으로만 간단하게.”
솔라의 질문은 ‘원인이 다른데 똑같이 대응해도 될까?’였다. 하지만 루나가 만든 이 작은 표는 ‘원인’의 정체가 무엇인지 스스로 정의해 보라고 요구하고 있었다. 솔라는 펜을 쥐고 잠시 고민에 빠졌다. 뭉뚱그려 ‘성능 저하’라고 생각했던 현상을 세 개의 구성요소로 분해해서 봐야 했다.
먼저 시나리오 A, 즉 사람들의 선호도가 가성비 중심으로 바뀐 경우를 생각했다.
‘입력(X)은? 연령, 성별, 과거 구매 기록 같은 사용자 정보는 그대로잖아. ‘변화 없음’. 그럼 정답(Y)은? ‘선물을 구매한다’는 최종 행동 자체는 그대로지. ‘변화 없음’. 그런데… 관계(X→Y)는? 예전엔 ‘고가 상품’이라는 입력이 ‘구매’라는 정답으로 이어졌는데, 이젠 아니잖아. 아, 여기가 변했구나.’ 솔라는 관계 (X→Y) 행의 시나리오 A 열에 ‘변화 있음’이라고 적었다.
다음은 시나리오 B, 새로운 연령대의 사용자가 대거 유입된 경우.
‘사용자들의 취향이나 경제 상황은 그대로라고 했으니까, ‘고가 상품’을 ‘구매’로 연결하는 규칙, 즉 관계(X→Y)는 그대로겠네. ‘변화 없음’. 정답(Y)도 ‘구매’라는 행동이니 그대로. 그런데… 입력(X)이? 아, 주 사용자 층이 아니었던 10대 사용자가 늘어나면, ‘연령’ 피처의 분포가 완전히 달라지겠구나. 이건 명백히 ‘변화 있음’이네.’ 솔라는 입력 (X) 행의 시나리오 B 열에 ‘변화 있음’이라고 적었다.
표를 다 채우고 나자, 솔라는 한 박자 늦게 깨달음을 얻었다.
“아…!”
분명 두 시나리오 모두 모델 성능을 떨어뜨리는 ‘드리프트’인데, 문제의 근원이 완전히 다른 곳에 있었다. 하나는 ‘규칙’의 변화였고, 다른 하나는 ‘데이터’의 변화였다.
| 구성요소 | 시나리오 A: 선호도 변화 | 시나리오 B: 신규 사용자 유입 |
|---|---|---|
| 입력 (X) | 변화 없음 | 변화 있음 |
| 정답 (Y) | 변화 없음 | 변화 없음 |
| 관계 (X→Y) | 변화 있음 | 변화 없음 |
“똑같은 드리프트가 아니었어. 성능 저하라는 결과는 같지만, ‘무엇이 변했는가’를 따져보니 원인이 명확하게 구분되네.”
솔라의 말에 루나가 비로소 입을 열었다. 루나는 표에서 ‘변화 있음’이라고 적힌 두 칸을 손가락으로 가리켰다.
“바로 그거야. MLOps에서는 이 차이를 아주 중요하게 다뤄. 시나리오 B처럼 입력 데이터의 분포 자체가 변하는 걸 **데이터 드리프트(Data Drift)**라고 불러. 모델을 만들 때 썼던 재료의 구성비가 달라진 거지. 반면에 시나리오 A처럼, 입력과 정답 사이의 관계, 즉 세상의 규칙 자체가 바뀌는 걸 **컨셉 드리프트(Concept Drift)**라고 하고.”
루나는 잠시 말을 멈췄다가 덧붙였다. “그리고 이 둘의 결과로 나타나는 ‘모델 성능 저하’라는 현상 자체를 **모델 드리프트(Model Drift)**라고 부르는 거야. 열이 나는 건 증상이고, 원인은 바이러스 감염일 수도, 염증일 수도 있는 것처럼.”
솔라는 자신이 채운 작은 표를 다시 들여다보았다. 데이터 드리프트, 컨셉 드리프트, 모델 드리프트. 스터디 그룹에서 무심코 스쳐 지나갔던 단어들이 제자리를 찾았다. 그것들은 단순한 용어의 나열이 아니었다. 문제의 원인을 진단하는 체계적인 질문지였다. ‘데이터가 변했나? 규칙이 변했나?’ 이 질문을 던져야만 ‘재학습’이라는 처방을 내릴지, 아니면 아예 모델의 로직이나 피처를 다시 설계해야 할지 결정할 수 있었다. 그냥 뭉뚱그려서는 절대 알 수 없는 것들이었다.
“그럼 원인을 진단하려면 어디가 변했는지, 이 변화 패턴을 보고 찾아내야 하는 거구나. 들어오는 데이터 자체가 달라졌는지, 아니면 데이터와 정답 사이의 규칙이 달라졌는지. 그냥 ‘성능 떨어졌네’ 하고 넘어가면 안 되는 거였어.”
확신에 찬 솔라의 목소리에 고개를 끄덕이던 루나는 문득 시선을 모델 쪽으로 옮겼다.
“그럼 한 가지만 더 생각해 볼까? 만약 입력 데이터의 분포도, 세상의 규칙도 그대로인데, 우리 모델이 내놓는 ‘예측값’의 분포가 갑자기 이상하게 한쪽으로 쏠리기 시작한다면? 그건 또 뭐라고 불러야 할까?”
3장: 종합적인 시선: 예측값과 드리프트 모니터링
루나의 마지막 질문이 묘한 여운을 남기고 방 안에 떠 있었다. 솔라는 잠시 그 질문을 곱씹었다. 입력 데이터도 그대로, 세상의 규칙도 그대로인데, 모델의 예측값만 이상하게 변한다면?
솔라의 시선은 어느새 두 사람이 함께 채웠던 작은 표로 돌아갔다. 입력 (X)과 관계 (X→Y)의 변화 여부를 따져 데이터 드리프트와 컨셉 드리프트를 구분했던 바로 그 표였다. 그때, 루나가 말없이 펜을 들어 표의 맨 아래에 새로운 행을 추가했다.
모델 예측 (Ŷ)
빈칸이 하나 더 늘어났을 뿐인데, 질문의 무게가 달라졌다. 이전까지의 논의는 모델의 ‘외부’ 환경, 즉 데이터와 현실 세계의 변화에 초점이 맞춰져 있었다. 하지만 이 새로운 행은 오롯이 모델 ‘자신’이 만들어내는 결과물에 대한 질문을 던지고 있었다.
솔라는 펜을 쥔 채 생각에 잠겼다. ‘입력(X)도, 관계(X→Y)도 변화가 없는데 예측(Ŷ)만 변했다면… 이건 그냥 모델이 뭔가 내부적으로 고장 난 거 아닐까? 그럼 결국 모델 성능이 떨어지는 ‘모델 드리프트’랑 같은 말 아닌가?’ 새로운 용어가 필요하다는 사실 자체를 납득하기 어려웠다. 모든 길은 결국 ‘모델 성능 저하’라는 하나의 결과로 이어지는 것 같았다.
솔라의 망설임을 읽은 듯, 루나는 가상의 시나리오를 하나 더 꺼냈다. 이번엔 선물 추천 모델이 아니었다.
“우리가 은행의 대출 승인 모델을 운영하고 있다고 생각해 보자. 과거 데이터를 학습한 결과, 우리 모델은 평균적으로 전체 대출 신청자의 약 10%를 ‘승인’으로 예측하도록 만들어졌어. 이게 실제 우량 고객의 비율을 잘 반영한, 아주 안정적인 상태라고 해보자.”
루나는 솔라가 처음 비즈니스 리스크를 그렸던 빈 종이의 남은 공간에 간단한 그래프를 그렸다. x축은 시간, y축은 예측값의 분포. ‘학습 시점’이라고 표시된 지점에는 ‘승인: 10%’라는 메모가 붙었다.
“그런데 이번 주 대시보드를 보니 이상한 점이 발견됐어. 대출 신청자들의 평균 소득이나 연령대 같은 입력 데이터 분포는 지난달과 똑같아. 갑자기 경제 정책이 바뀌거나 해서 대출 심사 기준이 달라진 것도 아니야. 그런데…”
루나는 ‘현재 시점’이라고 표시한 지점에 점을 찍고, 그 옆에 이렇게 적었다.
모델 예측 결과 → 승인: 30%
“모델이 갑자기 전체 신청자의 30%를 ‘승인’으로 예측하기 시작했어. 이 현상을 어떻게 해석해야 할까?”
솔라는 즉각적으로 반응했다. “일단, 실제로 우량 고객이 갑자기 세 배로 늘었을 리는 없잖아. 그럼 모델이 예전보다 훨씬 관대하게, 즉 위험한 대출을 많이 승인하고 있다는 뜻이네. 이건… 큰일인데?”
“맞아. 큰일이지.” 루나가 고개를 끄덕였다. “그럼 이건 데이터 드리프트일까?”
“아니. 입력 데이터 분포는 그대로라고 했으니까.”
“그럼 컨셉 드리프트?”
“심사 기준, 즉 규칙이 바뀐 것도 아니라고 했으니 그것도 아니지.”
“그럼 우리가 방금 말한 모델 드리프트, 즉 성능 저하일까?”
여기서 솔라는 한 박자 늦게 대답했다. “음… 성능이 저하될 거라는 건 거의 확실해. 하지만 아직 ‘저하되었다’고 말하긴 이르지 않나? 실제로 누가 부도를 냈는지 정답 데이터가 들어오려면 몇 달은 걸릴 테니까.”
바로 그 순간, 솔라는 무언가 깨달았다.
“아! 알겠다! 이건 ‘결과’가 아니라 ‘신호’구나!”
솔라의 목소리가 커졌다. “데이터 드리프트나 컨셉 드리프트는 세상이 변했다는 신호였어. 그런데 이건, 세상은 그대로인데 모델의 ‘행동’이 변했다는 신호야. 아직 실제 부도율이 올라가서 성능 지표(Model Drift)가 잡히기 전에, 모델의 예측값 분포가 먼저 이상 신호를 보내고 있는 거네!”
정답지가 없어도, 모델의 출력값만 보고도 감지할 수 있는 가장 빠른 경고등. 솔라는 이것이 왜 다른 드리프트와 구분되어야 하는지 비로소 이해했다. 루나는 솔라의 말을 받아 정리했다.
“정확해. 그걸 **예측 드리프트(Prediction Drift)**라고 불러. 입력 데이터나 세상의 규칙 변화 없이 모델의 예측값 분포 자체가 학습 당시와 달라지는 현상이지. 이건 다른 드리프트의 결과일 수도 있지만, 때로는 모델 자체의 문제나 이전에는 보지 못했던 데이터 패턴 때문에 독립적으로 발생하기도 해. 중요한 건, 실제 성능 저하가 확인되기 전에 가장 먼저 감지할 수 있는 강력한 ‘조기 경보 시스템’이라는 거야.”
솔라는 이제 네 종류의 드리프트가 각기 다른 질문을 던지고 있다는 것을 알았다.
- 데이터 드리프트: 들어오는 재료가 달라졌는가? (입력 모니터링)
- 컨셉 드리프트: 세상의 규칙이 바뀌었는가? (정답-입력 관계 모니터링)
- 예측 드리프트: 모델의 행동이 이상해지지 않았는가? (출력 모니터링)
- 모델 드리프트: 그래서, 최종 성적표가 나빠졌는가? (성능 모니터링)
이것들은 경쟁하는 개념이 아니라, 서로 다른 시점과 관점에서 모델의 건강 상태를 진단하는 보완적인 지표였다. ‘재학습’이라는 단일 처방으로 뭉뚱그리기엔 너무나 다른 신호들이었다.
“그럼 제대로 된 MLOps 시스템이라면, 이 모든 걸 다 보고 있어야겠네.”
솔라는 깨달음을 행동으로 옮기고 싶어졌다. 그녀는 루나의 동의를 구하지도 않고 새 빈 종이를 한 장 가져왔다. 그리고 맨 위에 이렇게 제목을 썼다.
연말 선물 추천 모델 - 통합 드리프트 모니터링 체크리스트
스스로 MLOps 담당자가 된 것처럼, 솔라는 방금 깨달은 관점들을 하나씩 구체적인 항목으로 바꾸어 적기 시작했다.
1. 입력 데이터 (Data Drift 감지)
- 사용자 연령대 분포가 과거와 크게 달라졌는가? (예: 10대 유입 급증)
- 상품 조회 로그에 이전에 없던 카테고리가 등장했는가?
2. 모델 예측 (Prediction Drift 감지)
- 모델이 추천하는 상품들의 평균 가격대가 갑자기 높아지거나 낮아졌는가?
- 과거 데이터 대비 특정 브랜드 추천이 비정상적으로 쏠리고 있지는 않은가?
3. 모델 성능 (Model / Concept Drift 감지 - 정답 필요)
- 추천 상품의 실제 클릭률(CTR) 및 구매 전환율이 지속적으로 하락하는가?
- 과거에 잘 팔렸던 ‘고가 상품’과 ‘구매’ 사이의 관계가 약해졌는가?
빈 종이 위에 완성된 작은 표. 그것은 더 이상 스터디 노트가 아니었다. 단순한 성능 저하 너머를 보게 된 엔지니어의 관점이자, 비즈니스 리스크를 막기 위한 구체적인 행동 계획이었다. 솔라는 자신이 만든 체크리스트를 보며 나지막이 말했다.
“결국 드리프트 모니터링은 ‘모델이 낡았나?’를 묻는 게 아니었어. ‘무엇이, 어떻게 변하고 있는가?’를 계속해서 질문하는 과정이었구나.”
이제 솔라에게 드리프트라는 단어는 막연한 정의의 나열이 아니었다. 그것은 데이터, 개념, 예측, 그리고 모델의 성능에 이르기까지, 살아 움직이는 시스템을 다각도로 이해하고 진단하는 체계적인 눈을 의미했다.