Claude Architect · Lektion

Anti-Pattern: Text auf Abschluss prüfen

Warum die Ausgabe nach „done“ zu durchsuchen fragil und falsch ist

Lektion 3 von 413 Schritte

Anti-Pattern: Text auf Abschluss prüfen ist eine kostenlose Claude Architect-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Claude Architect-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Claude Architect-Kurs umfasst insgesamt 4 Lektionen.

Die Falle

Sie entwickeln einen Agenten. Er führt Tools aus, denkt nach und antwortet. Nun müssen Sie wissen, wann er fertig ist. Eine verlockende Abkürzung: Durchsuchen Sie den Text des Modells nach einem Wort wie done, finished oder complete und beenden Sie die Schleife, sobald Sie es sehen.

Dies ist das Anti-Pattern Text auf Abschluss analysieren. Es wirkt intuitiv, ist aber fragil und falsch. Die Claude API liefert Ihnen bereits ein präzises, strukturiertes Abschlusssignal. In dieser Lektion erfahren Sie, warum das Durchsuchen von Text fehlschlägt und was Sie stattdessen verwenden sollten.

So funktioniert die agentische Schleife wirklich

Die agentische Schleife wird durch ein Feld in der Antwort gesteuert: stop_reason. Die Schleife ist einfach und deterministisch:

  • Senden Sie die Anfrage (in jedem Durchlauf mit dem vollständigen Nachrichtenverlauf).
  • Prüfen Sie stop_reason.
  • Wenn der Wert tool_use lautet, führen Sie die Tools aus, fügen Sie die Ergebnisse zum Verlauf hinzu und wiederholen Sie den Vorgang.
  • Wenn der Wert end_turn lautet, ist die Aufgabe abgeschlossen. Beenden Sie die Schleife.

Das Modell teilt Ihnen über strukturierte Metadaten selbst mit, ob es fortfahren möchte oder fertig ist. Sie müssen niemals durch das Lesen von Text vermuten, was gemeint ist.

while True:
    response = client.messages.create(
        model="claude-opus-4-8",
        max_tokens=16000,
        tools=tools,
        messages=messages,
    )
    if response.stop_reason == "end_turn":
        break  # complete
    # else: tool_use -> run tools, append results, loop

Die vier Stoppgründe

Beenden Sie die Schleife anhand des Signals, nicht anhand der Worte. Claude gibt einen von vier Stoppgründen zurück:

  • end_turn — Claude ist auf natürlichem Weg fertig geworden. Die Aufgabe ist abgeschlossen.
  • tool_use — Claude möchte ein Tool ausführen lassen; führen Sie es aus und setzen Sie die Schleife fort.
  • max_tokens — die Ausgabe wurde durch das Token-Limit abgeschnitten.
  • stop_sequence — eine konfigurierte Stoppsequenz wurde erreicht.

Jeder dieser Gründe ist eindeutig und maschinenlesbar. Vergleichen Sie das mit dem Durchsuchen von Freitext, bei dem die Bedeutung vollständig davon abhängt, wie das Modell sich diesmal zufällig ausgedrückt hat.

Warum das Durchsuchen von Text fehleranfällig ist

Natürliche Sprache ist kein Steuerungsprotokoll. Dieselbe abgeschlossene Aufgabe kann auf ein Dutzend verschiedene Arten enden:

  • "Alles erledigt!"
  • "Damit ist die Migration abgeschlossen."
  • "Ich habe die Analyse abgeschlossen."
  • "Jetzt ist alles eingerichtet."

Ihre Schlüsselwortprüfung auf done findet das erste Beispiel, vielleicht auch das zweite, und übersieht die übrigen stillschweigend. Die Schleife endet nie. Sie verbrauchen Tokens und Zeit oder stoßen bei einer Aufgabe, die bereits vor mehreren Durchläufen abgeschlossen war, an ein hartes Limit.

# ANTI-PATTERN: brittle keyword scan
if "done" in response_text.lower():
    break  # misses "finished", "complete", "all set"...

Falsch positive Treffer sind schlimmer

Wenn Sie das Signal verpassen, verschwenden Sie Ressourcen. Der umgekehrte Fehler ist gefährlicher: zu früh zu stoppen.

Nehmen Sie an, der Benutzer bittet Claude zu prüfen, ob die Bereitstellung abgeschlossen ist. Claude könnte mitten in der Untersuchung antworten: "Ich überprüfe, ob die Bereitstellung abgeschlossen ist, bevor ich fortfahre." Ihr Scanner findet done und beendet die Schleife — die Aufgabe wird auf halbem Weg abgebrochen, bevor ein Tool ausgeführt oder eine Antwort erzeugt wurde.

