본문으로 건너뛰기
Kreath Archive
TechProjectsBooksAbout
TechProjectsBooksAbout

내비게이션

  • Tech
  • Projects
  • Books
  • About
  • Tags

카테고리

  • AI / ML
  • 웹 개발
  • 프로그래밍
  • 개발 도구

연결

  • GitHub
  • Email
  • RSS
© 2026 Kreath Archive. All rights reserved.Built with Next.js + MDX
홈TechProjectsBooksAbout
//
  1. 홈
  2. 테크
  3. 3장: Human-in-the-Loop 설계
2026년 3월 5일·AI / ML·

3장: Human-in-the-Loop 설계

Agentic Workflow의 핵심 안전장치인 HITL과 Human-on-the-Loop 패턴, 승인 게이트, 에스컬레이션 정책, 신뢰도 기반 라우팅, 점진적 자율성 확대 전략을 다룹니다.

17분639자9개 섹션
workflowaiautomation
공유
agentic-workflow3 / 10
12345678910
이전2장: 에이전트 기반 비즈니스 프로세스 설계다음4장: 장기 실행 워크플로우 관리

이 장에서 배울 내용

  • HITL과 Human-on-the-Loop의 차이와 적용 기준
  • 승인 게이트의 설계 패턴과 구현 방법
  • 에스컬레이션 정책과 라우팅 전략
  • 피드백 수집과 점진적 자율성 확대 방법론

HITL vs Human-on-the-Loop

**Human-in-the-Loop(HITL)**은 에이전트의 주요 결정마다 사람이 직접 승인하는 패턴입니다. 반면 **Human-on-the-Loop(HOTL)**은 사람이 감독자 역할을 하면서 에이전트가 자율적으로 실행하되, 특정 조건에서만 개입하는 패턴입니다.

2026년 현재 대부분의 엔터프라이즈 환경에서 HOTL 패턴이 주류로 자리잡고 있습니다. 모든 결정에 사람이 개입하는 것은 비효율적이므로, 에이전트의 신뢰도와 결정의 영향도에 따라 자동 승인과 수동 승인을 구분하는 것이 합리적입니다.

패턴 선택 기준

기준HITL 적합HOTL 적합
결정 영향도높음 (재무적/법적 영향)중/낮음 (복구 가능)
에이전트 성숙도초기 단계검증 완료
규제 요구사항사람 승인 필수감독으로 충분
처리 속도 요구지연 허용실시간 처리 필요

승인 게이트 설계

**승인 게이트(Approval Gate)**는 워크플로우의 특정 지점에서 사람의 판단을 요구하는 체크포인트입니다. 모든 단계에 게이트를 두면 병목이 되고, 너무 적으면 위험이 커집니다.

게이트 배치 원칙

  1. 비가역적 행동 이전: 이메일 발송, 결제 실행, 데이터 삭제 등 되돌릴 수 없는 행동 직전에 배치합니다
  2. 임계값 초과 시: 금액, 영향 범위, 권한 수준이 사전 설정된 임계값을 초과할 때 활성화합니다
  3. 신뢰도 미달 시: 에이전트의 결정 신뢰도가 기준치 이하일 때 사람에게 전달합니다
approval_gate.py
python
from dataclasses import dataclass
from enum import Enum
 
class GateType(Enum):
    MANDATORY = "mandatory"      # 항상 승인 필요
    CONDITIONAL = "conditional"  # 조건 충족 시 승인 필요
    ADVISORY = "advisory"        # 알림만, 승인 불필요
 
@dataclass
class ApprovalGate:
    name: str
    gate_type: GateType
    condition: str | None  # 조건부 게이트의 활성화 조건
    timeout_hours: float
    escalation_on_timeout: str  # 타임아웃 시 에스컬레이션 대상
    approvers: list[str]  # 승인 가능한 역할/사용자 목록
 
# 고객 환불 워크플로우의 승인 게이트 예시
refund_gates = [
    ApprovalGate(
        name="small_refund",
        gate_type=GateType.CONDITIONAL,
        condition="amount > 50000",  # 5만원 초과 시
        timeout_hours=4,
        escalation_on_timeout="team_lead",
        approvers=["cs_agent", "cs_lead"],
    ),
    ApprovalGate(
        name="large_refund",
        gate_type=GateType.MANDATORY,
        condition="amount > 500000",  # 50만원 초과 시 항상
        timeout_hours=2,
        escalation_on_timeout="finance_manager",
        approvers=["finance_manager", "cs_director"],
    ),
]

