
Context Length Exceeded bei LLM-API-Aufrufen: Lösungen, Kompromisse und Modellauswahl

Ihr LLM-API-Aufruf hat gerade Folgendes zurückgegeben:
{
"error": {
"message": "This model's maximum context length is 128000 tokens. However, your messages resulted in 142837 tokens.",
"type": "invalid_request_error",
"code": "context_length_exceeded"
}
}Das bedeutet, dass Ihre Eingabe (System-Prompt + Gesprächsverlauf + Benutzernachricht) das Kontextfenster des Modells überschreitet. Die Anfrage wurde abgelehnt, bevor überhaupt Tokens generiert wurden.
Anders als Rate-Limit-Fehler (bei denen es um die Anfragehäufigkeit geht) betreffen Context-Length-Fehler die Anfragegröße. Die Lösung besteht nicht darin, langsamer zu werden — sondern die Eingabe zu reduzieren, die Anfrage umzustrukturieren oder auf ein Modell mit größerem Kontextfenster zu wechseln.
Kurzfassung
- Context Length Exceeded = Ihre Eingabe ist zu groß für das Token-Fenster des Modells.
- Sie haben vier Optionen: kürzen, zusammenfassen, aufteilen oder das Modell wechseln.
- Jede Option hat unterschiedliche Auswirkungen auf Kosten, Qualität und Latenz.
- Nutzen Sie die Entscheidungstabelle unten, um den richtigen Ansatz für Ihren Anwendungsfall zu wählen.
- In Produktionssystemen sollten Sie das Problem abfangen, bevor der Nutzer es sieht — nicht erst danach.
Schnellcheck-Checkliste
Bevor Sie eine Strategie wählen, prüfen Sie zuerst diese häufigen Ursachen:
| Prüfung | Worauf achten | Schnelle Lösung |
|---|---|---|
| Gesprächsverlauf zu lang | Das Messages-Array wächst bei Multi-Turn-Chats unbegrenzt | Älteste Nachrichten entfernen oder ein Sliding Window implementieren |
| System-Prompt zu groß | Detaillierte Anweisungen verbrauchen das Kontextbudget | System-Prompt komprimieren oder statische Anweisungen in eine Referenz auslagern |
| Doppelte Inhalte | Gleicher Kontext wird mehrfach eingefügt (RAG, Tool-Ergebnisse) | Vor dem Senden deduplizieren |
| Große Tool-/Funktionsergebnisse | Tool-Aufruf hat einen riesigen JSON- oder Text-Block zurückgegeben | Tool-Ausgabe kürzen oder zusammenfassen, bevor sie zum Kontext hinzugefügt wird |
| Unnötige Metadaten | Vollständige Objekte, obwohl nur wenige Felder relevant sind | Nur die relevanten Felder extrahieren |
Wenn keine dieser Schnelllösungen zutrifft, brauchen Sie einen strukturellen Ansatz.
Entscheidungstabelle: Kürzen vs. Zusammenfassen vs. Aufteilen vs. Modellwechsel
| Strategie | Funktionsweise | Qualitätsauswirkung | Kostenauswirkung | Latenzauswirkung | Ideal für |
|---|---|---|---|---|---|
| Kürzen | Älteste Nachrichten entfernen oder Eingabe trimmen | Wichtiger Kontext kann verloren gehen | Reduziert Input-Tokens = geringere Kosten | Schneller (weniger Input) | Chat-Apps mit langen Verläufen; Fälle, in denen aktueller Kontext am wichtigsten ist |
| Zusammenfassen | Ein günstigeres Modell komprimiert den bisherigen Kontext in eine Zusammenfassung | Verlustbehaftet — Zusammenfassung kann Details übersehen | Zusätzlicher API-Aufruf für die Zusammenfassung, aber der Hauptaufruf wird kleiner | Ein zusätzlicher Aufruf | Agenten-Workflows mit angesammeltem Zustand; wissensintensive Konversationen |
| Aufteilen + Zusammenführen | Eingabe in Chunks aufteilen, separat verarbeiten, Ergebnisse zusammenführen | Risiko, dass chunk-übergreifender Kontext verloren geht | Mehrere Aufrufe = höhere Gesamtkosten | Langsamer (sequenzielle oder parallele Chunks) | Dokumentverarbeitung, Analyse langer Texte |
| Modell wechseln | Ein Modell mit größerem Kontextfenster verwenden | In der Regel neutral oder besser | Modelle mit größerem Kontext kosten oft mehr pro Token | Kann variieren | Wenn die Eingabe nicht reduziert werden kann, ohne wesentliche Informationen zu verlieren |
Strategie 1: Kürzen — das Unwichtigste weglassen
Kürzung ist der einfachste Ansatz. Entfernen Sie die ältesten oder am wenigsten relevanten Teile der Eingabe.
Sliding Window für Chat
def sliding_window(messages: list, max_tokens: int, system_prompt: str) -> list:
"""Keep system prompt + most recent messages within token budget."""
# Always keep system prompt
result = [{"role": "system", "content": system_prompt}]
token_count = count_tokens(system_prompt)
# Add messages from newest to oldest
for msg in reversed(messages):
msg_tokens = count_tokens(msg["content"])
if token_count + msg_tokens > max_tokens:
break
result.insert(1, msg) # Insert after system prompt
token_count += msg_tokens
return resultWann Kürzung gut funktioniert
- Multi-Turn-Chats, in denen der aktuelle Kontext am wichtigsten ist
- RAG-Pipelines, bei denen Sie bei Bedarf erneut abrufen können
- Batch-Verarbeitung, bei der Sie in Reihenfolge verarbeiten können
Wann Kürzung gefährlich ist
- Agenten-Workflows, bei denen frühe Anweisungen das spätere Verhalten beeinflussen
- Rechtliche oder Compliance-Kontexte, in denen Vollständigkeit wichtig ist
- Mehrstufiges Reasoning, bei dem das Weglassen von Schritten die Antwort verändert
Strategie 2: Zusammenfassen — komprimieren, ohne die Bedeutung zu verlieren
Die Zusammenfassung nutzt ein günstigeres, schnelleres Modell, um den bisherigen Kontext zu komprimieren:
async def summarize_context(messages: list, client) -> str:
"""Compress older messages into a summary."""
context_text = "\n".join(
f"{m['role']}: {m['content']}" for m in messages
)
response = await client.chat.completions.create(
model="gpt-4o-mini", # Cheaper model for summarization
messages=[{
"role": "user",
"content": f"Summarize this conversation context in under 500 tokens. "
f"Preserve key decisions, facts, and pending actions:\n\n{context_text}"
}],
max_tokens=500
)
return response.choices[0].message.contentKostenvergleich: Zusammenfassen vs. Kürzen
| Ansatz | Input-Tokens für das Hauptmodell | Zusätzliche API-Aufrufe | Gesamtkosten |
|---|---|---|---|
| Keine Verwaltung (Fehler tritt auf) | N/A — Anfrage abgelehnt | 0 | Verschwendete Latenz + Wiederholungskosten |
| Auf 80K Tokens kürzen | 80K | 0 | Basiskosten bei 80K Input |
| Älteren Kontext zusammenfassen | ~10K (Zusammenfassung) + 40K (aktuell) = 50K | 1 Zusammenfassungs-Aufruf (~$0,01) | Niedrigere Hauptaufruf-Kosten + geringe Zusammenfassungskosten |
Die Zusammenfassung fügt einen günstigen Aufruf hinzu, reduziert aber oft die Input-Tokens des Hauptaufrufs erheblich — was bei teuren Modellen netto eine Kostenersparnis bedeuten kann.
Strategie 3: Aufteilen und Zusammenführen — für lange Dokumente
Wenn die Eingabe ein einzelnes langes Dokument ist (kein Gespräch), ist das Aufteilen oft der richtige Ansatz:
async def process_long_document(
document: str,
question: str,
client,
chunk_size: int = 50000
) -> str:
"""Process a long document by chunking."""
chunks = split_into_chunks(document, chunk_size)
chunk_results = []
for i, chunk in enumerate(chunks):
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": f"Analyze chunk {i+1}/{len(chunks)} of a document.\n"
f"Question: {question}\n\n"
f"Chunk content:\n{chunk}"
}]
)
chunk_results.append(response.choices[0].message.content)
# Merge chunk results
merge_response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": f"Merge these partial analyses into a final answer.\n"
f"Question: {question}\n\n"
f"Partial results:\n" + "\n---\n".join(chunk_results)
}]
)
return merge_response.choices[0].message.contentAbwägungen beim Aufteilen
- Vorteil: Verarbeitet beliebig lange Eingaben
- Nachteil: Chunk-übergreifender Kontext geht verloren
- Nachteil: Mehrere API-Aufrufe = höhere Gesamtkosten und Latenz
- Gegenmaßnahme: Chunks um 10-20% überlappen lassen, um den Kontext an den Grenzen zu erhalten
Strategie 4: Auf ein Modell mit größerem Kontext wechseln
Wenn Ihre Eingabe wirklich groß bleiben muss, wechseln Sie zu einem Modell mit größerem Kontextfenster:
| Modellfamilie | Typischer maximaler Kontext | Einsatzbereich |
|---|---|---|
| GPT-4o | 128K Tokens | Standard für die meisten Workloads |
| GPT-4o (Long Context) | 128K Tokens | Bereits der Standard |
| Claude Sonnet/Opus | 200K Tokens | Wenn mehr als 128K benötigt werden |
| Gemini Pro | 1M+ Tokens | Sehr lange Dokumente, vollständige Codebasen |
| Gemini Flash | 1M+ Tokens | Kostensensible Aufgaben mit langem Kontext |
Kostenauswirkung von Modellen mit größerem Kontext
Größere Kontextfenster bedeuten in der Regel höhere Kosten pro Token. Berechnen Sie, ob die Qualitätsverbesserung die Kosten rechtfertigt:
Option A: Auf 80K kürzen + GPT-4o = $X
Option B: Volle 150K Eingabe + Claude Sonnet = $Y
Option C: Volle 150K Eingabe + Gemini Flash = $Z
Vergleichen: Qualitätsunterschied vs. KostenunterschiedEin Routing-Gateway für die Modellauswahl nutzen
Anstatt die Modellauswahl fest zu codieren, können Sie ein Gateway verwenden, das basierend auf der Eingabegröße an das passende Modell weiterleitet:
from openai import OpenAI
client = OpenAI(
api_key="your-evolink-key",
base_url="https://api.evolink.ai/v1"
)
# Let the Smart Router choose based on your workload
response = client.chat.completions.create(
model="evolink/auto",
messages=your_messages
)Produktionsmuster: Vorprüfung vor dem Senden
Warten Sie nicht, bis die API Ihre Anfrage ablehnt. Prüfen Sie die Eingabegröße vor dem Senden:
import tiktoken
def check_context_length(messages: list, model: str, max_tokens: int) -> dict:
"""Pre-check whether messages fit within the model's context window."""
encoder = tiktoken.encoding_for_model(model)
total_tokens = sum(
len(encoder.encode(m["content"])) for m in messages
)
if total_tokens > max_tokens:
return {
"fits": False,
"total_tokens": total_tokens,
"excess": total_tokens - max_tokens,
"suggestion": "truncate" if total_tokens < max_tokens * 1.5
else "summarize_or_switch"
}
return {"fits": True, "total_tokens": total_tokens}So vermeiden Sie verschwendete Latenz durch abgelehnte Anfragen und können die richtige Strategie anwenden, bevor der Nutzer einen Fehler sieht.
Verwandte Artikel
- Fix OpenRouter 429 "Provider Returned Error" — wenn das Problem Rate Limits sind, nicht die Eingabegröße
- AI API Timeout: Causes, Retry Patterns, and Fallback Design — wenn lange Eingaben Timeouts statt Ablehnungen verursachen
- How to Reduce 429 Errors in Agent Workloads — Anfragevolumen neben der Anfragegröße verwalten
- Best AI API Platform for Production Reliability — eine Plattform wählen, die Modell-Routing übernimmt
FAQ
Was bedeutet "context length exceeded"?
Es bedeutet, dass Ihre Eingabe (System-Prompt + Nachrichten + eingefügter Kontext) mehr Tokens enthält, als das maximale Kontextfenster des Modells zulässt. Die Anfrage wird abgelehnt, bevor die Generierung beginnt.
Ist "context length exceeded" dasselbe wie ein Rate-Limit-Fehler?
Nein. Rate-Limit-Fehler (429) betreffen das Anfragevolumen — zu viele Anfragen in einem Zeitfenster. Context-Length-Fehler betreffen die Anfragegröße — eine einzelne Anfrage, die zu groß ist. Sie erfordern unterschiedliche Lösungen.
Was ist besser: Kürzung oder Zusammenfassung?
Kürzung ist einfacher und günstiger, aber es gehen Informationen verloren. Zusammenfassung bewahrt die Bedeutung, erfordert aber einen zusätzlichen API-Aufruf und führt zu Kompressionsartefakten. Verwenden Sie Kürzung für Chat-Verläufe, bei denen Aktualität am wichtigsten ist; verwenden Sie Zusammenfassung für Agenten-Workflows, bei denen der angesammelte Kontext wichtig ist.
Kann ich Context-Length-Fehler vermeiden, indem ich ein größeres Modell verwende?
Ja, aber zu einem Preis. Modelle mit größeren Kontextfenstern (Gemini 1M+, Claude 200K) können größere Eingaben verarbeiten, kosten aber in der Regel mehr pro Token. Berechnen Sie, ob die Qualitätsverbesserung die zusätzlichen Kosten rechtfertigt.
Wie zähle ich Tokens, bevor ich eine Anfrage sende?
tiktoken-Bibliothek für OpenAI-Modelle oder den Token-Zähl-Endpunkt des Anbieters. Die genaue Token-Anzahl hängt vom Tokenizer des Modells ab, verwenden Sie also den richtigen Encoder für Ihr Zielmodell.Sollte ich diesen Fehler im Anwendungscode oder auf Gateway-Ebene behandeln?
Beides. Der Anwendungscode sollte die Eingabegröße vorab prüfen und die passende Strategie anwenden (kürzen, zusammenfassen, aufteilen oder wechseln). Ein Routing-Gateway kann zusätzlich ein Modell mit einem ausreichend großen Kontextfenster für Ihre Anfrage auswählen.


