Strona główna / Artykuły

Pauzowanie i wznowienie agentów LangGraph przy użyciu interrupt() oraz Command

W jaki sposób funkcje interrupt() i Command w LangGraph wykorzystują punkty kontrolne oraz wątki, aby zawiesić agenta w oczekiwaniu na zatwierdzenie, edycje lub dane od człowieka, a następnie bezpiecznie wznowić jego działanie później.

Wydawca: REACTAPP.TOP14 min czytania3224 słów

Źródła: LangGraph From First Principles — Part 4: Human-in-the-Loop, Interrupts, Commands and Resumable Agents

Agent, który może przesuwać pieniądze, usuwa zasoby lub wdrażać rozwiązania do produkcji, nie powinien zawsze mieć możliwości dokończenia tego, co rozpoczął. Czasami graf musi celowo się zatrzymać, czekać godzinami na osobę, a następnie kontynuować dokładnie tam, gdzie przerwał. Ten artykuł wyjaśnia, w jaki sposób LangGraph robi to za pomocą interrupt() i Command, dlaczego zależy od punktów kontrolnych i wątków, oraz jakie decyzje nadal należy podjąć przed uruchomieniem agentów typu HITL w produkcji.

Bazy budulcowe

HITL opiera się na trzech warstwach. Po pierwsze, wykonywanie grafu: stan przechodzi do węzła, a krawędź wybiera następny węzeł.

STATE
  ↓
NODE
  ↓
EDGE
  ↓
NEXT NODE

Po drugie, zarządzanie stanem: węzły zwracają aktualizacje, a reduktory łączą je w nowy stan.

NODE
  ↓
STATE UPDATE
  ↓
REDUCER
  ↓
NEW STATE

Po trzecie, trwałość: punkt kontrolny zapisuje stan jako punkty kontrolne grupowane pod danym wątkiem.

STATE
  ↓
CHECKPOINT
  ↓
CHECKPOINTER
  ↓
THREAD
  ↓
PERSISTENCE

Wspólnie umożliwiają one agentowi działanie, pamiętanie informacji oraz przetrwanie restartów. Brakuje jednak sposobu na decydowanie, czy w ogóle powinien kontynuować działanie.

Kiedy agent nie powinien po prostu kontynuować

Użytkownik mówi do asystenta płatności: „Przelej ₹50 000 na ten rachunek”. Agent przygotowuje transakcję, a technicznie nic nie stoi na przeszkodzie jej wykonaniu.

User
  ↓
Agent
  ↓
Prepare Transfer
  ↓
Transfer ₹50,000
  ↓
Execute

W przypadku tak istotnej czynności osoba odpowiedzialna powinna najpierw przejrzeć propozycję, aby proces mógł skręcić w zależności od decyzji człowieka.

User
  ↓
Agent
  ↓
Prepare Transfer
  ↓
┌─────────────────────┐
│   HUMAN APPROVAL    │
└──────────┬──────────┘
           │
       ┌───┴───┐
       ↓       ↓
    Approve   Reject
       │       │
       ↓       ↓
    Execute   Cancel

Teraz graf musi zostać celowo zatrzymany: nie z powodu błędu czy awarii, ale dlatego, że w tym miejscu proces wymaga interwencji człowieka.

Co oznacza human-in-the-loop

HITL wprowadza decyzje ludzkie do zautomatyzowanego procesu. Zamiast przechodzić bezpośrednio od decyzji do działania,

Agent
  ↓
Decision
  ↓
Action

agent proponuje rozwiązanie, robi pauzę i czeka na jego sprawdzenie.

Agent
  ↓
Proposed Action
  ↓
PAUSE
  ↓
Human Review
  ↓
Decision
  ↓
Continue

Przeglądający może zatwierdzić, odrzucić, edytować propozycję, dostarczyć brakujące dane, skorygować agenta lub wybrać jedną z alternatyw. To odpowiada każdemu kroku, który ma rzeczywiste konsekwencje.

Financial transactions
Sending emails
Deleting resources
Production deployments
Database modifications
Legal workflows
Publishing content
Access approvals
Sensitive tool calls

Czego naprawdę wymaga pauzowanie grafu

Weźmy łańcuch z krokiem zatwierdzenia przed ostatnim węzłem.

Node A
  ↓
Node B
  ↓
Human Approval
  ↓
Node C

