iBetter Books
수정

재현성과 파라미터

프로덕션에서 "왜 어제와 답이 다르냐"는 질문은 거의 반드시 나온다. 이 질문에 답하려면 먼저 두 개념을 분리해야 한다. 결정성(determinism)은 같은 입력에 항상 같은 출력이 나오는 성질이고, 재현성(reproducibility)은 같은 조건에서 같은 품질·같은 형식·같은 의사결정을 안정적으로 얻는 성질이다. LLM은 본질적으로 결정적이지 않다. 같은 프롬프트라도 토큰 샘플링 단계의 미세한 비결정성 때문에 출력이 글자 단위로 달라질 수 있다. 따라서 프로덕션에서 추구할 목표는 "비트 단위로 똑같은 출력"이 아니라 "통제 가능한 표면을 고정해 흔들림의 범위를 좁히고, 변경을 추적·검증하는 재현성"이다. 시험은 이 구분을 정면으로 묻는다. "출력이 매번 조금씩 다르다"는 증상에 "temperature를 0으로 두면 동일해진다"고 답하는 선택지는 함정이다.

옛 직관이 함정인 이유

다른 LLM API 경험에서 온 엔지니어는 재현성을 샘플링 파라미터 문제로 본다. temperature=0으로 탐욕적 디코딩을 강제하고, seed를 박아 난수를 고정하는 식이다. 현행 Anthropic API에서 이 직관은 두 겹으로 막힌다.

첫째, temperature·top_p·top_k는 claude-opus-4-8(및 Opus 4.7, Fable 5)에서 제거되었다. 셋 중 하나라도 요청에 넣으면 400 invalid_request_error가 돌아온다. 모델 동작은 파라미터가 아니라 프롬프트로 유도하는 것이 현재의 권장 방식이다.

둘째, Anthropic API에는 seed 파라미터가 존재하지 않는다. seed는 OpenAI 계열 API의 개념이며, 이를 Anthropic 요청에 넣는 선택지는 시험에서 전형적인 교차-API 함정이다. 게다가 seed나 temperature=0이 가능했던 모델에서조차 동일 출력은 보장된 적이 없었다. 결정성은 LLM 추론 인프라에서 애초에 약속된 성질이 아니다.

# /examples/16/removed_params.pyimport anthropicclient = anthropic.Anthropic()response = client.messages.create(    model="claude-opus-4-8",    max_tokens=1024,    # temperature, top_p, top_k, seed는 모두 사용하지 않는다.    # claude-opus-4-8에서 샘플링 파라미터는 400, seed는 존재하지 않는 파라미터다.    messages=[        {"role": "user", "content": "이 리뷰의 감정을 분류하라."}    ],)

따라서 "재현성을 위해 temperature=0과 seed를 설정한다"는 문장은 현행 API에서 두 번 틀린다. 정답은 파라미터 조정이 아니라, 아래의 구조적 고정으로 옮겨가는 것이다.

구조적 재현성 - 무엇을 고정하는가

재현성을 파라미터가 아니라 구조로 확보한다는 것은, 출력에 영향을 주는 통제 가능한 표면을 모두 명시적으로 고정한다는 뜻이다. 핵심 표면은 네 가지다.

첫째, 모델 ID를 명시적으로 고정한다. 모델이 바뀌면 토큰화·추론·행동이 모두 달라지므로, 어떤 모델로 생성했는지가 재현성의 가장 큰 변수다. claude-opus-4-8처럼 정확한 ID를 코드에 박는다. 모델 고정의 세부 규칙은 다음 절에서 다룬다.

둘째, 프롬프트(system·messages·tools)를 버전 관리한다. 출력이 달라진 진짜 원인이 모델이 아니라 누군가 슬그머니 바꾼 system 프롬프트인 경우가 흔하다. 프롬프트를 코드처럼 버전 관리하면 "어느 버전이 이 출력을 냈는가"를 되짚을 수 있다.

셋째, output_config.format으로 출력의 형식(shape)을 고정한다. 주의할 것은 구조화 출력이 고정하는 것은 형식이지 내용이 아니라는 점이다. 스키마를 강제하면 응답이 항상 유효한 JSON 구조를 따르므로, 후속 파이프라인이 깨지지 않는 의미의 재현성이 확보된다. 그러나 같은 스키마 안에서 필드 값 자체는 여전히 달라질 수 있다. 형식의 재현성과 내용의 재현성을 혼동하지 않는 것이 시험 포인트다.

