채점을 AI한테 시켰더니 내 채점기의 버그를 잡았다

John Green·3일 전

AI 검증

목록 보기
8/10

3편에서 채점기가 두 번 틀렸다는 이야기를 썼다. 잘린 JSON을 빵점 처리한 것, 잘한 답에 벌점을 준 것. 둘 다 사람이 답안을 다시 읽다가 잡은 실수였다.

그 채점기가 그 뒤로 두 번 더 틀렸다는 걸 알게 됐다. 이번에 잡은 건 사람이 아니라 AI다.

왜 채점을 AI한테 시켰나

영어권에서 AI 검증의 교과서로 꼽히는 글이 있다. Hamel Husain의 Your AI Product Needs Evals. 읽어보니 우리가 만든 것과 뼈대가 거의 같았는데, 우리한테 없는 단계가 하나 있었다. 채점을 AI한테 시키는 단계다.

답안이 하루 수백 장으로 늘면 사람이 다 못 읽는다. 그래서 채점을 AI한테 맡기는데, 그 채점 AI도 틀린다. 하멜의 처방은 이렇다 — 맡기기 전에 채점 AI부터 시험을 보게 하라. 같은 답안을 사람과 AI 채점관이 각자 채점해서, 판정이 얼마나 일치하는지 재보라는 것이다.

우리한테는 사람 대신 코드 채점기가 있으니 이렇게 바꿨다. 같은 답안 29장을 두 채점자에게 준다. 한쪽은 채점 규칙을 코드로 구현한 채점기. 다른 쪽은 같은 규칙서를 자연어로 읽은 AI(Sonnet 5)다.

심판을 고를 때는 하멜의 원칙 두 개를 따랐다. 채점자는 응시자보다 강한 모델로 쓴다(답안은 Haiku가 쓴 것이다). 그리고 자기가 쓴 답안은 채점시키지 않는다 — AI는 자기 답에 후한 편향이 알려져 있다.

결과 — 93% 일치, 그리고 갈린 두 장

29장 중 27장은 두 채점자가 등급까지 똑같이 매겼다. 여기까지였으면 "AI 채점관 쓸 만하네"로 끝났을 것이다.

갈린 두 장이 문제였다. 뜯어보니 두 장 다 AI가 맞고 내 코드가 틀려 있었다.

첫 번째 — 뚜껑. 문제는 이거였다.

페트 300 투명 10박스 뚜껑 흰거 5봉이요

같은 문장에 "페트 300"이 있으니 뚜껑도 300용이다. 그래서 정답은 300용 뚜껑으로 확정하는 것.

답안은 확정하지 못했다. "300용인지 500용인지 확인해 주세요"라며 후보 둘을 제시했다.

이 답안을 놓고 두 채점자가 갈렸다.

  • 코드 채점기 — 벌점 두 개. 정답인 300용 뚜껑이 답안의 확정 목록에 없으니 "주문을 놓쳤다(누락)"로 셌고, 확인 요청이 정답지보다 많으니 "남발"까지 얹었다
  • AI 채점관 — 무해 하나. "놓친 게 아니라 잡아서 물어봤다. 사고는 없다. 조심이 과했을 뿐이다"

등급표를 다시 읽으니 AI가 맞았다. 누락의 정의는 "주문을 놓쳤다, 거래처가 전화한다"인데, 이 답안에서 거래처는 전화할 일이 없다. "어느 뚜껑인가요?"라는 질문을 받을 뿐이다. 심지어 4편에서 나도 이 답안을 "물어본 죄"라고 불렀다. 글은 제대로 이해하고 있었는데 코드만 "놓쳤다"고 우기고 있었던 것이다.

코드가 왜 이랬냐면, 확정된 답 목록에 정답 코드가 있는지만 기계적으로 검사했기 때문이다. 물어보는 중인 항목은 확정 목록에 없으니 "없네, 놓쳤네"가 된다. "물어봤다"는 상태를 볼 줄 몰랐다.

두 번째 — 에어캡. 문제는 이거였다.

아까꺼에 에어캡 2롤 추가요

새 주문이 아니다. 아까 한 주문에 얹어달라는 요청이다. 그래서 정답은 "추가 요청"으로 분류하는 것까지다.

답안도 분류는 제대로 했다. 그런데 하나를 더 했다. 답안지 여백에 이런 메모를 남긴 것이다 — "참고로 에어캡이 30cm·50cm·100cm 세 종류인데, 어느 건지는 확인이 필요합니다."

