Agent Mentor Learn
에이전트 하네스 기초: 루프와 통제 · 5 / 6강

레슨 5: 개입과 조향: 중단, 방향 전환, 휴먼 인 더 루프

학습 목표:

  • 자율적으로 도는 루프에 왜 사람이 필요한지 말하고, 인과 고리를 분명히 하기: 과도한 에이전시야말로 더 자율적인 루프일수록 수동 게이트가 더 필요한 이유
  • 중단, 조향, 승인을 서로 구별하기 — 각각이 루프의 어디를 파고들고, 무엇을 바꾸는지
  • 영향이 큰 행동에 대한 사람의 승인 지점이 실행 전에 놓여야 하는지 후에 놓여야 하는지 판단하고, "돌이킬 수 없게 되기 전" 규칙을 진술하기

전제: 레슨 3과 4를 마쳤고, 루프에 정지 조건이 있으며 데드 루프와 공회전에 폴백이 필요하다는 것을 알고, 하네스를 모델을 둘러싼 제어 코드로 이해한다 | 이전: 레슨 4 << | 다음: 레슨 6 >>

앞의 네 레슨은 루프 자체를 다스렸고, 이번 레슨은 거기에 사람을 넣는다

이제 여러분 손안의 루프는 돌고, 멈추고, 아래에 폴백을 깔고 있습니다. 레슨 3은 명시적 정지 조건을 주었습니다. 레슨 4는 데드 루프와 공회전을 알아보게 가르쳐 예산을 바닥까지 태우지 않게 했습니다. 이 제어들은 하나같이 공통점이 있습니다. 처음부터 끝까지, 아무도 끼어들지 않고, 하네스가 혼자 루프와 씨름하는 것입니다.

실제 에이전트는 처음부터 끝까지 무인으로 돌아가는 경우가 드뭅니다. 작업 중간에 통째로 그만두고 싶을 수 있습니다 — 방향이 완전히 틀렸으니 지출을 멈추라고. 프로세스를 멈추지 않고 목표를 바꾸고 싶을 수 있습니다. "리팩터는 놔두고, 먼저 그 프로덕션 버그부터 찾아 고쳐." 아니면 어떤 한 단계가 위험해서, 그 일이 벌어지기 전에 들여다보고 고개를 끄덕이고 싶을 수 있습니다. 모델은 이 중 어느 것도 스스로 결정할 수 없고, 레슨 3과 4의 자동 정지와 폴백도 여기에는 닿지 않습니다 — 이것들은 사람이 루프 바깥에서 손을 뻗어 하는 일입니다. 이 레슨은 그 층입니다. 사람이 루프 중간에 어떻게 개입하는지, 그리고 그 개입을 위한 코드는 어디에 있어야 하는지.

루프가 자율적일수록, 사람의 게이트가 더 필요하다

먼저 한 질문을 정리하겠습니다. 루프가 스스로 돌게 만드느라 그 고생을 하고서, 왜 사람을 도로 넣는 걸까요?

답은 "자율"이라는 단어의 반대편에 숨어 있습니다. 에이전트는 모델이 루프 안에서, 다음에 무엇을 할지 어떤 도구를 쓸지 스스로 결정하는 시스템입니다. 그 자율성이야말로 에이전트를 유용하게 만드는 것이고 — 동시에 위험하게 만드는 것입니다. 보안 커뮤니티는 이 위험에 이름을 붙였습니다. 과도한 에이전시(excessive agency)입니다. OWASP는 이렇게 씁니다. "Excessive Agency is the vulnerability that enables damaging actions to be performed in response to unexpected, ambiguous, or manipulated outputs from an LLM, regardless of what is causing the LLM to malfunction."1 (과도한 에이전시는, 무엇이 LLM을 오작동시키든 상관없이, LLM의 예기치 못한·모호한·조작된 출력에 반응해 해로운 행동이 수행되게 하는 취약점이다.)