LangGraph에서의 승인 게이트 구현

LangGraph의 interrupt 기능을 활용하면 워크플로우를 특정 지점에서 일시 정지하고, 외부 입력을 대기할 수 있습니다.

langgraph_approval.py
python
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.postgres import PostgresSaver
 
class SupportState(TypedDict):
    inquiry: str
    proposed_action: str | None
    approval_status: str | None  # pending, approved, rejected
    confidence: float
 
def propose_action(state: SupportState) -> SupportState:
    """에이전트가 행동을 제안"""
    action = resolver_agent.propose(state["inquiry"])
    return {
        **state,
        "proposed_action": action.text,
        "confidence": action.confidence,
    }
 
def check_approval_needed(state: SupportState) -> str:
    """승인 필요 여부를 판단하는 라우터"""
    if state["confidence"] >= 0.95:
        return "auto_approve"
    if state["confidence"] >= 0.80:
        return "advisory_review"
    return "mandatory_approval"
 
def wait_for_approval(state: SupportState) -> SupportState:
    """사람의 승인을 대기 (interrupt 지점)"""
    # LangGraph의 interrupt 메커니즘이 여기서 워크플로우를 일시 정지
    # 외부 시스템(UI, Slack 등)에서 승인 입력을 받은 후 재개
    return state
 
graph = StateGraph(SupportState)
graph.add_node("propose", propose_action)
graph.add_node("wait_approval", wait_for_approval)
graph.add_node("execute", execute_action)
graph.add_node("auto_execute", execute_action)
 
graph.add_conditional_edges("propose", check_approval_needed, {
    "auto_approve": "auto_execute",
    "advisory_review": "auto_execute",  # 알림만 발송
    "mandatory_approval": "wait_approval",
})
graph.add_edge("wait_approval", "execute")
graph.add_edge("auto_execute", END)
graph.add_edge("execute", END)
 
# PostgreSQL 기반 체크포인트로 상태 영속화
checkpointer = PostgresSaver.from_conn_string(DATABASE_URL)
workflow = graph.compile(checkpointer=checkpointer)
Info

체크포인터를 사용하면 승인 대기 중에도 워크플로우 상태가 안전하게 저장됩니다. 서버가 재시작되더라도 사용자가 승인하면 정확히 중단된 지점부터 재개됩니다.

에스컬레이션 정책

에이전트가 스스로 해결할 수 없는 상황에서 적절한 사람에게 적절한 정보를 전달하는 에스컬레이션(Escalation) 정책을 설계해야 합니다.

에스컬레이션 트리거

에스컬레이션을 발동하는 조건은 크게 4가지로 분류됩니다.

  1. 신뢰도 부족: 에이전트의 결정 신뢰도가 임계값 이하
  2. 반복 실패: 동일 태스크가 재시도 횟수를 초과하여 실패
  3. 권한 부족: 에이전트의 허용된 도구나 권한으로 처리 불가
  4. 타임아웃: 지정된 시간 내에 완료되지 않음
escalation_policy.py
python
@dataclass
class EscalationPolicy:
    triggers: list[EscalationTrigger]
    levels: list[EscalationLevel]
    notification_channels: list[str]
 
@dataclass
class EscalationLevel:
    level: int
    target: str  # 역할 또는 그룹
    sla_minutes: int  # 응답 SLA
    context_to_include: list[str]  # 포함할 컨텍스트
    auto_escalate_on_sla_breach: bool
 
support_escalation = EscalationPolicy(
    triggers=[
        EscalationTrigger(type="confidence_below", threshold=0.6),
        EscalationTrigger(type="retry_exceeded", max_retries=3),
        EscalationTrigger(type="timeout", minutes=30),
    ],
    levels=[
        EscalationLevel(
            level=1,
            target="senior_agent",
            sla_minutes=15,
            context_to_include=["inquiry", "agent_reasoning", "attempted_actions"],
            auto_escalate_on_sla_breach=True,
        ),
        EscalationLevel(
            level=2,
            target="team_lead",
            sla_minutes=30,
            context_to_include=["full_conversation", "system_logs"],
            auto_escalate_on_sla_breach=True,
        ),
        EscalationLevel(
            level=3,
            target="department_head",
            sla_minutes=60,
            context_to_include=["full_audit_trail"],
            auto_escalate_on_sla_breach=False,
        ),
    ],
    notification_channels=["slack", "email", "pagerduty"],
)

