본문 바로가기
C.W.K.
Stream
Lesson 03 of 07 · published

개별 평가와 쌍대 비교 평가

~18 min · judges, comparison, calibration

Level 0추측자
0 XP0/55 lessons0/10 achievements
0/150 XP to next level150 XP to go0% complete

LLM으로 판정하는 두 가지 방법

개별 평가: 출력 하나를 제시하면 판정 모델이 1~5점이나 통과/실패 여부를 매겨.

쌍대 비교: 출력 두 개를 나란히 제시하면 판정 모델이 더 나은 쪽을 고르거나 무승부로 판정해.

두 방식 모두 유용하지만 알맞은 상황은 달라. 많은 팀이 더 단순해 보이는 개별 평가를 기본으로 택하지만, 실제로는 쌍대 비교가 더 신뢰할 만한 경우가 많아.

왜 쌍대 비교가 LLM에 더 쉬울까

절대 점수를 매기려면 척도를 보정해야 해. 예를 들어 "4점과 5점의 차이는 무엇인가?"를 명확히 정해야 하지. LLM은 이런 절대 척도 적용을 특히 어려워해. 점수를 척도 중간에 몰아넣고 극단적인 점수는 거의 쓰지 않는 경향이 있어. 쌍대 비교는 이 문제를 피할 수 있어. "A가 B보다 나은가?"가 "A를 1~5점으로 평가하라."보다 답하기 쉬운 질문이기 때문이야.

위치 편향과 방어 방법

판정 모델에 출력 두 개를 보여주면 처음이나 마지막에 제시된 출력을 우연으로 보기 어려울 만큼 자주 선택해. 이를 막으려면 모든 쌍을 두 번 평가해. 한 번은 A를 먼저, 다른 한 번은 B를 먼저 제시하고 판정을 종합해. 순서를 바꿨을 때 결론이 달라지면 이 비교가 위치 편향의 영향을 크게 받았다는 뜻이니 무승부로 표시해.

원칙: 쌍대 비교는 항상 두 가지 순서로 실행해. 위치 편향은 실제로 존재하며, 무시하면 순위가 뒤집힐 만큼 클 수 있어.

쌍대 비교가 적합하지 않을 때

  • 순위가 아니라 절대적인 수치가 필요할 때(규제 보고, SLA).
  • 두 시스템을 비교하는 대신 한 시스템을 시간에 따라 평가할 때.
  • 후보가 많을 때(N=20). 쌍대 비교에는 N(N-1)/2번의 비교가 필요하지만 개별 평가는 N번이면 돼.

개별 평가를 보정할 때 쌍대 비교를 활용해

흔히 쓰는 방법은 작은 사례 모음에 쌍대 비교를 실행하고 Elo 방식으로 순위를 구한 뒤, 그 순위를 개별 평가의 기준점으로 삼는 거야. 예를 들어 "이 출력은 5점 수준이고, 이 출력은 3점 수준이다."처럼 기준을 정할 수 있어. 평가를 한 차례 더 실행하는 만큼 비용이 들지만 훨씬 신뢰할 만한 개별 평가 판정 모델을 만들 수 있어.

Code

순서 편향을 방어하는 쌍대 비교 판정 모델·python
def pairwise_judge(question, output_a, output_b, judge_model):
    def ask(first_label, first, second_label, second):
        prompt = f"""
Question: {question}

Response {first_label}: {first}

Response {second_label}: {second}

Which response is better? Reply with JSON: {{\"reasoning\": \"...\", \"winner\": \"{first_label}\" or \"{second_label}\" or \"TIE\"}}"""
        return parse_judge_output(judge_model.complete(prompt, temperature=0))

    v1 = ask("A", output_a, "B", output_b)
    v2 = ask("A", output_b, "B", output_a)  # roles swapped
    # Map v2 back: if v2 says A wins, that means output_b won on the second call.
    win1 = v1["winner"]
    win2 = {"A": "B", "B": "A", "TIE": "TIE"}[v2["winner"]]
    if win1 == win2:
        return win1, [v1["reasoning"], v2["reasoning"]]
    return "TIE", [v1["reasoning"], v2["reasoning"]]
명시적인 평가 기준표와 기준점을 활용한 개별 평가·python
POINTWISE_PROMPT = """
Score this response from 1 to 5.

5 = perfect: factually correct, complete, well-structured, no issues
4 = good: correct and complete, minor stylistic issues
3 = acceptable: mostly correct, but missing a notable detail or has a small error
2 = poor: major missing detail or factual error
1 = bad: largely incorrect, off-topic, or unhelpful

Question: {question}
Response: {response}

Reply with JSON: {{\"reasoning\": \"...\", \"score\": 1|2|3|4|5}}
"""

# Without anchors, judges cluster around 4. With anchors, distribution spreads.

External links

Exercise

순서 편향 방어를 적용해 제품의 프롬프트 두 버전을 비교하는 사례 20개짜리 쌍대 평가를 실행해. 각 버전의 승리 비율을 계산하고, 같은 사례 모음에 개별 평가도 실행해. 어느 방식이 출시할 프롬프트를 선택하는 데 더 명확한 신호를 줬는지 살펴봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.