이 문장을 루프에 겹쳐 보면 구체적으로 변합니다. 어느 한 턴에서 모델은 도구가 반환한 것을 잘못 읽을 수도, 사용자의 애매한 문장을 엉뚱하게 받아들일 수도, 읽어 들인 웹 페이지에 심긴 악의적 지시에 궤도를 벗어날 수도 있습니다. 레슨 4의 폭주 모드는 루프의 리듬을 깼습니다 — 멈추지 않고, 제자리에서 헛돌았습니다. 여기서 깨지는 것은 루프의 행동입니다. 하지 말았어야 할 일을 실제로 저지른 것입니다. 그리고 루프가 지닌 권한과 자율성이 클수록, 한 번의 잘못된 판단이 내는 피해가 큽니다. 그래서 하네스 자신의 자동 게이트 — 정지 조건, 폴백 — 와 나란히, 실수를 돌이킬 수 없는 몇몇 지점에는 게이트가 하나 더 필요합니다. 사람의 게이트, 행동이 착지하기 전에 사람이 "잠깐"이라고 말할 기회를 주는 것입니다.

이것은 자동화에 대한 불신이 아닙니다. 인정입니다. 모델은 긴 구간의 턴을 돌 수 있고, Anthropic의 지침이 말하듯 "The LLM will potentially operate for many turns, and you must have some level of trust in its decision-making."2 (LLM은 여러 턴에 걸쳐 동작할 수 있으므로, 그 의사결정을 어느 정도는 신뢰해야 한다.) 하지만 신뢰는 끝까지 방임하는 것과 같지 않습니다. 신뢰는 대부분의 단계를 스스로 밟게 해 주는 것이고, 사람의 게이트는 잘못 든 길을 되돌릴 수 없는 몇 안 되는 교차로를 지킵니다.

세 가지 개입: 중단, 조향, 승인

루프에 손을 뻗는 것이 언제나 "멈추게 하기"뿐인 것은 아닙니다. 이후 루프가 무엇을 하느냐로 나누면 세 가지 수가 있고, 각각 다른 지점을 파고들며 다른 것을 바꿉니다.

중단 — 루프 전체를 그만둔다. 셋 중 가장 무딥니다. 이번 턴 모델이 무엇을 하려 하든, 루프가 종료되고 더 이상 요청이 나가지 않습니다. 레슨 3의 정지 조건과 닮았지만, 차이는 방아쇠를 누가 당기느냐입니다. 정지 조건은 하네스가 미리 정한 규칙에 따라 스스로 물러서는 것입니다. 중단은 루프 바깥의 사람이 손으로 정지를 누르는 것입니다. 방향이 완전히 틀렸고 계속해 봐야 토큰만 태운다는 것이 보일 때 씁니다. 중단 후에는 루프가 끝납니다 — "그다음"은 없습니다.

조향 — 목표를 바꾸거나 새 지시를 건네고, 계속 돌게 한다. 이것은 아무것도 종료하지 않습니다. 대화에 새로운 사람의 메시지를 밀어 넣어, 모델이 다음에 기대는 방향을 바꾸고, 루프는 그 지시를 앞으로 실어 갑니다. 에이전트가 어떤 모듈 리팩터를 갈아 넘기고 있는데 더 급한 프로덕션 버그를 발견했다고 해 봅시다. 프로세스를 재시작하지 않고 이렇게 넣을 수 있습니다. "리팩터는 잠시 멈추고, 먼저 로그인 엔드포인트의 그 500을 추적해 고쳐." 조향은 루프의 목표를 바꾸는 것이지, 루프의 생사를 바꾸는 것이 아닙니다.

승인 — 한 단계를 통과시킨다. 끄덕임이 없으면 행동도 없다. 앞의 둘은 루프 전체에 작용합니다. 승인은 한 특정 행동에 작용합니다. 루프가 영향이 큰 조작에 닿아 멈추고, "지금 이것을 하려 합니다"를 펼쳐 보이고, 사람이 예라고 할 때만 실행하며 — 아니오라고 하면 건너뛰거나 취소합니다. 사실 이것은 아주 규율 잡힌 종류의 멈춤일 뿐입니다. "Agents can then pause for human feedback at checkpoints or when encountering blockers."2 (그러면 에이전트는 체크포인트에서, 또는 막힌 지점을 만났을 때 사람의 피드백을 위해 멈출 수 있다.) 승인은 바로 그 체크포인트를, 위험한 행동 바로 앞에 정확히 꽂아 둔 것입니다. 승인이 통과하면 루프는 평소 리듬으로 돌아갑니다. 셋 중 가장 일상적이고, 상시 켜 두기에 가장 어울리는 것이기도 합니다.

