interrupt() 함수를 호출하여 작동합니다. 이 함수는 JSON 직렬화 가능한 모든 값을 받아 호출자에게 전달합니다. 계속할 준비가 되면 Command를 사용하여 graph를 다시 호출하여 실행을 재개하며, 이는 node 내부의 interrupt() 호출의 반환 값이 됩니다.
정적 breakpoint(특정 node 전후에 일시 중지)와 달리, interrupt는 동적입니다—코드의 어느 곳에나 배치할 수 있으며 애플리케이션 로직에 따라 조건부로 실행될 수 있습니다.
- Checkpointing이 위치를 유지합니다: checkpointer는 정확한 graph 상태를 기록하여 오류 상태에서도 나중에 재개할 수 있습니다.
thread_id는 포인터입니다:config={"configurable": {"thread_id": ...}}를 설정하여 checkpointer에게 어떤 상태를 로드할지 알려줍니다.- Interrupt payload는
__interrupt__로 표시됩니다:interrupt()에 전달한 값은__interrupt__필드에서 호출자에게 반환되므로 graph가 무엇을 기다리고 있는지 알 수 있습니다.
thread_id는 사실상 영구적인 커서입니다. 이를 재사용하면 동일한 checkpoint를 재개하고, 새 값을 사용하면 빈 상태로 새로운 thread를 시작합니다.
interrupt를 사용하여 일시 중지
interrupt 함수는 graph 실행을 일시 중지하고 호출자에게 값을 반환합니다. node 내에서 interrupt를 호출하면 LangGraph는 현재 graph 상태를 저장하고 입력과 함께 실행을 재개할 때까지 기다립니다.
interrupt를 사용하려면 다음이 필요합니다:
- graph 상태를 유지하기 위한 checkpointer (프로덕션에서는 영구 checkpointer 사용)
- runtime이 어떤 상태를 재개할지 알 수 있도록 config에 thread ID
- 일시 중지하려는 위치에서
interrupt()호출 (payload는 JSON 직렬화 가능해야 함)
interrupt를 호출하면 다음과 같은 일이 발생합니다:
- Graph 실행이 중단됩니다
interrupt가 호출된 정확한 지점에서 - 상태가 저장됩니다 checkpointer를 사용하여 나중에 실행을 재개할 수 있도록, 프로덕션에서는 영구 checkpointer(예: 데이터베이스 기반)를 사용해야 합니다
- 값이 반환됩니다
__interrupt__아래에서 호출자에게; JSON 직렬화 가능한 모든 값(문자열, 객체, 배열 등)이 될 수 있습니다 - Graph가 무기한 대기합니다 응답과 함께 실행을 재개할 때까지
- 응답이 다시 전달됩니다 재개할 때 node로,
interrupt()호출의 반환 값이 됩니다
Interrupt 재개하기
Interrupt가 실행을 일시 중지한 후, resume 값을 포함하는Command로 graph를 다시 호출하여 재개합니다. Resume 값은 interrupt 호출로 다시 전달되어 node가 외부 입력으로 실행을 계속할 수 있게 합니다.
- Interrupt가 발생했을 때 사용된 것과 동일한 thread ID를 재개할 때 사용해야 합니다
Command(resume=...)에 전달된 값이interrupt호출의 반환 값이 됩니다- Node는 재개될 때
interrupt가 호출된 node의 시작 부분부터 다시 시작되므로interrupt이전의 모든 코드가 다시 실행됩니다 - Resume 값으로 JSON 직렬화 가능한 모든 값을 전달할 수 있습니다
일반적인 패턴
Interrupt가 가능하게 하는 핵심은 실행을 일시 중지하고 외부 입력을 기다리는 능력입니다. 이는 다음을 포함한 다양한 사용 사례에 유용합니다:- 승인 워크플로우: 중요한 작업(API 호출, 데이터베이스 변경, 금융 거래) 실행 전에 일시 중지
- 검토 및 편집: 계속하기 전에 사람이 LLM 출력이나 tool 호출을 검토하고 수정하도록 허용
- Tool 호출 중단: Tool 호출 실행 전에 일시 중지하여 실행 전에 tool 호출을 검토하고 편집
- 사용자 입력 검증: 다음 단계로 진행하기 전에 일시 중지하여 사용자 입력 검증
승인 또는 거부
Interrupt의 가장 일반적인 사용 사례 중 하나는 중요한 작업 전에 일시 중지하고 승인을 요청하는 것입니다. 예를 들어, API 호출, 데이터베이스 변경 또는 기타 중요한 결정을 승인하도록 사람에게 요청할 수 있습니다.true를, 거부하려면 false를 전달합니다:
전체 예제
전체 예제
상태 검토 및 편집
때로는 계속하기 전에 사람이 graph 상태의 일부를 검토하고 편집하도록 하고 싶을 수 있습니다. 이는 LLM을 수정하거나, 누락된 정보를 추가하거나, 조정을 하는 데 유용합니다.전체 예제
전체 예제
Tool에서의 Interrupt
Tool 함수 내부에 직접 interrupt를 배치할 수도 있습니다. 이렇게 하면 tool이 호출될 때마다 tool 자체가 승인을 위해 일시 중지되며, 실행 전에 tool 호출을 사람이 검토하고 편집할 수 있습니다. 먼저interrupt를 사용하는 tool을 정의합니다:
전체 예제
전체 예제
사용자 입력 검증
때로는 사람의 입력을 검증하고 유효하지 않으면 다시 요청해야 합니다. 루프에서 여러interrupt 호출을 사용하여 이를 수행할 수 있습니다.
전체 예제
전체 예제
Interrupt 규칙
Node 내에서interrupt를 호출하면 LangGraph는 runtime에 일시 중지하라는 신호를 보내는 예외를 발생시켜 실행을 중단합니다. 이 예외는 호출 스택을 통해 전파되고 runtime에 의해 포착되어 graph에 현재 상태를 저장하고 외부 입력을 기다리도록 알립니다.
실행이 재개되면(요청된 입력을 제공한 후), runtime은 전체 node를 처음부터 다시 시작합니다—interrupt가 호출된 정확한 줄에서 재개하지 않습니다. 즉, interrupt 이전에 실행된 모든 코드가 다시 실행됩니다. 따라서 interrupt가 예상대로 작동하도록 하려면 따라야 할 몇 가지 중요한 규칙이 있습니다.
interrupt 호출을 try/except로 감싸지 마세요
interrupt가 호출 지점에서 실행을 일시 중지하는 방식은 특수 예외를 발생시키는 것입니다. interrupt 호출을 try/except 블록으로 감싸면 이 예외를 포착하게 되어 interrupt가 graph로 다시 전달되지 않습니다.
- ✅
interrupt호출을 오류가 발생하기 쉬운 코드와 분리하세요 - ✅ try/except 블록에서 특정 예외 타입을 사용하세요
- 🔴
interrupt호출을 일반 try/except 블록으로 감싸지 마세요
Node 내에서 interrupt 호출 순서를 변경하지 마세요
단일 node에서 여러 interrupt를 사용하는 것은 일반적이지만, 주의하지 않으면 예상치 못한 동작이 발생할 수 있습니다.
Node에 여러 interrupt 호출이 포함되어 있으면 LangGraph는 node를 실행하는 task에 특정한 resume 값 목록을 유지합니다. 실행이 재개될 때마다 node의 시작 부분에서 시작됩니다. 각 interrupt가 발생할 때마다 LangGraph는 task의 resume 목록에 일치하는 값이 있는지 확인합니다. 일치는 엄격하게 인덱스 기반이므로 node 내 interrupt 호출의 순서가 중요합니다.
- ✅ Node 실행 전반에 걸쳐
interrupt호출을 일관되게 유지하세요
interrupt 호출에서 복잡한 값을 반환하지 마세요
사용되는 checkpointer에 따라 복잡한 값은 직렬화할 수 없을 수 있습니다(예: 함수를 직렬화할 수 없음). Graph를 모든 배포에 적응할 수 있도록 하려면 합리적으로 직렬화할 수 있는 값만 사용하는 것이 좋습니다.
- ✅
interrupt에 간단한 JSON 직렬화 가능한 타입을 전달하세요 - ✅ 간단한 값을 가진 dictionary/object를 전달하세요
- 🔴
interrupt에 함수, 클래스 인스턴스 또는 기타 복잡한 객체를 전달하지 마세요
interrupt 이전에 호출된 부작용은 멱등성이 있어야 합니다
Interrupt는 호출된 node를 다시 실행하여 작동하므로 interrupt 이전에 호출된 부작용은 (이상적으로) 멱등성이 있어야 합니다. 참고로, 멱등성은 동일한 작업을 여러 번 적용해도 초기 실행 이후 결과가 변경되지 않는다는 것을 의미합니다.
예를 들어, node 내부에 레코드를 업데이트하는 API 호출이 있을 수 있습니다. 해당 호출이 이루어진 후 interrupt가 호출되면 node가 재개될 때 여러 번 다시 실행되어 초기 업데이트를 덮어쓰거나 중복 레코드를 생성할 수 있습니다.
- 🔴
interrupt이전에 멱등성이 없는 작업을 수행하지 마세요 - 🔴 존재 여부를 확인하지 않고 새 레코드를 생성하지 마세요
함수로 호출되는 subgraph와 함께 사용
Node 내에서 subgraph를 호출할 때, 부모 graph는 subgraph가 호출되고interrupt가 트리거된 node의 시작 부분부터 실행을 재개합니다. 마찬가지로 subgraph도 interrupt가 호출된 node의 시작 부분부터 재개됩니다.
Interrupt를 사용한 디버깅
Graph를 디버그하고 테스트하려면 정적 interrupt를 breakpoint로 사용하여 한 번에 한 node씩 graph 실행을 단계별로 진행할 수 있습니다. 정적 interrupt는 node가 실행되기 전이나 후에 정의된 지점에서 트리거됩니다. Graph를 컴파일할 때interrupt_before와 interrupt_after를 지정하여 이를 설정할 수 있습니다.
정적 interrupt는 human-in-the-loop 워크플로우에 권장되지 않습니다. 대신
interrupt 메서드를 사용하세요.- 컴파일 시
- 런타임 시
- Breakpoint는
compile시에 설정됩니다. interrupt_before는 node가 실행되기 전에 실행을 일시 중지해야 하는 node를 지정합니다.interrupt_after는 node가 실행된 후에 실행을 일시 중지해야 하는 node를 지정합니다.- Breakpoint를 활성화하려면 checkpointer가 필요합니다.
- Graph는 첫 번째 breakpoint에 도달할 때까지 실행됩니다.
- 입력에
None을 전달하여 graph를 재개합니다. 이렇게 하면 다음 breakpoint에 도달할 때까지 graph가 실행됩니다.
LangGraph Studio 사용
LangGraph Studio를 사용하여 graph를 실행하기 전에 UI에서 graph에 정적 interrupt를 설정할 수 있습니다. 또한 UI를 사용하여 실행의 모든 지점에서 graph 상태를 검사할 수 있습니다.
Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.