/pattern/hitl-gate/

04 · ProductionGovernance & SafetyHITLHuman ApprovalManual Review Gate

HITL Gate.
Pausieren, bevor etwas Irreversibles geschieht.

Kritische Schritte werden von einem Menschen überprüft und freigegeben, bevor sie ausgeführt werden. Das System pausiert, persistiert den Zustand, stellt eine strukturierte Frage und setzt fort, sobald der Mensch antwortet. Am besten als abgestufte Autonomie konzipiert — Überwachung pro Aktionsklasse nach Tragweite gesetzt (Vollautomatisierung bei geringer Tragweite, überwacht bei mittlerer, menschengeführt bei hoher Tragweite) und nicht als einfaches Ein-/Ausschalter-Gate.

Wann man dazu greift

  • Aktionen irreversible oder teure Konsequenzen haben.
  • Compliance menschliche Entscheidungen vorschreibt.
  • Modellunsicherheit sichtbar gemacht werden muss.

Wann es nach hinten losgeht

  • Risikoarme Aktionen vollständig automatisiert laufen können.
  • Genehmigungen nur symbolischen Charakter haben.
  • Latenzanforderungen manuelle Prüfungen ausschließen.

Die Abwägung

Höhere Kontrolle wird auf Kosten langsamerer Betriebsabläufe erreicht.

Das mentale Modell

Eine Form, die du auf eine Serviette zeichnen kannst.

Vor jeder irreversiblen Aktion pausiert der Agent an einem Gate. Ein Mensch prüft, genehmigt oder überarbeitet.

  1. Der Lauf pausiert an einem definierten Knoten; sein Zustand wird persistiert.
  2. Ein Mensch beantwortet eine strukturierte Frage — freigeben, ändern oder ablehnen.
  3. Der Lauf setzt exakt dort fort, wo er anhielt — auf jedem anderen Pattern obenauf.

Alle sechs Koordinations-Patterns im Vergleich

PauseweiterAgentMenschAusführen
Einmal durchspielen

Ein realer Ablauf, Schritt für Schritt.

Aufgabe"Eine Rückerstattung auf eine markierte Kundenbestellung anwenden."
1 / 5
Entwurfagent(order) → { refundAmount: 249.00, reason: 'duplicate_charge', method: 'original_payment' }
PauseZustand suspendiert am interrupt. Mensch erhält: 'Rückerstattung von 249,00 $ auf ursprüngliche Zahlung genehmigen?'
PrüfenMensch überprüft Payload. Ändert Betrag auf 199,00 $ und genehmigt.
FortsetzenCommand(resume={ approved: true, refundAmount: 199.00 }) → Graph wird fortgesetzt
AusführenRückerstattung von 199,00 $ verarbeitet. Der ursprüngliche Entwurf über 249,00 $ hat die Produktion nie berührt.
Im Code

Die Schleife ist schon eingebaut.

LangGraphpython
from langgraph.graph import StateGraph, END
from langgraph.types import interrupt, Command

class State(TypedDict):
    order: dict
    refund: dict | None
    approved: bool | None

def draft_refund(state):
    return {"refund": refund_llm(state["order"])}

def human_gate(state):
    # Suspends execution; resumes when human replies
    return interrupt({
        "question": "Approve refund?",
        "payload": state["refund"],
    })

def execute_refund(state):
    if state["approved"]:
        process_refund(state["refund"])
    return state

g = StateGraph(State)
g.add_node("draft", draft_refund)
g.add_node("gate", human_gate)
g.add_node("execute", execute_refund)
g.add_edge("draft", "gate")
g.add_edge("gate", "execute")
g.add_edge("execute", END)
g.set_entry_point("draft")

# Resume with: graph.invoke(None, config, stream_mode="values")
# after human calls Command(resume={"approved": True, ...})
hitl = g.compile()
Fallstricke

Zwei Wege, wie dieses Pattern Probleme verursachen kann.

Gate zu früh gesetzt — Menschen ertrinken in bedeutungslosen Genehmigungen

Jede risikoarme Aktion löst ein Gate aus. Menschen entwickeln Genehmigungsmüdigkeit und klicken 'Genehmigen', ohne zu lesen.

Lösung · Nur bei irreversiblen oder kostenintensiven Aktionen ein Gate setzen. Einen Risikoklassifikator für die automatische Genehmigung risikoarmer Vorgänge verwenden.

Genehmigungspayload lässt das benötigte Diff aus

Das Gate zeigt den Endzustand, aber nicht was sich geändert hat. Der Mensch kann nicht erkennen, ob der Rückerstattungsbetrag korrekt ist.

Lösung · Ein klares Diff in den interrupt-Payload aufnehmen: 'Vorgeschlagene Änderung: 249,00 $ → 199,00 $. Grund: doppelte Abbuchung.'

Framework-Unterstützung

Wo HITL Gate nativ ist.

LangGraphinterrupt() / Command(resume=...) PrimitiveNativ
Microsoft Agent FrameworkNativ
CrewAINativ

Suche

Patterns, Frameworks und Seiten durchsuchen.