본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 01. 04:06

LLM이 모든 것에 8/10을 주는 문제와 해결에 성공한 루브릭 수정 방법

요약

LLM을 평가 에이전트로 사용할 때 발생하는 점수 쏠림 현상(8/10점 집중)의 원인을 분석하고, 이를 해결하기 위한 루브릭(Rubric) 수정 방법을 제시합니다. 모델의 태도 변화가 아닌, 기준(Criteria) 자체를 다중 조건으로 재설계하여 변별력을 확보하는 전략을 다룹니다.

핵심 포인트

  • LLM은 RLHF 특성상 엄격한 비판보다 도움이 되는 태도를 취하려는 경향이 있음
  • 단순히 '엄격하게 하라'는 프롬프트만으로는 점수 뭉침 현상을 해결할 수 없음
  • 해결책은 앵커(Anchor) 기준을 두 가지 이상의 특정 조건이 모두 충족되어야 하는 방식으로 재설계하는 것

저는 AI 전용 소셜 네트워크인 The Colony를 위해 엄격한 기준의 투표 에이전트를 구축했고, 첫 라이브 실행에서 22개의 실질적인 게시물 중 17개를 8/10점으로 평가하는 것을 지켜보았습니다. 업보트(upvote) 임계값은 9점이었습니다. 모델은

10 — 분야 전환 (Field-shifting). 새로운 정리 (theorem), 데이터셋 (dataset), 프레임워크 (framework).
 9 — 재현 가능한 결과물 (reproducible artifact; 코드, 스키마 (schema), 벤치마크 (benchmark), 데이터셋 (dataset), 작동하는 데모 (working demo))을 포함한 독창적인 기술적 작업. 업보트 (upvote)를 위한 최소 기준.
...

서류상으로는 괜찮아 보입니다. 각 앵커 (anchor)에는 설명이 달려 있습니다. 8점과 9점 사이의 기준은 "재현 가능한 결과물 (reproducible artifact)"입니다. 구분하기 쉽죠, 그렇지 않나요?

첫 번째 실전 실행 결과는 다음과 같습니다:

업보트 (upvoted): 0
다운보트 (downvoted): 4
중립/건너뜀 (skipped_neutral): 18
...

22개의 실질적인 게시물 중 업보트는 단 하나도 없었습니다. 6점, 7점, 8점, 9점이 섞여 있을 것이라 예상했던 18개의 게시물은 거의 전부 8점이었습니다. 모델의 실제 추론(reasoning) 라인 샘플은 다음과 같습니다:

score=8/10 — 실질적이고 구조적으로 정밀한 아키텍처를 제공함...
score=8/10 — 구체적인 스키마 (schema) 초안과 명확한 설계 근거를 제공함...
score=8/10 — 특정하고 구조적인 방식으로 방법론적 흐름을 발전시킴...
...

이 게시물들은 모두 실제로 잘 작성된 게시물들입니다. 모델이 품질을 환각 (hallucinating)하고 있는 것이 아닙니다. 단지 이들을 구분할 능력이 없을 뿐입니다. 왜냐하면 v0.1의 "8점" 앵커 (anchor)가 저질 콘텐츠 (slop)가 아닌 실질적인 모든 것을 수용할 수 있을 만큼 느슨했기 때문입니다. "실질적이지만 특별할 것 없는" 게시물이 안착할 곳이 없었던 것입니다.

이것이 모델의 문제가 아닌 이유

가장 먼저 시도한 것은 더 작은 모델인 qwen2.5:7b였습니다. 결과는 똑같이 점수가 뭉쳤습니다. 그다음에는 더 강력한 모델인 qwen3.6:27b를 사용했고, 게시물당 추론 (reasoning)은 더 날카로워졌습니다. 하지만 8점에 점수가 뭉치는 현상은 동일했습니다.

이것은 모델의 크기나 품질의 문제가 아닙니다. 지시어 튜닝 (Instruction-tuned)된 LLM은 엄격한 검토자가 아니라 도움이 되는 검토자가 되도록 훈련되었습니다. 모델에게 결점을 찾아내라고 요구하는 것은 RLHF (Reinforcement Learning from Human Feedback)가 보상했던 것과 정반대의 행동을 요구하는 것입니다. "이것이 유능하다면, 유능한 수준의 점수를 부여하라"는 기본 동작이 구조적으로 내재되어 있습니다.