Jeśli przeglądający odpowie po sześciu godzinach, zablokowanie procesu to niewłaściwa decyzja: marnuje się pracownik i całość przestaje działać przy pierwszym ponownym uruchomieniu.

sleep(21600)

Zamiast tego należy zapisać stan i zatrzymać się,

Node B
  ↓
SAVE STATE
  ↓
PAUSE EXECUTION
  ↓

a następnie przywrócić go później, ewentualnie w innym procesie, i kontynuować od następnego węzła.

Application can stop──────── 6 HOURS LATER ────────Human responds
  ↓
RESTORE STATE
  ↓
CONTINUE EXECUTION
  ↓
Node C

Persystencja już rozwiązuje połowę tego problemu. Punkty kontrolne, mechanizm zarządzania punktami kontrolnymi, wątki oraz thread_id to dokładnie to, czego potrzeba przy długiej pauzie.

Checkpoint
Checkpointer
Thread
thread_id
Persistence

Jak funkcja interrupt() zatrzymuje wykonywanie

interrupt() wstrzymuje działanie grafu i prosi zewnętrzny świat o wartość. Wywołuje się ją wewnątrz węzła z treścią możliwą do serializacji w formacie JSON, która opisuje to, co powinien zobaczyć recenzent. Fragment kodu jest napisany w Pythonie, mimo swojego pierwotnego oznaczenia.

from langgraph.types import interrupt
def approval_node(state):
  decision = interrupt({
        "question": "Do you approve this transaction?",
        "amount": state["amount"]
    })
  return {
        "decision": decision
    }

Gdy wykonanie dociera do tego wywołania,

interrupt(...)

węzeł nie dochodzi do instrukcji powrotu. Działanie zostaje wstrzymane, a przekazana treść wraca do wywołującego w celu wyświetlenia.

approval_node
      │
      ↓
 interrupt()
      │
      ↓
┌─────────────────┐
│ EXECUTION PAUSED│
└─────────────────┘

Ważne są dwa szczegóły. interrupt() wymaga grafu skompilowanego z checkpointerem, ponieważ stan wstrzymania musi zostać gdzieś zachowany. Po wznowieniu działania LangGraph ponownie uruchamia węzeł przerwany od początku, przy czym interrupt() zwraca teraz wartość podaną przez użytkownika, więc kod przed tym wywołaniem jest uruchamiany dwa razy. Unikaj efektów ubocznych w tej części węzła i sprawdź zachowanie swojej wersji w dokumentacji LangGraph.

Co jest zapisywane podczas przerwy

Rozważmy ten wykres.

START
  ↓
Prepare Transfer
  ↓
Human Approval
  ↓
Execute Transfer
  ↓
END

Węzeł przygotowawczy aktualizuje stan, zapisywany jest punkt kontrolny, a węzeł zatwierdzający wywołuje interrupt().

START
  ↓
Prepare Transfer
  ↓
State Updated
  ↓
Checkpoint
  ↓
Approval Node
  ↓
interrupt()

Bieżący stan jest zapisywany i przechowywany.

Current State
      │
      ↓
Checkpoint
      │
      ↓
Persistent Storage

Wątek posiada teraz szczegóły transferu, status w oczekiwaniu oraz powód zatrzymania.

THREAD: transaction-123
Checkpoint
────────────────────
amount       ₹50,000
recipient    Account X
status       pending
────────────────────

Execution:
PAUSED

Reason:
Human approval required

To wszystko, co jest potrzebne do kontynuacji później. Bez persistencji proces po prostu zniknąłby po przerwie.

Agent
  ↓
interrupt
  ↓
process disappears
  ↓
???

Gdy osoba sprawdzająca napisze „Zatwierdzone” następnego dnia, nikt nie będzie wiedział, co zostało zatwierdzone, gdzie zatrzymał się wykres ani który węzeł następuje dalej. Dzięki punktom kontrolnym stan jest ładowany z wątku i przywracany przed kontynuacją.

                  INTERRUPT
                       │
                       ↓
                  CHECKPOINT
                       │
                       ↓
                    THREAD
                       │
                       ↓
              PERSISTENT STORAGE

               ...time passes...

                   HUMAN INPUT
                       │
                       ↓
                    THREAD
                       │
                       ↓
               LOAD CHECKPOINT
                       │
                       ↓
                 RESTORE STATE
                       │
                       ↓
                    RESUME

Kontynuacja za pomocą polecenia

