투고된 희곡 대본을 LLM으로 채점하는 도구를 만들고 있습니다. 대사, 인물, 구성 같은 항목마다 점수를 매기고 근거를 붙이는 일입니다. 프롬프트를 몇 번 고치다 보면 점수는 곧 나옵니다. 문제는 그 다음입니다.

이 점수를 작가에게, 심사위원에게, 투자자에게 보여줄 수 있습니까?

점수를 만드는 것보다 점수를 믿을 근거를 만드는 일이 먼저였습니다. 그 근거를 문서로 남기는 절차가 캘리브레이션이고, 찾아보니 LLM과 함께 등장한 신기술이 아니라 100년 된 측정학 절차였습니다. 이 글은 그 절차를 우리 파이프라인에 어떻게 앉혔는지, 그리고 그 과정에서 가장 자주 헷갈렸던 루브릭과 골든셋의 구분을 정리한 기록입니다.

캘리브레이션 리포트: 100년 된 측정학 절차의 이식

캘리브레이션 리포트는 평가자(사람이든 모델이든)의 점수가 기준과 얼마나 일치하는지를 수치로 남긴 문서입니다. 원래는 계측기 교정 성적서를 뜻하던 말을 평가 영역으로 빌려온 것입니다.

한국어로는 정착된 단일 역어가 없어서 맥락에 따라 나눠 씁니다.

표현 쓰임
채점 기준 보정 가장 무난한 일반 표현
평가 기준 정렬 여러 평가자의 눈높이를 맞춘다는 뉘앙스
채점자 표준화 / 채점자 훈련 교육평가 현장의 실무 용어
루브릭 보정(Rubric Calibration) 문서에는 영문 병기가 가장 안전

출발점은 교육측정학(psychometrics)의 서술형 채점 신뢰도 연구입니다.

  • 1912년 Starch & Elliott: 동일한 답안 한 장을 교사 142명에게 채점시켜, 점수가 크게 갈린다는 것을 실증했습니다.
  • 그 대응으로 나온 것이 앵커 페이퍼(anchor paper)와 채점자 훈련을 묶은 방식입니다.
  • ETS가 SAT/AP 에세이 채점에 이걸 제도화했습니다. 기준 답안을 고르고(range finding), 채점자를 정렬하고(calibration), 그 다음 실채점에 들어갑니다.

LLM 평가는 이 틀에서 사람 자리에 모델을 넣은 것입니다. 새 방법론이 아니라 이식입니다. 이걸 알고 나니 무엇을 리포트에 담아야 하는지도 이미 답이 나와 있었습니다.

항목 의미
상관계수 (Spearman) 순위가 기준과 얼마나 같은가
일치도 (QWK, Krippendorff α) 점수 자체가 얼마나 맞는가
점수 분포 후하게 주는지 박하게 주는지의 편향
재현성 같은 대본을 다시 넣었을 때 흔들리는 폭
항목별 오차 어느 평가 항목이 특히 불안정한가
사람 간 일치도 기준 자체의 신뢰도(반드시 병기)

루브릭과 골든셋: 자와 기준 추

설계하면서 가장 오래 헷갈린 게 이 둘입니다. 둘 다 "기준"이라 불리는데 정체가 다릅니다.

루브릭은 자(尺)이고, 골든셋은 기준 추(標準分銅)입니다.

루브릭은 판단 기준 문서입니다. 단순한 항목 목록이 아니라 항목, 척도, 수준별 서술이 갖춰진 표를 말합니다. 체크리스트와는 이렇게 갈립니다.

체크리스트 루브릭
형태 있다/없다 1~5점
내용 항목만 각 점수가 어떤 상태인지 서술
용도 형식 검증 질적 판단

대본으로 치면 "등장인물 목록 있음"은 체크리스트이고, "대사 자연스러움 3점은 인물 구분은 되나 설명적 대사가 잦은 상태"는 루브릭입니다.

골든셋은 문서가 아니라 데이터입니다. 정답이 붙은 대본 샘플입니다.

루브릭 골든셋
정체 판단 기준 문서 정답이 붙은 대본 샘플
형태 항목 + 척도 + 수준별 서술 대본 20~30편 + 합의 점수 + 근거
대상 모든 대본에 적용 특정 대본들에만 존재
만드는 법 전문가가 설계 전문가가 실제로 채점
바뀌는 빈도 자주(v1.0 → v1.1) 거의 안 바뀜
역할 평가할 때 입력 검증할 때 정답지

