Text Generation
テキスト生成とは、言語モデルが一度に1トークンずつ予測し、貪欲デコーディング、ビームサーチ、サンプリングのいずれかで各トークンを選んで文章を生成する仕組みです。
テキスト生成とは、1行の応答からレポートやプログラム全体まで、モデルが文章を自動生成することです。現在は主に大規模言語モデル(LLM)が自己回帰方式で生成します。モデルはプロンプトを受け取ると、語彙内のすべてのtokenについて確率を計算し、1つを選んで追加する処理を、停止するまで繰り返します。この同じループが、チャットアシスタント、コード補完、機械翻訳、テキスト要約を支えています。以前のシステムはテンプレートを埋めたり、n-gramモデルや再帰型ニューラルネットワークモデルからサンプリングしたりしていました。2019年以降はTransformerにより、GPT-2をはじめとするモデルで長く一貫性のある出力を実用的に生成できるようになりました。
自己回帰生成の仕組み#
トークン化によってプロンプトがトークンIDに変換され、モデルは1回の並列プリフィル処理ですべてのトークンを処理し、各トークンのアテンションキーと値をKVキャッシュに保存します。その後の各デコードステップでは、最新のトークンだけをモデルに入力し、キャッシュを読み込んで、語彙内の各要素に対する生のスコアであるロジットを出力します。ソフトマックスがこれらのロジットを確率に変換します。デコード戦略によって次のトークンが選ばれ、ユーザーにストリーミングされてシーケンスに追加されます。生成は、シーケンス終了トークン、停止文字列、またはトークン数の上限に達したときに終了するため、出力長は生成中に決まります。
プリフィルは計算負荷が高く、デコードはメモリ帯域幅に制約されるため、サービングエンジンは両者を慎重にスケジューリングします。たとえばチャンク化プリフィルを利用します。ストリーミングとは、テキストが表示されるにつれてアプリケーションがユーザーに提示する仕組みです。Ultralytics LLMインターフェースはstream=TrueをOpenAI SDKに渡すため、YOLO26アプリケーションでは、検出したシーンの説明をモデルが生成する際に、response.output_text.deltaイベントが届くたびにトークン単位で表示できます。
デコード戦略#
デコード戦略は、モデルと同じくらい出力の性質を左右します。貪欲デコードは常に最も確率の高いトークンを選ぶため決定的ですが、同じ表現を繰り返しやすい傾向があります。ビームサーチは確率の高い部分シーケンスをk個保持し、最も良い完成済みシーケンスを返すため、翻訳のように正解が1つのタスクに適しています。サンプリングでは、通常は分布の形を調整してから、その分布に従って選択します。温度はソフトマックスの前にロジットを割り、top-kサンプリングは確率の高いk個のトークンだけを残します。核サンプリング(top-p)は、Holtzmanらが2019年に発表した「The Curious Case of Neural Text Degeneration」で提案され、確率の合計がpに達する最小のトークン集合を残します。PyTorchで5トークンの語彙を使うと、両方の効果を確認できます。
import torch
# Next-token logits over a five-word vocabulary after the prompt "I took the"
vocab = ["bus", "train", "car", "stairs", "banana"]
logits = torch.tensor([3.0, 2.4, 1.8, 0.6, -2.0])
# Temperature divides the logits: low values sharpen the distribution, high values flatten it
for temperature in [0.5, 1.0, 1.5]:
probs = torch.softmax(logits / temperature, dim=-1)
print(f"T={temperature}:", ", ".join(f"{w} {p:.2f}" for w, p in zip(vocab, probs)))
# Top-p (nucleus) sampling keeps the smallest set of tokens whose probabilities reach p
probs, order = torch.softmax(logits, dim=-1).sort(descending=True)
keep = probs.cumsum(dim=-1) - probs < 0.9
print("Top-p 0.9 keeps:", [vocab[i] for i in order[keep]])
# Sample from the renormalized nucleus
torch.manual_seed(0)
picks = torch.multinomial(probs[keep] / probs[keep].sum(), num_samples=10, replacement=True)
print("Samples:", [vocab[order[i]] for i in picks])温度0.5では「bus」の確率は0.71ですが、1.5では0.42に低下し、「banana」は0.00から0.02に上昇します。top-pを0.9にすると「bus」、「train」、「car」が残り、この3つで確率の合計が0.95になるため、「stairs」と「banana」はサンプリングされません。10回サンプリングすると、残った3つがさまざまな組み合わせで生成されます。他の制御も同じロジットに作用します。反復ペナルティはすでに使用されたトークンのスコアを下げ、制約付きデコードは文法やJSONスキーマに違反するすべてのトークンをマスクします。これにより、APIは構造化出力を保証できます。投機的デコードでは、小さなドラフトモデルに複数のトークンを提案させ、大きなモデルが1回の処理で検証することで生成を高速化します。
テキスト生成と関連用語の比較#
- 言語モデリング: 次のトークンの確率を学習することであり、生成を可能にする学習目的です。生成とは、そのモデルを推論時に使用することです。
- 系列変換モデル: 翻訳のように、別個の入力テキストから出力テキストを生成するエンコーダー・デコーダーモデルです。デコーダーのみのLLMは、プロンプトを続けることで同じタスクを処理します。
- 拡散言語モデル: 1トークンずつ生成するのではなく、複数回のノイズ除去ステップで全位置を並列に反復修正し、文章全体を生成します。
- テキストから画像への生成: テキストを入力として受け取り、ピクセルを生成します。
品質とリスク#
生成テキストは、正確かどうかにかかわらず流暢であるため、事実性が重要な用途ではハルシネーションが主なリスクとなります。検索拡張生成(RAG)では、ソース文書をプロンプトに含めることで、ハルシネーションを抑えます。温度を低くすると回答の再現性が高まり、温度を高くすると多様性が増す一方で、確率が低く誤ったトークンを選ぶ可能性も高まります。機械生成テキストは見分けることも難しく、AIウォーターマーキングの研究が進められています。2020年のGPT-3論文では、1,750億パラメーターのモデルが書いた200語のニュース記事と人間が書いた記事を見分けるよう求められた人々の正答率は、わずか52%でした。










