応答が組み立てられる過程を見る
普通のチャットに見えるやり取りも、内部では「入力トークン列から次の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