관계를 두 줄로 쓰면 이렇습니다.

새 대본  + 루브릭 → LLM → 점수
골든셋   + 루브릭 → LLM → 점수 vs 정답 점수 → 캘리브레이션 리포트

골든셋은 이런 모양입니다.

대본 대사 자연스러움 근거 캐릭터 일관성 근거
A-017 4 2막 3장 부부 대화, 지문 없이 관계가 파악됨 2 주인공이 3막에서 동기 없이 태도 반전
A-023 2 인물 전원이 같은 어투, 설명적 대사 과다 4

핵심은 점수가 아니라 근거 문장입니다. 근거가 있어야 나중에 "왜 틀렸는지" 분석이 됩니다. 그리고 각 점수대의 대표 대본 한두 편은 루브릭에 앵커 예문으로 그대로 박아 넣습니다.

동결: 루브릭은 고치고 골든셋은 두는 이유

루브릭은 계속 고치되 골든셋은 동결합니다.

v1.0과 v1.1 중 어느 쪽이 나은지는 같은 골든셋으로 재야 비교가 되기 때문입니다. 둘을 같이 바꾸면 점수 변화가 루브릭 개선 때문인지 샘플 교체 때문인지 분리되지 않습니다. 골든셋이 낡았다고 느껴지면 고치는 게 아니라 새 골든셋을 추가하고 기존 것은 회귀 테스트용으로 남깁니다.

그럼 루브릭은 언제 고치느냐. 리포트의 어느 숫자가 이상한지에 따라 고칠 자리가 다릅니다.

관찰된 현상 고칠 곳
사람끼리도 일치도가 낮음 기준 자체가 모호. 항목 정의를 쪼개거나 척도 축소(5점 → 3점)
사람은 맞는데 모델만 어긋남 앵커 예문 부족. 해당 점수대 예문 추가
점수가 3점에 몰림 중간값 회피 설계. 짝수 척도 또는 강제 근거 서술
특정 항목 간 상관이 0.9 이상 항목이 사실상 중복. 통합
장르나 분량별로 오차 방향이 다름 단일 루브릭이 무리. 장르별 분기

진단 순서는 사람 간 일치도, 항목 간 상관, 점수 분포 이 셋입니다. 대부분 여기서 잡힙니다.

한 가지 더. 루브릭은 LLM이 고치지 않습니다. 모델이 기준을 스스로 바꾸면 출제자와 채점자가 같아집니다. 캘리브레이션은 고정된 기준과 얼마나 맞는지를 재는 일인데 기준이 움직이면 측정 자체가 무의미해집니다.

주체 역할
LLM 오차 패턴 분석, 수정 문구 초안, 앵커 예문 후보 추출
사람 채택 여부 결정, 버전 부여, 변경 후 재측정

루브릭을 코드처럼 버전 관리하는 이유가 여기 있습니다. 나중에 "이 대본은 어떤 기준으로 평가됐는가"를 소명할 수 있어야 합니다.

과적합: 30편에만 맞는 기준이 되는 길

골든셋 30편에 맞춰 루브릭을 계속 고치면 그 30편에서만 잘 맞는 기준이 됩니다. 신작 투고에는 안 통하는데 리포트의 "상관 0.85"라는 숫자는 오히려 좋아집니다. 머신러닝의 과적합과 같은 구조라서 대응도 같습니다.

용도 원칙
개발셋 (20편) 루브릭 고칠 때 참조 마음껏 반복
홀드아웃셋 (10편) 최종 확인 거의 열지 않음

홀드아웃 점수가 개발셋보다 크게 낮으면 과적합입니다. 이때는 루브릭을 더 고치는 게 아니라 되돌립니다.

수정이 좁아지는 방향인지 명확해지는 방향인지는 문구의 성격으로 구분됩니다.

  • ❌ "부조리극은 대사 자연스러움 항목 완화": 특정 장르를 지목했습니다. 좁아지는 중입니다.
  • ✅ "대사 자연스러움 3점은 인물 구분은 되나 설명적 대사가 잦은 상태": 서술을 정교화했습니다. 명확해지는 중입니다.

사실 애초에 하나의 루브릭으로 모든 희곡을 재려는 시도가 무리입니다. 사실주의극과 부조리극에 같은 "대사 자연스러움" 척도를 대면 부조리극은 무조건 낮게 나옵니다. 그래서 골든셋을 구성하는 단계에서 장르와 형식을 의도적으로 섞고, 오차가 장르별로 갈리면 억지 통합 대신 장르별 분기를 택합니다. 골든셋의 다양성이 곧 루브릭의 적용 범위를 정합니다.

