3秒でわかる
AIモデルが1回のやり取りで扱えるトークンの上限。指示と会話履歴と資料と出力の全部がこの枠を共有し、長い資料を渡せる量を決めます。
30秒図解
もう少し詳しく
どういうものか
コンテキスト長は、大規模言語モデルが 1 回のやり取りで扱えるトークン数の上限です。ここに含まれるのは、システムプロンプト、これまでの会話履歴、添付した資料、そしてモデルが書く出力の全部です。入力だけの上限だと思われがちですが、多くのモデルでは出力ぶんも同じ枠を食います。日本語はおおよそ 1 文字が 1 から 2 トークンになるため、10 万トークンの枠でも日本語なら 5 万文字程度が目安です。
なぜ必要か
上限があるのは、計算量の都合です。Transformer は全トークン同士の関係を計算するため、長さが 2 倍になると計算量はおおむね 4 倍になります。実務では、この枠を意識せずに長い資料を丸ごと貼るとエラーで止まるか、古い会話が黙って切り捨てられて話が噛み合わなくなります。チャットボットを作るとき、履歴をどこまで持ち回すかは必ず設計項目になります。
具体例
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
doc = open("manual.md", encoding="utf-8").read()
tokens = len(enc.encode(doc))
print(tokens)
LIMIT = 100_000
if tokens > LIMIT:
# 収まらないので分割して渡す
chunks = [doc[i:i + 3000] for i in range(0, len(doc), 3000)]送る前に数えておくと、失敗してから気付く事態を避けられます。
つまずきやすいところ
枠に収まっていれば全部読まれている、という思い込みが危険です。長い入力の中間部分は参照されにくくなる傾向が知られており、重要な指示は先頭か末尾に置くほうが確実に効きます。もうひとつは料金の見落としで、長い履歴を毎回送り直すと、同じ内容に何度も課金されます。会話が伸びたら古い部分を要約に置き換える処理を入れると、精度と費用の両方が改善します。
似た用語との違い
| 用語 | 指すもの |
|---|---|
| トークン | モデルが文章を区切って扱う単位 |
| コンテキスト長 | 1回のやり取りで扱えるトークンの総量 |
| 最大出力トークン | 1回の返答として書ける長さの上限 |
| RAG | 必要な箇所だけ検索して渡し、総量を抑える手法 |
コンテキスト長が伸び続けている今も RAG が使われるのは、全文を毎回送ると料金と応答時間が線形に増えるためです。枠に入るかどうかと、入れるべきかどうかは別の判断になります。
覚え方
コンテキスト長はモデルの机の広さです。広い机でも、端に置いた書類は見落とされます。