OpenAI APIトークン制限エラーの解決策
問題
OpenAI API(特にtext-davinci-003
モデル)を使用する際に、次のエラーが発生する場合があります:
json
{
"message": "This model's maximum context length is 4097 tokens, however you requested 5360 tokens (1360 in your prompt; 4000 for the completion). Please reduce your prompt or completion length.",
"type": "invalid_request_error",
"param": null,
"code": null
}
エラーの原因
このエラーは、プロンプトのトークン数とmax_tokens
パラメータの合計がモデルのトークン上限(この場合4097トークン)を超えた場合に発生します。
解決策
1. max_tokensの適切な設定
max_tokens
は応答の最大長を指定しますが、プロンプトのトークン数と合算した値がモデルの最大制限を超えないようにする必要があります。
ts
// トークン数を事前に計算(tiktoken等を使用)
const promptTokenCount = 1360;
const maxResponseTokens = 4097 - promptTokenCount; // 使用可能な残りトークン数
const response = await openai.createCompletion({
model: 'text-davinci-003',
prompt,
max_tokens: maxResponseTokens, // 2737トークンに制限
temperature: 0.2
});
2. 大規模トークン対応モデルの使用
より大きなトークン制限を持つ最新モデルに切り替えることで根本解決:
最新モデルのトークン上限(2024年時点)
モデル | 最大トークン |
---|---|
gpt-4-turbo | 128,000 |
gpt-4-32k | 32,768 |
gpt-3.5-turbo-1106 | 16,385 |
text-davinci-003 | 4,097 |
ts
// GPT-4 Turboの使用例
const response = await openai.chat.completions.create({
model: "gpt-4-1106-preview",
messages: [
{ role: "system", content: "あなたは役立つアシスタントです" },
{ role: "user", content: prompt }
],
max_tokens: 4000,
temperature: 0.2
});
3. プロンプトの最適化
プロンプトのトークン数を削減するテクニック:
- 不要な部分の削除:冗長な説明を排除
- 要約の活用:長いコンテンツは事前に要約
- 構造化:箇条書きや簡潔な表現を使用
- 重複排除:類似内容を統合
トークン節約の例
# 非効率
「今回お伝えしたいのは以下の3点です。まず第一に、明日の天気についてですが、朝は晴れで午後から曇りになる予報です。第二に...」
# 効率的
明日の天気:朝☀️→午後☁️
4. テキストの分割処理
長い文書を処理する場合は、適切なサイズのチャンクに分割:
ts
async function processLongText(text: string, chunkSize: number = 3000) {
const chunks = [];
// テキストをチャンクに分割(簡易実装)
for (let i = 0; i < text.length; i += chunkSize) {
chunks.push(text.substring(i, i + chunkSize));
}
const results = [];
for (const chunk of chunks) {
const response = await openai.createCompletion({
model: "gpt-3.5-turbo",
prompt: `以下のテキストを処理してください:\n\n${chunk}`,
max_tokens: 1000
});
results.push(response.data.choices[0].text);
}
return results.join("\n\n");
}
トークン計算のベストプラクティス
APIリクエスト前の正確なトークン計算方法:
ts
import { encoding_for_model } from "tiktoken";
// モデルに対応するエンコーディングを取得
const enc = encoding_for_model("gpt-3.5-turbo");
// プロンプトのトークン数計算
const tokens = enc.encode(prompt);
const tokenCount = tokens.length;
console.log(`トークン数: ${tokenCount}`);
// リソース解放
enc.free();
::: important 計算の注意点
- Chatモデルではメッセージ形式もトークンにカウント
- ツールのレスポンスもトークン使用量に加算
- 公式ドキュメントで詳細を確認 :::
各モデル系列の特性
GPT-4 ファミリー
モデル | 最大トークン | 特徴 |
---|---|---|
gpt-4-turbo | 128,000 | 最新モデル・高精度・長文対応 |
gpt-4 | 8,192 | 一般的なタスク向けバランスモデル |
gpt-4-32k | 32,768 | 長文処理向け拡張版 |
GPT-3.5 ファミリー
モデル | 最大トークン | 特徴 |
---|---|---|
gpt-3.5-turbo-1106 | 16,385 | 最新版・コストパフォーマンスに優れる |
gpt-3.5-turbo | 4,096 | 標準的なチャットモデル |
gpt-3.5-turbo-instruct | 4,096 | text-davinci-003 の後継互換モデル |
まとめ
トークン制限エラーの解決には以下のアプローチが有効:
max_tokens
の適切な設定:プロンプト+レスポンスの合計が制限以下に- 最新モデルの活用:大規模コンテキスト対応モデル(GPT-4 Turbo等)へ移行
- プロンプト最適化:情報密度向上でトークン削減
- 長文の分割処理:チャンキング手法による分割処理
最新情報については常にOpenAI公式ドキュメントを参照してください。