무인 AI 에이전트를 위한 인간 승인 (Human Approval)
요약
무인 AI 에이전트 환경에서 인간의 승인을 비동기적으로 처리하는 패턴을 다룹니다. 사람이 실시간으로 대기할 수 없는 배치 작업이나 크론 잡 상황에서, 알림 채널을 인터페이스로 활용하여 작업의 유효 기간을 설정하고 승인을 관리하는 방법을 제안합니다.
핵심 포인트
- 비동기 승인(async approval) 패턴을 통한 무인 에이전트 제어
- 알림 채널(Slack, Telegram 등)을 통한 비동기 인터페이스 활용
- 작업 유효성을 고려한 적절한 expires_in 설정의 중요성
- 상태가 없는 크론 작업과 장기 실행 데몬의 두 가지 구현 패턴
아무도 지켜보지 않는 상태에서 정해진 일정에 따라 실행되는 에이전트라도, 실행을 멈추고 질문을 던질 수 있는 방법이 필요합니다. 이는 무인 AI 에이전트를 위한 비동기 승인 (async approval) 패턴을 다룹니다.
"아무도 지켜보지 않는다"는 것의 문제점
대부분의 인간 참여형 (human-in-the-loop) 사례는 사람이 터미널 앞에 앉아 몇 초 내에 승인할 준비가 되어 있다고 가정합니다. 하지만 무인 에이전트는 이러한 가정을 완전히 깨뜨립니다. 예를 들어, 매일 밤 송장 초안을 작성하는 야간 크론 잡 (cron job), 시장 요약본을 게시하는 예약된 스크래퍼 (scraper), 혹은 당신이 잠든 사이 새벽 3시에 실행되는 배치 파이프라인 (batch pipeline) 등이 있습니다. 루프의 반대편에는 동기적인 (synchronous) 인간이 존재하지 않습니다.
그렇다고 해서 승인 단계를 건너뛰어야 한다는 뜻은 아닙니다. 승인이 비동기적 (asynchronous)이고 내구성 (durable) 있게 이루어져야 함을 의미합니다. 에이전트는 제안을 제출하고 멈춥니다. 인간은 반드시 다음 10초 이내에 승인하는 것이 아니라, 다음에 휴대폰을 확인할 때 언제든 검토합니다. 이 간극을 견뎌낼 수 있는 게이트 (gate)가 필요합니다.
무인 파이프라인에서 게이트가 존재하는 위치
구조는 다른 Impri 통합 사례와 마찬가지로 동일한 세 번의 호출로 이루어지지만, 프레임워크가 달라집니다. 사람이 채팅창을 주시하는 대신, 알림 채널 (Telegram, Slack, 이메일, 푸시 알림) 자체가 인터페이스가 됩니다. 에이전트는 작업을 제출한 후, (실행 후 종료되는 방식의 배치 작업이라면) 종료하거나, (장시간 실행되는 프로세스라면) 롱 폴링 (long poll) 상태로 대기합니다.
import os, time, requests
API = "https://api.impri.dev"
...
크론 잡 (cron job)이 propose_invoice_run을 호출하고 종료하면, 별도의 프로세스 — 다음 예약된 실행 또는 작은 데몬 (daemon) — 가 나중에 wait_for_decision을 호출합니다. API의 어떤 부분도 두 과정을 동일한 프로세스가 수행할 것을 요구하지 않습니다.
"아직 아무도 보고 있지 않음"에 대한 만료 시간 설정
여기서는 expires_in 설정이 동기적 흐름보다 더 중요합니다. 만약 검토가 8시간 뒤 아침 커피를 마실 때 이루어진다면, 기본값인 5분은 무용지물입니다. 검토가 얼마나 걸리기를 원하는지가 아니라, 해당 작업이 얼마나 오랫동안 유효한지를 기준으로 기간을 선택하십시오.
| 무인 시나리오 (Unattended scenario) | 적절한 expires_in |
|---|---|
| 익일 아침에 검토하는 야간 배치 작업 (Overnight batch job) | 43200 (12h) |
| ... |
만약 아무도 확인하기 전에 윈도우(window)가 닫히면, 해당 액션은 만료되어 실행되지 않습니다. 파이프라인(pipeline)에서 expired 상태를 rejected와 정확히 동일하게 취급하고, 이를 조용히 누락시키기보다는 근본적인 작업을 다시 큐에 넣는(re-queuing) 것을 고려하십시오.
상태가 없는 작업(Stateless job)에서의 폴링(Polling) vs 데몬(Daemon)에서의 블로킹(Blocking)
두 가지 정직한 패턴이 있습니다. 무인 에이전트(unattended agent)가 어떻게 배포되었는지에 따라 선택하십시오:
- 상태가 없는 크론 작업 (Stateless cron job): 액션을 푸시(push)하고 즉시 종료합니다. 다음 예정된 실행 시, 새로운 작업을 수행하기 전에 이전 실행에서 푸시된 액션이 있는지 확인합니다. 이는 프로세스를 몇 시간 동안 열어두는 것을 방지합니다.
- 장기 실행 데몬 (Long-running daemon): 프로세스가 이미 상주하고 있으므로,
impri_await_decision(MCP)을 사용하거나 백오프(backoff)를 포함한 폴링 루프(polling loop, REST)를 사용하여 단순히 블로킹(block)합니다.
어떤 방식이든, 에이전트의 실제 부작용(side effect) — 송장 발송, 요약 게시 등 — 은 status == "approved" 체크 이후에 이루어져야 하며, 그 이전에 이루어져서는 안 됩니다. 무인 에이전트는 "모델이 체크하는 것을 기억할 것이다"라는 식의 접근이 충분하지 않은 전형적인 사례입니다. 코드 경로(code path) 상에서 승인되지 않은 브랜치(unapproved branch)에 도달할 수 없도록 만들어야 합니다.
여기서 Impri가 해결하지 못하는 것
Impri는 액션을 저장하고, 사용자에게 알리며, 결정을 보관합니다. 하지만 무인 파이프라인(unattended pipeline)이 언제 실행되어야 하는지, 재시도(retry)해야 하는지, 혹은 팬아웃(fan out)해야 하는지는 결정하지 않습니다. 그것은 여전히 스케줄러(scheduler, cron, 워크플로 엔진 또는 에이전트를 트리거하는 무엇이든)의 역할입니다. 또한, 무인 프로세스가 래퍼(wrapper)를 우회하여 직접 동작할 수 있는 상시 자격 증명(standing credential)을 보유하고 있지 않을 때에만 Impri는 진정한 게이트(gate) 역할을 할 수 있습니다. 이 기능의 기반이 되는 세 번의 호출 패턴에 대해서는 AI 에이전트에 인간 승인을 추가하는 방법을 참조하시고, 스케줄러 관련 버전의 문제에 대해서는 인간 승제로 크론 작업을 제어하기를 참조하십시오.
다음: 만약 귀하의 무인 에이전트 (unattended agent)가 작업별 게이트 (per-action gate) 대신 즉각적인 중단 (hard stop) 기능이 필요하다면, AI 에이전트에 킬 스위치 (kill switch) 추가하기를 참조하십시오.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기