Der Entwickler hat die Tool-Nutzung konfiguriert, mit Testanfragen überprüft – alles funktioniert. In der Produktion antwortet das Modell plötzlich ohne Tool-Aufruf, selbstbewusst und kohärent, aber mit Daten, die ein Jahr alt sind. Keine Fehler in den Logs. Einfach eine falsche Antwort. Spoiler: Das Modell ist nicht „kaputtgegangen“ – es hat eine rationale Entscheidung getroffen, nicht zu suchen, weil es sich für ausreichend informiert hielt. Und genau das ist der gefährlichste Fehlermodus.
⚡ Kurz gesagt
- ✅ Die Entscheidung für einen Tool-Aufruf wird über einen internen CoT getroffen: Das Modell wägt die Absicht der Anfrage gegen die Beschreibung des Tools ab.
- ✅ Die Beschreibung ist keine Dokumentation, sie ist ein Prompt: Eine schlecht geschriebene Beschreibung = das Modell wird kein Tool aufrufen.
- ✅ Der gefährlichste Fehlermodus: Das Modell ist sich seiner Antwort aus eigenem Wissen sicher, aber es ist veraltet.
- ✅ tool_choice: auto ≠ Garantie für Suche: Das Modell kann sich entscheiden, ohne Abruf zu antworten, auch wenn er benötigt wird.
- ✅ self-conditioning: Wenn das Modell kürzlich parallele Aufrufe getätigt hat, neigt es dazu, diese zu wiederholen.
- 🎯 Sie erhalten: Konkrete Vorlagen für das Schreiben von Beschreibungen und Strategien zur Kontrolle der Modellentscheidung.
- 👇 Unten finden Sie die Mechanik, Codebeispiele und praktische Muster.
📚 Inhalt des Artikels
- 📌 Drei Modi von tool_choice: auto, required, none
- 📌 Wie die Beschreibung des Tools die Modellentscheidung beeinflusst
- 📌 Chain-of-Thought im Inneren: Wie das Modell den Kontext analysiert
- 📌 Wo die Entscheidung fehlschlägt: Selbstvertrauen → Keine Suche → Halluzination
- 📌 Parallele Aufrufe: Wenn das Modell mehrere Tools gleichzeitig aufruft
- 💼 Praxis: Wie man eine Beschreibung schreibt, damit das Modell das Tool aufruft, wenn es nötig ist
- ❓ Häufig gestellte Fragen (FAQ)
- ✅ Schlussfolgerungen
Drei Modi von tool_choice: auto, required, none – und wann welcher zu verwenden ist
Der Parameter tool_choice ist nicht nur eine API-Einstellung.
Es ist eine architektonische Entscheidung darüber, wer den Ablauf kontrolliert: das Modell oder Ihr Code.
Die Wahl des Modus bestimmt, wo Probleme auftreten und wo man sie suchen muss.
auto: Das Modell als Richter
Der Standardmodus, wenn Tools übergeben werden. Das Modell entscheidet selbst: mit eigenem Wissen textlich antworten oder ein Tool aufrufen. Dies ist der flexibelste Modus – und der unvorhersehbarste.
# auto – das Modell entscheidet selbst
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
tools=tools,
tool_choice={"type": "auto"}, # kann weggelassen werden – das ist der Standard
messages=[{"role": "user", "content": query}]
)
# Überprüfen, was das Modell entschieden hat
if response.stop_reason == "tool_use":
# das Modell hat ein Tool aufgerufen
tool_block = next(b for b in response.content if b.type == "tool_use")
print(f"Tool: {tool_block.name}, Args: {tool_block.input}")
elif response.stop_reason == "end_turn":
# das Modell hat ohne Suche geantwortet – das kann normal sein oder ein Problem
text = next(b for b in response.content if b.type == "text")
print(f"Direkte Antwort (kein Tool): {text.text[:100]}")
Das Protokollieren von stop_reason ist eine obligatorische Praxis in der Produktion.
Dies ist der einzige Weg zu verstehen, ob das Modell nach Informationen gesucht hat oder mit eigenem Wissen geantwortet hat.
required / any: Erzwingen eines Aufrufs
Das Modell ist verpflichtet, mindestens ein Tool aufzurufen, unabhängig von der Anfrage.
OpenAI nennt dies required, Anthropic – any.
# Anthropic: Erzwingen des Aufrufs eines beliebigen Tools
tool_choice={"type": "any"}
# Anthropic: Erzwingen des Aufrufs eines bestimmten Tools
tool_choice={"type": "tool", "name": "search_documents"}
# OpenAI-kompatible Syntax
tool_choice="required"
Wann gerechtfertigt: Structured Output, bei dem die Antwort immer über ein Tool erfolgen muss, obligatorische Protokollierung jeder Anfrage an ein externes System, deterministischer Pipeline, bei der der Abruf ein obligatorischer Schritt ist.
Wann schädlich: Konversationsmodus, bei dem der Benutzer nach „Hallo“ oder „Danke“ fragen kann. Das Modell wird trotzdem einen Tool-Aufruf formulieren, Ihr Code wird Token und Zeit für einen unnötigen Abruf verschwenden.
Kritische Einschränkung von Anthropic (Stand 2025):
any und das erzwungene Aufrufen eines bestimmten Tools sind nicht kompatibel mit Extended Thinking.
Wenn Thinking aktiviert ist, sind nur auto und none verfügbar.
Der Versuch, any mit Thinking zu verwenden, gibt einen HTTP 400 zurück.
Aktueller Status –
docs.anthropic.com.
none: Verbieten von Aufrufen
Das Modell ruft kein Tool auf, es generiert nur Text. Nützlich für den letzten Schritt nach Erhalt aller Ergebnisse – wenn eine Antwort aus dem bereits gesammelten Kontext ohne zusätzliche Anfragen synthetisiert werden muss.
# Finale synthetisierende Antwort nach Datensammlung
final_response = client.messages.create(
model="claude-opus-4-6",
max_tokens=2048,
tools=tools, # Tools werden trotzdem übergeben (API-Anforderung)
tool_choice={"type": "none"}, # aber ihr Aufruf wird verboten
messages=[
*conversation_history,
{"role": "user", "content": "Formuliere nun den Abschlussbericht basierend auf den gesammelten Daten."}
]
)
Wichtiger Hinweis: Wenn in messages tool_result-Blöcke vorhanden sind,
müssen die Tools in der Anfrage trotzdem übergeben werden – andernfalls gibt die API einen Validierungsfehler zurück.
⚠️ Fallstrick #1: Die Illusion der Kontrolle durch tool_choice
tool_choice: auto bedeutet nicht, dass das Modell sucht, wenn es nötig ist.
Es bedeutet, dass das Modell sucht, wenn es es für notwendig hält.
Wenn Ihre Aufgabe bei jeder Anfrage aktuelle Daten erfordert – auto reicht nicht aus.
Verwenden Sie entweder required oder gestalten Sie die Beschreibung so,
dass das Modell die Suche für Ihre Anfragetypen immer für notwendig hält.
Wie die Beschreibung des Tools die Modellentscheidung beeinflusst: schlechte Beschreibung = Modell ruft kein Tool auf
Die Beschreibung ist keine Dokumentation für den Entwickler. Es ist Teil des Prompts, den das Modell sieht. Durch sie „versteht“ das Modell, was das Tool tut und wann es sich lohnt, es aufzurufen.
APXML (2025) beschreibt es so: Das Modell vergleicht die Absicht der Anfrage mit den Beschreibungen der verfügbaren Tools, wie ein Mensch eine Aufgabe mit den verfügbaren Werkzeugen in einer Kiste vergleicht. Wenn ein Hammer als „Gegenstand für physischen Einfluss“ beschriftet ist – kann es sein, dass der Mensch ihn nicht zum Nageln nimmt.
Offizielle OpenAI-Dokumentation empfiehlt: Schreiben Sie klare und detaillierte Funktionsnamen, Parameterbeschreibungen und Anweisungen. Beschreiben Sie explizit den Zweck der Funktion und jedes Parameters, und verwenden Sie einen System-Prompt, um zu erklären, wann (und wann nicht) jede Funktion verwendet werden soll.
Vergleich: schlechte vs. gute Beschreibung – Praxisbeispiel
Einer unserer Kunden hatte ein Problem: Das Modell folgte den Anweisungen schlecht und rief die Suche unregelmäßig auf.
Ein Teil der Anfragen zu Preisen und Vertragsbedingungen lief ohne Abruf –
das Modell antwortete selbstbewusst aus eigenem Wissen, aber veraltet.
Als wir die Ursache analysierten, stellten wir fest, dass die Beschreibung des Tools minimal war.
Nachdem wir die description mit Trigger-Szenarien neu geschrieben hatten,
stabilisierte sich das Modellverhalten.
# ❌ WAR SO: minimale Beschreibung – das Modell rief das Tool oft nicht auf
{
"name": "search_docs",
"description": "Sucht Dokumente",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string"}
},
"required": ["query"]
}
}
# ✅ IST JETZT: ausführliche Beschreibung mit Triggern – das Modell versteht wann und wozu
{
"name": "search_knowledge_base",
"description": """Sucht aktuelle Informationen in der unternehmensinternen Wissensdatenbank.
VERWENDE dieses Tool, wenn:
- Die Anfrage betrifft Vertragsbedingungen, Preise, Vorschriften oder interne Verfahren
- Aktuelle Informationen benötigt werden, die sich seit Ihrem Training geändert haben könnten
- Spezifische Details zu einem bestimmten Kunden, Produkt oder Projekt abgefragt werden
NICHT verwenden für:
- Allgemeine Fragen zu Technologien oder allgemein bekannte Fakten
- Mathematische Berechnungen
- Formatieren oder Bearbeiten von Text""",
"input_schema": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Suchanfrage in natürlicher Sprache. Formuliere sie als Frage oder Schlüsselbegriffe."
},
"top_k": {
"type": "integer",
"description": "Anzahl der zurückzugebenden Fragmente. Standardmäßig 5. Erhöhe auf 10 für komplexe Vergleichsanfragen."
}
},
"required": ["query"]
}
}
Der Hauptunterschied: Eine gute Beschreibung enthält Trigger-Szenarien – eine explizite Liste von Situationen, in denen das Tool benötigt wird. Das Modell verwendet diese Liste als Kriterium in seiner internen Entscheidung.
Wichtig, wenn Sie Ollama mit einem lokalen Modell verwenden:
Schwächere Modelle (7B–13B) folgen möglicherweise auch einer detaillierten Beschreibung nicht stabil –
das ist eine Einschränkung des Modells, nicht der Beschreibung.
In unserem Produktions-Stack verwenden wir
AskYourDocs über OpenRouter
mit deepseek/deepseek-chat als Standardmodell
(${SPRING_AI_OPENAI_CHAT_MODEL:deepseek/deepseek-chat}) –
und es gibt keine Probleme mit der Ausführung der Beschreibung auf dieser Ebene.
Für Ollama in der Entwicklungs-/Staging-Umgebung empfehlen wir, die Trigger-Anweisungen zusätzlich zu duplizieren im System-Prompt – dies erhöht die Stabilität bei schwächeren Modellen. Mehr über die Konfiguration von Ollama in einer Produktionskonfiguration: RAG mit Ollama: Wie man KI beibringt, anhand Ihrer Dokumente zu antworten .
Einfluss der Beschreibung auf die Wahl zwischen mehreren Tools
Wenn ein System mehrere Tools mit ähnlicher Funktionalität hat, wird die Qualität der Beschreibung noch kritischer. APXML betont: vage oder überlappende Beschreibungen zwingen das Modell entweder, das falsche Tool zu wählen, oder gar keines.
# Problem: Zwei ähnliche Tools mit unklaren Beschreibungen
tools = [
{"name": "search_contracts", "description": "Sucht Verträge"},
{"name": "search_documents", "description": "Sucht Dokumente"}
]
# Das Modell kennt den Unterschied nicht – die Wahl ist unvorhersehbar
# Lösung: Klare Abgrenzung der Verantwortungsbereiche
tools = [
{
"name": "search_contracts",
"description": "Sucht NUR unterzeichnete Rechtsverträge und deren Anhänge. "
"Verwenden Sie es für Anfragen zu Bedingungen, Fristen, Verpflichtungen der Parteien."
},
{
"name": "search_documents",
"description": "Sucht interne Vorschriften, Anleitungen, technische Dokumentationen und Berichte. "
"Enthält KEINE Rechtsverträge."
}
]
⚠️ Fallstrick #2: Mehr Tools = Mehr Wahlfehler
Laurent Kubaski (2025) stellt fest: Die meisten Anbieter veröffentlichen die maximale Anzahl von Tools, die das Modell technisch unterstützt, aber sie sagen nicht, dass in der Praxis mit zunehmender Anzahl von Tools die Wahrscheinlichkeit einer falschen Wahl steigt. Nach 10-15 Tools nimmt die Qualität der Auswahl merklich ab. Nach 50+ – ist ein Tool-RAG erforderlich (detailliert in TU-6).
Chain-of-Thought im Inneren: Wie das Modell den Kontext analysiert und eine Entscheidung trifft
Die Entscheidung für einen Tool-Aufruf ist kein Ergebnis einfacher Mustererkennung. Im Inneren findet ein Prozess statt, der dem Chain-of-Thought-Reasoning ähnelt, bei dem das Modell mehrere Faktoren sequenziell abwägt, bevor es eine Antwort zurückgibt.
Raina (2025) beschreibt dies aus der Perspektive neuronaler Schichten: Eingabe-Embedding-Schichten wandeln die Anfrage und die Tool-Beschreibungen in numerische Vektoren um – wie Text zu einem Vektor wird und warum semantisch ähnliche Anfragen in denselben Bereich des Raumes fallen, lesen Sie in Embeddings in einfachen Worten: Wie KI Sinn versteht, nicht nur Wörter . Mittlere Schichten führen abstraktes Denken und Tool-Auswahl-Logik durch, und wie die Suche anhand dieser Vektoren das relevanteste Tool oder Fragment findet – detailliert in Vektorsuche für Anfänger: Wie RAG die benötigten Informationen findet . Ausgabe-Schichten generieren die endgültige Entscheidung – Text oder Tool-Aufruf.
Interner Entscheidungsprozess (vereinfachtes Modell)
# Was intern im Modell bei tool_choice: auto passiert (konzeptionell):
# 1. Analyse der Absicht der Anfrage
intent = analyze_query(user_message)
# → "Anfrage zu den Bedingungen der Vertragsauflösung"
# 2. Bewertung des eigenen Wissens
confidence_in_own_knowledge = estimate_confidence(intent)
# → "Es gibt allgemeines Wissen über Verträge, aber nicht über den spezifischen Vertrag dieses Kunden"
# 3. Vergleich mit verfügbaren Tools
tool_relevance = match_intent_to_tools(intent, tool_descriptions)
# → search_knowledge_base: hohe Relevanz (Trigger-Szenario: "Vertragsbedingungen")
# 4. Entscheidung
if tool_relevance > threshold AND confidence_in_own_knowledge < threshold:
return tool_call(name="search_knowledge_base", args={...})
else:
return text_response(...)
Der entscheidende Punkt: Das Modell prüft nicht nur, ob ein relevantes Tool vorhanden ist. Es bewertet auch, ob eigenes Wissen ausreicht. Wenn das Modell sich für sachkundig hält – kann es eine Textantwort wählen auch wenn ein relevantes Tool vorhanden ist.
Wie das Modell lernt zu entscheiden, wann es suchen soll
Die Fähigkeit zur richtigen Entscheidung ist das Ergebnis von Fine-Tuning auf synthetischen Beispielen. Simplicity is SOTA (2025) beschreibt den Ansatz: Anbieter generieren Tausende von Beispielen Anfrage → CoT-Reasoning-Trace → Tool-Aufruf, bei denen das Modell lernt, nicht nur eine Funktion aufzurufen, sondern zu begründen, warum. Ein Beispiel für einen Reasoning-Trace sieht so aus:
# Interner CoT-Reasoning-Trace (wie er während des Trainings gebildet wird):
"""
Anfrage: "Welche Bedingungen gelten für die vorzeitige Kündigung unseres Vertrags?"
Analyse: Die Anfrage bezieht sich auf einen spezifischen Vertrag ("unseren") –
das bedeutet, dass spezifische Informationen benötigt werden, die nicht in meinem allgemeinen Wissen vorhanden sind.
Das verfügbare Tool search_knowledge_base beschreibt die Suche in der Unternehmensdatenbank
mit dem Trigger-Szenario "Vertragsbedingungen". Dies ist eine exakte Übereinstimmung.
Selbstvertrauen: niedrig (Spezifität des spezifischen Vertrags).
Entscheidung: search_knowledge_base aufrufen.
"""
→ tool_call("search_knowledge_base", {"query": "Bedingungen für vorzeitige Vertragsauflösung"})
Deshalb zeigen Reasoning-fähige Varianten von Modellen (Claude mit Extended Thinking, o-Serie von OpenAI) bessere Ergebnisse in komplexen Tool-Use-Szenarien – WildToolBench (2026) bestätigt: Reasoning-fähige Modelle übertreffen nicht-reasoning Varianten stabil bei Aufgaben, die eine korrekte Orchestrierung sequenzieller Tool-Aufrufe erfordern.
Einfluss des System-Prompts auf die Entscheidung
Der System-Prompt ist ein mächtiges Werkzeug zur Steuerung der Modellentscheidung.
Wenn dort explizit angegeben ist, wann gesucht werden soll, folgt das Modell dieser Anweisung
auch bei tool_choice: auto:
Die Kombination aus einer hochwertigen description + einer klaren Anweisung im System-Prompt
erhöht die Zuverlässigkeit der Modellentscheidungen erheblich im Vergleich zu jedem Ansatz einzeln.