Loading the catalog…
Loading the catalog…
이번 교안에서는 LangGraph 실행을 사람의 검토 지점에서 멈추고, 같은 작업을 재개하는 HITL 흐름과 생성 과정·진행 상태를 스트리밍으로 확인하는 방법을 정리했다. HITL로 사람의 판단을 실행 흐름에 넣기 HITL(Human-in-the-loop)은 자동 실행 중간에 사람의 판단을 받아 다음 작업을 정하는 방식이다. 서비스 점검 안내문 그래프는 초안을 만든 다음 사람이 승인·수정 요청·반려 중 하나를 선택한다. START → 초안 작성 → 사람 검토 ├─ 승인 → 안내문 확정 → END ├─ 수정 → 수정 후 재검토 └─ 반려 → END State에는 확정된 점검 정보, 현재 초안, 사람의 결정과 수정 의견, 최종 확정문을 둔다. 초안 작성과 수정은 LLM 노드이고, 검토 노드는 interrupt() 로 사람의 응답을 기다린다. interrupt로 멈추고 Command로 재개하기 interrupt() 는 검토할 초안과 선택지 같은 데이터를 호출자에게 전달하고 그래프를 멈춘다. 대기 상태를 저장하고 나중에 찾을 수 있도록 체크포인터와 thread_id 가 필요하다. 사람의 응답을 전달할 때는 대기 중인 실행과 같은 thread_id 를 사용한다. 한 요청만 대기 중이라면 Command(resume=응답) 으로 재개할 수 있다. 중단 ID를 알고 있거나 여러 요청을 구분해야 한다면 현재 요청의 ID를 키로 지정한다. interrupt_id = graph.get_state(config).interrupts[0].id result = graph.invoke( Command(resume={interrupt_id: { "action": "edit", "feedback": "기존 예약 조회가 가능하다는 점을 먼저 알려 주세요.", }}), config, ) 중단 요청의 stage 는 화면에서 어떤 검토 단계인지 표시하기 위한 값이다. 중단 ID는 응답할 요청을 지정하고, thread_id 는 전체 작업 기록을 구분한다. stage 가 사용자 권한을 확인해 주는 것은 아니므로 실제 서비스의 권한 검사는 별도로 구현해야 한다. 재개하면 대기 중이던 노드가 처음부터 다시 실행되고, 같은 interrupt() 에 도달했을 때 전달한 응답을 반환한다. 따라서 그 노드에서 interrupt() 앞에 놓인 코드는 다시 실행될 수 있다. 중복 실행되면 안 되는 외부 발송이나 결제는 대기 노드 앞에 두지 말고 승인 이후에 실행하며, 재시도에도 중복되지 않도록 설계해야 한다. 수정 요청은 LLM이 의견을 반영해 새 초안을 만들고, 다시 사람의 검토를 기다린다. 사람이 직접 고친 문장을 edited_text 로 전달해 승인하는 경로도 만들 수 있다. 이 경우 수정 모델 호출 없이 사람이 편집한 문장을 확정한다. 승인과 확정은 별도 작업으로 둘 수 있다 교안의 확장 실습은 채용공고의 내용 검토 와 게시 승인 을 두 단계로 나눈다. 공고 작성 → 내용 검토 ── 수정 → 재검토 ├─ 승인 → 게시 승인 └─ 반려 → END ├─ 승인 → 확정 └─ 반려 → END 내용이 정확하다는 승인과 실제 게시를 허가하는 승인은 서로 다른 판단이다. 두 번째 승인까지 끝난 뒤에만 approved_post 를 채운다. 첫 검토의 결정과 게시 결정은 별도 State 필드에 저장한다. 여러 HITL 단계가 한 작업에 있으면 매번 get_state(config).interrupts 에서 현재 대기 중인 요청의 ID 를 가져와 응답해야 한다. 수정 후 다시 대기한 요청은 같은 stage 를 쓰더라도 새로운 interrupt ID를 가질 수 있다. 검토를 진행하는 동안에는 같은 thread_id 를 유지한다. 스트리밍으로 실행 상황을 보여 주기 스트리밍은 그래프가 실행되는 동안 결과를 차례로 받아 화면에 보여 주는 방식이다. 교안에서는 안내문 생성 문장과 “작성 중”, “사람 검토 대기” 같은 진행 상태를 별도 화면 영역에 표시한다. 모드 받는 데이터 주 용도 updates 각 노드가 갱신한 필드 어떤 노드가 무엇을 바꿨는지 보기 values 단계별 전체 State 현재 초안과 결정 상태 보기 messages 모델 출력 조각과 메타데이터 작성 중인 문장을 이어서 표시 custom get_stream_writer() 로 보낸 값 사용자 정의 진행 알림 표시 messages 는 생성되는 토큰을 받을 수 있어 State에 messages 필드가 없어도 쓸 수 있다. custom 진행 정보는 화면 표시용이며 State를 갱신하지 않는다. 네 가지 모드는 한 번의 stream() 실행에 함께 지정할 수 있고, display_id 와 .update() 를 사용하면 진행·State·본문을 화면의 서로 다른 자리에 갱신할 수 있다. stream() 도 그래프를 실행한다. 새 입력으로 시작하면 LLM 호출이 실제로 발생하므로, 이미 끝난 실행을 수동으로 다시 스트리밍하는 조회 기능처럼 생각하면 안 된다. 실행이 끝나거나 interrupt에서 멈춘 뒤 최종 State를 읽는 것은 이미 저장된 결과를 확인하는 일이다. v2 StreamPart와 v3 실행 객체 교안은 두 출력 방식을 비교한다. stream(..., version="v2") 는 {type, data, ns} 형태의 항목을 내보낸다. type 을 확인해 messages , updates , values , custom 등의 data 를 처리한다. stream_events(..., version="v3") 는 실행 객체를 반환한다. run.messages , run.values , run.output , run.interrupts 같은 속성으로 필요한 정보를 읽는다. v2는 각 항목의 종류를 직접 분기해 처리하고, v3는 실행 객체의 속성으로 결과를 골라 읽는 방식이다. 교안은 v3를 실험 단계 API로 다루므로, 실제 사용 시 프로젝트에서 고정한 LangGraph 버전과 해당 버전의 문서를 확인해야 한다. 정리 interrupt() 는 사람의 검토를 위해 실행을 멈추고, Command(resume=...) 은 저장된 실행에 응답을 전달한다. 재개 시 대기 노드는 처음부터 실행되므로, 앞부분에 중복 실행 위험이 있는 작업을 두지 않는다. thread_id 는 작업 기록을, interrupt ID는 응답할 현재 요청을 구분한다. stage 는 화면 표시용이다. 수정 뒤에는 다시 사람의 검토로 돌아가며, 필요하면 내용 승인과 게시 승인을 따로 둘 수 있다. updates , values , messages , custom 은 각각 노드 변경, 전체 State, 생성 문장, 사용자 정의 진행 정보를 전달한다. stream() 은 관찰만 하는 기능이 아니라 그래프를 실행한다. 참고 자료 LangGraph interrupt와 재개 LangGraph 스트리밍 LangGraph event streaming
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
# TIL 엔코아 MLE-01 day51 교안02. 이번 교안에서는 LangGraph 실행을 사람의 검토 지점에서 멈추고, 같은 작업을 재개하는 HITL 흐름과 생성 과정·진행 상태를 스트리밍으로 확인하는 방법을 정리했다. HITL로 사람의 판단을 실행 흐름에 넣기 HITL(Human-in-the-loop)은 자동 실행 중간에 사람의 판단을 받아 다음 작업을 정하는 방식이다. 서비스 점검 안내문 그래프는 초안을 만든 다음 사람이 승인·수정 요청·반려 중 하나를 선택한다. START → 초안 작성 → 사람 검토 ├─ 승인 → 안내문 확정 → END ├─ 수정 → 수정 후 재검토 └─ 반려 → END State에는 확정된 점검 정보, 현재 초안, 사람의 결정과 수정 의견, 최종 확정문을 둔다. 초안 작성과…
Open source