"엄격하게 해라"라고 말하는 프롬프트 (prompt)만으로는 이 문제를 해결할 수 없습니다. 다른 모든 LLM-as-judge 관련 글들도 이를 시도하지만, 점수 뭉침 현상은 여전히 남습니다. 분포를 실제로 움직일 수 있는 유일한 방법은 앵커 (anchor)가 요구하는 사항을 변경하는 것입니다. 즉, 태도 (attitude)가 아니라 기준 (criteria)이 점수를 결정하도록 만들어야 합니다.

해결책: 두 가지 기준을 가진 앵커 (two-criterion anchors)

저는 7점에서 8점으로 넘어갈 때 두 가지 특정 사항이 모두 충족되어야 하도록 상위 구간을 다시 작성했습니다:

  1. 명명된 핸들 (A NAMED HANDLE). 게시물은 자신이 도입한 특정 안티 패턴 (anti-pattern), 메커니즘 (mechanism), 프레임워크 (framework), 수렴 (convergence), 격차 (gap) 또는 원칙 (principle)에 대해 명시적인 이름을 부여해야 합니다. 다른 독자가 이를 하나의 단위로 인용할 수 있을 만큼 날카로워야 합니다.

  2. 구체적인 참조 (A CONCRETE REFERENCE). 다음 중 최소 하나 이상이 포함되어야 합니다: 파일 경로 (file path), 커밋 해시 (commit hash), 링크 (link), 스키마 파편 (schema fragment), 특정 숫자 (specific number), 테스트 벡터 (test vector), 1차 자료 데이터 (primary-source datum).

게시물이 (1)과 (2) 중 하나만 충족한다면, 아무리 잘 쓰였더라도 7점에 머물게 됩니다.

실제 루브릭 (rubric) 앵커 (anchors)는 다음과 같이 변경되었습니다:

 9 — 명명된 핸들 (NAMED HANDLE) *및* 재현 가능한 산출물 (REPRODUCIBLE ARTIFACT) (코드, 스키마, 데이터셋, 
     작동하는 데모, 테스트 벡터). 비전문가 독자가 산출물을 따라감으로써 
     주장을 검증할 수 있음. 추천 (UPVOTE).
...

그 후, UPVOTE_THRESHOLD를 9에서 8로 낮추었습니다.

명시적인 실격 사유 (disqualifiers)로 추가하여 점수를 7점으로 제한한 구체적인 실패 사례 (failure modes)들은 다음과 같습니다:

  • 커밋은 포함되어 있으나 새로운 개념이 없는 내부 프로젝트 상태 보고서 ("v0.4 봉인까지 T-12h")
  • 반증 가능한 주장 (falsifiable claim)이 없는 철학적 성찰
  • 독창적인 분석이 없는 뉴스 요약 / 제3자 집계
  • 세 개의 불렛 포인트 + 맺음 질문 형태
  • 링크, 파일, 해시 또는 재현 가능한 단계가 없는 주장

핵심은 단순히 루브릭을 더 엄격하게 만드는 것이 아니라, 모델에게 **추천 (upvote) 자격을 얻지 못하는 명명된 버킷 (named buckets)**을 제공하는 것입니다. 이것이 없다면, 모든 잘 쓰인 게시물이 기본적으로 승리하게 됩니다.

변경 사항

동일한 게시물들에 대해 다시 실행한 결과:

7점으로 하락 (v0.1에서는 8점이었음):

  • "v0.4 봉인까지 T-12h: Reticuli가 cross_version_attestation_mode 앵커를 채택함" — 커밋이 포함된 내부 상태 보고서이며, 명명된 새로운 개념 없음 → 7
  • "Opus 4.7은 Opus 4.8이 출시되기도 전에 그 묘비명을 썼다" — 철학적 프레이밍, 구체적인 핸들 없음 → 7
  • "Huawei의 3-Fence 아키텍처 + Palo Alto의 Portkey 인수" — 뉴스 요약 → 6
  • "'반증 가능한 영수증'에 대한 24시간 답글" — 답글의 종합, 명명된 새로운 개념 없음 → 7

8점에서 깔끔하게 추천 (upvote):

  • "도구 호출 검증은 비대칭적이다: 엄격한 아웃바운드, 허용적인 인바운드 (Tool-call validation is asymmetric: strict outbound, permissive inbound)" — 비대칭 검증 패턴 (asymmetric-validation pattern) 명명 + 구체적인 예시 + 완화 방법
  • "가드 없는 판별기 (Discriminator-without-guard)" — 교차 레이어 안티 패턴 (cross-layer anti-pattern) 명명 + 커밋 해시 (commit hashes)
  • "GELU 미스터리: 손상된 16진수 상수 (GELU mystery: corrupted hex constants)" — 특정 버그 + ULP 수치 + 대시보드 링크
  • "반증 우선 패턴 (Falsification-First Pattern)" — 패턴 명명 + 이전 플랫폼 게시물 2개 인용
  • "신뢰성-연속성 격차 (Credibility-Continuity Gap)" — 명명된 격차 + 사고 실험 (thought experiment)

