사람 참여형 에스컬레이션
확신도가 낮거나, 파괴적인 작업이 곧 실행되려 하거나, 재시도 예산을 모두 사용했을 때 에이전트를 일시 중지하고 사람의 안내를 요청하도록 에스컬레이션 조건을 정의합니다.
사람 참여형 에스컬레이션은(는) CoddyKit의 무료 AI Engineering Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Engineering Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
에이전트에 사람의 안내가 필요한 경우
완전히 자율적인 에이전트는 명확하게 정의된 위험이 낮은 작업에 적합합니다. 그러나 모호한 지시, 낮은 모델 확신도, 되돌릴 수 없는 파괴적 작업, 실패 시 심각한 결과가 발생하는 작업과 같이 사람의 판단이 필요한 상황도 있습니다. 사람 개입형(HITL) 에스컬레이션은 이러한 의사 결정 지점에서 에이전트를 일시 중지하고 진행 전에 사람의 입력을 요청하여 자동화의 효율성과 사람의 판단을 결합합니다.
에스컬레이션 트리거 정의
에스컬레이션은 막연한 직감이 아니라 구체적이고 측정 가능한 조건에 의해 트리거되어야 합니다. 애플리케이션에 명시적인 에스컬레이션 트리거를 정의하십시오. 일반적인 트리거로는 임계값 미만의 모델 확신도, 곧 수행될 파괴적 작업, 접근 중인 정책 경계, 소진된 재시도 예산, 시간 제한 초과가 있습니다. 제어 흐름 로직을 변경하지 않고 조정할 수 있도록 트리거를 이름이 지정된 상수로 코드에 문서화하십시오.
from enum import Enum
class EscalationReason(Enum):
LOW_CONFIDENCE = 'low_confidence' # model uncertainty
DESTRUCTIVE_ACTION = 'destructive_action' # irreversible change
AMBIGUOUS_TASK = 'ambiguous_task' # unclear instructions
RETRY_BUDGET_EXHAUSTED = 'retry_exhausted' # too many failures
POLICY_BOUNDARY = 'policy_boundary' # approaching limit
HUMAN_REQUESTED = 'human_requested' # explicit request
TIMEOUT = 'timeout' # took too long
ESCALATION_THRESHOLDS = {
'min_confidence': 0.6,
'max_retries': 5,
'max_runtime_minutes': 30,
}낮은 확신도 감지
모델에 제안된 작업을 실행하기 전에 자신의 확신도를 표현하도록 요청하십시오. 확신도 점수가 설정한 임계값보다 낮으면 에스컬레이션을 트리거합니다. 수치 점수와 간단한 근거를 모두 포함하는 구조화된 확신도 확인을 사용하여 사람 검토자가 에이전트가 왜 확신하지 못했는지 정확히 이해하도록 하십시오. 근거가 있으면 사람이 전체 작업 기록을 검토하지 않고도 구체적인 안내를 제공할 수 있습니다.
from pydantic import BaseModel
class ConfidenceCheck(BaseModel):
proposed_action: str
confidence: float # 0.0 to 1.0
uncertainty_reason: str | None
proceed: bool
async def check_confidence(context: str, proposed_action: str) -> ConfidenceCheck:
return await judge_client.chat.completions.create(
model='gpt-4o',
response_model=ConfidenceCheck,
messages=[{
'role': 'user',
'content': f'Context: {context}\n\nI am about to: {proposed_action}\n\nHow confident am I that this is correct? Be honest about uncertainty.'
}]
)파괴적 작업 감지
되돌릴 수 없는 작업을 수행하는 도구에 destructive=True 플래그를 지정하고 실행 전에 사람의 확인을 요구하십시오. 예를 들면 파일 삭제, 실제 사용자에게 이메일 전송, 되돌릴 수 없는 데이터베이스 변경, 고객에게 요금 청구, 콘텐츠 공개 게시가 있습니다. 에이전트는 다른 작업을 자율적으로 수행하고 있더라도 이러한 작업에서 일시 중지하고 사람의 명시적인 승인을 기다려야 합니다.
from dataclasses import dataclass
from typing import Callable
@dataclass
class Tool:
name: str
func: Callable
destructive: bool = False
description: str = ''
tools = [
Tool('search_web', search_web, destructive=False),
Tool('read_file', read_file, destructive=False),
Tool('write_file', write_file, destructive=True, description='Overwrites existing file'),
Tool('send_email', send_email, destructive=True, description='Sends real email to user'),
Tool('delete_records', delete_records, destructive=True, description='Permanent DB deletion'),
]
def requires_approval(tool: Tool) -> bool:
return tool.destructive에이전트 일시 중지 및 입력 대기
에스컬레이션 트리거가 발생하면 체크포인트를 저장하여 작업을 재개할 수 있게 하고, 에스컬레이션 요청 기록을 생성한 다음 사람 검토자에게 알리십시오. 에이전트는 처리를 중지하고 기다립니다. 사람은 대시보드나 알림을 통해 에스컬레이션을 검토하고 안내 또는 승인을 제공합니다. 그러면 에이전트는 해당 안내를 기록의 새 메시지로 포함하여 체크포인트에서 재개합니다.
import asyncio
async def escalate_and_wait(task_id: str, reason: EscalationReason, context: str,
question: str, timeout_hours: int = 24) -> str:
# Save checkpoint
save_checkpoint(load_checkpoint(task_id))
# Create escalation record
escalation_id = create_escalation(task_id, reason, context, question)
# Notify reviewer
notify_reviewer(escalation_id, question)
# Wait for response (polling with timeout)
deadline = asyncio.get_event_loop().time() + timeout_hours * 3600
while asyncio.get_event_loop().time() < deadline:
response = get_escalation_response(escalation_id)
if response:
return response.guidance
await asyncio.sleep(60) # check every minute
raise TimeoutError(f'Escalation {escalation_id} not answered within {timeout_hours}h')검토자 인터페이스 구축
사람 검토자는 에스컬레이션에 응답할 수 있는 간단한 인터페이스가 필요합니다. 최소한 다음을 표시해야 합니다. 작업 설명, 현재까지 에이전트의 진행 상황, 승인이 필요한 구체적인 질문 또는 제안된 작업, 그리고 승인, 거부, 지침 제공 버튼입니다. 감사 목적으로 모든 검토자 결정을 검토자의 신원 및 타임스탬프와 함께 기록하세요. Slack 봇이나 간단한 웹 양식 모두 내부 팀에서 사용하기에 적합합니다.
# FastAPI escalation endpoint
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class EscalationResponse(BaseModel):
escalation_id: str
decision: str # 'approve', 'reject', 'guide'
guidance: str | None = None
reviewer_id: str
@app.post('/escalations/{escalation_id}/respond')
async def respond_to_escalation(esc_id: str, response: EscalationResponse):
escalation = get_escalation(esc_id)
if not escalation or escalation.status != 'pending':
return {'error': 'Escalation not found or already resolved'}
save_escalation_response(esc_id, response)
return {'status': 'response_recorded', 'task_will_resume': True}에이전트 컨텍스트에 사람의 지침 주입
사람이 응답한 후, 작업을 재개하기 전에 해당 지침을 에이전트의 대화 기록에 새 메시지로 주입하세요. 에이전트의 자체 관찰과 구분할 수 있도록 'supervisor'가 전달한 내용으로 표현하세요. 그러면 에이전트는 다음 단계에서 이 지침을 참조할 수 있습니다. 사람이 제안된 작업을 거부했다면 대신 무엇을 해야 하는지에 대한 지침을 포함하세요.
def inject_human_guidance(messages: list, decision: str, guidance: str | None) -> list:
if decision == 'approve':
messages.append({
'role': 'user',
'content': 'Supervisor: Your proposed action has been approved. Proceed.'
})
elif decision == 'reject':
messages.append({
'role': 'user',
'content': f'Supervisor: Your proposed action was rejected. Instead: {guidance}'
})
elif decision == 'guide':
messages.append({
'role': 'user',
'content': f'Supervisor: Additional guidance: {guidance}'
})
return messages에스컬레이션 지표 추적
에스컬레이션의 빈도, 이유, 응답 시간을 모니터링하세요. 에스컬레이션 빈도가 높다는 것은 에이전트의 확신이 충분하지 않다는 의미입니다. 작업이 지나치게 모호하거나, 모델에 더 나은 지침이 필요하거나, 확신 임계값이 너무 낮게 설정되었을 수 있습니다. 응답 시간이 길다면 검토자의 업무량에 문제가 있음을 나타냅니다. 이러한 지표를 활용하면 불필요한 중단을 최소화하면서도 실제로 위험한 결정에는 사람이 계속 관여하도록 자동화와 사람의 개입 사이의 균형을 조정할 수 있습니다.
def escalation_report(db_connection, days: int = 7) -> dict:
# SQL query (pseudocode)
rows = db_connection.execute('''
SELECT
reason,
COUNT(*) as count,
AVG(EXTRACT(EPOCH FROM (responded_at - created_at)) / 3600) as avg_response_hours,
SUM(CASE WHEN decision = 'approve' THEN 1 ELSE 0 END) as approvals,
SUM(CASE WHEN decision = 'reject' THEN 1 ELSE 0 END) as rejections
FROM escalations
WHERE created_at > NOW() - INTERVAL '%s days'
GROUP BY reason
ORDER BY count DESC
''' % days).fetchall()
return [dict(r) for r in rows]점진적인 자율성 확대
에스컬레이션 민감도를 높게 설정한 상태(낮은 확신 임계값, 모든 파괴적 작업에 대한 에스컬레이션)에서 시작하고, 에이전트의 동작에 대한 확신이 쌓이면 에스컬레이션 빈도를 점진적으로 줄이세요. 어떤 에스컬레이션이 승인 결정으로 이어졌고 어떤 에스컬레이션이 실제 수정으로 이어졌는지 추적하세요. 특정 트리거 유형에 대한 승인 비율이 지속적으로 높다면 해당 트리거를 안전하게 자동화할 수 있습니다. 그러면 진정으로 중요한 부분에 대한 감독은 유지하면서 사람의 업무량을 줄일 수 있습니다.
# Autonomy expansion strategy:
# Week 1: escalate for ALL destructive actions
# Week 2: auto-approve file writes to /tmp (low-risk), escalate others
# Week 4: auto-approve all file writes, escalate only email/DB changes
# Week 8: auto-approve emails under 10 recipients, escalate mass emails
# Track approval rates per trigger type:
# Tool: write_file -> 98% approve -> safe to automate
# Tool: send_email -> 89% approve -> near-automate with content check
# Tool: delete_records -> 43% approve -> always escalate긴급 재정의 및 작업 취소
사람이 실행 중인 에이전트 작업을 즉시 취소할 수 있는 긴급 재정의 메커니즘을 항상 제공하세요. 에이전트가 허용되지 않은 도구를 호출하거나 의도한 범위를 벗어난 작업을 수행하는 등 잘못 동작하는 경우, 사람은 몇 초 안에 에이전트를 중지할 수 있어야 합니다. 취소 신호를 구현하고(에이전트가 각 단계에서 확인하는 데이터베이스 플래그), 에이전트가 단계 중간에 취소되면 도구 호출 결과가 폐기되도록 하세요.
async def run_agent_with_cancel(task_id: str, messages: list) -> str:
for step in range(MAX_ITERATIONS):
# Check cancel flag at start of every step
if redis_client.get(f'agent:cancel:{task_id}'):
save_final_status(task_id, 'cancelled')
return 'Task cancelled by operator.'
response = await get_next_action(messages)
if response.is_final:
return response.answer
result = await execute_tool(response.tool, response.args)
messages.append({'role': 'user', 'content': result})
save_checkpoint_after_step(task_id, step, messages)
return 'Max iterations reached'에스컬레이션 임계값 조정
에스컬레이션 임계값은 조정이 필요합니다. 확신 임계값이 너무 높으면 에이전트가 거의 모든 작업에서 에스컬레이션을 발생시켜 검토자가 감당하기 어려워집니다. 반대로 너무 낮으면 위험한 작업이 그대로 통과합니다. 첫째 주에는 보수적인 임계값으로 시작하고, 에스컬레이션 빈도와 검토자 승인율을 추적한 뒤 조정하세요. 안정적인 시스템은 확신 문제로 작업의 5~15%를 에스컬레이션하고, 파괴적 작업은 거의 100% 에스컬레이션하며, 전체 승인율은 80%를 넘어야 합니다.
# Threshold tuning guide:
# Escalation rate vs quality trade-off:
#
# confidence_threshold=0.8 -> 35% escalation rate (too many)
# confidence_threshold=0.6 -> 12% escalation rate (target)
# confidence_threshold=0.4 -> 4% escalation rate (too few)
#
# Weekly review of escalation decisions:
# - Approval rate > 90%: lower threshold (too conservative)
# - Approval rate < 70%: raise threshold (not catching real issues)
# - Target: 75-85% approval rate빠른 확인
사람 개입형 에스컬레이션 설계에 대한 이해도를 확인해 보세요.
이번 단원 요약
이번 단원에서는 다음을 배웠습니다. 에스컬레이션 트리거는 에이전트가 작업을 일시 중지하고 사람의 지침을 요청해야 하는 정확한 조건을 정의합니다. 도구의 파괴적 작업 플래그는 되돌릴 수 없는 작업에 승인 요구 사항을 적용합니다. 또한 점진적인 자율성 확대를 통해 에이전트가 신뢰를 얻어 감에 따라 자동화를 안전하게 늘릴 수 있습니다. 다음으로는 최종 프로젝트를 위한 운영 환경 아키텍처를 설계합니다.
AI 튜터와 함께 Python을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 30
- 레슨
- 120
자주 묻는 질문
“사람 참여형 에스컬레이션” 강의는 무료인가요?
네 — “사람 참여형 에스컬레이션” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Engineering Academy 강의 전체를 잠금 해제할 수 있습니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“사람 참여형 에스컬레이션”에서 뭘 배우나요?
확신도가 낮거나, 파괴적인 작업이 곧 실행되려 하거나, 재시도 예산을 모두 사용했을 때 에이전트를 일시 중지하고 사람의 안내를 요청하도록 에스컬레이션 조건을 정의합니다. 브라우저에서 직접 실행하는 실습 코드로 AI Engineering Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Engineering Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Engineering Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“사람 참여형 에스컬레이션” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Engineering Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Engineering Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 에이전트 실패 유형 분류
- 자기 교정과 성찰적 프롬프트 작성
- 체크포인트 저장과 작업 재개
- 사람 참여형 에스컬레이션