0Pricing
AI Prompt Engineering · レッスン

AI が応答を生成する仕組み

トークン予測と確率、そして AI が人間のように「考える」わけではない理由を学びます。

「AI が応答を生成する仕組み」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。

確率問題としてのテキスト

言語モデルの本質的な役割は1つです。前にあるすべてのトークンをもとに、次のトークンを予測することです。

トークンはテキストの小さな単位で、およそ単語または単語の一部に相当します。モデルは語彙に含まれるすべてのトークンに確率を割り当て、そのうち1つを選びます。そして、完全な回答を生成するまで、トークンごとにこの処理を繰り返します。

トークンとは何か

トークンは、LLMのテキスト処理における基本単位です。英語のテキストは、おおむね次のようにトークン化されます。

  • 一般的な単語 → 1語につき1トークン(the、run)
  • あまり一般的でない単語 → 2〜3個のトークンに分割される(running → run + ning)
  • 句読点とスペース → 多くの場合、それぞれ独立したトークンになる

GPT-4oやClaudeなどのモデルは、多くの言語のサブワードを含む10万以上の語彙エントリを扱えるトークナイザーを使用しています。

import tiktoken

encoding = tiktoken.encoding_for_model('gpt-4o')

sentence = 'The temperature parameter controls randomness in token selection.'
tokens = encoding.encode(sentence)
token_strings = [encoding.decode([t]) for t in tokens]

print(f'Sentence: {sentence}')
print(f'Token count: {len(tokens)}')
print(f'Tokens: {token_strings}')

自己回帰生成

生成は自己回帰的に行われます。次のトークンを予測する前に、新しいトークンが入力へ追加されます。

たとえば「空は青い」を生成する場合、モデルは次のように処理します。

  • 「空」を見る → 「は」を予測する
  • 「空は」を見る → 「青い」を予測する
  • 「空は青い」を見る → シーケンスの終了を予測する

長い出力の生成に時間がかかるのはこのためです。各トークンの生成に、完全なフォワードパスが必要になるからです。

# Simulated autoregressive token-by-token output via streaming
import openai

client = openai.OpenAI(api_key='sk-your-key-here')

stream = client.chat.completions.create(
    model='gpt-4o',
    stream=True,     # receive tokens as they are generated
    messages=[{'role': 'user', 'content': 'Name five planets in our solar system.'}]
)

print('Tokens arriving one by one:')
for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end='', flush=True)
print()  # newline at end

Temperature:ランダム性の制御

Temperatureは、サンプリング前に確率分布を調整する0〜2の数値です。

  • Temperature 0:最も確率の高いトークンを常に選択する — 決定的で、繰り返しが多い
  • Temperature 1:元の確率に従ってサンプリングする — バランスが取れている
  • Temperature 2:確率分布を平坦化する — 非常にランダムで、ときどき一貫性を欠く

事実に基づくタスクには低いTemperatureを、クリエイティブな作業には高いTemperatureを使用してください。

import openai

client = openai.OpenAI(api_key='sk-your-key-here')

prompt = 'Continue this sentence with one word: The ocean is'

for temp in [0.0, 0.7, 1.5]:
    response = client.chat.completions.create(
        model='gpt-4o',
        temperature=temp,
        max_tokens=5,
        messages=[{'role': 'user', 'content': prompt}]
    )
    word = response.choices[0].message.content.strip()
    print(f'Temperature {temp}: "{word}"')

実行するたびに回答が変わる理由

同じプロンプトを使っても、同じモデルを2回実行すると異なる出力になることがあります。これは、次の理由によるものです。

  • サンプリングは確率的であり、モデルは検索表ではなく確率分布から選択する
  • 浮動小数点演算のわずかな数値差が連鎖する
  • ハードウェアの並列処理によって非決定性が生じる

再現性を最大限に高めるには、temperature=0とseed(対応している場合)を設定してください。

import openai

client = openai.OpenAI(api_key='sk-your-key-here')

prompt = 'Give me a one-word color that feels calm.'

