MeWrite Docs

This model's maximum context length is exceeded

OpenAI APIでコンテキスト長の上限を超えた場合のエラー

概要

OpenAI APIでプロンプトとレスポンスの合計トークン数がモデルの最大コンテキスト長を超えた場合に発生するエラーです。

エラーメッセージ

openai.BadRequestError: Error code: 400 - {'error': {'message': "This model's maximum context length is 8192 tokens. However, your messages resulted in 8452 tokens (8415 in the messages, 37 in the functions). Please reduce the length of the messages or functions.", 'type': 'invalid_request_error', 'param': 'messages', 'code': 'context_length_exceeded'}}
This model's maximum context length is 4097 tokens. However, you requested 4927 tokens (3927 in the messages, 1000 in the completion). Please reduce the length of the messages or completion.

モデル別のコンテキスト長

モデル最大トークン数
gpt-4o128,000
gpt-4-turbo128,000
gpt-48,192
gpt-3.5-turbo16,385
gpt-3.5-turbo (旧)4,096

原因

1. 入力メッセージが長すぎる

1
2
3
4
5
6
# NG: 長すぎる会話履歴
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": very_long_text},  # 数千トークン
    # ... 多数のメッセージ
]

2. max_tokensの設定が大きすぎる

1
2
3
4
5
6
# NG: 入力 + max_tokens がコンテキスト長を超える
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=messages,  # 3500トークン
    max_tokens=1000     # 合計4500 > 4096
)

解決策

1. トークン数を事前に計算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import tiktoken

def count_tokens(messages, model="gpt-4"):
    encoding = tiktoken.encoding_for_model(model)
    num_tokens = 0
    for message in messages:
        num_tokens += 4  # メッセージのオーバーヘッド
        for key, value in message.items():
            num_tokens += len(encoding.encode(value))
    num_tokens += 2  # 返答のプライミング
    return num_tokens

# 使用例
token_count = count_tokens(messages)
print(f"Token count: {token_count}")

2. 会話履歴をトリミング

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def trim_messages(messages, max_tokens=3000, model="gpt-4"):
    encoding = tiktoken.encoding_for_model(model)

    # システムメッセージは保持
    system_message = messages[0] if messages[0]["role"] == "system" else None
    other_messages = messages[1:] if system_message else messages

    # 新しいメッセージから優先的に保持
    trimmed = []
    total_tokens = 0

    for msg in reversed(other_messages):
        msg_tokens = len(encoding.encode(msg["content"]))
        if total_tokens + msg_tokens <= max_tokens:
            trimmed.insert(0, msg)
            total_tokens += msg_tokens
        else:
            break

    if system_message:
        trimmed.insert(0, system_message)

    return trimmed

3. より大きなコンテキストのモデルを使用

1
2
3
4
5
6
# gpt-4 (8K) → gpt-4-turbo (128K)
response = client.chat.completions.create(
    model="gpt-4-turbo",  # 128Kコンテキスト
    messages=messages,
    max_tokens=4096
)

4. テキストを要約して圧縮

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def summarize_if_needed(text, max_length=2000):
    if len(text) <= max_length:
        return text

    # 長いテキストは要約
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "Summarize the following text concisely."},
            {"role": "user", "content": text[:4000]}  # 最初の部分だけ
        ],
        max_tokens=500
    )
    return response.choices[0].message.content

5. max_tokensを調整

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import tiktoken

def safe_completion(messages, model="gpt-4", desired_max_tokens=1000):
    encoding = tiktoken.encoding_for_model(model)
    input_tokens = count_tokens(messages, model)

    # モデルの最大コンテキスト長
    max_context = {"gpt-4": 8192, "gpt-4-turbo": 128000, "gpt-3.5-turbo": 16385}

    available_tokens = max_context.get(model, 4096) - input_tokens
    safe_max_tokens = min(desired_max_tokens, available_tokens - 100)

    return client.chat.completions.create(
        model=model,
        messages=messages,
        max_tokens=max(safe_max_tokens, 100)
    )

LangChainでの対処

1
2
3
4
5
6
7
from langchain.memory import ConversationSummaryBufferMemory

# トークン数に基づいて自動的に要約
memory = ConversationSummaryBufferMemory(
    llm=llm,
    max_token_limit=2000
)

関連エラー

関連エラー

AI の他のエラー

最終更新: 2025-12-18