컨텍스트 전달의 중요성

에스컬레이션 시 담당자에게 전달하는 컨텍스트의 품질이 해결 속도를 좌우합니다. 단순히 "에이전트가 실패했습니다"라는 알림만으로는 부족합니다.

효과적인 에스컬레이션 컨텍스트에는 다음이 포함되어야 합니다.

  • 원래 요청 내용과 고객 정보
  • 에이전트가 수행한 분석과 판단 근거
  • 시도한 해결 방법과 실패 이유
  • 에이전트가 제안하는 해결 방향 (확신이 부족한 이유 포함)

신뢰도 기반 라우팅

에이전트의 출력에 **신뢰도 점수(Confidence Score)**를 부여하고, 이를 기반으로 자동 처리와 사람 개입을 동적으로 결정합니다.

신뢰도 산출 방법

신뢰도 점수는 여러 신호를 종합하여 산출합니다.

confidence_scoring.py
python
@dataclass
class ConfidenceSignals:
    llm_self_assessment: float  # LLM 자체 신뢰도 평가
    retrieval_relevance: float  # 참조 문서의 관련성
    historical_accuracy: float  # 유사 케이스의 과거 정확도
    input_clarity: float        # 입력 데이터의 명확성
 
def calculate_confidence(signals: ConfidenceSignals) -> float:
    """가중 평균으로 종합 신뢰도 산출"""
    weights = {
        "llm_self_assessment": 0.25,
        "retrieval_relevance": 0.30,
        "historical_accuracy": 0.30,
        "input_clarity": 0.15,
    }
 
    score = sum(
        getattr(signals, key) * weight
        for key, weight in weights.items()
    )
 
    return round(min(max(score, 0.0), 1.0), 3)
Warning

LLM의 자체 신뢰도 평가(self-assessment)만 의존하는 것은 위험합니다. LLM은 잘못된 답변에도 높은 확신을 보일 수 있기 때문입니다. 반드시 참조 문서 관련성, 과거 정확도 등 외부 신호를 함께 사용해야 합니다.

임계값 보정

신뢰도 임계값은 고정값이 아니라 운영 데이터를 기반으로 지속적으로 보정해야 합니다. 자동 승인된 결정 중 사후 리뷰에서 문제가 발견된 비율, 에스컬레이션된 케이스 중 에이전트가 올바르게 판단했던 비율 등을 모니터링하여 임계값을 조정합니다.

리뷰 UI 설계

사람이 효율적으로 리뷰할 수 있는 인터페이스를 설계하는 것도 HITL 시스템의 중요한 부분입니다. 리뷰어가 빠르게 맥락을 파악하고 정확한 판단을 내릴 수 있어야 합니다.

리뷰 화면의 핵심 요소

  1. 요약 패널: 요청 내용, 에이전트의 제안, 신뢰도 점수를 한눈에 표시
  2. 추론 과정: 에이전트가 어떤 정보를 참고하여 어떤 판단을 내렸는지 단계별 표시
  3. 유사 사례: 과거에 유사한 요청을 처리한 이력과 결과
  4. 행동 버튼: 승인, 수정 후 승인, 반려, 에스컬레이션 등 원클릭 액션

피드백 수집과 점진적 자율성 확대

HITL 시스템의 궁극적 목표는 시간이 지남에 따라 사람의 개입을 줄이는 것입니다. 이를 위해서는 체계적인 피드백 수집과 자율성 확대 전략이 필요합니다.

피드백 루프

점진적 자율성 확대 전략

자율성을 안전하게 확대하기 위한 단계적 접근법을 사용합니다.

  1. Shadow Mode(그림자 모드): 에이전트가 결정을 내리지만 실행하지 않고, 사람의 결정과 비교합니다. 이 단계에서 에이전트의 정확도를 측정합니다.

  2. Supervised Mode(감독 모드): 에이전트가 실행하되, 모든 결정을 사람이 사후 리뷰합니다. 문제 발견 시 즉시 수동으로 전환합니다.

  3. Confidence-Gated Mode(신뢰도 게이트 모드): 신뢰도 기준에 따라 자동/수동을 구분합니다. 자동 처리 비율을 점진적으로 높여갑니다.

  4. Autonomous Mode(자율 모드): 대부분의 결정을 자동으로 처리하고, 예외 상황에서만 사람이 개입합니다. 정기적인 샘플 리뷰로 품질을 유지합니다.