Aplikacja wyświetla treść przerwy jako pytanie

Approve transfer of ₹50,000?

z dwoma przyciskami,

[ APPROVE ]   [ REJECT ]

a osoba sprawdzająca wybiera jeden z nich.

APPROVE

Odpowiedź wraca przez Command, który informuje graf o dalszych krokach. Aby wznowić działanie, należy wywołać graf za pomocą Command(resume=...) zamiast normalnego wprowadzenia danych.

from langgraph.types import Command

graph.invoke(
    Command(resume="approved"),
    config=config
)

config musi używać tej samej wątku co zatrzymana eksploatacja,

thread_id = transaction-123

ponieważ identyfikator wątku jest tym, dzięki czemu LangGraph wie, o której zatrzymanej eksploatacji mowa.

Kroki cyklu życia krok po kroku

Eksploatacja rozpoczyna się od zwykłego wywołania,

graph.invoke()

czyta swój wątek z konfiguracji,

thread_id = transaction-123

wchodzi w węzeł przygotowania,

START
  ↓
Prepare Transfer

i zapisuje informacje o przeniesieniu do stanu.

amount    = ₹50,000
recipient = Account X
status    = pending

Węzeł zatwierdzenia wywołuje interrupt(),

Approval Node
     ↓
interrupt()

a wykonywanie jest wstrzymane.

EXECUTION PAUSED

Najnowszy punkt kontrolny pozostaje bezpieczny w ramach wątku.

Thread
  ↓
Checkpoint
  ↓
Persistent Storage

Człowiek widzi prośbę

Approve ₹50,000 transfer?

i odpowiada.

YES

Aplikacja wysyła polecenie wznowienia

Command(resume="approved")

do tego samego wątku.

transaction-123

LangGraph przywraca wykonywanie, przekazuje decyzję węzłowi zatwierdzenia i kontynuuje do końca.

Restore Execution
       ↓
Human Decision = approved
       ↓
Continue Graph
       ↓
Execute Transfer
       ↓
END

Każdy poniższy wzorzec jest wariacją tego cyklu życia.

Decyzje ludzkie poza tak lub nie

Odpowiedź recenzenta nie musi być binarna.

YES / NO

Zatwierdzenie wykonuje propozycję.

Agent Proposal
      ↓
Human
      ↓
APPROVE
      ↓
Execute

Odrzucenie ją anuluje.

Agent Proposal
      ↓
Human
      ↓
REJECT
      ↓
Cancel

Edycja zmienia jej część, np. kwotę, zanim graf może kontynuować.

Agent:
Send ₹50,000
      ↓
Human:
Change to ₹40,000
      ↓
Graph continues with
updated information

Dostarczenie brakujących informacji zamienia przerwanie w pytanie.

Agent
  ↓
Missing Account Number
  ↓
INTERRUPT
  ↓
Human provides account
  ↓
RESUME

Wybór pozwala agencji zaproponować alternatywy i pozostawić decyzję osobie.

Agent generates:
Option A
Option B
Option C
    ↓
Human chooses B
    ↓
Graph continues

HITL to ogólny sposób wprowadzania danych od człowieka do działającego grafu, a nie tylko dialog zatwierdzania.

Polecenie jako przepływ danych i przepływ sterowania

Polecenie może również aktualizować stan i wybrać następne miejsce przeznaczenia.

Resume Execution
Update State
Choose Next Destination

Jedno polecenie może ustalić stan i przekazać wykonywanie do konkretnego węzła; w LangGraph ta forma jest zazwyczaj zwracana przez węzeł.

Command(
    update={
        "status": "approved"
    },
    goto="execute"
)

To łączy dwie kwestie,

DATA FLOW
   +
CONTROL FLOW

ponieważ routowanie wcześniej należało wyłącznie do krawędzi.

Edges control where we go.

Teraz jeden obiekt może zawierać zarówno zmianę stanu, jak i następny krok.

Command can participate in
state updates + control decisions.

Korygowanie stanu przed kontynuacją

Załóżmy, że stan przechowuje tę kwotę,

amount = 50000

a recenzent zatwierdza ją po wprowadzeniu korekty.

Approve, but change amount to 40000.

Przepływ przebiega od wartości początkowej, przez proces recenzji, do zaktualizowanej wartości, a dopiero wtedy jest kontynuowany (drugi fragment pojawia się na jednej linii).