셋을 헷갈리지 않게 하는 한 줄. 중단은 루프가 사느냐를 결정하고, 조향은 루프가 어디를 향하느냐를 결정하며, 승인은 한 행동이 통과하느냐를 결정합니다. 레슨 6의 최소 하네스에서 승인이 실제로 코드로 쓰여집니다.

승인 밸브를 루프에 새겨 넣기: 행동이 착지하기 전에 멈춘다

셋 중 승인이야말로 하네스 코드 안에 있어야 할 필요가 가장 큽니다. 중단과 조향은 대개 사람이 터미널에 무언가를 입력해 촉발할 수 있지만, 승인은 하네스가 옳은 지점에서 능동적으로 멈춰 서서 기다려야 합니다. 그것을 빼놓으면 루프는 그냥 위험한 일을 저지릅니다.

과도한 에이전시에 대한 OWASP의 완화책 중 하나는 이렇습니다. "Utilise human-in-the-loop control to require a human to approve high-impact actions before they are taken."1 (휴먼 인 더 루프 제어를 활용해, 영향이 큰 행동이 취해지기 전에 사람이 승인하도록 요구하라.) 그 문장의 순서를 보세요 — 취해지기 전에 승인. 승인이 먼저, 실행이 나중입니다. 먼저 실행하고 나중에 서명을 받는 것이 아닙니다. 밸브가 물리적으로 어디에 가는지는 표준이 활짝 열어 둡니다. "This may be implemented in a downstream system (outside the scope of the LLM application) or within the LLM extension itself."1 (이것은 다운스트림 시스템(LLM 애플리케이션 범위 바깥)에 구현될 수도, LLM 확장 자체 안에 구현될 수도 있다.) 우리 루프에 떨어뜨리면, 자연스러운 자리는 도구 디스패치입니다 — 영향이 크다고 표시된 도구가 실제로 호출되기 바로 전에 삽입되는 멈춤입니다.

코드로 보면, 도구를 실행하는 줄 앞에 놓인 분기입니다.

세 군데를 들여다볼 만합니다. 첫째, 체크가 executeTool 에 있습니다 — 멈춤은 행동이 착지하기 전에 일어나야 하고, 그래야 사람을 기다리는 동안 위험한 조작이 아직 실행되지 않은 상태가 됩니다. 둘째, 거부는 조용한 건너뛰기가 아닙니다. is_error가 세팅된 tool_result를 돌려주므로(레슨 2의 그 필드를 기억하시죠?), 모델은 이 경로가 막혔음을 배우고 다음 턴에 똑같은 행동을 또 제안하는 대신 다른 접근을 찾아 나섭니다. 셋째, isHighImpact는 영향이 큰 조작만 멈춥니다 — 파일 읽기, 로그 확인, 그 밖의 무해한 수는 건드리지 않고 통과합니다. 그러지 않으면 모든 단계마다 사람의 끄덕임이 필요해지고, 에이전트는 비싼 수동 도구로 전락합니다.

게이트가 가는 자리: 행동이 돌이킬 수 없게 되기 전, 후가 아니다

그 승인 밸브가 온전히 작동하는 것은 옳은 자리에 서 있기 때문입니다. 이 절은 그 배치 규칙을 따로 꺼냅니다. 이 레슨에서 가장 거꾸로 기억되기 쉽고 — 거꾸로 기억했을 때 가장 값비싼 것이기 때문입니다.

한 문장으로 규칙은 이렇습니다. 승인의 멈춤은 행동이 돌이킬 수 없게 되기 전에 가고, 후에 가지 않는다. 이 발상은 앞선 코스 "에이전트 도구 호출: 에이전트가 실제로 일하게 만들기"에서 이미 만났습니다 — 행동의 영향 범위가 크고 되돌리기 어려울수록, 그 확인 지점은 더 이른 자리에 있어야 합니다. 루프에 떨어지면 이렇게 됩니다. 체크는 executeTool 윗줄에 가고, 그래서 사람을 기다리는 동안 파괴적 행동은 아직 일어나지 않았습니다. 그것을 아래로 옮기면, 여러분이 반응할 즈음에는 테이블은 드롭됐고, 이메일은 전원에게 나갔고, 프로덕션 설정은 이미 바뀌었습니다 — 그리고 로그가 아무리 정밀해도, 한 일이라곤 잔해를 사진 찍은 것뿐입니다.