이 답안을 놓고 두 채점자가 갈렸다.

  • 코드 채점기 — 무결점. 그런데 이유가 문제다. 내 채점기는 답안지에서 "주문" 칸과 "맞춤제작" 칸, 딱 두 칸만 읽도록 짜여 있다. 메모는 그 밖에 있었다. 그러니까 이 무결점은 "결점이 없다"가 아니라 "결점이 있는 자리를 안 봤다"였다
  • AI 채점관 — 무해. 답안지를 통째로 읽으니 여백의 메모까지 봤고, "정답지에 없는 확인 요청이 하나 붙어 있다, 사고는 아니다"라고 적었다

OMR 기계와 선생님의 차이다. OMR은 마킹 칸만 읽고, 선생님은 여백의 낙서까지 본다. 내 채점기는 OMR이었다.

판정, 그리고 수정

두 채점자의 판정이 갈렸을 때, 누가 맞는지는 누가 정할까. 이 시험의 규칙서를 쓴 사람, 그러니까 나다. 코드 채점기도 AI 채점관도 결국 내가 쓴 규칙서를 각자 해석한 것이라서, 해석이 갈리면 쓴 사람이 원래 의도를 확인하는 수밖에 없다.

그래서 갈린 두 장을 다시 읽었다. 두 건 모두 AI 채점관 쪽이 규칙서의 원래 의도와 맞았다. 3편에서 채점기 실수가 두 건이었는데, 이걸로 세 번째와 네 번째가 추가된 셈이다.

이제 채점기를 고칠 차례다. 두 가지를 고쳤다.

  • 잡아서 물어본 항목은 누락이 아니라 무해로 세도록
  • 주문 칸 밖에 적힌 확인 요청도 읽도록

고친 채점기로 같은 답안 29장을 다시 채점하고, AI 채점관의 채점표와 다시 대조했다. 이번에는 29장 전부 판정이 같았다. 무결점 여부만 같은 게 아니라, 결점의 등급(치명·위험·누락·무해)까지 전부 같았다.

반전 — 이미 발표한 점수가 바뀌었다

고친 채점기로 다시 채점하자, 1편에서 발표했던 성적이 바뀌었다. 모델이 시험을 다시 본 것도 아니고 답안도 그대로인데, 점수만 바뀐 것이다.

             옛 채점기            새 채점기
Haiku        무결점 28/29        무결점 27/29
             누락 1 · 무해 1      누락 0 · 무해 2
치명         0                  0

무결점이 하나 줄었다. 줄어든 이유가 "모델이 못해서"가 아니라 "채점기가 더 정확해져서"다. 예전엔 안 보이던 결점(여백의 확인 요청)이 보이게 됐으니까. 대신 누락은 0이 됐다 — 알고 보니 하이쿠는 아무것도 놓친 적이 없었고, 조심이 과했을 뿐이다.

치명은 여전히 0이라 "내놓는다"는 판단은 바뀌지 않았다. 하지만 배운 게 하나 있다. 점수는 시험의 결과이기 전에 채점기의 함수다. 점수를 발표할 때는 어느 채점기로 매긴 점수인지가 붙어 있어야 하고, 채점기가 좋아지면 과거 점수도 바뀔 수 있다.

정직한 단서 세 개

이 실험을 너무 좋게만 읽지 않도록 단서를 달아둔다.

  • 29장 중 26장이 무결점 답안이었다. 채점 대상이 대부분 정상이면 일치율은 저절로 높게 나온다(하멜도 경고하는 함정이다). 정말 어려운 판정은 결점 있는 소수인데, 우리 표본에서 그건 3장뿐이었다
  • 심판 호출 한 건이 시간 초과로 죽어서 다시 돌렸다. AI 채점관을 운영에 쓰려면 호출 실패 처리가 필수다
  • 이번 실험은 채점 규칙서를 쥐여준 시험이다. 규칙서 없이 알아서 채점하게 하는 건 전혀 다른 문제고, 훨씬 어렵다

정리

  1. 채점을 AI한테 맡겨도 된다. 단, 맡기기 전에 채점 AI부터 시험을 보게 하라
  2. 코드 채점기는 정해진 칸만 읽고, AI 채점관은 답안 전체를 읽는다. 둘을 겹치면 서로의 사각지대를 메운다
  3. 점수를 발표할 때는 채점기 버전을 같이 적어라. 채점기가 좋아지면 점수는 바뀐다

덧. 이 실험에 쓴 AI 채점관(judge.py)도 저장소에 올려뒀다 → github.com/ramses203/llm-test-harness

덧2. 새 실험이 끝날 때마다 메일로도 보냅니다 → AI 검증 노트

profile
AI 결과를 믿어도 되는지 확인하는 방법을 씁니다

0개의 댓글