자율형 AI 에이전트를 위한 Human-in-the-Loop (인간 참여형 루프)
요약
자율형 AI 에이전트의 효율적인 운영을 위해 모든 단계를 검토하는 대신, 부작용을 일으킬 수 있는 '특권적 도구'에만 인간의 승인을 결합하는 Human-in-the-loop 패턴을 제안합니다. 프롬프트 기반의 일시 정지 방식보다 도구 자체를 래핑하는 방식이 실행의 안정성을 보장합니다.
핵심 포인트
- 모든 단계를 검토하는 방식은 확장성이 떨어지므로 효율적인 게이팅이 필요함
- 도구를 읽기 전용(Free)과 외부 부작용 발생(Privileged)으로 분류하여 관리
- 프롬프트 지시가 아닌 도구 자체를 래핑하여 실행 단계의 안전성을 강제
- 계획(Plan)과 실행(Execution)의 분리를 통해 모델의 오류로부터 시스템 보호
자율 에이전트(Autonomous agents)는 스스로 계획을 세우고 도구 호출(tool calls)을 체인 형태로 연결합니다. 자율형 AI 에이전트를 위한 Human-in-the-loop(인간 참여형 루프)란, 이러한 호출들 중 실제로 사람이 승인해야 하는 것이 무엇인지 선택하는 것을 의미합니다.
스스로 다음 단계를 계획하고, 루프 내에서 도구를 호출하며, 언제 완료할지를 결정하는 에이전트는 "모든 것을 그냥 검토하라"는 방식이 확장(scale)될 수 없는 전형적인 시스템입니다. 질문 하나에 답하기 위해 40개의 도구 호출을 수행할 수도 있기 때문입니다. 유용한 패턴은 모든 단계를 차단(gating)하는 것이 아니라, 실제 세계에 부작용(side effect)을 일으키는 소수의 단계만을 차단하고 나머지는 자유롭게 실행되도록 하는 것입니다.
자율성은 괜찮지만, 검토되지 않은 부작용은 안 됩니다
자율적인 조사 및 아웃리치(research-and-outreach) 에이전트가 엔드 투 엔드(end to end)로 실제로 무엇을 하는지 생각해 보십시오: 웹 검색, 페이지 읽기, 결과 요약, 메시지 초안 작성, 메시지 전송. 처음 세 단계는 읽기 전용(read-only)이며 되돌릴 수 있습니다(reversible). 에이전트의 검색 쿼리가 약간 잘못되더라도 나쁜 일은 일어나지 않습니다. 마지막 단계는 그렇지 않습니다. 일단 이메일이 발송되면, 그것으로 끝입니다. 게이트(gate)는 전체 루프가 아니라 네 번째 단계에 있어야 합니다.
이것이 이 패턴의 핵심 설계 결정입니다. 에이전트가 호출할 수 있는 각 도구를 자유로운(free) 도구(읽기 전용, 내부적, 되돌릴 수 있음) 또는 특권적인(privileged) 도구(외부 부작용 발생)로 분류하고, 특권적인 도구에 대해서만 래핑(wrap)하는 것입니다.
에이전트의 도구 루프에서 특권적 도구 래핑하기
type Tool = (args: Record<string, unknown>) => Promise<unknown>;
const IMPRI_API = "https://api.impri.dev";
...
에이전트의 계획 루프(planning loop)는 모든 도구에 대해 동일한 방식으로 tools[toolName](args)를 호출합니다. "이것은 승인이 필요하다"와 같은 특별한 케이스 로직을 가질 필요가 없습니다. 게이트는 플래너(planner)에게는 보이지 않지만 실행기(executor)에게는 피할 수 없는 것이며, 이것이 계획 및 실행(plan-and-act) 루프가 스스로 검토 과정을 건너뛰도록 유도하는 것을 방지합니다.
왜 "모델에게 일시 정지를 요청하는 것"이 게이트가 아닌가
자율형 에이전트의 계획(plan)은 생성된 텍스트입니다. 여러분은 에이전트에게 "이메일을 보내기 전에 일시 정지하세요"라고 프롬프트(prompt)를 줄 수 있으며, 대부분의 경우 에이전트는 이를 따를 것입니다. 하지만 계획이 곧 실행 경로(execution path)는 아닙니다. 만약 모델이 지침을 건너뛰거나, 상황을 오독하거나, 이후의 계획 단계가 이전 단계를 덮어쓴다면, send_outreach_email이 실행되는 것을 막을 수 있는 것은 아무것도 없습니다. 위에서 언급한 것처럼 도구(tool) 자체를 래핑(wrapping)하면 이러한 의존성을 제거할 수 있습니다. 즉, 계획이 무엇이라고 말하든 상관없이, 기반이 되는 sendEmail 함수는 오직 requireApproval을 통해서만 접근할 수 있게 됩니다.
이 점은 단순한 요청/응답(request/response) 모델보다 자율형 에이전트에게 더 중요합니다. 왜냐하면 자율형 루프(autonomous loops)는 작업의 시작부터 종료 사이에 감독 없이 수많은 단계를 실행하기 때문입니다. 즉, 계획이 인간이 실제로 의도한 것에서 벗어날 수 있는 표면(surface)이 더 넓습니다.
무엇을 특권(privileged)으로 간주할지 선택하기
| 도구 호출 (Tool call) | 자유로운가 아니면 특권적인가? |
|---|---|
| 웹 검색, 페이지 읽기 | 자유로움 — 부작용(side effect) 없음 |
| ... |
만약 특정 도구가 특권(privileged) 열에 속하는지 확신이 서지 않는다면, 잘못된 호출이 발생했을 때 누군가 알아차리기 전에 시스템 외부의 사람에게 보이거나 비용이 발생하는지를 자문해 보십시오. 만약 그렇다면, 해당 도구를 래핑(wrap)하십시오.
명확하게 밝혀두어야 할 경계
Impri는 결정을 보유하고 인간에게 알리는 역할을 수행합니다. Impri는 에이전트의 단계를 계획하거나, 어떤 도구가 특권적인지 결정하거나, 주어진 초안이 좋은지 해석하지 않습니다. 위의 분류 작업은 에이전트를 구축할 때 도구당 한 번씩 여러분이 수행해야 할 몫입니다. 또한 Impri는 멀티 에이전트 조정 레이어(multi-agent coordination layer)도 아닙니다. 만약 여러분의 "자율형 에이전트"가 실제로는 서로에게 작업을 넘겨주는 여러 에이전트로 구성되어 있다면, 승인 게이트(approval gate)는 여전히 그것이 래핑하고 있는 특정 도구 호출만을 보호할 뿐, 에이전트 간의 핸드오프(handoff) 로직은 보호하지 않습니다.
이 래퍼(wrapper)가 기반으로 하고 있는 전체 3단계 호출 패턴(three-call pattern)에 대해서는 AI 에이전트에 인간 승인(human approval)을 추가하는 방법을 참조하세요. 처음부터 검토 체크포인트(review checkpoints)를 내장하여 루프(loop) 자체를 구축하는 것에 대한 더 폭넓은 관점은 인간 참여형(human-in-the-loop) AI 에이전트를 구축하는 방법을 참조하세요. 만약 귀하의 에이전트가 특히 LangGraph를 기반으로 구축되었다면, LangGraph를 위한 인간 참여형 (human-in-the-loop for LangGraph)에서 프레임워크 전용 체크포인트 API(checkpoint API)를 다룹니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기