for run in range(3):
    response = client.chat.completions.create(
        model='gpt-4o',
        temperature=1.0,   # randomness ON
        max_tokens=5,
        messages=[{'role': 'user', 'content': prompt}]
    )
    print(f'Run {run + 1}: {response.choices[0].message.content.strip()}')

# For reproducible outputs use seed + temperature=0
response = client.chat.completions.create(
    model='gpt-4o',
    temperature=0,
    seed=42,
    max_tokens=5,
    messages=[{'role': 'user', 'content': prompt}]
)
print(f'Deterministic: {response.choices[0].message.content.strip()}')

Top-pサンプリング

Top-p(nucleus sampling)は、ランダム性を制御するもう1つの方法です。すべての確率を調整する代わりに、累積確率がpを超える最小限のトークン集合にサンプリング対象を制限します。

  • top_p=0.1:ごく上位のトークンだけを対象にする(保守的)
  • top_p=0.9:より幅広い候補を対象にする(クリエイティブ)
  • top_p=1.0:すべてのトークンを対象にする(完全な確率分布)

実際には、ほとんどのチームがTemperatureを調整し、top-pは1.0のままにしています。

import openai

client = openai.OpenAI(api_key='sk-your-key-here')

# Conservative generation: top_p=0.1 restricts to high-confidence tokens
response_conservative = client.chat.completions.create(
    model='gpt-4o',
    top_p=0.1,
    max_tokens=30,
    messages=[{'role': 'user', 'content': 'What is the capital of Japan?'}]
)

# Creative generation: top_p=0.95 allows broader token pool
response_creative = client.chat.completions.create(
    model='gpt-4o',
    top_p=0.95,
    max_tokens=30,
    messages=[{'role': 'user', 'content': 'Write a poetic one-liner about the moon.'}]
)

print('Conservative:', response_conservative.choices[0].message.content)
print('Creative:    ', response_creative.choices[0].message.content)

真の理解はない — パターンマッチング

LLMは、人間と同じように言語を理解しているわけではありません。膨大なテキストコーパスで学習した、非常に高度なパターンマッチャーです。

モデルが「光合成とは何ですか?」と回答するとき、保存された事実を取り出しているわけではありません。学習中に何百万もの類似した文書を見た経験に基づき、その質問パターンに続く可能性が統計的に高いトークン列を生成しています。

# Demonstration: the model can produce plausible-sounding but wrong answers
import anthropic

client = anthropic.Anthropic(api_key='sk-ant-your-key-here')

# Asking about something nonsensical — model may still try to answer
response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=128,
    messages=[{
        'role': 'user',
        'content': (
            'What is the boiling point of happiness in degrees Celsius? '
            'Please just say "I cannot answer this" if the question makes no sense.'
        )
    }]
)
print(response.content[0].text)

学習と推論

モデルの「知識」は、大規模なテキストコーパスで学習した時点で固定されています。推論時(プロンプトを送信したとき)、モデルはその固定された知識に基づいてテキストを生成します。学習したり、インターネットを検索したりしているわけではありません。

つまり、学習のカットオフ日以降の出来事を知ることはできず、URLにアクセスしたり、学習後に事実が変わっていないかを確認したりすることもできません。

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-your-key-here')

# Asking the model about its own knowledge cutoff
response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=128,
    messages=[{
        'role': 'user',
        'content': (
            'What is your knowledge cutoff date? '
            'And can you access the internet right now to look up today\'s news?'
        )
    }]
)
print(response.content[0].text)

フォワードパスの内部で起きていること

高いレベルで見ると、各トークンの予測では次の処理が行われます。

  1. 入力されたすべてのトークンを数値の埋め込み表現に変換する
  2. 多数のTransformerレイヤー(アテンション+フィードフォワード)に通す
  3. 語彙全体に対する確率分布を生成する
  4. その分布から1つのトークンをサンプリングする

最新のモデルには、この変換の形を決める数十億個のパラメータがあります。これらはすべて、人間が書いたテキストから学習されたものです。

# You can inspect logprobs (token probabilities) to see the model's confidence
import openai

client = openai.OpenAI(api_key='sk-your-key-here')

