본문으로 건너뛰기

버그 제보

이상한 점을 알려 주시면 고칠게요. 지금 보고 있는 페이지와 브라우저 정보가 함께 담겨요.

페이지:

AI & Data

LLM 동작은 왜 날마다 다른가

추가
목차10개 항목
출처와 참고

shanraisshan의 「claude-code-best-practice」(MIT)의 LLM 일별 성능 저하 리포트(2026.03)와 Agent SDK·CLI 시스템 프롬프트 비교 리포트(2026.02)를 바탕으로, Anthropic의 2025년 9월 포스트모템을 더해 재구성한 노트다.

가중치 고정은 동작 고정이 아니다

질문답
출시 후 가중치가 바뀌나아니오
같은 모델이 날마다 다르게 동작할 수 있나예. 일별 점수 변동이 ±8~14% 측정됐다
의도적으로 성능을 낮추나증거가 없다. Anthropic은 수요·시간대·부하 때문에 품질을 낮추지 않는다고 밝혔다
인프라 버그는 실재하나예. 2025년 8~9월에 세 건이 확인됐다
시스템 프롬프트·후속 학습은 바뀔 수 있나예
심리 요인도 있나예

가중치 위의 층

사용자가 보는 출력은 고정된 가중치 위에 여러 층을 거친다. 위에 있을수록 사용자 가까이, 자주 바뀐다.

층무엇이 바뀌나
세션 맥락세션 안에서 맥락이 오염·포화되며 열화한다. 세션 안 「멍청해짐」의 가장 흔한 원인
시스템 프롬프트수시로 갱신된다. 한 세대의 핫픽스 지시가 다음 세대에서 후속 학습으로 옮겨 가기도 한다
후속 학습(RLHF)기본 가중치는 그대로인 채 조용히 갱신될 수 있다
샘플링 파라미터서버 쪽에서 조정된다
추측 디코딩이론상 분포를 보존하지만 도메인·긴 맥락에서 초안 모델의 수락률이 흔들린다
MoE 라우팅·배치 구성같은 배치에 섞인 다른 사용자 요청이 내 요청이 어느 전문가로 갈지를 바꾼다
하드웨어같은 모델이 TPU·GPU·Trainium 같은 서로 다른 칩에서 돈다
양자화메모리를 2~4배 줄인다. 부하에 따라 동적으로 바꾸는지는 논쟁 중이다
컴파일러·런타임컴파일러 버그가 특정 배치 크기에서만 틀린 결과를 낸 사례가 있다
가중치고정

MoE와 배치의 잡음

희소 MoE 모델을 배치로 서빙하면 내 출력이 남의 요청에 따라 달라진다. 외부 측정에서 일별 점수 변동은 OpenAI ±1012%, Anthropic ±811%, Google ±914%였고, 같은 모델이 탈옥 저항 테스트에서 하루는 77%, 다음 날은 63%를 기록했다. **일별 잡음이 1015%면 5% 품질 차이는 잡기 어렵다.** A/B 테스트로 잡으려면 표본 수를 충분히 늘리고, 같은 날짜 안에서 무작위 배정해 날짜 효과를 통제해야 한다. 배치와 서빙 구조는 LLM 서빙의 병목에 있다.

실제로 있었던 인프라 버그 세 건

Anthropic은 2025년 8~9월 품질 저하 신고를 조사해 버그 세 건을 공개했다.

버그증상영향
맥락 창 라우팅 오류일반 요청이 1M 맥락용 서버로 잘못 라우팅됐다. 라우팅이 sticky라 한 번 걸리면 계속 그쪽으로 갔다최악 시점에 해당 모델 요청의 16%, Claude Code 사용자 약 30%가 한 번 이상 영향
TPU 출력 손상잘못된 설정으로 드문 토큰에 높은 확률이 실려, 영어 응답 중 태국어·중국어 문자나 명백한 문법 오류가 나왔다API 직접 사용 경로만
XLA 컴파일러 오컴파일근사 top-k 연산이 특정 배치 크기·모델 구성에서 완전히 틀린 결과를 냈다. 앞뒤 연산과 디버깅 도구 여부에 따라 달라져 재현이 어려웠다근사를 정확한 top-k로 바꾸고 효율 손실을 감수했다

탐지가 늦었던 이유는 둘이다. 자동 평가가 못 잡았다(모델이 개별 실수에서 잘 회복하므로). 버그마다 플랫폼·증상·비율이 달라 신고가 하나의 원인을 가리키지 않았다.

오래된 「LLM drift」 연구의 교훈

2023년 연구는 GPT-4의 소수 판별 정확도가 3개월 만에 97.6%에서 2.4%로 떨어졌다고 보고했다. 하지만 실제로는 예·아니오를 찍는 패턴이 바뀐 것에 가까웠다. 동작이 바뀐다는 것은 보였지만 원인은 의도적 갱신일 공산이 크다. 측정 설계가 결론을 좌우한다.