넷째, thinking은 adaptive만 쓴다. claude-opus-4-8에서 thinking은 adaptive 모드만 유효하며, 과거의 budget_tokens 같은 고정 예산 방식은 제거되어 보내면 400이 난다. adaptive thinking은 모델이 사고량을 스스로 정하므로 튜닝할 파라미터가 없다는 점이 오히려 재현성에 유리하다. 사람이 손으로 맞출 변수가 줄어들기 때문이다. 사고 깊이를 조절하고 싶으면 thinking의 budget이 아니라 output_config의 effort(low·medium·high·xhigh·max)로 다룬다.

# /examples/16/structural_reproducibility.pyimport anthropicclient = anthropic.Anthropic()response = client.messages.create(    model="claude-opus-4-8",            # 1. 모델 ID 고정    max_tokens=1024,    thinking={"type": "adaptive"},      # 4. adaptive만 사용, 튜닝 파라미터 없음    output_config={        "effort": "high",               # 사고 깊이는 budget이 아니라 effort로        "format": {                      # 3. 출력 형식 고정 (내용이 아니라 shape)            "type": "json_schema",            "schema": {                "type": "object",                "properties": {"sentiment": {"type": "string", "enum": ["positive", "negative", "neutral"]}},                "required": ["sentiment"],                "additionalProperties": False            }        }    },    messages=[        {"role": "user", "content": "배송이 빨라서 만족합니다."}  # 2. 프롬프트는 버전 관리 대상    ],)

이 네 가지를 고정해도 sentiment 필드의 값이 한 번 positive, 한 번 neutral로 갈릴 수는 있다. 그것이 LLM의 본질이고, enum과 회귀 테스트로 흔들림의 허용 범위를 관리하는 것이 현실적인 재현성 전략이다. effort를 max로 올리면 흔들림이 줄어드는 경향은 있으나 비용과 지연이 늘고, 그조차 비트 단위 동일을 약속하지는 않는다.

재현성은 검증으로 완성된다

통제 표면을 고정했다는 사실만으로 재현성이 보장되지는 않는다. 고정된 표면이 실제로 같은 품질을 내는지 확인하려면 평가(eval) 셋이 필요하다. 대표 입력 묶음에 대한 기대 출력 또는 합격 기준을 정해두고, 코드·프롬프트·모델 중 무엇이든 바뀔 때마다 그 셋을 돌려 회귀를 잡는다. 시험은 "모델이나 프롬프트를 바꾼 뒤 무엇으로 안전을 확인하는가"라는 형태로 이 점을 묻는다. 정답은 "출력이 동일한지 확인"이 아니라 "eval 셋으로 품질이 유지되는지 검증"이다. 동일성은 애초에 가능하지 않기 때문이다.

정리

  • 결정성(같은 입력 같은 출력)과 재현성(같은 조건 같은 품질·형식)은 다르다. LLM은 결정적이지 않으므로 재현성의 목표는 비트 단위 동일이 아니라 통제 가능한 표면의 고정이다.
  • temperature·top_p·top_k는 claude-opus-4-8에서 제거되어 보내면 400이고, Anthropic API에는 seed 파라미터가 없다. "temperature=0과 seed로 재현성을 맞춘다"는 선택지는 현행 API에서 함정이며, OpenAI식 seed를 넣는 선택지는 교차-API 함정이다.
  • 구조적 재현성의 네 표면은 모델 ID 고정, 프롬프트 버전 관리, output_config.format(형식 고정 — 내용은 아님), adaptive thinking이다. 사고 깊이는 budget이 아니라 effort로 조절한다.
  • output_config.format이 고정하는 것은 출력의 shape이지 필드 값이 아니다. 형식의 재현성과 내용의 재현성을 혼동하는 선택지는 오답이다.
  • 재현성은 eval·회귀 테스트로 완성된다. 변경 후 안전 확인의 정답은 "출력 동일성 확인"이 아니라 "평가 셋으로 품질 유지 검증"이다.
01. 재현성과 파라미터 — 합격하는 Claude Certified Architect 자격증 | iBetter Books