Das Modell verwendet Wörter wie done im Gespräch. Ein Schlüsselwortvergleich kann erzählerische Aussagen nicht von einem echten Abschlusssignal unterscheiden. stop_reason kann das.

Das Modell speichert keinen Zustand

Hier liegt der tiefere Grund dafür, dass das Durchsuchen von Text auf der falschen Ebene ansetzt. Die Claude API ist zustandslos: Das Modell speichert zwischen Anfragen keine Informationen. Sie senden bei jedem einzelnen Aufruf die gesamte Unterhaltung — system, alle bisherigen messages-Durchläufe und Tool-Ergebnisse.

Die Frage "Ist der Agent fertig?" bezieht sich also auf die von Ihnen gesteuerte Schleife. Beantwortet wird sie durch den strukturierten Wert stop_reason, den die API zurückgibt — nicht durch Rückschlüsse aus dem Fließtext. Die Steuerungsebene (Ihre Schleife) und die Inhaltsebene (der Text des Modells) sind getrennt. Belassen Sie die Abschlusslogik auf der Steuerungsebene.

# Stateless: full history goes up every turn
response = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=16000,
    system=system_prompt,
    tools=tools,
    messages=messages,  # ENTIRE history, every call
)
messages.append({"role": "assistant", "content": response.content})

Die korrekte Prüfung zum Beenden

Steuern Sie die Schleife ausschließlich über stop_reason. Wenn der Wert tool_use lautet, führen Sie die angeforderten Tools aus und fügen Sie ihre Ergebnisse zusammen mit der passenden tool_use_id zum Verlauf hinzu. Wenn der Wert end_turn lautet, sind Sie fertig.

Das funktioniert unabhängig davon, wie Claude seine abschließende Nachricht formuliert — "Alles erledigt", "Fertig" oder überhaupt nichts. Die Entscheidung basiert auf vertrauenswürdigen Metadaten und nicht auf einem Zeichenfolgenvergleich, den Sie ständig überwachen müssen.

while True:
    response = client.messages.create(
        model="claude-opus-4-8", max_tokens=16000,
        tools=tools, messages=messages,
    )
    messages.append({"role": "assistant", "content": response.content})

    if response.stop_reason == "tool_use":
        results = run_tools(response.content)  # each with tool_use_id
        messages.append({"role": "user", "content": results})
        continue
    if response.stop_reason == "end_turn":
        break  # done -- no text parsing anywhere

Entscheidungen werden vom Modell gesteuert

Ein wichtiges Architekturprinzip: In einer agentischen Schleife wird der Ablauf vom Modell entschieden und über stop_reason sichtbar gemacht. Sie schreiben nicht vor: "Nach 3 Tools musst du fertig sein." Claude signalisiert, wann es ein weiteres Tool benötigt und wann es fertig ist.

Verwenden Sie fest codierte Steuerung nur für Dinge, die eine Garantie benötigen — eine deterministische Invariante, die Ihr Geschäftsprozess voraussetzt. Die Erkennung des Abschlusses gehört nicht dazu; die API stellt sie bereits sauber bereit. Eine selbst entwickelte Lösung mit Textanalyse ersetzt ein zuverlässiges Signal durch eine Vermutung.

Iterationslimits sind ein Sicherheitsnetz

"Gut", sagen Sie, "dann beende ich die Schleife einfach nach N Iterationen." Vorsicht: Ein Iterationslimit ist ein Sicherheitsnetz, nicht der primäre Mechanismus zum Beenden. Es soll endlos laufende Schleifen begrenzen und vor Fehlern schützen — nicht entscheiden, dass die Arbeit abgeschlossen ist.

Wenn Ihre Schleife darauf angewiesen ist, dass das Limit sie normal beendet, haben Sie dasselbe Problem wie beim Durchsuchen von Text: Sie ersetzen das echte, modellgesteuerte Signal durch eine willkürliche Heuristik. Beenden Sie die Schleife zuerst anhand von stop_reason; lassen Sie das Limit nur den Ausnahmefall abfangen.

MAX_ITERS = 20  # safety net, NOT the primary stop
for _ in range(MAX_ITERS):
    response = client.messages.create(...)
    messages.append({"role": "assistant", "content": response.content})
    if response.stop_reason == "end_turn":
        break  # primary: model-driven
    # ... handle tool_use ...
else:
    log.warning("hit iteration cap -- investigate, don't trust as 'done'")

Behandeln Sie die übrigen Stoppgründe