"돌이킬 수 없음"을 어떻게 알아볼까요? 스스로에게 반사실 테스트를 던지세요. 이 행동이 실행됐는데 틀렸다면, 한 단계로 되돌릴 수 있나? 값싸게 롤백되는 것 — 스크래치 파일 쓰기, 내부 초안 저장 — 은 게이트가 필요 없거나 아주 느슨한 것이면 됩니다. 되돌릴 수 없거나, 엄청난 비용을 치러야만 되돌릴 수 있는 것 — 데이터베이스 드롭, 자금 이동, 외부 게시, 프로덕션 설정 변경 — 은 이른 게이트가 필요하고, "먼저 승인, 그다음 실행"이어야 합니다. 그것은 레슨 4와도 깔끔하게 이어집니다. 그 레슨은 루프가 자원을 태우는 것을 막는 것이었고, 이번 레슨은 루프가 도로 부를 수 없는 일을 저지르는 것을 막는 것입니다. 첫째는 리듬이 제어를 벗어나는 것이고, 둘째는 행동이 제어를 벗어나는 것이며, 둘 다 "너무 늦음"이 오기 전에 게이트를 세워야 합니다.

사람들이 흔히 놓치는 한 가지. 게이트는 행동이 실제로 착지하는 곳에 가장 가까운 단계에 있어야 합니다. 테이블을 드롭하는 일이 여러 손을 거친다고 해 봅시다 — 모델이 제안하고, 하네스가 디스패치하고, drop_table이 호출됩니다. "모델이 제안하는" 단계에 승인을 두는 것으로는 부족합니다. 제안 자체는 아무런 피해도 주지 않기 때문입니다. 레슨 1이 말했듯 "The model never executes anything on its own."3 (모델은 스스로 아무것도 실행하지 않는다.) 피해는 그 마지막 executeTool 호출에 삽니다. 게이트를 실행 끝단으로 최대한 밀어 두면, 모델은 마음을 몇 번이고 바꾸고 인자를 다시 만들어도 됩니다 — 그 모든 것이 여전히 게이트의 이쪽, 아무도 다치지 않는 자리에 있습니다.

레슨 6이 세 가지를 한 루프에 어떻게 접어 넣는가

이 레슨을 앞선 것들과 나란히 놓으면 하네스의 제어 세트가 완성됩니다. 레슨 3의 정지 조건(때가 되면 자동으로 물러난다), 레슨 4의 폭주 폴백(데드 루프와 공회전을 알아보고, 예산을 태워 없애지 않는다), 그리고 이 레슨의 휴먼 인 더 루프 승인(위험한 행동이 착지하기 전의 수동 게이트)입니다. 이들은 셋 중 하나를 고르는 것이 아닙니다. 같은 루프 위에 쌓인 세 층입니다 — 정지 조건은 얼마나 오래 도는지를, 폴백은 궤도를 벗어났을 때 무엇이 일어나는지를, 승인은 이 특정 수가 벌어져도 되는지를 다스립니다.

레슨 6은 셋을 하나의 돌아가는 최소 하네스로 용접합니다. 턴 상한이 달린 while 루프, 공회전 감지, 그리고 영향이 큰 조작에 대한 승인 밸브입니다. 거기서 이 레슨의 isHighImpact 분기, 레슨 3의 카운터, 레슨 4의 진척 체크가 서로 싸우지 않고 각자의 자리를 하나의 루프 본문 안에서 어떻게 차지하는지 보게 됩니다. 이 레슨에서는 두 가지만 붙들면 충분합니다. 세 개입이 각각 무엇을 바꾸는지, 그리고 승인 밸브는 돌아올 수 없는 지점 앞에 서야 한다는 것입니다.

