TL;DR — 넘어져도 다시 일어서는 에이전트도 결국 되돌릴 수 없는 결정 앞에서는 멈춰야 합니다. 계정 삭제, 고액 송금, 기밀 문서 공개 — AI가 단독으로 처리하면 사고가 됩니다. 휴먼 인 더 루프(Human-in-the-Loop)는 AI 워크플로우에 인간의 판단·검증·개입을 전략적으로 끼워 넣는 패턴입니다. 핵심은 위험도로 자동/수동을 가르는 에스컬레이션과, 실행 도중 멈췄다 사람이 결정하면 그 지점부터 재개하는 LangGraph의 interrupt() → 인간 결정 → Command(resume=…) 입니다. 모든 걸 사람이 보는 게 아니라 위험한 30%만 사람에게 — 그게 설계입니다.
1. 왜 휴먼 인 더 루프인가 — 넘어져도 일어서는 AI의 마지막 안전장치
지난 편에서 에이전트는 장애를 만나도 재시도·폴백·복구로 죽지 않는 복원력을 얻었습니다. 그 다단계 방어의 맨 끝에 무엇이 있었는지 기억하시나요? 폴백 체인의 최후 단계는 늘 사람(Escalation)이었습니다. 자동 복구가 모두 실패하는 그 지점, AI가 스스로 결정해서는 안 되는 그 순간을 설계하는 것이 이번 편의 주제입니다.
교재가 던지는 핵심 난제는 한 문장입니다 — "언제 AI가 스스로 결정하고, 언제 인간에게 물어봐야 하는가?" 고객이 "계정 해지할게요"라고 했을 때, 안전장치 없는 챗봇은 "해지 완료되었습니다" → 고객 후회 → 클레임으로 끝납니다. 휴먼 인 더 루프가 있으면 위험 감지 → 담당자 승인 요청 → 리텐션 오퍼 → 고객 유지로 이어지죠. 휴먼 인 더 루프(Human-in-the-Loop, HITL) 패턴은 에이전트의 자율성에 인간 통제권이라는 핸들을 다는 일입니다.
2025년 기업들이 이 패턴에 주목하는 이유는 네 가지입니다. 규제 준수(EU AI Act 등이 고위험 AI의 의사결정에 인간 감독을 요구), 신뢰 구축("AI가 알아서 했습니다"보다 "전문가가 검토했습니다"를 고객이 신뢰), 리스크 관리(환각으로 인한 법적·재정적 손실 방지), 품질 향상(인간 피드백으로 AI를 지속 개선, RLHF) — 자율성과 통제권을 동시에 요구하기 때문이죠.
2. 개념과 오해 — HITL은 AI의 실패가 아니라 설계된 협업이다
📌 한 줄 정의 — 휴먼 인 더 루프는 AI 워크플로우에 인간의 판단·검증·개입을 전략적으로 통합하는 설계 패턴입니다. 본질은 "AI와 인간이 각자의 강점을 발휘하되, 중요한 결정의 최종 통제권은 인간이 보유하는 것"이며, 네 가지 원칙 — 보완적 협력 · 통제권 유지 · 지속적 개선 · 투명성 — 위에 섭니다.
주니어가 이 패턴에서 가장 많이 빠지는 오해 세 가지를 먼저 짚습니다. 셋 다 "HITL은 어쩔 수 없이 끼워 넣는 군더더기"라는 잘못된 전제에서 나옵니다.
두 가지 비유가 이 패턴을 직관적으로 잡아줍니다. 첫째, 응급실 트리아지(Triage) 시스템입니다. 간호사(AI)가 들어온 환자를 초기 분류해 경미한 증상은 직접 처리하고, 중증 환자는 전문의(Human)에게 넘기며, 생명이 위급하면 즉시 인간이 개입합니다. 둘째, 항공기 자동조종장치입니다. 순항 비행은 자동조종(AI)이 담당하다가, 이상 기상이나 비상 상황에서는 조종사(Human)가 통제권을 인수하죠. "Autopilot Disconnect" 버튼이 바로 인간 개입 트리거 — HITL의 interrupt()에 해당합니다. 위험도에 따라 통제권이 AI와 인간 사이를 오간다는 점이 핵심입니다.
3. HITL의 6가지 핵심 측면 — 협업은 한 가지 모습이 아니다
"인간 개입"이라고 뭉뚱그리면 설계가 막힙니다. 교재는 HITL을 여섯 가지 측면으로 나눕니다. 각각 다른 시점·다른 방식의 협업이고, 실제 시스템은 이들을 조합해 씁니다.
이 가운데 ⑥ 에스컬레이션 정책이 나머지를 작동시키는 스위치입니다. "언제 사람을 부를까?"를 정해야 감독·개입·증강이 발동하니까요. 그래서 다음 절에서 에스컬레이션을 독립적으로 깊게 봅니다.
4. 에스컬레이션 4레벨 — 위험도가 통제권을 정한다
HITL의 심장은 "이 요청을 누가 결정할 것인가?"를 가르는 에스컬레이션입니다. 교재는 위험도를 네 단계로 나눕니다. 위험이 낮을수록 AI가, 높을수록 인간이 통제권을 쥡니다 — 신호등처럼 초록에서 빨강으로 갈수록 인간 개입이 강해진다고 보면 됩니다.
FAQ·배송 조회
처리하되 로깅
환불·계정 변경
감정 고객·보안
그렇다면 레벨은 무엇으로 정할까요? 학습 코드의 EscalationPolicy.evaluate()는 네 가지 신호를 우선순위 순서대로 검사합니다. 순서가 중요합니다 — 감정이 키워드보다 먼저입니다. "화가 납니다. 환불해주세요"는 환불 키워드(REQUIRED)가 아니라 감정(CRITICAL)으로 분류되어 즉시 상담원에게 연결되죠.
$1,000 → REQUIRED (승인 필수)0.8 → REVIEW (검토 권장)이 다단계·우선순위 판단이 HITL 설계의 출발점입니다. 임계값(confidence_threshold=0.8, amount_threshold=1000)을 비즈니스에 맞춰 조정하면, 같은 코드로 보수적/공격적 정책을 자유롭게 오갈 수 있죠. 이제 이걸 실제 구현으로 옮겨봅니다.
5. 구현 ① Gemini API — 정책·에스컬레이션·의사결정 증강
프레임워크 없이 Gemini API만으로 패턴의 뼈대를 봅니다. 설계 철학은 정책의 투명성(에스컬레이션 기준을 코드 밖 설정으로), 의존성 주입(정책·검토 인터페이스를 외부에서 교체), 학습 가능성(인간이 수정한 케이스를 피드백 히스토리로 축적)입니다. 먼저 레벨과 정책을 @dataclass로 못 박습니다.
검토 채널은 추상 클래스로 분리합니다. HumanReviewInterface를 상속해 콘솔·Slack·웹 UI·이메일·자동 승인을 갈아끼우는 Strategy 패턴이죠. HITLAgent는 REQUIRED/CRITICAL일 때만 검토를 요청하고, 인간 결정을 피드백 히스토리에 쌓아 나중의 모델 개선에 씁니다.
한 가지 더 짚을 패턴이 Decision Augmentation(의사결정 증강)입니다. 일반 HITL이 "AI 응답 → 인간이 승인/거부/수정"이라면, 증강은 한 발 더 물러섭니다 — AI는 분석·추천만 내놓고, 결정 자체를 인간이 합니다. DecisionAugmentationAgent.analyze_and_recommend()는 강점·약점·위험을 정리하고 "승인/거부/보류" 추천과 신뢰도를 돌려줄 뿐, 대출 승인 버튼은 심사관이 누릅니다.
기본기는 이걸로 충분합니다. 다만 이 구조에는 빈틈이 있습니다 — request_review()가 동기적으로 블로킹한다는 점이죠. 사람이 결정할 때까지 프로세스가 기다려야 하고, 그 사이 서버가 죽으면 진행 중이던 상태가 날아갑니다. "사람이 1초 만에 누를 수도, 하루 뒤에 누를 수도 있는" 승인을 어떻게 견딜까요? 여기서 LangGraph가 등장합니다.
6. 구현 ② LangGraph — 그래프를 멈췄다 다시 잇는 HITL
최신 LangGraph(LangChain 팀, 2025년 기준 권장)는 인간 승인을 그래프의 일시 중지로 다룹니다. 폴링으로 입력을 기다리는 대신 interrupt()로 그래프 자체가 멈추고, 상태는 Checkpointer가 보관하며, thread_id로 언제든 복원되죠. 먼저 위험도를 평가하는 노드를 봅니다 — 5절의 우선순위 판단과 같은 골격입니다.
에러를 State에 새기던 지난 편처럼, 여기서는 승인 상태를 State에 담습니다. status는 analyzing → pending_approval → approved/rejected → completed로 전이하고, 핵심 승인 노드가 interrupt()를 호출합니다.
노드들은 조건부 엣지로 엮입니다. 분석 후 승인이 필요하면 human_approval로, 아니면 auto_execute로 갈라지고, 승인 후에는 결정에 따라 execute 또는 rejection으로 나뉩니다 — "승인 분기"가 if문이 아니라 그래프로 선언됩니다.
5절의 블로킹 request_review()가 중단 가능한 노드로, if 분기가 조건부 엣지로 바뀌었습니다. 그 대가로 따라오는 interrupt·Command·Checkpointer 3종이 이 패턴의 진짜 핵심이라, 다음 절에서 따로 깊게 봅니다.
7. interrupt · Command · Checkpointer — 멈춤과 재개의 3종 세트
LangGraph HITL은 세 부품으로 작동합니다. interrupt()가 그래프를 멈추고, Checkpointer가 그 순간의 상태를 보관하며, Command(resume=…)가 인간 결정을 들고 정확히 그 지점부터 재개합니다. 항공기 비유의 "Autopilot Disconnect → 조종사 조작 → 자동조종 복귀"가 코드로 옮겨진 셈이죠.
analyze 노드 실행
상태 저장 → 반환
(분/시간/일 무관)
interrupt 지점부터 재개
실행기는 두 메서드로 단순해집니다. start_workflow()가 시작하면 interrupt에서 멈춰 __interrupt__를 돌려주고, 인간 결정이 도착하면 resume_workflow()가 Command(resume=…)로 재개합니다.
여기서 thread_id가 결정적입니다. 스레드별로 독립된 상태가 Checkpointer에 보관되므로, 수백 명의 승인 대기를 동시에 관리해도 서로 간섭하지 않죠. 사용자 A가 승인을 미뤄도 사용자 B의 워크플로우는 멀쩡합니다. 그리고 이 비동기 구조 덕분에 실무에서는 타임아웃 처리(24시간 초과 시 자동 에스컬레이션 또는 거부)와 Slack 버튼 콜백(버튼 클릭 → resume_workflow() 호출)을 자연스럽게 얹을 수 있습니다.
compile(checkpointer=...)입니다.8. in-the-Loop vs on-the-Loop — 매 결정이냐, 정책이냐
HITL에는 형제 패턴이 있습니다. Human-on-the-Loop(HOTL)입니다. 둘의 차이는 "인간이 언제·무엇에 개입하느냐"입니다. in-the-Loop은 개별 결정마다 끼어들고, on-the-Loop은 정책을 정해두고 AI가 그 안에서 자율 실행하게 둡니다.
교재의 예가 직관적입니다. 자동 트레이딩에서 인간 전문가는 "Tech 70%·Bond 30%, 단일 종목 최대 5%, 손절선 -10%, 일일 한도 $100,000" 같은 정책만 설정합니다. AI 봇은 그 범위 안에서 실시간으로 자율 매매하고, 손절선·한도에 닿으면 스스로 멈추며, 인간은 정기 리뷰에서 정책을 조정할 뿐이죠. 매 거래를 승인받지 않습니다 — 대규모 자동화에는 on-the-Loop이 맞습니다.
9. 두 구현 비교와 한계 — 어디서 막히고, 무엇을 조심할까
Gemini 기본 구현과 LangGraph는 같은 HITL 패턴을 다른 추상화로 담습니다. 단발성 승인이면 Gemini가 빠르고, 비동기 승인·재시작·다중 세션이 필요하면 LangGraph가 유리합니다.
| 측면 | ① Gemini API 기본 | ② LangGraph |
|---|---|---|
| 승인 방식 | 동기 블로킹(request_review) |
비동기 중단(interrupt()) |
| 상태 보존 | 메모리(휘발) | Checkpointer(영속) |
| 재개 | 불가(처음부터) | Command(resume=…) |
| 분기 | if-else | Conditional Edge |
| 다중 세션 | 수동 관리 | thread_id 격리 |
| 검토 채널 | 인터페이스 추상화(Strategy) | resume 콜백(Slack·웹) |
| 학습 곡선 | 낮음 | 중간 |
어떤 구현을 쓰든 HITL에는 네 가지 함정이 따라옵니다. 가장 흔한 게 인간 병목이죠 — 모든 요청에 승인을 걸면 시스템이 사람 속도로 느려집니다. 해법은 처음부터 분명합니다.
나머지 셋도 함께 챙겨야 합니다. 전문성 의존(검토자 역량이 HITL 효과를 좌우 → 교육·가이드라인·다중 검토), 프라이버시(인간 검토 시 민감 정보 노출 → 데이터 익명화·접근 권한 제한·감사 로그), 일관성(사람마다 판단 기준이 다름 → 명확한 가이드라인·캘리브레이션 세션). 이 한계들을 정면으로 다루는 게 엔터프라이즈 설계의 절반입니다.
10. 엔터프라이즈 — CRM·ERP·Groupware의 승인 게이트
레거시 시스템의 공통 고통점은 "AI가 되돌릴 수 없는 결정을 단독으로 내린다"입니다. CRM은 민감 요청(해지·환불)을 AI가 단독 처리해 분쟁, ERP는 대금 지급을 자동 승인해 감사 지적, Groupware는 문서 공개 범위를 오판해 정보 유출 — HITL은 이를 위험도 기반 승인 게이트로 막습니다.
| 시스템 | 핵심 적용 | 기대효과(목표치) |
|---|---|---|
| CRM 고객 민감 요청 |
해지·환불 위험도 평가 + 담당자 승인(리텐션 오퍼) | 이탈 방지 5%→35% · NPS 45→72 · 클레임 80%↓ |
| ERP 대금 지급 |
Tiered Approval(금액·이상 탐지로 4단계 라우팅) | 처리 3일→0.5일 · 사기 차단 95% · 자동 처리 70% |
| Groupware 문서 분류·공개 |
AI 분류 추천 + 불일치 시 보안팀 확인 게이트 | 유출 99% 차단 · 분류 정확도 98% · 위반 95%↓ |
ERP의 Tiered Approval이 9절의 "위험도 기반 분리"를 그대로 구현한 예입니다. $1,000 미만+기존 업체는 자동 승인, ~$10,000은 담당자 1-click, $10,000 이상·이상 탐지는 재무팀장 결재, $100,000 이상은 CFO 직접 검토 — 4티어가 곧 4레벨 에스컬레이션이죠.
권장 기술 스택은 LangGraph(HITL 워크플로우), MemorySaver/PostgreSQL·Redis(상태 영속화), Gemini(분석·추천), React+Slack Bot(승인 UI), Immutable Log(감사)입니다. 핵심 성공 요인은 위험도 기준의 비즈니스 합의, 검토자 가용성(대리자·에스컬레이션 체계), 신뢰할 만한 AI 추천 품질, 1-click·모바일 승인 UX, 그리고 모든 결정의 Who/When/Why 감사 추적 — 목표는 자동 70% + 인간 30%의 균형으로 오류율 90% 감소·처리 시간 60% 단축입니다.
11. 케이스 스터디 — VIP 고객의 "해지하고 싶어요"
3년 이용·월 $200 결제 VIP 고객이 "계정 해지하고 싶어요"라고 보냈습니다. 무방비 챗봇이라면 "해지 완료" 한 줄로 연 $2,400 매출을 날렸겠죠. HITL이 어떻게 한 흐름으로 이를 막는지 따라가 봅니다.
requires_approval=True → REQUIRED 레벨로 에스컬레이션Command(resume={"approved": True, ...})로 재개고객은 일방적 해지 대신 맞춤 제안을 받았고, AI는 단독으로 결정하지 않았으며, 모든 판단이 추적 가능하게 남았습니다. "AI가 알아서 한 것"이 아니라 "전문가가 AI 분석을 보고 결정한 것" — 이것이 신뢰와 책임을 동시에 잡는 HITL의 목표입니다.
12. 베스트 프랙티스 — 언제 사람을 부를까
HITL은 "사람을 많이 끼울수록 안전한 것"이 아닙니다. 되돌릴 수 없는 결정엔 반드시 사람을, 안전한 다수엔 자동화를 거는 균형이 핵심입니다. 모든 걸 검토하면 병목이고, 아무것도 검토 안 하면 사고죠. 관련 패턴으로는 최후 안전망인 12. 예외 처리·복구의 에스컬레이션과, AI가 스스로 점검하는 4. 리플렉션을 함께 보면 좋습니다.
순서대로 쪼개고(체이닝), 갈래를 나누고(라우팅), 병렬로 돌리고(병렬화), 스스로 비평하고(리플렉션), 도구를 쥐고(도구 사용), 계획하고(플래닝), 팀을 이루고(멀티 에이전트), 기억하고(메모리), 배우고(학습), 표준으로 연결되고(MCP), 스스로 채점하고(목표 설정), 넘어져도 일어서던(예외 처리) 에이전트 — 이번엔 멈춰야 할 순간 사람을 부르는 법(휴먼 인 더 루프)을 배웠습니다. 자율성의 끝에는 늘 인간의 판단이 안전장치로 서 있죠. 다음 편은 RAG(검색 증강 생성): 에이전트가 환각 대신 근거로 말하게 하는, 외부 지식을 끌어오는 법입니다.
- LangGraph 공식 문서 — Human-in-the-Loop (interrupt · Command · Checkpointer)
- LangGraph Persistence — Checkpointer와 thread_id 상태 관리
- Google Gemini API 문서 — 모델 호출·구조화 출력
'Agentic AI Design Patterns' 카테고리의 다른 글
| CH15-내 에이전트가 남의 에이전트와 일하게 하라 — 에이전트의 명함, A2A 프로토콜 (0) | 2026.06.11 |
|---|---|
| CH14-환각 대신 근거로 말하게 하라 — AI 에이전트 검색 증강 생성(RAG) 설계 (0) | 2026.06.10 |
| CH12-넘어져도 다시 일어서는 AI — 예외 처리와 복구(Exception Handling & Recovery) (1) | 2026.06.09 |
| CH11-스스로 채점하는 AI — 목표 설정과 모니터링(Goal Setting & Monitoring) 완벽 정리 (0) | 2026.06.07 |
| CH10-MCP는 '또 다른 API'가 아니다 — 표준 프로토콜로 모든 LLM에 외부 시스템을 연결하는 법 (1) | 2026.06.07 |