평가 점수가 0.81에서 0.84로 올랐습니다. 당신은 이 변경 사항을 배포했습니다. 다음 주에는 이전 기준선이 다시 승리했습니다.
그 개선은 실제였을까요? 아니면 소수점 자릿수를 가진 노이즈였을까요?
저는 에이전트 작업에서 같은 패턴에 계속 부딪힙니다. 단 하나의 숫자가 측정치로 취급됩니다. 그것은 보통 소수점을 가진 일화입니다.
제가 계속 접하는 6가지 신화와, 사람들이 실제로 필요한 숫자(아이템이 얼마나 자주 바뀌는지)를 보고하는 작은 도구를 소개합니다.
신화 1: 동일한 프롬프트, 동일한 모델, 동일한 출력
호스팅 추론은 함수가 아닙니다. 배치 처리(batching), 샘플링(sampling), 버전 드리프트(version drift)가 있는 서비스입니다.
Temperature zero는 분산(variance)을 줄일 뿐입니다. 분산을 삭제하지 않습니다. 배치 처리와 백엔드 변경 사항들은 여전히 토큰들을 이동시킵니다.
수정된 사고 모델: 모든 호출은 하나의 샘플입니다. 한 번의 호출은 크기가 1인 샘플입니다.
그렇다면 당신의 점수는 무엇이 될까요? 알려지지 않은 분포의 샘플 평균(sample mean)일 뿐입니다.
신화 2: 평균 점수가 실행 결과를 요약한다
평균값은 변화를 숨깁니다. 두 번의 실행 모두 0.80점을 받을 수 있지만, 완전히 다른 아이템에 대해서는 의견이 다를 수 있습니다.
대신 더 날카로운 질문을 하세요. 실행 간에 판결(verdict)이 변경된 아이템은 몇 개입니까?
그 숫자가 변화율(flip rate)입니다. 그것은 당신의 델타가 신호인지 아니면 지터(jitter)인지를 알려줍니다.
평균값은
신화 4: 캐싱과 중복 제거는 눈에 보이지 않는다
프롬프트 캐싱은 속도를 높입니다. 또한 모델이 실제로 보는 것을 변화시킵니다.
중복 제거(Deduplication)는 항목 세트(item set)를 축소합니다. 분모가 바뀝니다. 점수가 공짜로 움직입니다.
보고서마다 항목 수와 입력 파일의 해시 값을 기록하세요. 만약 해시 값이 변경되었다면, 그것은 비교가 아닙니다.
신화 5: 데이터셋이 파일이기 때문에 고정된다
파일은 편집됩니다. 항목이 추가됩니다. 순서가 바뀝니다. 누군가가 조용히 골드 레이블을 수정합니다.
경로(path)가 아닌 해시 값으로 데이터셋을 고정하세요. items.jsonl은 위치일 뿐입니다. SHA-256이 정체성(identity)입니다.
점수가 급증할 때는 먼저 데이터셋 해시를 확인하세요. 그다음 프롬프트 해시를 확인하세요. 그 다음에 모델에 대해 논쟁하세요.
신화 6: 임계값을 넘는다는 것은 개선을 의미한다
0.12의 노이즈 대역(noise band) 안에서 0.03의 변화량은 진전이 아니라 장식입니다.
희망이 아닌 관찰된 분산(observed variance)으로부터 게이트를 설정하세요. 어떤 임계값도 신뢰하기 전에 하니스를 몇 번 실행해 보세요.
그리고 무엇을 비교하고 있는지에 대해 정직해야 합니다. 새로운 프롬프트를 이전 점수와 비교하는 것은 두 개의 다른 주간을 비교하는 것이지, 두 개의 다른 프롬프트를 비교하는 것이 아닙니다.
아티팩트: 플립률(flip-rate) 하니스
아래 스크립트는 각 항목을 여러 번 실행하고 항목별 플립률을 보고합니다. 이는 참고용일 뿐, 벤치마크가 아닙니다. 여러분 자신의 항목과 엔드포인트에 적용해 보세요.
# flip_rate.py - 참고용 하니스입니다. 벤치마크가 아닙니다. 직접 항목을 가져오세요.
import hashlib, json, os, statistics, urllib.request
...
CI에서 다음과 같이 실행하세요:
pip install --quiet jsonschema
RUNS=5 MAX_FLIP=0.2 python flip_rate.py > eval_report.json
코드에 대한 두 가지 참고 사항입니다. seed는 계약이 아니라 힌트이며, 제공업체마다 다르게 취급하므로 자체 문서를 통해 확인하세요. 그리고 이 스크립트는 문제가 있는 항목에서 비제로(non-zero)로 종료되는데, 이는 이를 읽지 않는 대시보드가 아닌 게이트로 만듭니다.
출력 읽기
| 플립 레이트 (Flip rate) | 시사하는 바 | 합리적인 조치 |
|---|
| 0.00 | 이 항목 세트에서 안정적임 | 노이즈 플로어(noise floor) 이상의 변화량에 신뢰를 두세요 |
| ... | | |
| 이러한 대역폭은 측정된 상수(measured constants)가 아니라 시작적인 휴리스틱(heuristic)입니다. 무엇을 강제하기 전에 반드시 자체 세트에서 보정하세요. | | |
무료 엔드포인트와 무료 서버가 적합한 경우
이 하네스(harness)는 설계상 반복적입니다. 여러 항목에 대해 여러 번의 호출과 이를 실행할 장소를 필요로 합니다.
공개: 이 기사는 MonkeyCode의 제품 홍보의 일환으로 준비되었습니다.
운영자는 무료 모델 접근 및 무료 서버 옵션에 대해 설명합니다. 이 두 가지는 정말 유용합니다. 왜냐하면 플립 레이트 측정은 사용자에게 보이는 기능 없이 호출(calls)과 벽시계 시간(wall-clock time)을 소모하기 때문입니다.
무료 엔드포인트는 더 많은 항목에 걸쳐 첫 번째 검토를 할 수 있게 해줍니다. 무료 서버는 루프가 노트북 덮개 외부에서 실행되도록 합니다. 저는 할당량(quotas), 제한 사항(limits), 또는 지속 가능성에 대해서는 말씀드릴 수 없으며, 파이프라인을 구축하기 전에 현재 약관을 확인해야 합니다.
하네스를 가지고 있는 어떤 엔드포인트에도 겨냥하세요. 스크립트는 누가 응답하는지 신경 쓰지 않습니다.
한계점 및 이 접근 방식을 건너뛰어야 하는 경우
이것이 무엇을 하지 않는지 명확히 하세요.
- 플립 레이트가 정확성(correctness)은 아닙니다. 안정적으로 틀린 답변은 플립 레이트가 0입니다.
- 작은 항목 세트는 노이즈가 많은 플립 레이트를 제공합니다. 10개의 항목으로는 소수점 네 자리를 지원할 수 없습니다.
- 반복 실행은 유료 엔드포인트에서 돈, 시간, 그리고 속도 제한 예산(rate-limit budget)을 소모합니다.
- 스스로에게 두 번 동의하는 심사관이 반드시 옳은 것은 아닙니다.
429 에러가 발생하면 멈추고 뒤로 물러나세요. 하네스를 핫 리트라이 루프(hot retry loop) 안에 넣지 마세요.
약 10개 미만의 항목을 가지고 있다면 이 접근 방식을 건너뛰세요. 어떤 답변이든 허용되는 스모크 테스트(smoke tests)를 위해 건너뛰세요. 비교할 정답(ground truth)이 없는 일회성 창의적 작업에는 건너뛰세요.
프롬프트 변경에 결정이 필요하고, 유일한 증거가 계속 흔들리는 숫자일 때 사용하세요.
다음에 물어볼 질문
다음 점수를 인용하기 전에 한 가지를 물어보세요. 만약 제가 오늘 다시 실행한다면, 몇 개의 항목이 바뀔까요?
그것에 답할 수 없다면, 그것은 측정이 아니라 소수점입니다.