トークンとは
Token
LLMなど自然言語処理モデルがテキストを入出力する際に扱う最小の処理単位
ひとことで言うと
AIが文章を扱うときに区切る、言葉の最小単位。単語や文字の断片のこと。
概要
トークンとは、LLMをはじめとする自然言語処理モデルがテキストを入力・出力する際に扱う最小の単位。 単語ひとつがそのまま1トークンになる場合もあれば、単語の一部(サブワード)や1文字が1トークンになる場合もある。 生のテキストをトークン列に変換する処理をトークナイゼーション(トークン化)と呼び、代表的な手法にBPE(Byte Pair Encoding)・WordPiece・SentencePieceなどがある。 LLMは有限個のトークンIDからなる語彙(vocabulary)を通じてテキストを扱い、モデルの入力・出力の長さ、APIの課金、コンテキストウィンドウの上限は全てトークン数で計測される。
背景
単語単位(Word-level)で語彙を構成すると語彙サイズが膨大になり、学習データ中に現れない未知語(OOV)への対応が弱いという課題があった。 サブワード単位のトークナイゼーションは、頻出する文字列の組み合わせを1トークンとして扱うことで語彙サイズを抑えつつ、未知語も既知のサブワードの組み合わせとして表現できるよう考案された。
歴史
1906年: 哲学者Charles Sanders Peirceが、記号の集合(タイプ)と個々の出現(トークン)を区別する「タイプ・トークン区別」を提唱し、「トークン」という用語の起源となる。 1990年代以降: 計算言語学・自然言語処理において、テキストを分割した最小単位を指す用語として定着。 2015年: Sennrichらがサブワード単位のトークナイゼーション手法BPEをNLPに導入し、現在のLLMで使われるトークナイゼーションの主流手法となる。
アーキテクチャ
トークナイザは学習済みの語彙表とマージルール(またはユニグラム統計)を持ち、入力テキストを頻度統計や最長一致に基づいてサブワード単位に分割し、それぞれを整数のトークンIDへ変換する。 LLM内部では各トークンIDが埋め込みベクトルに変換されてTransformerへ入力される。 日本語のように単語間にスペースがない言語では、形態素解析を経ずにバイト列やサブワード単位から直接トークン化する手法(SentencePieceのByte-fallbackなど)が広く使われる。
ワークフロー
生テキスト入力 → トークナイザによるサブワード分割 → トークンID列への変換 → 埋め込み層でベクトル化 → モデルへ入力。 生成時はこの逆に、モデルが出力したトークンID列を1つずつテキストへデコードする。
コード例
tiktokenによるトークン数のカウント
import tiktoken
enc = tiktoken.encoding_for_model("gpt-4")
tokens = enc.encode("トークンとは何か?")
print(len(tokens), tokens)利点
- 語彙サイズを抑えつつ未知語への対応力を確保できる
- モデルの入出力量・APIの課金・コンテキストウィンドウを共通の単位で計測できる
- 言語やドメインを問わず同じ枠組みでテキストを扱える
欠点
- 同じ内容でも言語やトークナイザによってトークン数が大きく変わる(日本語は英語よりトークン数が多くなりやすい)
- 数値の桁や綴りなど文字単位の情報がトークン境界で失われやすい
- コンテキストウィンドウの上限がトークン数で決まるため、長文処理の制約になる
比較
- LLM — LLMはテキストをトークン列として処理し、次トークンの予測を学習目標とする
- Transformer — Transformerへの入力は、トークンIDを埋め込みベクトル化したもの
- コーパス — コーパスは生テキストの集合であり、トークンはそれをモデルが処理できる単位に分割したもの
- コンテキストウィンドウ — コンテキストウィンドウの大きさはトークン数で計測される
関連用語
よくある質問
トークンと単語は同じもの?
必ずしも同じではない。 頻出する単語は1トークンになることが多いが、まれな単語や複雑な日本語の表現は複数のトークンに分割されることがある。
日本語はなぜ英語よりトークン数が多くなりやすい?
主要なLLMの語彙は英語中心のコーパスから学習されており、日本語の文字・表現に対する割り当てが英語ほど効率化されていないため、同じ内容でもトークン数が多くなりやすい。
参考文献
- GitHubopenai/tiktoken
- GitHubgoogle/sentencepiece
- DocumentationOpenAI Tokenizer