BEFORE
amount = 50000        ↓Human Review        ↓UPDATEamount = 40000        ↓RESUME

Pytanie zmienia się z „Czy mogę kontynuować?” na „Sprawdzić, poprawić w razie potrzeby, a potem kontynuować.”

Kontrola wywołań wrażliwych narzędzi

HITL jest najpraktyczniejszy przy wykorzystaniu narzędzi o wysokim ryzyku.

search_web()
read_database()
send_email()
delete_resource()
transfer_money()

Wyszukiwanie w internecie może być uruchamiane automatycznie,

search_web()
      ↓
Execute Automatically

natomiast usuwanie zasobu powinno czekać na zatwierdzenie.

delete_resource()
       ↓
    INTERRUPT
       ↓
Human Approval

Każde wywołanie narzędzia przechodzi kontrolę wrażliwości: bezpieczne wywołania są realizowane, natomiast wrażliwe są przerywane w celu uzyskania zatwierdzenia lub anulowania.

                    Agent
                       │
                       ↓
                   Tool Call
                       │
                       ↓
                 Sensitive Tool?
                   /          \
                 NO            YES
                 │              │
                 ↓              ↓
              Execute       INTERRUPT
                 │              │
                 │              ↓
                 │            Human
                 │          /       \
                 │      Approve    Reject
                 │         │          │
                 └─────────┘          ↓
                                    Cancel

Aby zapoznać się z pełniejszą implementacją opartą na magazynie danych, sprawdź agenty z kontrolą zatwierdzenia w LangGraph.

Przegląd jako celowe ograniczenie kontroli

Ludzki przegląd nie jest naprawą dla agenta, który nie jest wystarczająco inteligentny. To granica umieszczona celowo. Prace o niskim ryzyku są wykonywane automatycznie,

LOW RISK
Search
Read
Summarize
  ↓
Automatic

a prace o wysokim ryzyku przechodzą przez człowieka.

HIGH RISKSend
Delete
Purchase
Transfer
Deploy
 ↓
Human Approval

Celem jest określenie, gdzie autonomia jest odpowiednia, a nie jej ograniczanie wszędzie.

Zarządzanie odrzuceniami i milczeniem

Odrzucenie wymaga rzetelnego projektowania.

Agent
  ↓
Prepare Action
  ↓
Interrupt
  ↓
Human
  ↓
REJECT

Zapisz wynik w stanie,

status = "rejected"

następnie skieruj działanie na podstawie tego wyniku za pomocą warunkowego krawędzi.

                Decision
                /      \
          approved     rejected
              │           │
              ↓           ↓
           Execute       Cancel
              │           │
              ↓           ↓
             END         END

Wszystkie wcześniejsze koncepcje biorą udział, a dane wprowadzone przez człowieka to po prostu dodatkowe informacje kształtujące wykonywanie zadań.

State
Reducers
Conditional Routing
Checkpoints
Threads
Commands

Recenzenci również mogą nigdy nie odpowiedzieć.

Interrupt
   ↓
Waiting for approval
   ↓
1 hour
   ↓
1 day
   ↓
7 days

Wątek w stanie pauzy może czekać nieograniczenie, dlatego aplikacja wymaga określonych zasad.

Expiration
Timeout
Cancellation
Reminder
Escalation

Powszechnym rozwiązaniem jest czekanie z ograniczeniem czasowym, zwykle realizowane przez planer, który przywraca wątki o przestarzałych danych po upływie określonego czasu.

Approval Requested
       │
       ↓
Wait up to 24 hours
       │
   ┌───┴────┐
   ↓        ↓
Response   Timeout
   │        │
   ↓        ↓
Resume    Cancel

LangGraph dostarcza podstawowe elementy; zasady biznesowe należą do Ciebie.

Wielokrotne bramy i przepływ danych

Agent odpowiedzialny za wdrożenie może prosić o zatwierdzenie swojego planu, a ponownie przed uruchomieniem w produkcji.

START
  ↓
Analyze Code
  ↓
Generate Deployment Plan
  ↓
Human Approval #1
  ↓
Deploy to Staging
  ↓
Run Tests
  ↓
Human Approval #2
  ↓
Deploy Production
  ↓
END

Każda brama pauzuje i przywraca ten sam wątek, tworząc historię punktów kontrolnych i przerwań.

