왜 단일 모델은 답이 아닌가
LLM 서비스를 운영하다 보면 모든 요청을 최상위 모델로 처리하려는 유혹에 빠진다. 정확도는 안전하게 확보되지만, 실제 트래픽의 상당수는 "요약해줘", "이 문장 다듬어줘" 같은 쉬운 요청이다. 이런 요청까지 고가 모델에 태우면 비용이 선형으로 늘어나고, 큰 모델의 추론 지연 때문에 p95 레이턴시도 나빠진다. 반대로 저가 모델만 쓰면 어려운 요청에서 품질이 무너진다. 문제의 본질은 "요청마다 필요한 지능의 양이 다른데, 인프라는 그것을 구분하지 않는다"는 점이다.
모델 캐스케이딩의 기본 아이디어
캐스케이딩은 저렴한 모델을 먼저 호출하고, 그 결과의 신뢰도가 임계값 미만일 때만 상위 모델로 승격(escalate)시키는 구조다. 쉬운 요청은 값싼 모델에서 끝나고, 어려운 요청만 비싼 모델로 흘러간다. 핵심은 두 가지다. 첫째, 저가 모델의 출력에 대한 신뢰도 신호를 어떻게 얻느냐. 둘째, 어느 지점에서 끊을지 임계값을 어떻게 정하느냐다.
신뢰도 신호를 얻는 방법
신뢰도를 판단하는 방식은 작업 유형에 따라 다르다. 분류·추출처럼 정답 형태가 정해진 작업은 토큰 로그확률(logprob)이나 응답 스키마 검증 결과를 그대로 쓸 수 있다. 자유 생성 작업은 별도의 경량 판정기(judge)를 두거나, 저가 모델 자신에게 확신도를 함께 출력하게 하는 방식을 쓴다. 자기 보고 확신도는 편향이 있으므로, 가능하면 규칙 기반 검증(JSON 파싱 성공, 필수 필드 존재, 길이 범위)과 조합하는 편이 안정적이다.
from anthropic import Anthropic
client = Anthropic()
def call(model, prompt, max_tokens=1024):
resp = client.messages.create(
model=model,
max_tokens=max_tokens,
messages=[{"role": "user", "content": prompt}],
)
return resp.content[0].text
def cascade(prompt, threshold=0.75):
# 1단계: 저가 모델 + 자기 확신도 요청
draft = call(
"claude-haiku-4-5-20251001",
prompt + "\n\n답변 끝에 0~1 형식으로 확신도를 붙여라.",
)
conf = parse_confidence(draft) # 태그 파싱, 실패 시 0.0
if conf >= threshold and validate(draft):
return {"model": "haiku", "text": strip_tag(draft)}
# 2단계: 신뢰도 미달 시 상위 모델로 승격
final = call("claude-opus-4-8", prompt)
return {"model": "opus", "text": final}
임계값은 데이터로 정한다
임계값을 감으로 정하면 안 된다. 라벨이 있는 평가셋으로 저가 모델의 확신도와 실제 정답 여부를 함께 기록한 뒤, 임계값을 바꿔가며 승격률·정확도·비용을 시뮬레이션한다. 아래는 확신도-정확도 로그를 쌓아두고 후보 임계값별 지표를 뽑는 쿼리다.
-- eval_log(threshold 후보별 승격률/정확도 시뮬레이션)
SELECT
t.threshold,
AVG(CASE WHEN e.confidence < t.threshold THEN 1 ELSE 0 END) AS escalate_rate,
-- 저가 모델이 처리한 건의 정확도
AVG(CASE WHEN e.confidence >= t.threshold THEN e.is_correct END) AS cheap_acc
FROM eval_log e
CROSS JOIN (SELECT UNNEST(ARRAY[0.6,0.7,0.8,0.9]) AS threshold) t
GROUP BY t.threshold
ORDER BY t.threshold;
승격률이 낮으면 비용은 줄지만 저가 모델이 처리한 건의 정확도가 목표치 아래로 떨어질 수 있다. 목표 정확도를 만족하는 선에서 승격률이 가장 낮은 임계값을 고른다.
비용·정확도 트레이드오프 비교
| 전략 | 상대 비용 | 정확도 | 레이턴시 |
|---|---|---|---|
| 상위 모델 단독 | 높음 | 높음 | 느림 |
| 저가 모델 단독 | 낮음 | 불안정 | 빠름 |
| 2단계 캐스케이드 | 중간 | 높음 | 대부분 빠름 |
승격 비율이 20%라면, 상위 모델 단독 대비 비용의 상당 부분을 절감하면서 정확도는 비슷하게 유지할 수 있다. 다만 승격된 요청은 두 모델을 모두 거치므로 그 20%의 레이턴시는 오히려 늘어난다는 점을 감안해야 한다.
운영에서 놓치기 쉬운 주의점
- 승격 요청의 이중 비용: 승격되면 저가 호출 비용이 매몰된다. 승격률이 40%를 넘어가면 캐스케이드 이득이 사라지고 상위 모델 단독보다 비싸질 수 있다. 승격률을 상시 모니터링해야 한다.
- 자기 보고 확신도 과신: 모델은 틀렸을 때도 높은 확신도를 보고하는 경향이 있다. 규칙 검증과 병행하고, 확신도 분포가 실제 정답률과 맞는지(캘리브레이션) 주기적으로 점검한다.
- 임계값 드리프트: 입력 분포나 모델 버전이 바뀌면 최적 임계값도 바뀐다. 임계값은 상수가 아니라 재학습 대상으로 다뤄야 한다.
- 레이턴시 SLA: 두 단계를 순차 실행하므로 승격 경로는 지연이 누적된다. 지연에 민감한 엔드포인트는 승격 시점에 타임아웃과 폴백을 명확히 정의한다.
정리
모델 캐스케이딩은 "모든 요청이 같은 지능을 필요로 하지 않는다"는 관찰을 인프라로 옮긴 것이다. 저가 모델로 대부분을 처리하고 어려운 것만 승격시키되, 신뢰도 신호는 규칙 검증과 조합하고 임계값은 평가셋으로 결정하며 승격률을 지속적으로 관측하라. 이 세 가지가 갖춰지면 정확도를 크게 희생하지 않고도 비용과 지연을 의미 있게 줄일 수 있다.