応答が組み立てられる過程を見る

普通のチャットに見えるやり取りも、内部では「入力トークン列から次の1トークンの確率を計算して1つ選ぶ」処理の繰り返しです。その過程を、実際のモデルで段階を追って見ていきます。

0 普通にチャットする

いつも通りのチャットです。メッセージを送ると応答が返ります。まずはこの状態から始めます。

↑ システムプロンプト(普段は見えない前提の指示)

1 入力はテンプレートで包まれている

あなたの入力もシステムプロンプトも、役割(system / user / assistant)を示す特殊トークンで包まれてからモデルに渡されます。これが chat template。色が付いているのが特殊トークンです。

末尾の <|im_start|>assistant までが入力で、モデルはこの続きを書きます。だから「会話」のように見えます。

2 展開すると1本の文字列になる

テンプレートを展開すると、これは1本の長い文字列です。モデルがしているのは「この文字列に続く次の部分を予測する」、それだけです。

3 文字ではなくトークンの列になる

モデルは文字単位では読みません。文字列はまずトークン(語や部分文字列の単位)に分割され、各トークンはID(整数)になります。下のチップにカーソルを乗せるとIDが出ます。日本語は1文字が複数トークンに分かれたり、複数文字が1トークンになったりします。

合計 トークン。モデルが実際に見ているのは、この整数の列だけです。

4 次の1トークンは確率で選ばれる

モデルは入力トークン列から、次に来る全トークンの確率を計算します。下がその上位15個。通常はここから1個を選んで末尾に足し、また計算…を繰り返します。ここではあなたがサンプラーです。バーをクリックして1トークンずつ応答を作ってみてください。

「サンプラー開始」を押すと、stage 1 の入力の続きをここに書いていきます

温度 = 1.0:素の確率。下げると尖って(決定的に)、上げると平らに(ランダムに)なります。0に近づけると常に「最有力」を選ぶ=貪欲。

次のトークンの確率 上位15