Thread
  │
  ├── CP1
  │
  ├── CP2
  │
  ├── INTERRUPT
  │
  ├── RESUME
  │
  ├── CP3
  │
  ├── INTERRUPT
  │
  ├── RESUME
  │
  └── END

To jest trwały przepływ pracy udostępniany zarówno ludziom, jak i agentowi. Do tej pory każdy przykład wykorzystywał funkcję blokującą,

graph.invoke(...)

która zwraca wynik tylko wtedy, gdy wykonanie się kończy lub zostaje wstrzymane.

START → A → B → C → END
                         ↓
                      RESULT

Aplikacje interaktywne wymagają informacji o postępach w czasie rzeczywistym, aż do złożenia prośby o zatwierdzenie.

START
  ↓
Planner Update ─────────→ UI
  ↓
Tool Call ──────────────→ UI
  ↓
Tool Result ────────────→ UI
  ↓
Approval Required ──────→ UI

Strumieniowanie dostarcza te zdarzenia, dzięki czemu interfejs może pokazywać ukończone kroki oraz decyzję w oczekiwaniu.

┌──────────────────────────────────┐
│          Deployment Agent        │
├──────────────────────────────────┤
│                                  │
│ ✓ Analyzed repository            │
│                                  │
│ ✓ Generated deployment plan      │
│                                  │
│ ✓ Staging tests passed           │
│                                  │
│ ⚠ Production deployment ready    │
│                                  │
│ Human approval required          │
│                                  │
│ [ APPROVE ]     [ REJECT ]       │
│                                  │
└──────────────────────────────────┘

Za tym ekranem zdarzenia trafiają do frontendu, a decyzja jest zwracana za pomocą Command(resume=...).

LangGraph
    │
    ↓
Streaming
    │
    ↓
Frontend
    │
    ↓
Human Decision
    │
    ↓
Command(resume=...)
    │
    ↓
LangGraph

Pełny model wykonywania

Na jednym diagramie: użytkownik uruchamia graf na wątku, stan przechodzi przez węzły i reduktory, zapisywane są punkty kontrolne, routery wybierają następny krok, a czynności wrażliwe kierowane są do przerwy, którą rozstrzyga człowiek.

                      USER
                        │
                        ↓
                  graph.invoke()
                        │
                        ↓
                     THREAD
                        │
                        ↓
                  CHECKPOINTER
                        │
                        ↓
                     STATE
                        │
                        ↓
                      NODE
                        │
                        ↓
                  STATE UPDATE
                        │
                        ↓
                     REDUCER
                        │
                        ↓
                   NEW STATE
                        │
                        ↓
                   CHECKPOINT
                        │
                        ↓
                 EDGE / ROUTING
                        │
                        ↓
                 SENSITIVE ACTION?
                    /          \
                  NO            YES
                  │              │
                  ↓              ↓
             NEXT NODE       interrupt()
                                 │
                                 ↓
                              PAUSED
                                 │
                                 ↓
                               HUMAN
                            /     |     \
                           /      |      \
                      Approve   Edit    Reject
                         │        │        │
                         └────────┼────────┘
                                  ↓
                          Command(resume)
                                  │
                                  ↓
                           SAME thread_id
                                  │
                                  ↓
                         RESTORE CHECKPOINT
                                  │
                                  ↓
                           CONTINUE GRAPH
                                  │
                                  ↓
                                 END

Jako historia: przychodzi prośba

User Input

i rozpoczyna się wykonywanie.

START

Węzły odczytują stan i zwracają aktualizacje, reduktory je łączą, punkty kontrolne zapisują je w ramach określonego wątku, a krawędzie decydują, co ma zostać uruchomione dalej. Graf może się rozgałęziać, tworzyć pętle lub wywoływać narzędzia.

BRANCH
LOOP
CALL TOOLS

Gdy potrzebna jest interwencja człowieka, przerwa wstrzymuje jego działanie.

interrupt()

Człowiek reaguje,

APPROVE
REJECT
EDIT
PROVIDE INPUT

a polecenie kontynuacji działa dalej z wątku, w którym dane zostały zachowane,

Command(resume=...)

a graf kończy swoją pracę.

END

Większość projektów zaczyna się od jednego wywołania modelu,

LLM
 ↓
Response

