LangGraph

LangGraph 8강

[HITL] Human-in-the-loop · interrupt

에이전트가 돈을 쓰거나 메일을 보내는 등 위험한 행동을 하기 전엔 사람의 승인이 필요하다. LangGraph는 interrupt()로 그래프를 그 자리에서 멈추고, 사람이 값을 넣어 Command(resume=...)로 재개하게 한다. 멈춘 상태는 체크포인터에 저장되므로, 몇 초 뒤든 며칠 뒤든 이어갈 수 있다.

LangGraph 8강 구성도

이 강의 목표는 승인·수정 흐름(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