autonomy_progression.py
python
@dataclass
class AutonomyConfig:
    mode: str  # shadow, supervised, confidence_gated, autonomous
    auto_approve_threshold: float
    sample_review_rate: float  # 자율 모드에서의 샘플 리뷰 비율
    rollback_trigger: RollbackCondition
 
def evaluate_progression(metrics: PerformanceMetrics) -> AutonomyConfig:
    """성과 지표 기반 자율성 단계 평가"""
    if metrics.accuracy < 0.90:
        return AutonomyConfig(
            mode="supervised",
            auto_approve_threshold=1.0,  # 모든 결정에 리뷰
            sample_review_rate=1.0,
            rollback_trigger=RollbackCondition(error_rate=0.15),
        )
 
    if metrics.accuracy < 0.95:
        return AutonomyConfig(
            mode="confidence_gated",
            auto_approve_threshold=0.90,
            sample_review_rate=0.20,
            rollback_trigger=RollbackCondition(error_rate=0.10),
        )
 
    return AutonomyConfig(
        mode="autonomous",
        auto_approve_threshold=0.70,
        sample_review_rate=0.05,  # 5% 샘플 리뷰
        rollback_trigger=RollbackCondition(error_rate=0.05),
    )
Tip

자율성 확대 시 반드시 롤백 조건을 함께 정의해야 합니다. 에러율이 특정 기준을 초과하면 자동으로 이전 단계로 돌아가는 안전장치를 마련해 두는 것이 중요합니다.


정리

이 장에서는 Agentic Workflow의 안전장치인 Human-in-the-Loop 설계를 살펴보았습니다.

  • HITL은 매 결정마다 승인을 받고, HOTL은 감독자 모드로 예외 시에만 개입합니다
  • 승인 게이트는 비가역적 행동, 임계값 초과, 신뢰도 미달 지점에 배치합니다
  • 에스컬레이션 시 충분한 컨텍스트를 함께 전달해야 해결 속도가 높아집니다
  • 신뢰도 점수는 LLM 자체 평가뿐 아니라 외부 신호를 종합하여 산출합니다
  • Shadow - Supervised - Confidence-Gated - Autonomous 순서로 자율성을 점진적으로 확대합니다

다음 장 예고

4장에서는 시간 단위, 일 단위로 실행되는 **장기 실행 워크플로우(Long-Running Workflow)**의 관리 방법을 다룹니다. 듀러블 실행, 일시 정지/재개, 상태 직렬화, 타임아웃 관리 등 실무에서 반드시 필요한 기술을 살펴보겠습니다.

이 글이 도움이 되셨나요?

관련 주제 더 보기

#workflow#ai#automation

관련 글

AI / ML

4장: 장기 실행 워크플로우 관리

시간/일 단위 워크플로우의 듀러블 실행, 체크포인팅, 일시 정지와 재개, 상태 직렬화, 타임아웃 관리, 분산 실행 전략을 정리합니다.

2026년 3월 7일·16분
AI / ML

2장: 에이전트 기반 비즈니스 프로세스 설계

Agentic Workflow를 위한 프로세스 분석, 태스크 분해, 에이전트 역할 정의, 워크플로우 DAG 설계 방법론을 체계적으로 정리합니다.

2026년 3월 3일·16분
AI / ML

5장: 에러 복구와 재시도 전략

Agentic Workflow의 에러 분류 체계, 지수 백오프, 서킷 브레이커, 모델 폴백, Saga 패턴 기반 보상 트랜잭션, 데드레터 큐 등 복원력 패턴을 다룹니다.

2026년 3월 9일·17분
이전 글2장: 에이전트 기반 비즈니스 프로세스 설계
다음 글4장: 장기 실행 워크플로우 관리

댓글

목차

약 17분 남음
  • 이 장에서 배울 내용
  • HITL vs Human-on-the-Loop
    • 패턴 선택 기준
  • 승인 게이트 설계
    • 게이트 배치 원칙
    • LangGraph에서의 승인 게이트 구현
  • 에스컬레이션 정책
    • 에스컬레이션 트리거
    • 컨텍스트 전달의 중요성
  • 신뢰도 기반 라우팅
    • 신뢰도 산출 방법
    • 임계값 보정
  • 리뷰 UI 설계
    • 리뷰 화면의 핵심 요소
  • 피드백 수집과 점진적 자율성 확대
    • 피드백 루프
    • 점진적 자율성 확대 전략
  • 정리
  • 다음 장 예고