a kończy grafem łączącym węzły LLM i narzędzi, reduktory, punkty kontrolne, mechanizmy routingu, przerwy oraz polecenia.

                          USER
                           │
                           ↓
                         START
                           │
                           ↓
                         STATE
                           │
                           ↓
                         NODE
                           │
                    ┌──────┴──────┐
                    │             │
                  LLM           TOOL
                    │             │
                    └──────┬──────┘
                           ↓
                     STATE UPDATE
                           │
                           ↓
                        REDUCER
                           │
                           ↓
                       NEW STATE
                           │
                           ↓
                      CHECKPOINT
                           │
                           ↓
                        THREAD
                           │
                           ↓
                       ROUTING
                    /      |      \
                   /       |       \
                NODE      LOOP    INTERRUPT
                                    │
                                    ↓
                                  HUMAN
                              /      |      \
                         Approve    Edit    Reject
                              \      |      /
                               \     |     /
                                    ↓
                                COMMAND
                                    │
                                    ↓
                                 RESUME
                                    │
                                    ↓
                              NEXT NODE
                                    │
                                    ↓
                                   END

Lista kontrolna produkcji

Zachowaj skupienie węzłów

Mniejsze, jednoznaczne węzły są łatwiejsze do testowania, ponawiania prób oraz bezpiecznego przerywania,

Plan Node
Search Node
Validate Node
Execute Node

w odróżnieniu od węzła, który robi wszystko.

do_everything_agent()

Zamierzony projekt stanu i reduktorów

Zachowaj tylko to, czego potrzebują węzły, ponieważ wszystko jest zapisywane jako punkty kontrolne i może zostać pokazane recenzentom. Starannie dobieraj reduktory dla pól, które gromadzą dane.

messages
events
results
observations

Czynienie efektów ubocznych idempotentnymi

Operacje nieodwracalne wymagają szczególnej ostrożności.

Send Email
Charge Card
Delete Resource
Deploy
Transfer Money

Próby ponownego uruchomienia nigdy nie powinny je powtarzać. Ponieważ przerwany węzeł uruchamia się ponownie po wznowieniu, umieść nieodwracalne wywołania po punkcie zatwierdzenia lub w oddzielnym węźle, a także użyj kluczy idempotencji tam, gdzie API je obsługują.

Używaj trwałej persistencji

Punkty kontrolne w pamięci nadają się do celów edukacyjnych; produkcja wymaga trwałego przechowywania dostosowanego do Twoich wymagań dotyczących niezawodności.

Zapisz granice i limity

Decyduj o nich wyraźnie dla każdego procesu pracy,

What can AI do automatically?
What requires approval?
What can humans modify?
When does approval expire?

i określ warunki zakończenia pętli.

Maximum attempts
Timeouts
Validation
Failure paths
Escalation

Kiedy HITL jest opłacalny

Ludzka weryfikacja przynosi korzyści w określonych sytuacjach.

Cost of wrong action is high
Action is irreversible
Policy requires approval
Agent confidence is insufficient
Sensitive information is involved
Human judgment adds value

Rozproszone wszędzie, uniemożliwiają one automatyzację i zmuszają osoby sprawdzające do klikania bez czytania.

Agent
 ↓
Ask Human
 ↓
Agent
 ↓
Ask Human
 ↓
Agent
 ↓
Ask Human

Lepszy projekt zapewnia agentowi autonomiczną strefę do planowania i rozumowania, z jedną granicą przed podjęciem decyzji.

AUTONOMOUS ZONE
        ┌───────────────────────┐
        │                       │
        │ Plan → Search → Think │
        │                       │
        └───────────┬───────────┘
                    │
                    ↓
              CONTROL BOUNDARY
                    │
                    ↓
                  HUMAN
                    │
                    ↓
              APPROVED ACTION

Jak warstwy się łączą

Egzekucja grafu obejmuje węzły, krawędzie i routowanie;

Graph
Nodes
Edges
START
END
Loops
Conditional Routing

Zarządzanie stanem obejmuje aktualizacje i reduktory;

State
State Updates
Reducers
Messages
State Evolution

Trwałość danych obejmuje punkty kontrolne, wątki i przywracanie stanu;

Checkpoints
Checkpointer
Threads
thread_id
State History
Recovery

A HITL dodaje przerwy, polecenia i wzorce weryfikacji.

interrupt()
Command
Pause
Resume
Approve
Reject
Edit
Human Control

Ułożone warstwami, tworzą jedną ścieżkę przetwarzania.

GRAPH
  ↓
STATE
  ↓
NODE
  ↓
