概要
ChatGPTのAPIを利用時にmax_tokens
というオプション設定ができる.
これについて解説・実験してみる.
前提
- ChatGPTをAPI経由で使用したことがある人
- WebAPIをJSONで扱っている
- トークンの量と文字量の違いが分かる人
- トークンを数えるツールはこちら
前提知識(トークンについて)
トークンとは,ChatGPTに聞いてみた.
ChatGPTにおける「トークン」とは、
テキストを処理する際に使用される基本的なデータ単位です。
トークンは単語、句読点、スペース、特殊文字などを表すことができ、
テキストを機械が解析しやすい形に分割するために用いられます。
例えば、「こんにちは、世界!」という文は、
「こんにちは」「、」「世界」「!」というトークンに分割されます。
このトークン化により、ChatGPTはテキストを理解し、
適切な応答を生成することができます。
また、トークンは、ChatGPTが生成するテキストの長さを計算する際にも使用されます。
こう返ってきますが,単語で分割されているというのは嘘です.
基本的に英語ベースの場合の処理だと,綺麗に単語単位での分割になります.
日本語での「こんにちは、世界!」は以下のように分割され,「世界」という単語は2トークンで「世」,1トークンで「界」を表現します.
一部の漢字が1トークン扱いでない理由は,漢字単体に複数の読みや意味があり,文脈でそれらが変わるためとされています.
また,英語の場合でも,1単語が長い場合その限りではありません.
例として,医学用語「Pseudopseudohypoparathyroidism」は1トークンではありません.
また,生成系AIモデル(GPT-3やGPT-3.5など)毎にトークンの分け方が異なる場合や,アップデート,バックエンドシステムの改修で変更される場合がありますので,
トークン数を厳密に制御することは困難と考えて活用するのがいいかと思います.
だいたいこれぐらいのトークン数だよね,という使い方が適切とおもわれます.
前提知識(max_tokensについて)
以下は,max_tokens
についての解説になります.
簡単に言うと,ChatGPTの回答に文字数(正確にはトークン数)制限を付ける機能です.
APIはこの文字数(トークン)で料金が変わります.
10文字ぐらいで答えてほしいのに,毎回10万文字で返答されて,その分料金が上がってしまったらユーザーもお怒りです.
今回は,max_tokens
について検証します.
機能解説
max_tokens
は,ChatGPTのレスポンスのトークン量を制限する機能になります.
{
"model": "gpt-3.5-turbo",
"messages": [
{"role": "user", "content": "太陽はなぜ明るいのか?"}
],
"max_tokens": 800
}
例えば上記の入力に対して,下記のように返答があります.
返答のトークン数が,設定値以下になります.(tokenizerを使用)
800トークン以内という制限は満たしていますが,説明をこのトークン数分までしてくれるわけではなさそうです.
実験 ① とても短く設定してみる.
max_tokens
を少なく設定することで強制的に短い答えを作れるか検証します.
そのため,単語で答えられる質問をします.
入力をした質問 : 赤と青を混ぜたら何色ですか?
予想される回答 : 紫 (2トークン)
{
"model": "gpt-3.5-turbo",
"messages": [
{"role": "user", "content": "赤と青を混ぜたら何色ですか?"}
],
"max_tokens": 2
}
いや,間違えとるがな
でもこれ,赤と青を混ぜたら紫になります.
と言おうとしたら文章がブちぎれた可能性があるので,max_token
を3にしてみます.
{
"model": "gpt-3.5-turbo",
"messages": [
{"role": "user", "content": "赤と青を混ぜたら何色ですか?"}
],
"max_tokens": 3
}
どうやら予想は当たっていそうです.
ちょっとSeed値を固定して,1ずつ増やしてみます.
{
"model": "gpt-3.5-turbo",
"messages": [
{"role": "user", "content": "赤と青を混ぜたら何色ですか?"}
],
"seed" : 27 // 適当な数,固定しておくことで何度やっても回答が同じになる.
"max_tokens": N // 増やしていく
}
N = 5の時 (青は2トークンなので,N=3とN=4の時は同じ)
N = 6の時
N = 17の時
N = 21の時
実験 ② とても長く設定してみる.
上記よりmax_tokens
に関わらず,文章を作ろうとしてます.
結論
max_tokens
生成する文章の質に対しては影響を与えず,分量のみを制御する.
余談,返答文章の減らし方
上記の例のように,質問に対して端的にこたえてほしいものです.
なので注文に簡単に答えて
などと加えます.
{
"model": "gpt-3.5-turbo",
"messages": [
{"role": "system", "content": "一言で回答すること"},
{"role": "user", "content": "赤と青を混ぜたら何色ですか?"}
],
"seed" : 27 // 上記と同じ
"max_tokens": 10
}