한계: 캘리브레이션은 정확도를 재지 않습니다

캘리브레이션이 재는 값은 정확도가 아니라 골든셋과의 일치도입니다. 골든셋을 만든 심사자가 특정 취향으로 치우쳐 있으면 모델은 그 편향을 그대로 재현하고, 리포트 숫자는 오히려 좋아집니다. 편향이 심할수록 일관되기 때문에 상관계수가 올라갑니다.

그래서 두 가지를 함께 합니다.

  • 골든셋 심사자 구성을 의도적으로 다양화합니다.
  • 사람 간 일치도를 리포트에 항상 병기합니다. 사람끼리도 안 맞는 항목에서 모델만 맞기를 기대할 수 없습니다. 그 항목은 모델 문제가 아니라 루브릭 문제입니다.

정리하면 절차는 이 순서입니다.

  1. 루브릭 확정(항목, 척도, 각 점수대 앵커 예문까지)
  2. 골든셋 구축(심사 경험자 23명이 같은 대본 2030편을 독립 평가)
  3. 사람 간 일치도 측정
  4. 모델 평가 실행(temperature 0, 항목별 호출 분리, 3회 샘플링 후 중앙값)
  5. 지표 산출
  6. 오차 분석(장르, 분량, 번역극 등 어느 구간에서 어긋나는지 분류)
  7. 루브릭과 프롬프트 수정 후 재측정. 5~7을 반복하고 홀드아웃으로 최종 확인
  8. 정기 재캘리브레이션(모델 버전 교체, 투고작 성격 변화 시 필수)

3번에서 막히면 4번으로 넘어가지 않습니다.

파이프라인: LLM은 꼭 필요한 층에만

캘리브레이션이 관리하는 대상은 파이프라인 전체가 아니라 그중 한 층입니다. 전부를 LLM으로 처리하면 비용은 비싸지고 정확도는 낮아집니다. 싼 것부터 층을 나눠 걸렀습니다.

측정 대상 도구 LLM
1 형식, 분량, 인물 수, 지문 형식 룰 기반 파서
2 표절, 자기중복 MinHash + LSH
3 유사 작품 검색 임베딩 + 벡터DB 부분
4 구조 추출(인물, 장별 요약, 대사 분포) 저가 LLM, JSON 출력
5 질적 평가(대사, 캐릭터, 완성도) 고성능 LLM + 루브릭
6 무대화 가능성, 최종 판단 사람

각 층은 앞 층을 통과한 대본만 받습니다. 층이 올라갈수록 건당 비용이 커지므로 아래층에서 걸러내는 양이 곧 운영비가 됩니다.

1층은 품질이 아니라 처리 가능성을 봅니다. 한국 희곡 대본은 형식이 정형화돼 있어 정규식으로 대부분 파싱됩니다.

인물 대사:  ^\s*([가-힣A-Za-z0-9 ]{1,12})\s*[::]\s*(.+)$
지문:      ^\s*[((].+[))]\s*$
장/막:     ^\s*(제?\s*\d+\s*[막장]|막\s*\d+)

여기서 걸러지는 건 파싱 실패, 분량 미달, 깨진 인코딩처럼 5층에 넣어 봐야 의미 있는 결과가 안 나오는 입력입니다. 형식이 깨진 입력은 LLM이 그럴듯한 헛소리를 만들어내기 때문에, 점수가 나오는 쪽이 걸러지는 쪽보다 위험합니다. 다만 설계 원칙은 반려가 아니라 반송입니다. 대부분 작가가 고치면 통과되는 것들이라, 투고 화면에서 업로드 즉시 사유를 구체적으로 알려주고 재업로드를 무제한 허용합니다. 자동 반려는 분량이나 인코딩처럼 다툼의 여지가 없는 항목에만 겁니다.

2층에 LLM을 쓰지 않는 이유는 명확합니다. LLM은 "이거 표절 같은데요"를 근거 없이 만들어냅니다. 표절은 재현 가능하고 반박 가능해야 하므로 결정론적으로 재야 합니다. 1,000편 이하 규모에서는 LSH도 필요 없이 Postgres만으로 충분했습니다.

create table shingles (
  script_id uuid,
  h bigint,          -- 어절 5-gram의 해시
  primary key (script_id, h)
);
create index on shingles (h);
select b.script_id, count(*) as inter
from shingles a join shingles b on a.h = b.h
where a.script_id = $1 and b.script_id <> $1
group by b.script_id order by inter desc limit 10;

