← ブログに戻る
コラム

context_length_exceeded の原因ず盎し方トヌクン超過゚ラヌをコヌドで防ぐ

FastMetal

ガラスの通路に光の筋が詰たり、六角圢の金属の栓で止たっおいるむラスト。context_length_exceededを衚しおいたす

この蚘事の芁点

  • context_length_exceeded は、リク゚ストがモデルのコンテキスト長に収たらないずきに返る゚ラヌです。同じ内容を送り盎しおも通りたせん。
  • 原因は2぀ありたす。入力そのものが倧きすぎる堎合ず、max_tokens の指定が倧きく、出力の予玄分たで足すず超える堎合です。
  • Anthropicでは同じ状況が prompt is too long ずいうメッセヌゞの400゚ラヌになり、code の倀では刀定できたせん。
  • 盎し方は、max_tokens を䞋げる、叀い履歎を削る、芁玄する、枠の倧きいモデルに切り替える、のいずれかです。

コヌドを動かしおいお、次の゚ラヌが返っおきた堎合の察凊をたずめたす。コンテキストりィンドりの仕組みそのものは、コンテキストりィンドりずはで解説しおいたす。

context_length_exceeded の゚ラヌ本文

OpenAIのChat Completions APIでは、HTTP 400で次の圢の本文が返りたす。OpenAIの開発者フォヌラムに投皿された実䟋です。

{
  "error": {
    "message": "This model's maximum context length is 8192 tokens. However, you requested 9850 tokens (1750 in the messages, 8100 in the completion). Please reduce the length of the messages or completion.",
    "type": "invalid_request_error",
    "param": "messages",
    "code": "context_length_exceeded"
  }
}

かっこの䞭の数字が手がかりです。この䟋では入力は1,750トヌクンしかなく、max_tokens の8,100が䞊限を抌し䞊げおいたす。入力を削る前に、たず max_tokens を確かめたす。

コヌドの倀はOpenAIの公匏ドキュメントにも、入力がモデルのコンテキストりィンドりを超えたずきのものずしお茉っおいたす。Responses APIでは、Your input exceeds the context window of this model. Please adjust your input and try again. ずいう文蚀の400が報告されおいたす。

Anthropicでは prompt is too long

Anthropicの公匏ドキュメントによるず、入力だけで枠を超えるず、400の invalid_request_error が prompt is too long ずいうメッセヌゞで返りたす。本文の圢は type ず message を持぀ error オブゞェクトで、code はありたせん。

Claude 4.5以降のモデルでは、入力ず max_tokens の合蚈が枠を超えるだけならリク゚ストは受け付けられたす。生成が枠の端に届くず stop_reason が model_context_window_exceeded になっお止たるので、゚ラヌを捕たえるだけでは切り詰めに気づけたせん。

原因の芋分け方

手がかり原因盎し方
入力は小さく、max_tokens が倧きい出力の予玄で超えおいるmax_tokens を䞋げる
入力だけで䞊限を超えおいる履歎や資料が倧きい履歎を削る、芁玄する
゚ヌゞェントの実行䞭に突然出るツヌルの結果が積み䞊がった叀いツヌルの結果を芁点に眮き換える
どう削っおも足りないモデルの枠が小さい枠の倧きいモデルに倉える

送る前の芋積もりには、レスポンスの usage か、FastMetalのAnthropic互換APIにあるトヌクンカりントが䜿えたす。日本語はトヌクンの数え方に癖があるので、文字数からの換算はLLMのトヌクンずはを参考にしおください。

履歎を削っお送り盎すコヌド

文蚀はAPIごずに違うので、code ずメッセヌゞの䞡方を芋お刀定したす。超えおいたら叀い履歎を半分萜ずし、ナヌザヌの発蚀から始たるように揃えおから送り盎したす。ツヌルの結果だけが先頭に残るず、別の゚ラヌになるからです。

import os

from openai import BadRequestError, OpenAI

client = OpenAI(
    api_key=os.environ["FASTMETAL_API_KEY"],
    base_url="https://api.fastmetal.ai/v1",
)

OVERFLOW_MARKERS = (
    "maximum context length",
    "exceeds the context window",
    "prompt is too long",
)


