同じプロンプトなのに毎回答えが変わる——LLM の非決定性という落とし穴
요약
LLM(대규모 언어 모델)의 근본적인 문제 중 하나는 '비결정성'입니다. 이는 동일한 프롬프트와 파라미터를 사용하더라도 실행할 때마다 출력이 달라지는 현상을 의미하며, 특히 복잡한 추론이나 장문의 결과물을 요구하는 작업에서 그 차이가 커집니다. 개발자는 `temperature`나 `top_p` 같은 파라미터 조정이나 `seed` 값 설정을 통해 출력의 변동성을 줄일 수 있지만, 이 방법들은 완전한 재현성(완벽한 결정성)을 보장하지 못합니다.
핵심 포인트
- LLM은 본질적으로 비결정적(Non-deterministic)이므로, 동일 입력에도 출력이 달라지는 것이 일반적입니다.
- `temperature`를 0에 가깝게 설정하면 출력의 변동성을 줄이는 데 효과적이지만, 완전한 재현성은 보장되지 않습니다.
- `top_p`(nucleus sampling) 역시 안정화에 도움을 주지만, 결정적인 출력을 만들 수는 없습니다.
- 과거에는 `seed` 파라미터가 있었으나, 최신 API(Responses API 등)에서는 이 기능이 사라지거나 공식적인 재현성 제어 수단이 약해지고 있습니다.
- LLM의 비결정성을 완전히 해결하기 위해서는 모델 자체의 근본적인 이해와 아키텍처적 접근이 필요합니다.
AI Agent が流行りのワードになって久しいですが、実際に開発しているとその核となる LLM には厄介な性質があることに気づきます。
それが「非決定性」、つまり全く同じ入力を与えても出力が変化する性質です。
この記事では、そんな非決定性について紐解きつつ、私が開発する中で実際に行なっている対処法を紹介します。
まずは結論から
- LLM には決定性がないため、全く同じプロンプトとパラメータを与えても実行するたびに出力が変わります。出力させる内容が複雑であればあるほど揺らぎが大きくなるため、何か見逃してはいけない問題を見つけるためのレビューを行わせるといった使い方では注意が必要です。
- 出力の揺らぎを小さくするパラメータとして
temperature
や
top_p
はありますが、これらは完全な再現性を保証するものではありません。OpenAI の API で再現性に近づけるための手段としては
seed
がありましたが、OpenAI Cookbook でも「mostly deterministic」と説明されており、完全な決定性を保証するものではありません。2026 年 5 月 7 日時点で主流の Responses API に
seed
パラメータ自体が存在しません。
この記事の前提
- この記事で言及する LLM は、OpenAI の GPT や Anthropic の Claude など、サーバレスで使うものを指しています。もしかしたら単一サーバー上で動かすローカル LLM だと決定性が得られるかもしれません。
- 私が Agent 開発でメインに使っているのは OpenAI GPT 系であるため、API の仕様や挙動の説明は OpenAI を前提にしています。Anthropic の Claude でも非決定性の性質は同様です。
決定性とは何か
プログラムに決定性があるとは、「同じ入力を与えると常に同じ出力が返る」性質のことです。
たとえば
add(2, 3)
は何度呼んでも
5
を返します。この前提があるからこそ、ユニットテストが成立し、バグの再現と修正が可能になります。
LLM にはこの性質がありません。OpenAI Cookbook でもデフォルトでは非決定的で、リクエストごとに出力が異なり得ると説明されています(OpenAI Cookbook: Reproducible outputs with the seed parameter)。
例えば、「以下のコードをレビューして」という全く同じプロンプトを送っても、返ってくる文章は毎回異なります。指摘する問題点の順序が変わったり、ある実行では言及された懸念点が次の実行では省略されたりします。単純な出力であれば揺らぎは小さいですが、複雑な推論や長い文章が絡むほど、実行ごとの差異は大きくなります。
決定性をある程度コントロールする方法
temperature=0 という対処法
LLM の非決定性を調べると、まず「temperature=0 にすればいい」という情報が出てきます。temperature は LLM がトークンを選ぶときの確率分布の「広がり」を制御するパラメータです。OpenAI の Responses API リファレンスでも、temperature は 0〜2 のサンプリング温度で、値が高いほど出力がランダムになり、低いほど集中して決定的になると説明されています(OpenAI API Reference: Create a response)。
LLM は文章を生成するとき、次のトークンの候補それぞれに確率を割り当てて、その分布からサンプリングします。temperature が高いほど分布が平坦になり、確率の低いトークンも選ばれやすくなります。逆に temperature=0 に近づくほど分布が鋭くなり、最も確率の高いトークンだけを確定的に選ぶ「貪欲法(greedy decoding)」に近づきます。
つまり
temperature=0
は、出力の揺らぎを抑えるための有効な手段ではあります。ただし、これだけで完全に再現するわけではありません。
加えて、GPT-5 では
temperature=1
以外を指定するとエラーになる仕様となりました。そのため、
temperature=0
をそもそも指定できません。
top_p という対処法
top_p
(nucleus sampling)も出力の揺らぎを抑えるために使われるパラメータです。次のトークンを選ぶ際に、累積確率が
top_p
を超えるまでの上位候補だけに絞り込んでサンプリングします。値を小さくするほど候補が減り、出力が安定する方向に動きます。
ただし、これも temperature と同様、完全な再現性は保証されませんし、GPT-5 では 1 以外を指定できなくなりました。
seed パラメータという手段
Chat Completions API にはもう一つの手段として
seed
パラメータが用意されていました。同じ
seed
値を指定すれば、ある程度同じ出力が得られるというものです。
ただし OpenAI Cookbook では、
seed
を同じ値にして他のパラメータも揃えると「mostly deterministic」な出力を得られると説明されています。つまり、
seed
は再現性に近づけるための手段ではありますが、完全な決定性を保証するものではありません(OpenAI Cookbook: Reproducible outputs with the seed parameter)。
また、OpenAI 側でモデルの設定が変更されると同じ
seed
でも出力が変わることがあり、それを検知するために
system_fingerprint
이 응답에는 seed 파라미터가 포함되어 있습니다 (OpenAI API Reference: Chat)。
또한, 2026 년 5 월 7 일 기준 Responses API 에는 seed 파라미터 자체가 존재하지 않습니다. Responses API 의 Create response 리퍼런스에는
temperature
와 top_p
은 있지만, seed
은掲載されていません (OpenAI API Reference: Create a response). OpenAI 는 Chat Completions API 에서 Responses API 로의 이동을 권장하고 있으며, 재현성을 직접적으로 제어할 공식적인 수단은 약해져 보인다고 보입니다.
요약하면, temperature
와 top_p
도 seed
도 LLM 의 비결정성에 대한 완전한 해결책이 아닙니다.
왜 결정성이 없는가
이 부분은 저도 전문가가 아니므로, 조사한 한계에서의 이해입니다.
먼저, temperature=0
또는 같은 seed
를 지정해도 실행 기반 측의 수치 계산의 요동은 남아있는ようです. GPU 는 병렬 연산으로 처리를 고속화하지만, 부동소수점 연산은 계산의 순서에 따라 결과가 미세하게 달라질 수 있습니다. PyTorch 의 재현성에 관한 문서에서도, 같은 seed 를 사용해도, 릴리스·플랫폼·CPU/GPU 간에 완전한 재현성은 보장되지 않는다고 설명됩니다 (PyTorch docs: Reproducibility)。
나의 이해에서는, 포인트는「다음 토큰을 선택하기 직전의 스코어가ほんの少し変わるだけでも、生成結果全体が分岐し得る」というところです. 여러 토큰의 확률이 매우 가까운 경우, 작은 수치 차이로 어떤 토큰이 선택되는かが 바뀝니다. 한 번 다른 토큰이 선택되면, 그 후의 입력 컨텍스트 자체가 변하기 때문에, 후속 문장도 크게 달라질 수 있습니다.
또한, OpenAI 나 Anthropic 같은 서버리스 API 는 사용자가 추론 시 GPU 나 모델 측의 설정을 고정할 수 없습니다. OpenAI 의 system_fingerprint
는, 모델을 실행하는 백엔드 구성을 나타내는 식별자로 설명됩니다. 이는 반대로 말하면, 같은 요청처럼 보아도, 백엔드 측의 조건이 바뀌면 결과가 바뀔 수 있다는 것입니다.
결정성이 없으면何が問題か?
가장 곤란한 것은, 「놓쳐서는 안 되는」용도에 LLM 을 사용할 때입니다.
예를 들어, 코드 리뷰를 LLM 에 맡겨 보안상의 문제를 검출하게 한다고 가정해 봅시다. 어떤 실행에서는 취약점을 지적해 주었지만, 다른 실행에서는 같은 코드를 넘겨주어도 아무 말도 하지 않는 일이 일어납니다. LLM 이「気づかなかった」のか「問題がないと判断した」のかが区別できません.
이 문제는, Agent 화하면 더욱 커집니다. 도구 호출이나 외부 API 와의 연계가 얽으면, 비결정성의 영향이 연쇄하고、「なぜこの結果になったのか」の追跡がさらに難しくなります.
구체例:코드 리뷰의 issue 를 Structured Output 으로 지적하는 경우
코드 리뷰를 LLM 에 맡기고, 지적 내용을 JSON 으로 반환하는 경우를 생각해 봅시다.
예를 들어, 이런 출력 형식을 정의합니다.
{
"issues": [
{
...
같은 코드를 같은 프롬프트와 파라미터로 10 회 리뷰하게 하면, level
이 critical
이 되거나 high
이 됩니다. 검출되는 issues
의 수도 바뀝니다. 어떤 실행에서는 3 건 지적된 것이, 다음 실행에서는 2 건이 되는 것입니다. 게다가 어떤 issue
가 사라지는지는毎回異なります.
これが特に問題になるのは、プロンプトチューニングをしているときです。
「シニアエンジニアが実際にレビューした結果」を正解データとして用意し、LLM の出力がそれに近づくようにプロンプトを調整したとします。調整後に実行してみたら、前より良さそうな出力が返ってきた。
でも、それがチューニングの効果なのか、たまたまその実行が良かっただけなのか、1回の結果では判断できません.
「プロンプトを少し修正→再実行→結果が良くなった→これが良いプロンプト!」を繰り返すのは、当たりが出るまでガチャを引き続けているのと同じです。
私がとっている対処法:複数回実行して傾向を見る
현재의 대응으로, 같은 입력에 대해 10 회 실행하고, 결과의 분포를 확인하는 방식으로 하고 있습니다.
예를 들어「SQL 인젝션의 가능성」이 level: critical
로 검출되는 비율이, 튜닝 전에는 10 회 중 3 회였지만, 튜닝 후 8 회가 되면, 개선 경향이 있다고 판단할 수 있습니다. 반대로 10 회 중 4 회와 5 회라면 큰 차이가 없으므로, 오차의 범위입니다.
1 회 실행에 따라 기뻐하거나 슬퍼하지 않고, 「何回中何回、望ましい結果が出るか」という確率で品質を見るようにしてから, 튜닝의 느낌을だいぶ掴みやすくなりました.
まとめ
LLM 의 비결정성은 버그가 아니라, 아키텍처상의 구조적인 성질입니다. temperature=0
와 top_p
도 seed
도 완화책이 될 수 있지만, 완전한 해결책은 아닙니다. 게다가 GPT-5 가 주류로 되면서, 그들조차 사용할 수 없게 되어가고 있습니다.
중요한 것은「再現しない前提」で設計・評価する考え方に切り替えることだと思っています. 1 회 실행 결과에 기뻐하거나 슬퍼하지 않고, 여러 회 실행한 분포에서 경향을 보는 것입니다. 정밀도를「高い・低い」ではなく「何%の確率で望ましい結果が出るか」で測るといった 형입니다.
이 번역본은 원문의 구조와 내용을 최대한 충실히 반영하여 작성되었습니다.
또한, 이러한 특성이 허용되지 않는 경우, 예를 들어 생명을 결정하는 의사결정 등에서는 AI 에이전트를 채택하는 것이 매우 어렵다고 생각합니다.
반복성을 보장하는 산업용 LLM 이나 유사한 것이 나오면 이야기가 달라질 수 있지만, 현재는 AI 에이전트에 적합한ユース케이스을 판단하면서 확률적 행동을 전제로 다루는 것이 중요하다고 생각합니다.
우리 회사는 AI 에이전트의 설계 및 개발을 수행하고 있습니다. 문의사항은 이곳에서.
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기