3편에서 채점기가 두 번 틀렸다는 이야기를 썼다. 잘린 JSON을 빵점 처리한 것, 잘한 답에 벌점을 준 것. 둘 다 사람이 답안을 다시 읽다가 잡은 실수였다.
그 채점기가 그 뒤로 두 번 더 틀렸다는 걸 알게 됐다. 이번에 잡은 건 사람이 아니라 AI다.
영어권에서 AI 검증의 교과서로 꼽히는 글이 있다. Hamel Husain의 Your AI Product Needs Evals. 읽어보니 우리가 만든 것과 뼈대가 거의 같았는데, 우리한테 없는 단계가 하나 있었다. 채점을 AI한테 시키는 단계다.
답안이 하루 수백 장으로 늘면 사람이 다 못 읽는다. 그래서 채점을 AI한테 맡기는데, 그 채점 AI도 틀린다. 하멜의 처방은 이렇다 — 맡기기 전에 채점 AI부터 시험을 보게 하라. 같은 답안을 사람과 AI 채점관이 각자 채점해서, 판정이 얼마나 일치하는지 재보라는 것이다.
우리한테는 사람 대신 코드 채점기가 있으니 이렇게 바꿨다. 같은 답안 29장을 두 채점자에게 준다. 한쪽은 채점 규칙을 코드로 구현한 채점기. 다른 쪽은 같은 규칙서를 자연어로 읽은 AI(Sonnet 5)다.
심판을 고를 때는 하멜의 원칙 두 개를 따랐다. 채점자는 응시자보다 강한 모델로 쓴다(답안은 Haiku가 쓴 것이다). 그리고 자기가 쓴 답안은 채점시키지 않는다 — AI는 자기 답에 후한 편향이 알려져 있다.
29장 중 27장은 두 채점자가 등급까지 똑같이 매겼다. 여기까지였으면 "AI 채점관 쓸 만하네"로 끝났을 것이다.
갈린 두 장이 문제였다. 뜯어보니 두 장 다 AI가 맞고 내 코드가 틀려 있었다.
첫 번째 — 뚜껑. 문제는 이거였다.
페트 300 투명 10박스 뚜껑 흰거 5봉이요
같은 문장에 "페트 300"이 있으니 뚜껑도 300용이다. 그래서 정답은 300용 뚜껑으로 확정하는 것.
답안은 확정하지 못했다. "300용인지 500용인지 확인해 주세요"라며 후보 둘을 제시했다.
이 답안을 놓고 두 채점자가 갈렸다.
등급표를 다시 읽으니 AI가 맞았다. 누락의 정의는 "주문을 놓쳤다, 거래처가 전화한다"인데, 이 답안에서 거래처는 전화할 일이 없다. "어느 뚜껑인가요?"라는 질문을 받을 뿐이다. 심지어 4편에서 나도 이 답안을 "물어본 죄"라고 불렀다. 글은 제대로 이해하고 있었는데 코드만 "놓쳤다"고 우기고 있었던 것이다.
코드가 왜 이랬냐면, 확정된 답 목록에 정답 코드가 있는지만 기계적으로 검사했기 때문이다. 물어보는 중인 항목은 확정 목록에 없으니 "없네, 놓쳤네"가 된다. "물어봤다"는 상태를 볼 줄 몰랐다.
두 번째 — 에어캡. 문제는 이거였다.
아까꺼에 에어캡 2롤 추가요
새 주문이 아니다. 아까 한 주문에 얹어달라는 요청이다. 그래서 정답은 "추가 요청"으로 분류하는 것까지다.
답안도 분류는 제대로 했다. 그런데 하나를 더 했다. 답안지 여백에 이런 메모를 남긴 것이다 — "참고로 에어캡이 30cm·50cm·100cm 세 종류인데, 어느 건지는 확인이 필요합니다."
이 답안을 놓고 두 채점자가 갈렸다.
OMR 기계와 선생님의 차이다. OMR은 마킹 칸만 읽고, 선생님은 여백의 낙서까지 본다. 내 채점기는 OMR이었다.
두 채점자의 판정이 갈렸을 때, 누가 맞는지는 누가 정할까. 이 시험의 규칙서를 쓴 사람, 그러니까 나다. 코드 채점기도 AI 채점관도 결국 내가 쓴 규칙서를 각자 해석한 것이라서, 해석이 갈리면 쓴 사람이 원래 의도를 확인하는 수밖에 없다.
그래서 갈린 두 장을 다시 읽었다. 두 건 모두 AI 채점관 쪽이 규칙서의 원래 의도와 맞았다. 3편에서 채점기 실수가 두 건이었는데, 이걸로 세 번째와 네 번째가 추가된 셈이다.
이제 채점기를 고칠 차례다. 두 가지를 고쳤다.
고친 채점기로 같은 답안 29장을 다시 채점하고, AI 채점관의 채점표와 다시 대조했다. 이번에는 29장 전부 판정이 같았다. 무결점 여부만 같은 게 아니라, 결점의 등급(치명·위험·누락·무해)까지 전부 같았다.
고친 채점기로 다시 채점하자, 1편에서 발표했던 성적이 바뀌었다. 모델이 시험을 다시 본 것도 아니고 답안도 그대로인데, 점수만 바뀐 것이다.
옛 채점기 새 채점기
Haiku 무결점 28/29 무결점 27/29
누락 1 · 무해 1 누락 0 · 무해 2
치명 0 0
무결점이 하나 줄었다. 줄어든 이유가 "모델이 못해서"가 아니라 "채점기가 더 정확해져서"다. 예전엔 안 보이던 결점(여백의 확인 요청)이 보이게 됐으니까. 대신 누락은 0이 됐다 — 알고 보니 하이쿠는 아무것도 놓친 적이 없었고, 조심이 과했을 뿐이다.
치명은 여전히 0이라 "내놓는다"는 판단은 바뀌지 않았다. 하지만 배운 게 하나 있다. 점수는 시험의 결과이기 전에 채점기의 함수다. 점수를 발표할 때는 어느 채점기로 매긴 점수인지가 붙어 있어야 하고, 채점기가 좋아지면 과거 점수도 바뀔 수 있다.
이 실험을 너무 좋게만 읽지 않도록 단서를 달아둔다.
덧. 이 실험에 쓴 AI 채점관(judge.py)도 저장소에 올려뒀다 → github.com/ramses203/llm-test-harness
덧2. 새 실험이 끝날 때마다 메일로도 보냅니다 → AI 검증 노트