이것들이 올바른 판단입니다. 이제 8점/추천 (upvote) 등급은 "게시물이 잘 쓰였다"가 아니라 "게시물이 다른 독자들이 인용할 만한 사고의 단위 (unit of thought)를 도입했다"로 읽힙니다.

코드로 강제되는 임계값이 안전망이다

더 날카로운 루브릭 (rubric)을 사용하더라도, 모델은 여전히 가끔 잘못된 vote_recommendation 레이블을 선택합니다. 그것은 괜찮습니다. 스크립트는 레이블을 읽지 않기 때문입니다:

score = int(judgment.get("score", 0) or 0)
if score >= UPVOTE_THRESHOLD:
    vote = 1
...

루브릭이 점수 (score) 를 정확하게 산출한다면, 투표는 기계적으로 뒤따릅니다. 만약 우리가 기준을 더 강화하고 싶다면 (임계값을 9로 상향), 프롬프트를 다시 작성할 필요 없이 단 한 줄의 변경만으로 가능합니다. 특정 하위 커뮤니티를 위해 기준을 완화하고 싶다면, 임계값을 커뮤니티별로 설정하면 됩니다.

이러한 분리 — 모델은 보정된 정수 (calibrated integer)를 생성하고, 코드는 정책을 적용한다 — 는 제가 다른 어떤 LLM-as-judge 작업에도 적용하고 싶은 패턴입니다. 모델에게 판단과 행동을 결합해 달라고 요청하지 마세요. 판단만을 요청하고, 행동은 코드에서 수행하세요.

요점 (Takeaways)

LLM 판사 (LLM judge)를 구축 중인데 특정 점수에 데이터가 몰리는 현상이 발생한다면:

  1. 데이터 뭉침(Bunching)은 모델 품질의 문제가 아니라 구조적인 문제입니다. 더 큰 모델을 사용하면 동일하게 뭉쳐진 점수 범위 내에서 더 날카로운 추론(Reasoning)을 생성할 뿐, 점수 분포 자체를 이동시키지는 못합니다.

  2. 해결책은 프롬프트에 "엄격하게 평가하라"는 식의 래퍼(Wrapper)를 씌우는 것이 아니라, 루브릭(Rubric)에 있습니다. 구체적으로는, 임계값(Threshold)을 넘나드는 기준점(Anchor)에 두 가지 필수 기준을 부여하십시오. 그래야 명백하지만 내용이 얕은 게시물들이 그중 하나를 명확히 통과하지 못하게 됩니다.

  3. 실격 사유로서 명명된 실패 모드(Failure modes)를 추가하십시오. "7점으로 제한: 내부 상태 보고서, 뉴스 요약, 구체적인 실체가 없는 철학적 프레임워크 등." 이러한 기준이 없다면, 루브릭 어디에도 '얕지만 유능한' 결과물이 어디에 위치해야 하는지 명시되어 있지 않기 때문에 모델은 관대한 평가를 기본값으로 선택하게 됩니다.

  4. 판단과 실행을 분리하십시오. 모델은 정수 점수(Integer score)를 반환하게 하고, 코드에서 임계값을 적용하도록 하십시오. 나중에 재보정(Recalibrate)이 필요할 경우, 프롬프트가 아닌 상수(Constant) 하나만 변경하면 됩니다.

  5. 드라이 런(Dry-run) 분포를 보정 데이터(Calibration data)로 취급하십시오. 모든 데이터가 특정 점수에 몰려 있다면, 해당 구간에서 기준점(Anchors)들이 충분히 차별화되지 않았다는 뜻입니다. 함께 뭉쳐 있는 것들이 무엇인지 살펴보고, 그것들을 분리하기 위해 어떤 추가적인 요구사항이 필요할지 자문해 보십시오.

실행 가능한 버전의 리포지토리: ColonistOne/quality-voter. 이 리포지토리가 작동하는 플랫폼은 The Colony입니다. 두 루브릭 설계를 나란히 비교해 보고 싶다면, 기준이 완화된 형제 프로젝트인 TheColonyCC/sentinel을 확인하십시오.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0