정리

  • 루프가 자율적일수록 결정적 지점에 사람의 게이트가 더 필요하다: 과도한 에이전시란 예기치 못한·모호한·조작된 모델 출력이 돌이킬 수 없는 해로운 행동을 촉발할 수 있다는 것이고1, 여러 턴을 돌 수 있는 모델을 신뢰하는 것2은 방임과 같지 않으며, 사람의 게이트는 잘못 든 길을 되돌릴 수 없는 몇 안 되는 교차로를 지킨다
  • 세 개입은 각각 다른 층을 다스린다: 중단은 루프가 사느냐에 작용하고(사람이 루프 전체를 바깥에서 그만둔다), 조향은 어디를 향하느냐에 작용하며(새 지시를 밀어 넣어 목표를 바꾸고 계속 돈다), 승인은 한 행동이 통과하느냐에 작용한다(위험한 조작 전에 멈춰 끄덕임을 기다린다). 마지막 것이 바로 "체크포인트에서 사람의 피드백을 위해 멈춘다"2는 발상을 영향이 큰 행동 앞에 꽂은 것이다
  • 휴먼 인 더 루프 승인의 굳은 규칙은 먼저 승인, 그다음 실행이다: 영향이 큰 행동은 취해지기 전에 사람이 승인해야 하고1, 밸브는 다운스트림 시스템에 있어도 에이전트 확장 안에 있어도 된다1
  • 게이트는 행동이 돌이킬 수 없게 되기 전에 가고, 후에 가지 않는다: executeTool 위에 앉으면 사람을 기다리는 동안 파괴적 행동은 아직 일어나지 않았고, 실행 아래로 옮기면 아무리 정밀한 로그도 사후 추적일 뿐 이미 착지한 것을 아무것도 멈추지 못한다. "돌이킬 수 없음"은 반사실 테스트로 알아본다 — 잘못 실행되면, 한 단계로 되돌릴 수 있나?
  • 이 레슨의 승인, 레슨 3의 정지 조건, 레슨 4의 폭주 폴백은 같은 루프 위에 쌓인 세 층이고, 레슨 6이 그것들을 돌아가는 최소 하네스로 용접한다

레슨 6 >>

Footnotes

  1. LLM06:2025 Excessive Agency — OWASP Gen AI Security Project — https://genai.owasp.org/llmrisk/llm062025-excessive-agency/ 2 3 4 5 6

  2. Building Effective AI Agents — Anthropic Engineering — https://www.anthropic.com/engineering/building-effective-agents 2 3 4

  3. How tool use works — Claude API — https://platform.claude.com/docs/en/agents-and-tools/tool-use/how-tool-use-works

연습

01

배포 에이전트가 "빌드 → 테스트 → 프로덕션 릴리스" 파이프라인을 자동으로 돌리고 있습니다. 아래는 온콜 엔지니어가 서로 다른 순간에 하는 세 가지 일입니다. 각각에 대해 중단인지, 조향인지, 승인인지 판단하고, 왜인지 말하세요(루프를 종료했나, 루프의 목표를 바꿨나, 한 행동을 통과시켰나?).

레벨 1: 세 개입 수에 이름 붙이기
  1. 에이전트가 "프로덕션 릴리스" 단계 바로 전에 멈춥니다. 화면에 프롬프트가 뜹니다. "v2.3.1을 프로덕션에 릴리스하려 합니다. 확인하시겠습니까?" 엔지니어가 버전 번호를 흘긋 보고 "확인"을 클릭하자, 에이전트가 릴리스를 진행합니다.
  2. 에이전트가 매번 실패하는 테스트를 계속 재시도합니다. 엔지니어는 이 경로가 아무 데도 못 간다고 판단해 정지를 누르고, 파이프라인 전체가 종료되며 프로세스가 빠져나갑니다.
  3. 에이전트가 아직 테스트를 돌리는 중에 엔지니어가 메시지를 넣습니다. "2.3.1은 내보내지 마 — 고객이 원하는 건 2.3.0이야, 그 버전으로 바꿔서 계속해." 에이전트가 새 버전 번호로 이어 갑니다.
완료 기준 · 로컬에서 확인
02

아래 루프 본문은 외부 이메일을 보낼 수 있는 에이전트에 사람의 승인을 더하려 하지만, 쓰인 방식에 문제가 있습니다. 사람에게 묻는 시점이면 이메일은 이미 나가 있습니다. 배치가 무엇이 틀렸는지, 그것이 무엇으로 이어지는지 짚고, 승인 밸브를 옳은 위치로 옮기세요.

레벨 2: 승인 밸브를 옳은 자리에 두기
완료 기준 · 로컬에서 확인