LLM 엔지니어링20장 · LLM 평가와 모니터링9 / 22← 이전목차다음 →MetaContents

20장. LLM 평가와 모니터링

모델 드리프트

동네 식당 옆에 대학교 기숙사가 새로 생기면, 손님층이 바뀌고 주문하는 메뉴도 바뀝니다. 메뉴판과 요리사가 그대로여도 "맛없다"는 평이 늘 수 있습니다. 모델은 그대로인데 세상이 바뀌는 것, 이것이 드리프트입니다.

데이터 드리프트, 개념 드리프트, 모델과 환경의 변화의 세 가지를 나란히 놓은 비교 그림

그림의 왼쪽은 들어오는 질문이 바뀌는 데이터 드리프트입니다. 가운데는 같은 질문의 바른 답이 바뀌는 개념 드리프트입니다(대출 권수가 5권에서 7권으로). 오른쪽은 모델 서버의 판이나 설정이 바뀌는 일입니다(12장에 Ollama 가 저절로 업데이트되었습니다). 새 손님층이 데이터 드리프트, 바뀐 메뉴 정책이 개념 드리프트입니다.

드리프트 견주기

종류예알아채는 법대응
데이터 드리프트새 서비스(지하철역 스마트 도서관) 질문이 늘었다질문 분포, 처음 보는 질문의 비율문서를 보태고 평가 묶음을 늘린다
개념 드리프트대출 권수 규정이 바뀌었다평가 묶음의 점수, 사용자 반응문서와 참조 답을 고친다
모델·환경 변화서빙 엔진이 업데이트되었다판 기록, 같은 묶음의 점수판을 고정하고 바뀌면 다시 잰다

분포가 바뀌는 모습

Python
from collections import Counter

# 두 기간에 들어온 질문의 주제(예시)
before = ["대출"] * 6 + ["열람실"] * 3 + ["주차"] * 1
after = ["대출"] * 4 + ["열람실"] * 2 + ["주차"] * 1 + ["스마트 도서관"] * 3
for name, xs in [("전", before), ("후", after)]:
    c = Counter(xs)
    # 결과: 주제마다의 비율. '후' 에는 전에 없던 주제가 생겼다
    print(name, {k: round(v / len(xs), 2) for k, v in c.items()})

코드에 나오는 함수

코드쉬운 뜻
["대출"] * 6'대출' 을 6번 담은 목록을 만든다. 질문 6개의 주제가 대출이라는 예시다
Counter(xs)주제마다 몇 번 나왔는지 센다
c.items()(주제, 개수) 짝을 하나씩 꺼낸다
round(v / len(xs), 2)개수를 전체 수로 나눠 비율로 만들고 소수 둘째 자리까지 반올림한다

이 코드가 뜻하는 것

분식집이 지난주와 이번 주 주문표 열 장씩을 놓고 메뉴별로 세어 보는 일과 같습니다. 이번 주에는 전에 없던 신메뉴 주문이 섞여 있습니다. 여기서 주문표가 before, after 목록이고, 메뉴가 질문의 주제입니다.

줄하는 일쉽게 말하면
before = ..., after = ...두 기간의 주제 열 개씩을 만든다지난주, 이번 주 주문표
c = Counter(xs)주제마다 센다메뉴별로 세기
{k: round(v / len(xs), 2) ...}비율로 바꾼다열 장 가운데 몇 장인지

결과에서 대출은 0.6 에서 0.4 로 줄고, 전에 없던 '스마트 도서관' 이 0.3 으로 생겼습니다. 주차는 0.1 로 그대로입니다. 이 비율 두 묶음을 숫자 하나로 견주는 법이 다음 절의 PSI 입니다.

주의할 점

  • 드리프트가 곧 나쁜 것은 아닙니다. 새 주제가 늘었으면 서비스가 쓰이는 범위가 넓어진 것입니다. 품질 지표와 함께 봅니다.
  • 개념 드리프트는 질문 분포만 봐서는 보이지 않습니다. 질문은 같은데 답이 바뀌기 때문입니다. 평가 묶음과 사용자 반응으로 잡습니다.
← 이전 절20장 · RAG 는 나눠서 잰다다음 절 →20장 · 드리프트를 재는 법