UPDATE
  ↓
REDUCER
  ↓
CHECKPOINT
  ↓
THREAD
  ↓
ROUTING
  ↓
INTERRUPT
  ↓
HUMAN
  ↓
COMMAND
  ↓
RESUME
  ↓
END

Główne wnioski

Słownictwo może wydawać się przytłaczające,

StateGraph
MessagesState
Reducers
Checkpointers
Threads
Commands
Interrupts

ale każda z tych części rozwiązuje jeden aspekt jednego celu: agent, który wie, działa, aktualizuje dane, podejmuje decyzje, zapisuje postępy, zatrzymuje się w odpowiednim momencie, pyta człowieka i bezpiecznie kontynuuje pracę.

Remember what it knows
        ↓
Perform some work
        ↓
Update what it knows
        ↓
Decide what to do next
        ↓
Persist its progress
        ↓
Pause when necessary
        ↓
Ask a human
        ↓
Resume safely
        ↓
Continue until complete
  • Stan to to, co wie agent, węzły to to, co robi, krawędzie to miejsca, do których udaje się agent, a reduktory określają, jak zmienia się stan.
  • Punkty kontrolne rejestrują, gdzie agent się znajdował; wątki wskazują, do którego historii należy dana operacja.
  • interrupt() określa miejsce zatrzymania i moment zadania pytania; Command wskazuje, jak kontynuować pracę, zawsze na tym samym wątku.
  • Zatrzymane węzły uruchamiają się ponownie po wznowieniu, dlatego należy zachować nieodwracalne skutki uboczne po punkcie zatwierdzenia.
  • Należy umieszczać procedury sprawdzania na rzeczywistych granicach kontroli, z wyraźnymi regułami czasu wygaśnięcia i eskalacji.

Literatura pokrewna

  • Dlaczego agenci AI w produkcji powodują błędy cicho i jak uniknąć nieprawidłowych odpowiedzi — Studium przypadku dwunastu agentów AI w produkcji pokazuje, dlaczego prawdopodobny błędny wynik jest rzeczywistym modelem awarii oraz jakie zasady projektowe sprawiły, że te agencje pozostały przydatne.
  • Jak agenci LangGraph przetrwają przerwy startowania: checkpointy, checkpointerzy, nici — Dowiedz się, jak działa mechanizm trwałości w LangGraph: dlaczego bez niego agenci tracą wszystko oraz jak stan, checkpointy, checkpointerzy i identyfikatory nici umożliwiają wznowienie działania po awarii.
  • Bramy zatwierdzenia w LangGraph.js: Wstrzymywanie agentów za pomocą interrupt() i Command — Stwórz minimalną bramkę zatwierdzeń LangGraph.js, która zawiesza działanie przed wystąpieniem skutku ubocznego, zbiera decyzję człowieka w terminalu i bezpiecznie kontynuuje pracę od punktu kontrolnego.
  • Specjalni agenci, router słów kluczowych i funkcja interrupt(): Trener LangGraph — Zaprojektuj asystenta LangGraph z dwoma specjalistami, wyposażonego w deterministycznego routera, wspólny stan przetrwający przenoszenie kontroli oraz punkt kontrolny dla człowieka oparty na przerwach i poleceniach.
  • Dlaczego sztuczne agenty produkcyjne zawodzą w ciszy i jak wykryć błędne odpowiedzi — Przypadek badawczy dwunastu agentów sztucznej inteligencji służących do produkcji pokazuje, dlaczego wiarygodny błędny wynik jest rzeczywistym modelem awarii, oraz jakie zasady projektowe sprawiły, że te, które przetrwały, pozostały przydatne.
  • Wewnątrz LangGraph's InMemorySaver: Jak pasują punkty kontrolne, zapisy i Blobs — Przejdź przez strukturę przechowywania, zapisz słowniki typu „writes” i „blobs” wewnątrz LangGraph’s InMemorySaver oraz prześledź, jak jeden mały graf po zakończeniu obliczeń przekształca się w trzy powiązane punkty kontrolne.
  • Sześć podstawowych elementów LangGraph i ukryty w każdym z nich sposób awarii — Dowiedz się o stanie LangGraph, węzłach, krawędziach, warunkowym routingu, tworzeniu punktów kontrolnych oraz przerwach poprzez konkretne błędy, do których każda z tych funkcji może prowadzić, oraz o sposobach ich unikania.