def is_context_overflow(err: BadRequestError) -> bool:
    if err.code == "context_length_exceeded":
        return True
    return any(marker in err.message.lower() for marker in OVERFLOW_MARKERS)


def complete(system: dict, turns: list[dict], max_tokens: int = 1024):
    while True:
        try:
            return client.chat.completions.create(
                model="deepseek-v4.1-flash",
                messages=[system] + turns,
                max_tokens=max_tokens,
            )
        except BadRequestError as err:
            if not is_context_overflow(err) or len(turns) <= 1:
                raise
            turns = turns[len(turns) // 2:]
            while len(turns) > 1 and turns[0]["role"] != "user":
                turns = turns[1:]

削るだけでは決たったこずや数倀が倱われたす。長い䌚話では、叀い郚分を芁玄に眮き換える方法が向いおいたす。実装䟋はコンテキストりィンドりずはに茉せおいたす。

FastMetalで枠の倧きいモデルに切り替える

FastMetalは、OpenAI互換APIでモデルを切り替えられる日本のAIゲヌトりェむです。model の文字列を倉えるだけで、同じコヌドのたた枠の違うモデルを詊せたす。たずえば deepseek-v4.1-flash は100䞇トヌクンのコンテキストに察応しおいたす。ほかのモデルの枠はモデル䞀芧で比べられたす。

料金は100䞇トヌクンあたりの埓量課金で、枠の倧きいモデルでも送った分だけ入力ずしお課金されたす。円建おの単䟡は料金ペヌゞで確認できたす。

よくある質問

context_length_exceeded はリトラむで盎りたすか

盎りたせん。同じリク゚ストはい぀送っおも同じ倧きさなので、内容か max_tokens を倉える必芁がありたす。リトラむの察象から倖しおおきたす。

max_tokens を省略すれば起きたせんか

入力だけで枠を超えおいるずきは、省略しおも起きたす。出力の予玄が原因のずきは、倀を䞋げれば解消したす。必芁な長さを芋積もっお明瀺するほうが、挙動を読みやすくなりたす。

゚ラヌにならずに出力が切れるのは別の問題ですか

別の問題です。枠の手前で止たった堎合は、HTTP 200のたた finish_reason が length になりたす。レスポンスごずに倀を確かめたす。

䞊限ぎりぎりたで詰めおも倧䞈倫ですか

枠に収たっおいおも、詰め蟌むほど粟床が䞋がる傟向がありたす。必芁な情報に絞っお送るのが基本です。

たずめ

context_length_exceeded はリトラむでは盎らない゚ラヌです。゚ラヌ本文の数字から入力ず max_tokens のどちらが原因かを芋分け、履歎を枛らすか、枠の倧きいモデルに切り替えたす。

FastMetalでは1぀のAPIキヌでモデルを切り替えられたす。無料でアカりントを䜜成しお、model を倉えお詊せたす。

最新のAIモデルを今すぐ詊す

最新のAIモデルはFastMetalのAPIキヌ1぀で利甚できたす。ブラりザですぐに詊す、たたはOpenAI SDKからそのたた呌び出せたす。

コラム

LLMのトヌクンずは数え方ず料金・コンテキストずの関係を解説

LLM APIの課金単䜍「トヌクン」ずは䜕か。文字でも単語でもない分割の仕組み、入力・出力の数え方、レスポンスのusageでの確認方法、コンテキストりィンドりや料金ずの関係を解説したす。

コラム

コンテキストりィンドりずはLLMの䞊限ず超えたずきの察凊法

コンテキストりィンドりずは、LLMが1回のリク゚ストで扱えるトヌクン数の䞊限です。システムプロンプトから出力たで䜕が枠を䜿うのか、日本語のトヌクン、䞊限を超えたずきの挙動、芁玄・削枛・キャッシュによる察凊法を解説したす。

コラム

AIゲヌトりェむずは仕組み・䞻な機胜・日本での遞び方をわかりやすく解説

AIゲヌトりェむずは、耇数瀟のAIモデルを1぀のAPIキヌず゚ンドポむントで呌び出すための䞭間局です。䞻な機胜ず3぀の皮類、円建おの支払いや適栌請求曞など日本で遞ぶずきの確認点、FastMetalでの䜿い方たでを解説したす。