본문 바로가기
C.W.K.
Stream
Lesson 02 of 06 · published

일관성과 보정

~18 min · safety, consistency, calibration

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

정확성을 넘어서는 신뢰성의 두 축

"모델은 대부분 맞아"라는 말은 서로 다른 두 가지 문제를 가릴 수 있어:

  • 일관성 — 같은 질문을 다르게 표현해도 같은 답을 내놓을까?
  • 보정 — 모델이 표현한 신뢰도가 실제 정확도와 일치할까?

둘 다 중요해. 일관되지 않은 모델은 사용자 신뢰를 무너뜨려. "같은 내용을 두 번 물었는데 서로 다른 답을 받았어"라는 경험을 주기 때문이야. 보정되지 않은 모델은 자신 있게 틀려. "I'm 95% confident"라고 말하지만 실제로는 60%만 맞는 식이지.

일관성 측정

같은 질문을 N가지로 바꿔 표현한 뒤 각각 모델에 입력해. 답변 사이의 의미 유사도를 BERTScore나 임베딩 코사인 유사도로 측정해. 평균값이 해당 사례의 일관성 점수이고, 모든 사례의 평균값이 시스템의 일관성 지표야.

보정 측정

모델이 신뢰도를 밝히게 해 (I'm X% confident). 표현한 신뢰도에 따라 예측을 여러 구간으로 나누고, 각 구간의 실제 정확도를 계산해. 잘 보정된 모델이라면 각 구간의 실제 정확도가 모델이 표현한 신뢰도와 비슷해야 해. 이 편차를 그래프로 나타낸 것이 보정 곡선이야.

원칙: 자신 있게 틀리는 모델은 조심스럽게 틀리는 모델보다 더 위험해. 보정은 보여주기용 지표가 아니라 안전성 속성이야.

왜 최첨단 모델도 여전히 제대로 보정되지 않을까

RLHF 학습은 과신을 부추길 수 있어. 모델은 자신감 있는 답변이 더 높은 인간 평점을 받는다는 점을 학습하고, 근거가 뒷받침하는 수준보다 더 자신 있게 말하게 돼. 2025~2026년 모델 세대에서 조금 나아졌지만, 모델이 매우 높은 신뢰도를 보이는 구간에서는 여전히 과신하는 경향이 있어.

Code

바꿔 말하기를 활용한 일관성 테스트·python
from sentence_transformers import SentenceTransformer
import numpy as np

emb = SentenceTransformer("all-mpnet-base-v2")

def consistency(question_variants, model):
    answers = [model.complete(q) for q in question_variants]
    vecs = emb.encode(answers)
    # Pairwise cosine similarity, averaged
    n = len(vecs)
    sims = []
    for i in range(n):
        for j in range(i + 1, n):
            sims.append(np.dot(vecs[i], vecs[j]) / (np.linalg.norm(vecs[i]) * np.linalg.norm(vecs[j])))
    return float(np.mean(sims))

variants = [
    "What is the capital of France?",
    "Which city is France's capital?",
    "France's capital city is what?",
    "Name the capital of France.",
]
print(consistency(variants, my_model))  # ~0.95 for a calibrated factual QA
보정 곡선·python
from collections import defaultdict

def calibration_curve(predictions, n_bins=10):
    """predictions: list of (stated_confidence, was_correct)."""
    bins = defaultdict(lambda: [0, 0])  # (correct, total)
    for conf, correct in predictions:
        bin_idx = min(int(conf * n_bins), n_bins - 1)
        bins[bin_idx][0] += int(correct)
        bins[bin_idx][1] += 1
    curve = []
    for i in range(n_bins):
        c, t = bins[i]
        if t > 0:
            curve.append((i / n_bins, c / t, t))
    return curve

# Output: [(stated_conf_bin, actual_accuracy, n_samples), ...]
# A calibrated model has actual_accuracy ≈ bin midpoint.

External links

Exercise

사실성이 가장 중요한 기능을 골라 질문 20개를 만들고, 각 질문을 다섯 가지로 바꿔 표현해. 각 표현을 모델에 입력해 답변을 생성하고 일관성을 측정한 다음, 모델이 각 답변의 신뢰도를 밝히게 하고 보정도 측정해. 두 측정값 모두 사용자 신뢰를 가늠하는 신호야. 보통 예상보다 낮게 나와.

Progress

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

댓글 0

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

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