Jaccard 유사도는 inter / (|A| + |B| - inter)로 나옵니다. 임계치를 넘으면 일치 구간을 원문 대비로 제시만 하고 판정은 사람이 합니다. 자기 작품 재투고, 공동창작, 공유저작 각색은 전부 정상 케이스이기 때문입니다.

4층이 투자 대비 효과가 가장 큰 층입니다. 8만 자를 통째로 5층에 넣으면 중간부 인식률이 떨어지는데, JSON 요약과 필요한 장면 원문 발췌만 넘기면 품질은 오르고 비용은 내려갑니다. 그리고 이 층에는 1층 파서 결과라는 정답이 이미 있어서 출력을 대조할 수 있습니다.

  • 인물 목록이 파서 결과와 일치하는가
  • 장별 요약 개수가 실제 장 수와 맞는가
  • 인용한 대사가 원문에 실제로 존재하는가(문자열 매칭)

불일치하면 5층으로 보내지 않고 재시도합니다. 이 게이트는 대본을 거르는 장치가 아니라 LLM 출력을 거르는 장치입니다. 환각 방지의 실질적 장치가 이것입니다.

5층이 캘리브레이션의 대상입니다. 여기서 지키는 규칙이 네 가지입니다.

  • 항목별 호출을 분리합니다. 한 프롬프트에서 5개 항목을 동시에 매기면 halo effect로 점수가 다 비슷해집니다.
  • 근거 먼저, 점수 나중입니다. 원문 인용, 판단, 숫자 순서로 뽑습니다. 반대로 하면 사후 합리화만 붙습니다.
  • 앵커 예문이 필수입니다. "3점: 자연스러움" 같은 추상 기준은 무용지물이고, 실제 3점짜리 예문이 두세 개는 있어야 점수가 안정됩니다.
  • temperature 0에 3회 샘플링 후 중앙값을 씁니다. 단발 호출은 재현성이 없어서 서비스에 못 씁니다.

하지 말아야 할 것

설계하면서 "이것도 되겠는데" 싶었다가 접은 것들입니다.

금지 이유
LLM으로 표절 판정 근거 없는 환각. 결정론적 방식만 사용
AI 생성 탐지 기능 오탐률이 높고, 오탐 한 건이 작가와의 신뢰를 끝낸다
종합 점수 하나로 합산 항목별 점수를 유지. 랭킹이 필요하면 용도별로 다르게 가중
LLM이 루브릭 수정 출제자와 채점자가 같아짐. 측정 무효
골든셋 수정 버전 간 비교 불가. 추가만 허용
정량 신호로 자동 반려 형식 실험을 결함으로 오판
작가에게 원점수 공개 분쟁 유발. 서술형 피드백으로 대체

마지막 두 줄을 조금 더 풀면, 4층에서는 이런 정량 신호가 공짜로 나옵니다. 인물 3명 중 1명이 대사의 90%를 차지한다거나, 마지막 장 분량이 앞 장의 5분의 1이라거나, 새 인물이 마지막 장에서 처음 등장한다거나. 결함처럼 보이지만 전부 의도적인 형식 실험일 수 있습니다. 모놀로그극은 장르이고 지문 없는 희곡도 있습니다. 그래서 반려 사유가 아니라 심사자 참고 표시로만 씁니다.

남은 병목

도입 순서는 자연스럽게 정해졌습니다. 1층 파서와 2층 유사도는 골든셋 없이 지금 바로 할 수 있어서 이 상태로 투고를 받기 시작하고, 데이터를 쌓으면서 4층을 붙이고, 골든셋이 모이면 5층과 캘리브레이션에 들어갑니다. 참고로 이용약관의 학습 이용 조항은 소급 적용이 안 되므로 오픈 전에 반드시 넣어야 합니다.

파인튜닝은 한참 뒤입니다. 파인튜닝은 출력 형식과 점수 분포 같은 일관성을 올리지 판단력을 올리지 않고, 데이터 라벨링 인건비가 GPU 비용을 크게 넘어섭니다. 프롬프트와 루브릭으로 한계에 부딪힌 다음에 검토할 일입니다.

결국 남는 병목은 하나입니다. 골든셋 확보입니다. 심사 경험자 두세 명이 같은 대본 20~30편을 독립 평가해야 하고, 실제 부담은 점수 매기기가 아니라 근거 문장 작성입니다. 5층 이후의 모든 것이 여기에 달려 있습니다.