
엄격한 임계값으로 인해 temperature=0 점수 노이즈가 50/50의 Low/Medium 결정으로 변함
요약
temperature=0 설정에서도 LLM의 비결정론적 특성으로 인해 임계값 경계에 있는 점수가 범주를 바꿀 수 있음을 실험을 통해 증명합니다. 특히 비전-LLM 워크플로에서 미세한 점수 차이가 안전 결정(Low/Medium)을 뒤집는 문제를 다룹니다.
핵심 포인트
- temperature=0에서도 부동 소수점 및 라우팅 문제로 비결정론적 결과 발생 가능
- 임계값(threshold) 근처의 점수는 범주형 결정의 불확실성을 초래함
- 단순히 추론 노력을 높이는 것이 항상 결과의 안정성을 보장하지 않음
- 경계선에 있는 데이터는 특정 범주로 단정하기보다 불확실한 상태로 취급해야 함
지루한 비용 관련 질문에 답하려다 우연히 임계값(threshold) 문제를 발견했습니다.
설정 (Setup)
설정은 호스팅된 API 모델을 사용하는 작은 비전-LLM (vision-LLM) 워크플로였습니다. 두 개의 제약 의약품 패키징 이미지를 비교하고, 11가지 기준에 따라 유사성 위험(look-alike risk) 점수를 매긴 다음, 가중치 점수를 버킷(bucket)으로 변환하는 방식입니다. 2026-08-01에 테스트되었습니다. 반복 실행된 메인 모델은 gpt-4.1-mini-2025-04-14였습니다. 또한 토큰 및 비용 동작을 확인하기 위해 gpt-5.6-luna와도 비교했습니다.
< 40 Low
40 to <70 Medium
= 70 High
동일한 두 이미지. 동일한 프롬프트 (prompt). 동일한 구조화된 스키마 (structured schema). temperature=0.0.
발생한 현상 (What happened)
gpt-4.1-mini-2025-04-14를 10회 실행한 후, 첫 번째 결과가 의심스러워 보여 두 번째 독립적인 10회 배치(batch)를 실행했습니다.
배치 1 (Batch 1): 평균 38.38, 표준편차 (stdev) 5.70, 범위 14.90, 결과 6 Low / 4 Medium
배치 2 (Batch 2): 평균 38.69, 표준편차 (stdev) 5.75, 범위 14.90, 결과 5 Low / 5 Medium
최종 안전 버킷 (safety bucket)이 동일한 요청에서 약 절반의 확률로 뒤집혔습니다. 네, temperature=0에서의 비결정론적 (nondeterminism) 특성은 알려져 있습니다. 배치 처리 (batching), 라우팅 (routing), 그리고 부동 소수점 (floating-point) 세부 사항들이 모두 이를 유발할 수 있습니다. 제가 내재화하지 못했던 점은 그 규모였습니다. 단순히 마지막 자릿수가 흔들리는 수준이 아니라, 범주형 안전 결정 (categorical safety decision)을 바꿀 정도의 규모였습니다. 또한 테스트 중인 API 인터페이스에서 사용할 수 있는 시드 (seed) 메커니즘이 없었기 때문에 이를 고정할 수 없었습니다.
정직한 교훈은 "temperature=0은 가짜다"라고 생각하지 않습니다. 평균은 약 38.5였고, 컷오프 (cutoff)는 40이었습니다. 사례가 바로 경계선에 걸쳐 있었던 것입니다. 반복된 호출은 앱 설계가 숨기고 있던 무언가를 드러냈을 뿐입니다. 이것은 실제로 Low도 Medium도 아니었습니다. 불확실한 상태였습니다.
나를 놀라게 한 몇 가지 사항들 (A few things that surprised me)
일부 개별 기준들이 최종 점수보다 훨씬 더 크게 움직였습니다. 하나는 20에서 70으로 변했습니다. Median-of-3 (3개 값의 중앙값) 방식도 도움이 되지 않았습니다. 한 배치에서 가능한 모든 120개의 3회 실행 서브셋 (subsets)을 부트스트랩 (bootstrapped) 해본 결과, 정확히 60 Low / 60 Medium이 나왔습니다. 이 작업에서는 더 많은 추론 노력 (reasoning effort)이 더 나은 결과를 가져오지 않았습니다. 이 부분은 gpt-5.6-luna를 사용하여 노력 수준 none/low/medium에서 테스트되었습니다: medium 비용이 low보다 더 비쌌으며 ($0.00320 vs $0.00297), 밴드 (bands)를 더 자주 뒤집었습니다 (4/10 vs 1/10).
지연 시간 (Latency)은 동시성 (concurrency) 5 환경에서 측정되었으므로, 그 부분에서 low 대 medium의 차이에 큰 의미를 두지는 않겠습니다. 바이트 단위로 동일한 중복 이미지들에 대해, gpt-5.6-luna 모델로 4가지 노력 설정 (effort settings)에 걸쳐 40회 실행한 결과, 모든 실행에서 High 점수가 반환되었습니다. 좋습니다. 하지만 더 높은 노력 (higher-effort)을 기울인 실행들만 점수가 100점보다 약간 낮게 나왔는데, 이는 이상한 현상입니다. 추론 모델 (Reasoning models)은 temperature 설정을 완전히 거부했습니다: 400 Unsupported parameter: 'temperature' is not supported with this model. 추론 노력 (reasoning effort)이 활성화되었을 때 top_p 또한 거부되었습니다: 400 Unsupported parameter: 'top_p' is not supported with this model. 서로 다른 모델 제품군 (model families)은 동일한 이미지를 매우 다르게 토큰화 (tokenize)했습니다. gpt-5.6-luna는 동일한 이미지 쌍에 대해 약 70% 더 많은 입력 토큰 (input tokens)을 사용했지만, 입력 가격 덕분에 여전히 더 저렴하게 나왔습니다. 의심스러울 정도로 동일한 범위 (ranges): 10회 실행 배치 (batch) 모두 정확히 동일한 범위인 14.90을 기록했습니다. 저는 복사-붙여넣기 오류라고 가정하고 원본 데이터 (raw data)로 돌아갔습니다. 하지만 오류가 아니었습니다. 각 배치에서 가장 낮은 점수를 받은 실행은 동일한 11개 기준 점수 벡터 (criterion score vector)를 반환했고, 가장 높은 점수를 받은 실행도 마찬가지였습니다. 두 개의 독립적인 배치 전체에서 모든 개별 기준에 대해 동일한 숫자가 나왔습니다. 따라서 이는 범위에 걸쳐 매끄럽게 샘플링 (sampling)되는 것처럼 보이지 않았습니다. 그보다는 모델이 반복되는 작은 점수 패턴 세트에 빠져 있는 것처럼 보였습니다. 20회 실행 전체에서 저는 단 15개의 고유한 가중치 합계 (weighted totals)만을 얻었습니다. 여기에는 두 번째 층위가 있습니다. gpt-4.1-mini는 기초 기준 점수 (underlying criteria scores)로 5의 배수만을 출력했으며, 110개의 점수 중 약 10개의 고유한 값만을 가졌습니다. 반면 gpt-5.6-luna는 자유로운 정수 (free integers)를 출력했으며, 유사한 실행에서 39개의 고유한 값을 가졌습니다. 따라서 구형 모델이 반드시 더 확신이 있었던 것은 아닙니다. 모델이 더 거친 격자 (coarser grid)로 반올림을 하고 있었으며, 동일한 몇 안 되는 답변들 중에서 계속 선택하고 있었던 것입니다. 한 단계가 통째로 뛰어넘기 전까지는 안정적으로 보입니다. 저의 첫 번째 분산 확인 (variance check)은 n=3을 사용했고, 잘못된 이야기를 들려주었습니다. 고통스러웠지만 유익했습니다. 확률적 시스템 (stochastic system)에서 3개의 샘플은 측정이 아닙니다. 그것은 스프레드시트를 곁들인 느낌 (vibe)일 뿐입니다. 한계점 (Limitations): 이것은 정확도 벤치마크 (accuracy benchmark)가 아닙니다. 전문가 라벨 (expert labels)도 없습니다.
단 하나의 경계선에 있는 쌍(borderline pair)이 흥미로운 불안정성의 대부분을 유발했습니다. 조건당 n=10은 적은 수치입니다. 이것은 코딩, RAG, 에이전트(agents) 또는 텍스트 전용 작업이 아닌, 이미지 쌍 구조의 점수 매기기(image-pair structured scoring)였습니다. 해당 경계선 쌍은 플레이스홀더(placeholder) 아트워크를 사용했으므로, 모델의 흔들림(wobble) 중 일부는 타당할 수 있습니다. 가격과 API 동작은 변경될 수 있습니다. 이것은 2026-08-01에 수행된 특정 시점의 테스트였습니다. 실질적인 시사점: 만약 LLM에 점수를 요청한 뒤 여기에 엄격한 임계값(hard threshold)을 적용한다면, 그 임계값 또한 모델의 일부가 됩니다. 컷오프(cutoff) 근처의 점수는 가짜로 명확한 카테고리로 분류할 것이 아니라, 아마도 "검토 필요(needs review)"가 되어야 할 것입니다. 다른 분들은 이를 어떻게 처리하는지 궁금합니다. 임계값 주변에 회색 지대(gray zone)를 추가하시나요? 재시도 후 평균을 내시나요? 스키마(schema)를 양자화(quantize)하시나요? 아니면 일부 사례는 결코 하나의 버킷(bucket)으로 강제 분류되어서는 안 된다는 점을 그냥 받아들이시나요? https://preview.redd.it/dp7efqku7ogh1.png?width=1920&format=png&auto=webp&s=c85b38057f645c4d6d89c0c9e5c9d1b914ffbab4 /u/Midoxp가 r/OpenAI에 제출함 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/OpenAI Codex (search)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기