response = client.chat.completions.create(
    model='gpt-4o',
    max_tokens=5,
    logprobs=True,
    top_logprobs=3,
    messages=[{'role': 'user', 'content': 'The opposite of hot is'}]
)

for token_info in response.choices[0].logprobs.content:
    print(f'Chosen token: "{token_info.token}"')
    for alt in token_info.top_logprobs:
        import math
        prob = round(math.exp(alt.logprob) * 100, 1)
        print(f'  Option "{alt.token}": {prob}% probability')

停止シーケンス

停止シーケンスは、特定の文字列を生成した時点でモデルに生成を停止させます。次のような用途に便利です。

  • リスト内でモデルが2つ以上の回答を生成するのを防ぐ
  • ###や---END---のような区切り文字で停止する
  • 1行だけの出力を強制する

停止シーケンスを指定しない場合、モデルはmax_tokensに達するか、終了シーケンストークンを予測するまで生成を続けます。

import openai

client = openai.OpenAI(api_key='sk-your-key-here')

# Stop after the first item in a numbered list
response = client.chat.completions.create(
    model='gpt-4o',
    max_tokens=64,
    stop=['2.'],   # halt as soon as '2.' appears
    messages=[{
        'role': 'user',
        'content': 'List 5 programming languages, numbered 1 through 5.'
    }]
)
print(response.choices[0].message.content)
print('Stop reason:', response.choices[0].finish_reason)

プロンプト作成者にとっての実践的な意味

生成の仕組みを理解すると、よりよいプロンプトを書けるようになります。

  • 一貫性のある事実に基づく出力が必要なタスクでは温度0を使用する
  • 創作には温度0.7~1.0を使用する
  • 事実を確認する — モデルが生成するのはもっともらしいテキストであり、真実が保証されているわけではない
  • 出力の長さを正確に制御するために停止シーケンスを使用する
  • 短いプロンプト → より創造的だが、制御しにくい出力
  • 詳細なプロンプト → より制約され、焦点の絞られた出力
import anthropic

client = anthropic.Anthropic(api_key='sk-ant-your-key-here')

# Low temperature for factual classification
fact_response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=8,
    temperature=0,   # deterministic
    messages=[{'role': 'user', 'content': 'Is Paris the capital of France? Answer YES or NO only.'}]
)
print('Factual (temp=0):', fact_response.content[0].text.strip())

# Higher temperature for creative tasks
creative_response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=64,
    temperature=1.0,
    messages=[{'role': 'user', 'content': 'Write a surprising one-line poem about code.'}]
)
print('Creative (temp=1):', creative_response.content[0].text.strip())

理解度チェック

LLMがトークンを1つずつ生成してテキストを作る仕組みを学びました。温度について理解できているか確認しましょう。

ある開発者が、請求に関する質問に一貫性のある正確な回答をしなければならないカスタマーサポートチャットボットを開発しています。最も適切な温度設定はどれでしょうか。

AIが回答を生成する仕組み — まとめ

これで、AIのすべての回答の背後にある仕組みを理解できました。

  • モデルは次のトークンを1つずつ予測する — 自己回帰生成
  • 温度は、トークン選択に加えるランダム性の大きさを制御する
  • Top-pは、確率の高いトークン群にサンプリング対象を限定する
  • モデルは理解しているわけではない — 大規模なパターンマッチングを行っている
  • 知識は学習時点で固定される — リアルタイムデータもインターネットアクセスもない
  • 停止シーケンスを使うと、出力をどこで終了させるかを正確に制御できる

よくある質問

「AI が応答を生成する仕組み」レッスンは無料ですか?

はい。「AI が応答を生成する仕組み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。

「AI が応答を生成する仕組み」で何を学びますか?

トークン予測と確率、そして AI が人間のように「考える」わけではない理由を学びます。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Prompt Engineeringを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「AI が応答を生成する仕組み」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Prompt Engineeringレッスンでコードを書いて実行できますか?

はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. チャットインターフェースを理解する
  2. AI が処理できるリクエストの種類
  3. AI が応答を生成する仕組み
  4. AI にできないこと
← AI Prompt Engineeringに戻る