에이전트가 돈을 쓰거나 메일을 보내는 등 위험한 행동을 하기 전엔 사람의 승인이 필요하다. LangGraph는 interrupt()로 그래프를 그 자리에서 멈추고, 사람이 값을 넣어 Command(resume=...)로 재개하게 한다. 멈춘 상태는 체크포인터에 저장되므로, 몇 초 뒤든 며칠 뒤든 이어갈 수 있다.
이 강의 목표는 승인·수정 흐름(Human-in-the-loop)을 그래프에 넣는 것이다.
1. interrupt 로 멈추기
노드 안에서 interrupt(payload)를 호출하면 그래프가 멈추고, payload가 바깥으로 전달된다.
from langgraph.types import interrupt, Command
def approval(state):
decision = interrupt({"action": "송금", "amount": state["amount"]})
return {"approved": decision == "yes"}
체크포인터가 반드시 있어야 한다(멈춘 상태를 저장해야 하므로).
2. 멈춤 확인 & 재개
app = g.compile(checkpointer=MemorySaver())
cfg = {"configurable": {"thread_id": "t1"}}
res = app.invoke({"amount": 100000}, cfg)
print(res["__interrupt__"]) # 사람에게 물어볼 내용
# 사람이 결정한 값으로 재개
app.invoke(Command(resume="yes"), cfg)
Command(resume=값)의 값이 interrupt()의 반환값 자리에 들어가 그래프가 이어진다.
3. 흔한 패턴
- 승인/거부: 도구 실행 전 멈춰 사람이 yes/no.
- 상태 편집: 사람이 State를 고쳐
update_state로 반영 후 재개. - 입력 요청: 부족한 정보를 사람에게 물어봄.
핵심 명령·용어
| 이름 | 뜻 |
|---|---|
interrupt(payload) |
그래프 일시정지 |
Command(resume=v) |
값 v로 재개 |
__interrupt__ |
멈춤 시 반환되는 키 |
interrupt_before |
특정 노드 앞에서 자동 정지 |
예제
# 프리빌트 에이전트에서 도구 실행 전 승인받기
agent = create_react_agent(
llm, [transfer_money],
checkpointer=MemorySaver(),
interrupt_before=["tools"], # 도구 노드 앞에서 멈춤
)
해설) interrupt_before는 저수준 코드 없이도 특정 노드 앞에서 멈춰 사람의 확인을 받게 한다. 위험한 도구를 쓰는 에이전트의 안전장치다.
댓글 0
댓글은 운영자만 작성할 수 있어요.