8.6 AI 결과 평가와 사람 검수 설계 - 정답 세트, 지표, 임계값, 표본 검수
정답 세트를 만들고 작업별 지표(CER, 정밀도·재현율)로 결과를 재는 방법, 신뢰도 임계값을 정답과 비교해 정하는 코드, 표본 검수 크기 계산, 검수 큐 설계와 품질 감시를 실행 결과와 함께 설명합니다.
#평가 없이 도입하면 생기는 일
AI 메타데이터를 도입하고 몇 달 뒤 흔히 듣는 말은 "검색 결과가 이상하다"입니다. 그런데 무엇이 얼마나 이상한지 측정해 둔 적이 없으면 모델 탓인지, 입력 문제인지, 임계값 문제인지 구별할 수 없습니다. 평가는 도입 전에 기준선을 만들고, 도입 후에는 품질이 변했는지 감지하는 도구입니다.
#1단계: 정답 세트(golden set)
평가의 시작은 사람이 만든 정답입니다.
- 자기 소재에서 뽑습니다. 장르(뉴스, 다큐, 예능, 스포츠), 잡음 환경, 화질을 고르게 섞습니다. 가장 쉬운 소재만 뽑으면 점수만 좋아집니다.
- 작게 시작해도 됩니다. 처음에는 음성은 장르별 10분, 화면 문자는 장르별 100프레임 정도라도 기준선이 생깁니다. 규모는 뒤에 계산하는 표본 크기를 참고해 늘립니다.
- 정답의 일관성을 확인합니다. 두 사람이 같은 샘플에 따로 정답을 달고 불일치가 얼마나 나는지 보면, 정답 자체의 모호함(키워드를 어디까지로 볼 것인가)이 드러납니다.
- 고정하고 버전을 붙입니다. 모델을 바꿔도 같은 정답으로 비교해야 합니다. 정답을 고치면 새 버전으로 관리합니다.
#2단계: 작업별 지표
| 작업 | 지표 | 비고 |
|---|---|---|
| 음성 인식 | CER(공백 무시), 필요하면 WER | 8장 2편 |
| 화면 문자 | CER + 숫자·날짜 완전 일치율 | 아래 설명 |
| 키워드·태그 | 정밀도, 재현율, F1 | 아래 코드 |
| 장면 설명 | 사람의 합격/불합격 판정 | 자동 지표보다 표본 검수가 현실적 |
| 검색 | 상위 K개 안에 정답이 있는 비율 | 질문-정답 쌍을 만들어야 함 |
#지표가 가리는 것: 글자 오차율과 숫자 일치율
8장 3편의 화면 문자 인식 결과를 다시 보겠습니다. 4프레임 중 정답이 있는 3프레임의 CER은 0.0%, 0.0%, 2.7%로 평균 약 0.9%(글자가 없는 프레임은 제외)였습니다. 이 수치만 보면 거의 완벽합니다. 그러나 정확하게 읽어야 하는 숫자·날짜 값만 따로 세면 이야기가 달라집니다.
| 값 | 정답 | 인식 | 일치 |
|---|---|---|---|
| 방문객 수 | 3만여 명 |
3만여 명 |
O |
| 스코어 | 3 : 2 |
3 : 2 |
O |
| 경기 시간 | 38:12 |
38:12 |
O |
| 거리 | 2.4km |
2.4km |
O |
| 시각 | 17:42 |
17:42 |
O |
| 날짜 | 2026.10.28 |
2026 10.28 |
X |
숫자·날짜 값의 완전 일치율은 6개 중 5개(83%) 입니다. CER 0.9%는 "글자 몇 개가 틀림"이지만, 날짜 한 칸이 틀리면 해당 값은 쓸 수 없습니다. 숫자와 날짜처럼 정밀해야 하는 값은 평균 오차율 대신 값 단위 완전 일치율을 따로 관리하세요.
#정밀도·재현율·F1
키워드나 태그를 뽑는 작업에는 정밀도와 재현율을 씁니다.
- 정밀도: 모델이 낸 것 중 정답인 비율(잘못 낸 것이 많으면 낮음)
- 재현율: 정답 중 모델이 찾아낸 비율(놓친 것이 많으면 낮음)
- F1: 두 값의 조화평균
def prf(pred, gold):
norm = lambda xs: {x.replace(" ", "") for x in xs}
p, g = norm(pred), norm(gold)
tp = len(p & g)
prec = tp / len(p) if p else 0.0
rec = tp / len(g) if g else 0.0
f1 = 2 * prec * rec / (prec + rec) if prec + rec else 0.0
return prec, rec, f1
8장 5편에서 LLM이 만든 키워드 6개를, 제가 대본을 읽고 정한 정답 키워드 6개(광화문광장, 가을 축제, 공예 장터, 야간 영상 상영회, 세종대로 통제, 체험 부스)와 비교했습니다.
정밀도 0.833 / 재현율 0.833 / F1 0.833 (모델 6개 중 5개가 정답과 일치)
모델이 낸 시민 인터뷰는 정답에 없고, 정답의 체험 부스는 모델이 내지 않았습니다. 그런데 이 정답 자체가 저 한 사람의 판단입니다. 시민 인터뷰도 합리적인 키워드일 수 있습니다. 완전 일치 비교는 이처럼 동의어나 상위 개념을 오답으로 처리하므로, 지표는 같은 정답과 같은 방식으로 비교하는 추세 확인용이고 절대 점수로 해석하면 안 됩니다.
#3단계: 신뢰도와 임계값
많은 엔진이 결과마다 신뢰도(confidence) 를 줍니다. 이 값으로 자동 등록 / 검수 / 폐기를 나눕니다.
def route(conf, auto=0.90, review=0.60):
"""신뢰도에 따라 처리 경로를 정한다. 경계값은 평가 데이터로 정한 뒤 고정한다."""
if conf >= auto:
return "auto" # 자동 등록(표본 검수 대상)
if conf >= review:
return "review" # 사람 검수 큐
return "discard" # 폐기 또는 재처리
0.95 → auto, 0.90 → auto, 0.75 → review, 0.60 → review, 0.30 → discard
0.90, 0.60이라는 숫자가 문제입니다. 엔진이 말하는 신뢰도는 정확도와 다릅니다. 신뢰도 0.9라고 해서 10건 중 9건이 맞는다는 보장이 없습니다. 임계값은 정답 세트에서 실제 맞은 비율을 보고 정합니다.
def pick_threshold(samples, target=0.95):
"""samples: [(신뢰도, 정답 여부)]. 정밀도가 target 이상이 되는 가장 낮은 임계값을 찾는다."""
for th in sorted({c for c, _ in samples}):
sel = [ok for c, ok in samples if c >= th]
if sel and sum(sel) / len(sel) >= target:
return th
return None
samples = [(0.95, 맞음), (0.92, 맞음), (0.90, 맞음), (0.85, 틀림), (0.80, 맞음), (0.70, 틀림), (0.60, 틀림)]
pick_threshold(samples, target=0.95) → 0.90 ← 0.90 이상 3건이 모두 맞음(정밀도 100%)
위 표본은 설명용 가상 값입니다. 실제로는 정답 세트가 충분히 커야 임계값이 안정적이며(표본이 7건이면 의미가 없습니다), 모델이나 소재 유형이 바뀌면 임계값도 다시 정해야 합니다. LLM이 스스로 말하는 "확신도"는 보정이 안 된 경우가 많으므로, LLM 결과에는 모델 자체의 신뢰도보다 8장 5편의 검증 통과 여부와 같은 외부 기준을 쓰는 편이 안전합니다.
#4단계: 자동 등록분의 표본 검수
자동 등록(auto)된 결과도 무작위 표본을 사람이 확인해야 합니다. 임계값이 어긋나거나 입력 소재가 바뀌어도 알아차릴 수 있는 유일한 방법입니다. 표본 크기는 오차 범위로 정합니다.
n = z² · p(1−p) / e² (z=1.96은 95% 신뢰수준, p=0.5는 가장 보수적인 가정, e는 허용 오차)
| 허용 오차 | 필요한 표본 수 |
|---|---|
| ±5% | 385건 |
| ±10% | 97건 |
계산 결과입니다(올림). 예상 비율이 0이나 1에 가까워 p(1−p)가 작아지면 표본을 줄일 수 있지만, 처음에는 보수적으로(p=0.5) 잡습니다. 이 계산은 독립적인 무작위 표본을 전제로 한 근사값입니다. 전체가 수백 건뿐이라면 유한 모집단 보정으로 더 줄일 수 있습니다. 장르별로 따로 보고 싶으면 장르마다 표본을 뽑아야 하므로 필요한 수가 늘어납니다.
#검수 큐 설계
검수는 사람의 시간이 드는 일이므로 화면 설계가 비용을 좌우합니다.
| 항목 | 설계 |
|---|---|
| 상태 | pending → approved / edited / rejected (누가, 언제 했는지 기록) |
| 보여 주는 것 | 결과 텍스트와 해당 시점의 영상(앞뒤 몇 초), 신뢰도, 모델 이름·버전 |
| 조작 | 키보드로 승인·수정·반려(수백 건을 처리하므로 마우스만으로는 느림) |
| 우선순위 | 신뢰도가 경계값 부근인 것, 사용 빈도가 높은 소재를 먼저 |
| 환류 | 수정·반려 결과를 정답 세트에 추가하고, 같은 유형의 오류가 반복되면 후처리 규칙이나 프롬프트를 개선 |
| 원본 보존 | 수정해도 AI의 원래 결과는 남겨 둠(9장 1편) |
#5단계: 운영 중 품질 감시
- 주 단위 표본 정밀도를 기록해 두고 하락하면 알림을 줍니다.
- 모델이나 프롬프트를 바꿀 때는 정답 세트로 먼저 돌려 이전과 비교하고(회귀 테스트, 7장 5편과 같은 방식), 나빠진 항목이 있으면 적용을 보류합니다.
- 입력 소재의 특성이 바뀌는 경우(새 프로그램, 새 카메라, 오디오 구성 변경)를 변경 이벤트로 기록하면 품질 변화의 원인을 찾기 쉽습니다.
#정리
- 평가는 자기 소재의 정답 세트에서 시작합니다. 작아도 기준선이 됩니다.
- 평균 지표(CER 0.9%)는 정밀해야 하는 값의 오류(날짜 1개 틀림, 값 단위 일치율 83%)를 가릴 수 있으므로 작업에 맞는 지표를 함께 봅니다.
- 신뢰도 임계값은 정답 세트의 실제 정밀도로 정하고, 자동 등록분도 표본 검수합니다(±5%에 385건, ±10%에 97건).
- 검수 결과는 정답 세트로 돌려보내 평가와 개선의 고리를 닫습니다.