Eine robuste Schleife verzweigt bei jedem Stoppgrund, nicht nur im Erfolgsfall. Insbesondere bedeutet max_tokens, dass die Antwort abgeschnitten wurde — es bedeutet nicht, dass sie abgeschlossen ist. Wenn Sie einen abgeschnittenen Durchlauf als "fertig" behandeln, liefern Sie stillschweigend eine halbe Antwort aus.

Wenn Sie max_tokens sehen, erhöhen Sie max_tokens oder wechseln Sie bei großen Ausgaben zu Streaming und setzen Sie anschließend die Schleife fort — beenden Sie sie niemals so, als wäre die Aufgabe erfolgreich abgeschlossen.

if response.stop_reason == "end_turn":
    break
elif response.stop_reason == "tool_use":
    messages.append({"role": "user", "content": run_tools(response.content)})
elif response.stop_reason == "max_tokens":
    # truncated, NOT complete -- raise cap or stream, then continue
    raise OutputTruncated("increase max_tokens or stream")

Benötigen Sie ein strukturiertes Fertig-Signal? Verwenden Sie ein Tool

Manchmal soll das Modell beim Abschluss tatsächlich ein strukturiertes Ergebnis melden — etwa einen Status, eine Konfidenz oder eine Zusammenfassung. Die Lösung besteht auch dann nicht darin, Fließtext zu analysieren. Geben Sie Claude ein Tool (oder ein JSON Schema über strukturierte Ausgaben) und lassen Sie es ein typisiertes Ergebnis ausgeben.

Mit tool_choice: "any" können Sie das Modell zwingen, irgendein Tool aufzurufen, und so strukturierte Ausgaben statt Freitext sicherstellen. Die Schleife wird weiterhin anhand von stop_reason beendet; das Tool überträgt lediglich das maschinenlesbare Ergebnis. Struktur ersetzt überall dort, wo es darauf ankommt, den Zeichenfolgenvergleich.

tools = [{
    "name": "submit_result",
    "description": "Report the final task outcome.",
    "input_schema": {
        "type": "object",
        "properties": {
            "status": {"type": "string", "enum": ["success", "failed"]},
            "summary": {"type": "string"},
        },
        "required": ["status", "summary"],
    },
}]
# tool_choice={"type": "any"} forces a structured call, not prose

Kurze Überprüfung

Prüfen Sie Ihr Urteilsvermögen anhand einer realistischen Designentscheidung.

Wichtigste Erkenntnisse

Sie wissen nun, warum das Durchsuchen der Ausgabe nach einem Abschluss das falsche Werkzeug für diese Aufgabe ist:

  • Beenden Sie die Schleife anhand von stop_reason, niemals anhand von Text. end_turn = abgeschlossen; tool_use = Tools ausführen und fortfahren.
  • Das Durchsuchen von Text ist in beide Richtungen fehleranfällig — es übersieht echte Abschlüsse (unterschiedliche Formulierungen) und erzeugt falsch positive Treffer (die Verwendung von "done" im Gespräch).
  • Die API ist zustandslos und modellgesteuert. Senden Sie in jedem Durchlauf den vollständigen Verlauf; lassen Sie das strukturierte Signal und nicht den Fließtext die Schleife steuern.
  • Iterationslimits sind ein Sicherheitsnetz, nicht der primäre Mechanismus zum Beenden. Behandeln Sie max_tokens als Abbruch der Ausgabe, nicht als Erfolg.
  • Benötigen Sie ein strukturiertes Ergebnis? Verwenden Sie ein Tool oder ein JSON Schema (erzwingen Sie es mit tool_choice: "any") — analysieren Sie niemals Freitext.
Kostenlos starten

Lerne Python mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
26
Lektionen
104

Häufig gestellte Fragen

Ist die Lektion „Anti-Pattern: Text auf Abschluss prüfen“ kostenlos?

Ja — der vollständige Text von „Anti-Pattern: Text auf Abschluss prüfen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Claude Architect-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Claude Architect-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Anti-Pattern: Text auf Abschluss prüfen“?

Warum die Ausgabe nach „done“ zu durchsuchen fragil und falsch ist Du übst Claude Architect mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Claude Architect zu starten?

Keine Vorkenntnisse erforderlich. Claude Architect auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Anti-Pattern: Text auf Abschluss prüfen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Claude Architect-Lektion Code schreiben und ausführen?

Ja. Jede Claude Architect-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Die Kernschleife
  2. Bei stop_reason beenden
  3. Anti-Pattern: Text auf Abschluss prüfen
  4. Anti-Pattern: Willkürliche Iterationslimits
← Zurück zu Claude Architect