Паузаванне і продаж чынення LangGraph Агентаў за дапамою interrupt() і Command
Як функцыі interrupt() і Command у LangGraph выкарыстоўваюць пункты контролу і задачы, каб на час зупініць агента для параджэння чалавека, внесення змян або вводу дадзенаў, а пасля безпечна яго запусціць знову.
Агент, які можа пераводзіць грошы, выкасываць рэсурсы або запускацца ў працэўны режым, не павінен завжды мець права завершыць тое, што пачаў. Інодзе граф должен намеравана зупініцца, чакаць калькі гадзінаў на аднаго чалавека, а пасля продажыць роботу самэ там, дзе застаў. У этай статыцы адказвана, як LangGraph робіць гэта за дапамогою interrupt() і Command, чаму ён залежыць ад контрольных пунктав і нітак, і якія рашэнні вы ўсё ейсце маеце права прымкнуць перад запускам агентав з участю чалавека (HITL) у працэўны режым.
Аднойчынныя элементы, якія лежачы пад спадом
HITL складаецца з трох гэтых слоёў. Першы — выкананне графа: стан заходзіць у вузел, а рэглі ўзначаюць наступны вузел.
STATE
↓
NODE
↓
EDGE
↓
NEXT NODE
Другі — калектывацыя стану: вузелі вяртаюць апдэйты, а редукеры з’яеднаюць іх у новы стан.
NODE
↓
STATE UPDATE
↓
REDUCER
↓
NEW STATE
Трэці — перазберагчыванне: контрольны пункт зберагае стан у відпаведных контрольных пунктавых групах пад нітамі.
STATE
↓
CHECKPOINT
↓
CHECKPOINTER
↓
THREAD
↓
PERSISTENCE
Ўжае гэтыя элементы дазволяюц агенту працавац, запамятоввац і выжывац пасля перзапускаў. Што не хватает, так гэта спосаб прыняць рашэнне, чы хаця бы трэба продавац працу.
Калі агент не должен проста продавац працу
Пользователь кажа асистэнту з платежамі: «Пераказаць 50 000 рупіяў на гэты рахунак». Агент падготавляе транзакцыю, і тэхнічна няма нічога, што заважало бы яе выкананню.
User
↓
Agent
↓
Prepare Transfer
↓
Transfer ₹50,000
↓
Execute
Для такага значныя дзеяння чалавек павінен спачатку пераглядзець прыказ, ўсёлькі логіка практыкавацца за рашэннем чалавека.
User
↓
Agent
↓
Prepare Transfer
↓
┌─────────────────────┐
│ HUMAN APPROVAL │
└──────────┬──────────┘
│
┌───┴───┐
↓ ↓
Approve Reject
│ │
↓ ↓
Execute Cancel
Тепер граф павінен намерна зупыніцца: не через адказ чы крах, а таму што працэс патрабуе чалавечага вводу.
Што значыць наявнасць чалавека ў процэсе
HITL уводзіць чалавечыя рашэнні ў аўтаматызаваны логічны лянцюг. У замест на тое, каб праходзіць ад рашэння да дзеяння без перерываў,
Agent
↓
Decision
↓
Action
агент прыказвае, зупіняецца і чакае на перагляд.
Agent
↓
Proposed Action
↓
PAUSE
↓
Human Review
↓
Decision
↓
Continue
Рэвізор можа затвердзіць, адхоўнуць, выправіць прыказ, дадаць нехваткавае даннё, скорэктаваць агента чы ўзяць выбар між альтернатывамі. Гэта падходзіць для будзь-яга крока, які мае рэальныя наследкі.
Financial transactions
Sending emails
Deleting resources
Production deployments
Database modifications
Legal workflows
Publishing content
Access approvals
Sensitive tool calls
Што насправды трэба для павернення графа
Возьміце ланцюг з крокам затверджэння перед апошнім вузлом.
Node A
↓
Node B
↓
Human Approval
↓
Node C
Якщо рэвізор адпавядае за шасць гадзін, блакуванне процэса — глыткая адпаведна: гэта марнуе працоўніка і заканчываецца праз першае запусканне.
sleep(21600)
Уместна ў такі момент зберагчы стан і зупініцца,
Node B
↓
SAVE STATE
↓
PAUSE EXECUTION
↓
потым восстановіць яго пазней, можа ў іншым процэсе, і продаважыць роботу на наступны вузел.
Application can stop──────── 6 HOURS LATER ────────Human responds
↓
RESTORE STATE
↓
CONTINUE EXECUTION
↓
Node C
Перазберагчыце вже рашае палову проблемы. Кэшпоінты, кэшпойнтар, ниткі і thread_id — гэта самэ тое, што трэба для дзейна павернення.
Checkpoint
Checkpointer
Thread
thread_id
Persistence
Як interrupt() зупіняе выконанне
interrupt() зупіняе граф і запитуе зовнішній свет працэўнае значэнне. Яго вызываюць усередзіні вузла з пэўным навантажэнням, якое можна серыялізаваць у формате JSON і якое описвае, што павінен бачыць адгукнуўшыся. Хоць у первісным пазначэнні напісана інша мова, у даным прыкладзе викорыстоўваецца Python.
from langgraph.types import interrupt
def approval_node(state):
decision = interrupt({
"question": "Do you approve this transaction?",
"amount": state["amount"]
})
return {
"decision": decision
}
Калі выконанне доходзіць да вызову,
interrupt(...)
вузел не доходзіць да свайго оператара вярнення. Выконанне зупіняецца, а навантажэння вяртаецца вызываючаму для адображэння.
approval_node
│
↓
interrupt()
│
↓
┌─────────────────┐
│ EXECUTION PAUSED│
└─────────────────┘
Важлівы два моменты. interrupt() выклікаецца толькі для графа, скомпільаванага з падтрымкай checkpointer, адтуды што стан зупінення павінен быць схованыя. Калі выконанне практычна, LangGraph зноў запускае перыявлены вузел з самага пачатку; тады interrupt() вяртае значэнне, якое задаў чалавек, і код, які знаходзіцца даўжэй ад вызову, выконваецца два разы. Не трэба даваць пабочных эфектаў у гэты частак вузла, а таксама павінны быць паказаныя правілы працы вашай версіі ў дасведчэннях LangGraph.
Што зберагаецца пад перарыве
Разглядзім этот граф.
START
↓
Prepare Transfer
↓
Human Approval
↓
Execute Transfer
↓
END
Узел падготовкі выкарыстоўваецца для абнавлення стану, запісываецца контрольная точка, а узел затверджэння вызывае interrupt().
START
↓
Prepare Transfer
↓
State Updated
↓
Checkpoint
↓
Approval Node
↓
interrupt()
Тэкучы стан фіксуецца і запісываецца у памяць.
Current State
│
↓
Checkpoint
│
↓
Persistent Storage
Адэнтадацыя тепер мае дакументацію пераказу, статус у ачыянні і прычыну зупінкі.
THREAD: transaction-123
Checkpoint
────────────────────
amount ₹50,000
recipient Account X
status pending
────────────────────
Execution:
PAUSED
Reason:
Human approval required
Это ўсё, што патрэбна для продажу далей. Без зберагання процес проста зникне пасля перарыву.
Agent
↓
interrupt
↓
process disappears
↓
???
Калі адпрацоўчык наступнага дня напісае "Затверджана", ніхто не зможа сказаць, што было затверджана, дзе зупініўся граф чы які узел будзе следующы. За дапамогою контрольных точак стан завантажваецца з адэнтадацыі і вярна восстанавляецца перш чым продажу.
INTERRUPT
│
↓
CHECKPOINT
│
↓
THREAD
│
↓
PERSISTENT STORAGE
...time passes...
HUMAN INPUT
│
↓
THREAD
│
↓
LOAD CHECKPOINT
│
↓
RESTORE STATE
│
↓
RESUME
Продажу з адказам
Програма адаптавае пакет інтарэйсу як запит.
Approve transfer of ₹50,000?
з двумя кантактамі,
[ APPROVE ] [ REJECT ]
і пераглядач выбирае адны з іх.
APPROVE
Адказ вяртаецца через Command, який паведамляе граф апранутыя дзеінстацыі. Чыба прыняць роботу, вызваце граф за дапамою Command(resume=...) у зьвязку з звычайным вводам.
from langgraph.types import Command
graph.invoke(
Command(resume="approved"),
config=config
)
config павінен выконвацца на той жа нить, што і зупіненыя робота,
thread_id = transaction-123
так как ID ніты — гэта спосаб, яким LangGraph ведае, пра яку зупіненую екзекуцыю йдzie мова.
Этапы жыцёвага циклу па шагах
Робота запускаецца з звычайнага вызову,
graph.invoke()
зьяўляе сваю нить з config,
thread_id = transaction-123
входзіць у вузол падготовкі,
START
↓
Prepare Transfer
і запісвае перадачу ў стан.
amount = ₹50,000
recipient = Account X
status = pending
Узел затверджэння вызывае interrupt(),
Approval Node
↓
interrupt()
і виконанне адхвалюецца.
EXECUTION PAUSED
Пасляпэўны пункт перапыткі застаецца безпечным пад гэтым потам.
Thread
↓
Checkpoint
↓
Persistent Storage
Чалавек бачыць запит
Approve ₹50,000 transfer?
і адпавядае.
YES
Програма адправляе команду на продажчык
Command(resume="approved")
до таго ж пота.
transaction-123
LangGraph вярнюе виконанне, перадае рашэнне узелу затверджэння і продовжае да канца.
Restore Execution
↓
Human Decision = approved
↓
Continue Graph
↓
Execute Transfer
↓
END
Кожны з наведзеных выкладак ёсць варіяцыяю гэтага жыцёвага циклу.
Людзкія рашэнні, якія не ўскладнююцца толькі на «так» чы «нет»
Адпаведзь рэвізора не павінна быць двухкомпонентной.
YES / NO
Затверджэння выканае прыявку.
Agent Proposal
↓
Human
↓
APPROVE
↓
Execute
Адклэнчэнне анулюе яе.
Agent Proposal
↓
Human
↓
REJECT
↓
Cancel
Рэдагаванне зміняе частку прыявкі, напрыклад суму, перш чым граф продовжае свою роботу.
Agent:
Send ₹50,000
↓
Human:
Change to ₹40,000
↓
Graph continues with
updated information
Падача нехватковай інформацыі ператварае перерыв у пытанне.
Agent
↓
Missing Account Number
↓
INTERRUPT
↓
Human provides account
↓
RESUME
Выбір дазволяе агенту запропанаваць альтернатывы і заставіць чалавека выбраць.
Agent generates:
Option A
Option B
Option C
↓
Human chooses B
↓
Graph continues
HITL — гэта загальны спосаб уведзення даных ад чалавека ў працюючы граф, а не толькі дыялог затверджэння.
Каманда як поток данных і поток керавання
Каманда таксама можа апдэйтаваць стан і выбраць наступную мету.
Resume Execution
Update State
Choose Next Destination
Адна каманда можа задаць статус і надаць выконанне конкрэтнаму вузлу; у LangGraph гэтае форма зазвычай вяртаецца з вузла.
Command(
update={
"status": "approved"
},
goto="execute"
)
Это спаўнае два аспекты,
DATA FLOW
+
CONTROL FLOW
адколі маршрутызацыя раней належала толькі до рэгулі.
Edges control where we go.
Тепер адна об’ект можа несці як змяну стану, так і наступны крок.
Command can participate in
state updates + control decisions.
Корэкцыя стану пры продажчыце
Падзеймім, што дзяржава мае гэтую суму,
amount = 50000
і адміністратар затверджвае ўсё пасля внесення парадоксу.
Approve, but change amount to 40000.
Процес праходзіць ад пачатковага значэння, через перагляд, да апдейтаванага значэння, і толькі пасля чаго продовжваецца (другi фрагмент падае на адну лінію).
BEFORE
amount = 50000 ↓Human Review ↓UPDATEamount = 40000 ↓RESUME
Запит зменшаецца з «Магчыма продаваць далей?» на «Працаваць, выправіць за патрэбы, а потым продаваць далей».
Контроль вызоваў чулівых інструментаў
HITL ёсць найболей практычныяй пры викорыстоўванні рызыкавых інструментаў.
search_web()
read_database()
send_email()
delete_resource()
transfer_money()
Пошук у інтэрнете можа выконвацца аўтаматычна,
search_web()
↓
Execute Automatically
тады як для выдалення рэсурса трэба чакаць на затверджэнне.
delete_resource()
↓
INTERRUPT
↓
Human Approval
Кожны вызов інструмента праходзіць праз перакананне ў чулівасці: безпечныя вызовы выконваюцца, а чулівыя перарываюцься для затверджэння аб анулювання.
Agent
│
↓
Tool Call
│
↓
Sensitive Tool?
/ \
NO YES
│ │
↓ ↓
Execute INTERRUPT
│ │
│ ↓
│ Human
│ / \
│ Approve Reject
│ │ │
└─────────┘ ↓
Cancel
Для болейш абсалютнай рэалізацыі, падтрымванай хранальнікам, адзірніце агентаў з разрашэнням у LangGraph.
Перагляд як цялеспрямованая межа кантролю
Перагляд чалавекам не ёсць спосабом выправлення агента, які недаўна достатнь смартны. Цэлая межа, яку вы створылі намеравана. Роботы з низкім рызыкам выкананыя автаматычна,
LOW RISK
Search
Read
Summarize
↓
Automatic
а роботы з высокім рызыкам праходзяць чераз чалавека.
HIGH RISKSend
Delete
Purchase
Transfer
Deploy
↓
Human Approval
Мета — выявіць, дзе адпаведна автаномія, а не скасаваць яе ў всіх випадках.
Работа з адклэннямі і мовчаннем
Адклэння вымагае правільнага проектавання.
Agent
↓
Prepare Action
↓
Interrupt
↓
Human
↓
REJECT
Запісаце рэзультат у стан,
status = "rejected"
потым направіце на яго за дапамою умовнага рэгламента.
Decision
/ \
approved rejected
│ │
↓ ↓
Execute Cancel
│ │
↓ ↓
END END
Усе пакульшыя концэпты беруць участь, а чалавечы ввод — цэлая проста ўтварэнняе для формавання выконання.
State
Reducers
Conditional Routing
Checkpoints
Threads
Commands
Адміністратары таксама можаць ніколі не адпавядаць.
Interrupt
↓
Waiting for approval
↓
1 hour
↓
1 day
↓
7 days
Зупіненыя ниткі можаць чакаць несканчатнае час, таму ваша прыкладка патрабуе наявнасці правіл.
Expiration
Timeout
Cancellation
Reminder
Escalation
Паўзлівы спосаб чакання — адно з распашчацых рашэнняў, якое зазвычай выкарыстоўваецца схематызаторам, які вярнюе зупіненыя ниткі пасля спылу часу.
Approval Requested
│
↓
Wait up to 24 hours
│
┌───┴────┐
↓ ↓
Response Timeout
│ │
↓ ↓
Resume Cancel
LangGraph апранае прымітывы; правіла роботы заданы вам.
Калькі гэтавак і стрімінг
Агент развяртання можа просіць апраўды свага плану, а таксама перад запускам у прымэтны режым.
START
↓
Analyze Code
↓
Generate Deployment Plan
↓
Human Approval #1
↓
Deploy to Staging
↓
Run Tests
↓
Human Approval #2
↓
Deploy Production
↓
END
Кожны кальк гэтавак зупіняе і вярнюе тую ж нитку, залічваючы історыю пунктав перагляду і перарываў.
Thread
│
├── CP1
│
├── CP2
│
├── INTERRUPT
│
├── RESUME
│
├── CP3
│
├── INTERRUPT
│
├── RESUME
│
└── END
Это ўстойчывы рабочы план, які выкарыстоўваюць людзі і агент. Да гэтага часу кожны прыклад выкарыстоўваў блакіруючы вызов,
graph.invoke(...)
які вярнюе рэзультат толькі калі завершываецца адработка або вырабляецца паўза.
START → A → B → C → END
↓
RESULT
Інтэрактыўныя прыкладніцы патрабуюць абнаўлення стану ў момент выконання, пакуль не будзе адправлена просьба про затверджэння.
START
↓
Planner Update ─────────→ UI
↓
Tool Call ──────────────→ UI
↓
Tool Result ────────────→ UI
↓
Approval Required ──────→ UI
Стрімаванне дастае гэтыя змены, тады інтэрфейс можа паказваць завершаныя крокі і рашэнне, якое ўсё ще чакае.
┌──────────────────────────────────┐
│ Deployment Agent │
├──────────────────────────────────┤
│ │
│ ✓ Analyzed repository │
│ │
│ ✓ Generated deployment plan │
│ │
│ ✓ Staging tests passed │
│ │
│ ⚠ Production deployment ready │
│ │
│ Human approval required │
│ │
│ [ APPROVE ] [ REJECT ] │
│ │
└──────────────────────────────────┘
За гэтым экранам змены праходзяць да фронтэнду, а рашэнне вяртаецца через Command(resume=...).
LangGraph
│
↓
Streaming
│
↓
Frontend
│
↓
Human Decision
│
↓
Command(resume=...)
│
↓
LangGraph
Полны модэль выконання
У аднай дыяграме: корыстунач запускае процес на адным потоку, стан пераходзіць між вузламі та редуктарамі, фіксуюцца контрольныя точкі, маршрутызацыя выбирае наступны крок, а чутлівыя дзеяння пераказваюцца на перерыв, які рашае чалавек.
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
У формате аповесці: прыходзіць просьба.
User Input
і запускаецца выконання.
START
Вузлы чытаюць стан і вяртаюць апдэйты, редактары з’яеднваюць іх, чэкпоінты запішываюць іх пад адным потокам, а рэглі ўзначаюць, што будзе выканана далей. Граф можа розгалужвацца, ствараць цыклі або вызываць інструменты.
BRANCH
LOOP
CALL TOOLS
Калі патрэбны людзкія дзеяння, інтарупцыя паставляе выкананне на паузу.
interrupt()
Чалавек адпавядае,
APPROVE
REJECT
EDIT
PROVIDE INPUT
команда продазваць продовжвае выкананне з таго ж потока, які быў запісаны,
Command(resume=...)
і тады граф завершаецца.
END
Большасць проектаў пачынаецца з аднаго вызыву модэлю,
LLM
↓
Response
і заканчваецца графам, які з’яеднвае вузлы LLM і інструментаў, редактары, чэкпоінты, механізмы направлення, інтарупцыі та команды.
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
Чэк-ліст для працы ў прыметнай сярэжці
Зберагаюце вузлы сфармаванымі
Маленькія вузлы з адной функцыяй лёгкія для тэставання, прабавок і безпечнага перыву,
Plan Node
Search Node
Validate Node
Execute Node
на вярсці з адним вузлам, які выкананае все.
do_everything_agent()
Зусім спецыяльна разработка стану і редуктараў
Зберагаюце толькі тое, што патрэбна вузлам, адколькі все фіксуецца як пункты контролю і можа быць паказана пераглядачам. Рашуча выбірайце редуктары для полей, якія накапліваюць данні.
messages
events
results
observations
Зробіце парадоксальныя эфекты ідэмпотентнымі
Операцыі, якія немагчыма вярнуць у пачатковы стан, выклікаюць адзінаковыя проблемы.
Send Email
Charge Card
Delete Resource
Deploy
Transfer Money
Практыкі перапрыцягвання і продовжэння ніколі не должны ўздаражваць іх. Паколькі перерваны вузел пачынае работу зноў пасля продовжэння, размістайце немагчыма вярнуць у пачатковы стан вызовы пасля точкі затверджэння або ў окремы вузел, і выкорыстайце ключы ідэмпотентнасці там, дзе API яе падтрымляюць.
Выкорыстоўваеце стойкае збераганне
Інструменты контролю ў памяці падходзяць для навучэння; у прымененні патрэбна стойкая система зберагання, якая падходзіць вашым трэбаванням да надзеямоўнасці.
Запішыце межы і ліміты
Ясна прызначыце іх для кожнага робочага прайсепту,
What can AI do automatically?
What requires approval?
What can humans modify?
When does approval expire?
і задаце умовы завершэння циклаў.
Maximum attempts
Timeouts
Validation
Failure paths
Escalation
Калі HITL ёсць корыстны
Людзка пераглядка ўтрымлівае сэнс у спецыяльных ситуацыях.
Cost of wrong action is high
Action is irreversible
Policy requires approval
Agent confidence is insufficient
Sensitive information is involved
Human judgment adds value
Распалённыя па всім, яны памешчаюць автаматызацыю і навучаюць пераглядачоў клацаць без чытання.
Agent
↓
Ask Human
↓
Agent
↓
Ask Human
↓
Agent
↓
Ask Human
Лепейшыя праектаванні даюць агенту автонамную зону для планавання і разумоўвання, з аднай межой пры перадзеянні дзеяння.
AUTONOMOUS ZONE
┌───────────────────────┐
│ │
│ Plan → Search → Think │
│ │
└───────────┬───────────┘
│
↓
CONTROL BOUNDARY
│
↓
HUMAN
│
↓
APPROVED ACTION
Як складаюцца шары
Выкананне графа абходзіць вузлы, рэшткі і маршрутызацыю;
Graph
Nodes
Edges
START
END
Loops
Conditional Routing
Кантроль стану абходзіць апдэйты і редукеры;
State
State Updates
Reducers
Messages
State Evolution
Перазбіранне абходзіць чэкпоінты, ніткі і вяснаванне;
Checkpoints
Checkpointer
Threads
thread_id
State History
Recovery
А HITL дадае перарывы, каманды і шаблоны пераглядки.
interrupt()
Command
Pause
Resume
Approve
Reject
Edit
Human Control
Складзеныя разам, яны ствараюць адну трубопрацэсную лінію.
GRAPH
↓
STATE
↓
NODE
↓
UPDATE
↓
REDUCER
↓
CHECKPOINT
↓
THREAD
↓
ROUTING
↓
INTERRUPT
↓
HUMAN
↓
COMMAND
↓
RESUME
↓
END
Ключовыя выводы
Слоўнік можа здавацца перанасытным,
StateGraph
MessagesState
Reducers
Checkpointers
Threads
Commands
Interrupts
Але кожны элемент рашае адзін частка адной-едзінай меты: агент, які знае, дзейнае, актуалізуе інфармацыю, прыме рашэння, зберагае прогрэс, зупінаецца тады, калі трэба, запытае чалавека і продовжвае работу без апяшэнняў.
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
- Стан — гэта тое, што знае агент; вузлы — гэта тое, што ён рабіць; ребры — гэта тое, куды ён ідзе; редуктары — гэта спосабы змены стану.
- Чекпоінты фіксуюць месца, дзе агент знаходзіўся; ниткі паказваюць, каму належыць історыя дзеянняў.
interrupt()пазначае месца, дзе трэба зупініцца і запытаць;Commandадпавядае на пытанне, як продовжыць, завжды на той самай нітке.- Вузлы, якія былі перарваны, пачынаюць работу зноў пасля вярнення, таму неабходна сохраніць незворачныя паслядкі пасля точкі затверджэння.
- Практыку перагляду трэба размесціваць на справжніх межах кантролю, з чысткі сэтамі часу та правіламі падняць прыбутак проблемы.