결정성: seed가 없다

Messages API에는 seed 파라미터가 없고, temperature=0이어도 같은 출력이 보장되지 않는다. 부동소수점 병렬 연산 순서, MoE 라우팅, 배칭, 수치 정밀도, 모델 스냅샷 변경은 사용자가 통제할 수 없다. 통제할 수 있는 것은 시스템 프롬프트와 입력뿐이다.

그래서 비트 단위 재현에 기대지 않고 결정적 장치로 묶는다.

장치방법
구조화 출력JSON 스키마로 받고 검증한다
결정적 로직판단이 필요 없는 부분은 코드로
다수결여러 번 생성해 합의를 본다
캐싱같은 입력에는 저장한 결과를 쓴다

비결정적 함수를 결정적 게이트로 감싸는 원칙은 AI 시대 개발자의 역할의 「하네스와 오라클」과 같다.

같은 모델, 다른 하네스: CLI와 Agent SDK

「Claude Code에서는 됐는데 SDK에서는 안 된다」의 1순위 원인은 시스템 프롬프트가 다르다는 것이다.

항목CLI 기본SDK 기본SDK + claude_code 프리셋
도구 지침전체최소전체
코딩 가이드있음없음있음
안전 규칙전체기본전체
CLAUDE.md 자동 로드있음없음없음(settingSources 필요)
  • CLI의 시스템 프롬프트는 모듈식이다. 작은 기본 프롬프트에 상황에 따라 붙는 조각이 100개 넘게 있다(도구 지침, 코딩 가이드, 환경 정보, CLAUDE.md, 서브에이전트 프롬프트, MCP 도구 설명 등).
  • SDK 기본은 넘겨준 도구 지침과 기본 안전 규칙뿐인 최소 프롬프트다. 일에 쓸 맥락이 더 많다는 장점도 있다.
  • systemPrompt: "..."는 기본을 통째로 대체해 도구 지침까지 잃는다. CLI 동작에 가깝게 하려면 systemPrompt: { type: "preset", preset: "claude_code", append: "..." }에 settingSources: ["project", "user"]를 더한다.
  • CLI 쪽에서는 --append-system-prompt(덧붙이기)와 --system-prompt(대체)가 같은 구분이다.

대화형 개발·일회성 작업은 CLI, 프로그램 통합·배치·일관된 응답이 필요한 일은 SDK가 맞다.

「멍청해졌다」고 느낄 때

기간먼저 의심할 것대처
세션 안맥락 오염·포화/compact, /rewind, 새 세션
며칠간 나빠졌다가 회복제공자 장애와 롤백, 서빙 설정(샘플링·추론 예산) 변경, 별칭이 가리키는 스냅샷 이동장애 공지 확인, 스냅샷 고정
계속 나쁨기본 모델 저하(가능성 낮음)측정으로 확인

심리 요인도 크다. 누가 「오늘 멍청하다」고 하면 실수가 눈에 띄는 확증 편향, 처음 쓸 때의 허니문 효과, 과제 난이도 차이, 확률적인 연속 불운이 겹친다. 「월요일 Claude」 같은 요일 패턴은 근거가 없다.

운영 대응

  • 별칭 대신 모델 스냅샷을 고정한다.
  • 요청마다 모델 ID·스냅샷, 디코딩 파라미터, 지연·오류율, 실패 시 맥락 깊이를 저장한다.
  • 고정 프롬프트 세트로 일일 카나리를 돌려 회귀를 경보한다. 측정 없이는 개인 체감과 서빙 문제를 구분할 수 없다.
  • 장애 때 쓸 대체 제공자 경로를 둔다.
  • 대시보드에서 「모델 품질」과 「서빙 신뢰성」을 나눠 본다.

정리

  • 가중치는 고정이어도 그 위의 여러 층이 동작을 바꾼다. 일별 ±8~14% 잡음은 기본값이다.
  • 세션 안 열화는 맥락 문제, 며칠 단위 열화는 서빙 문제일 가능성이 높다. 측정 없이 단정하지 않는다.
  • seed가 없으니 재현성은 모델이 아니라 하네스(구조화 출력, 결정적 로직, 스냅샷 고정, 카나리)에서 얻는다.
  • 같은 모델도 하네스(시스템 프롬프트)가 다르면 다른 결과를 낸다.

관련 노트: LLM 서빙의 병목: KV 캐시, 배치, GPU, AI 시대 개발자의 역할, 프롬프트에서 하네스로, 평가 주도 개발(EDD), Claude API 고급 도구 사용

원본 기록3

댓글

GitHub 계정으로 댓글을 남길 수 있어요.