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

레슨 3: 정지 조건: 에이전트는 언제 손을 떼야 하는가

학습 목표:

  • 모델이 스스로 end_turn 을 돌려주는 것에 맡기는 것만으로는 루프를 끝내기에 부족한 이유를 설명하고, 그 긴장을 또렷이 말하기: 모델을 신뢰해야 하지만, 그 모델은 다수의 턴에 걸쳐 계속 갈 수 있다
  • 뼈대 루프에 최대 턴 수의 하드 게이트를 더하고, 그 카운터가 루프 밖에 있을 때만 작동하는 이유를 설명하기
  • 하드 스톱(상한에서의 강제 정지)과 소프트 스톱 / 서스펜드(사람을 기다림, 재개 가능)를 구별하고, 어떤 에이전트가 멈춰야 하는 조건을 열거하기

전제: 레슨 2를 읽고, stop_reason 이 구동하는 while 루프를 쓸 수 있으며, end_turn 이 돌아왔을 때 루프가 자연히 끝난다는 것을 알고 있어야 합니다 | 이전: 레슨 2 << | 다음: 레슨 4 >>

모델이 스스로 그만두기를 기대하지 마십시오

레슨 2의 뼈대 루프가 멈추는 이유는 딱 하나입니다. 어느 라운드에 모델이 도구를 요구하지 않게 되고, stop_reasontool_use 에서 end_turn 으로 바뀌고, while 조건이 거짓이 되어, 루프가 자연히 끝납니다.1 바꿔 말하면, 한 바퀴 더 돌지 아닐지의 판단이 완전히 모델에 맡겨져 있습니다 — 모델이 "할 말은 했다"고 말했을 때 루프가 멈추는 것입니다.

대개는 그것으로 잘 돌아가지만, 누가 판단하고 있는지는 또렷이 해 둡시다. 에이전트란 정의상, 모델이 자신의 프로세스와 자신의 도구 사용을 동적으로 지휘하는 시스템이며,2 언제 그만둘지도 그 일부입니다. 자율성이야말로 에이전트를 유용하게 만드는 것이지만, 같은 동전의 뒷면은 이것입니다. "The autonomous nature of agents means higher costs, and the potential for compounding errors."(에이전트의 자율적인 성질은 더 높은 비용과, 에러가 누적될 가능성을 의미한다)2 그리고 여기서 가장 중요한 한 문장. "The LLM will potentially operate for many turns, and you must have some level of trust in its decision-making."(LLM은 다수의 턴에 걸쳐 동작할 가능성이 있으며, 그 의사결정에 어느 정도의 신뢰를 두어야 한다)2

찬찬히 곱씹어야 할 말은 신뢰입니다. 신뢰는, 모델을 무감독으로 방치하는 것과 같지 않습니다. 모델이 어느 단계에서 막히거나, 도구가 돌려준 것에 이끌려 탈선하고, 그대로 end_turn 을 돌려주지 않게 되면, stop_reason 만 보는 루프는 여러분을 대신해 조급해해 주지 않습니다. 라운드를 거듭하며, 모델에 어울려 계속 돕니다 — 여러분이 쓴 while 조건 어디에도 "이제 충분히 돌았다"고 쓰여 있지 않기 때문입니다. 그러니 모델에 의한 자기 종료만으로는 부족합니다. 모델의 기분을 기다리지 않는, 호스트가 정하는 정지 조건이 필요합니다.

먼저 루프에 하드 게이트를: 최대 턴 수

모든 것 중 가장 기본적인 정지 조건은, Anthropic의 엔지니어링 가이던스에 그대로 이름이 나옵니다. "it's also common to include stopping conditions (such as a maximum number of iterations) to maintain control."(제어를 유지하기 위해 정지 조건(최대 반복 횟수 등)을 포함하는 것도 흔하다)2 코드로 옮기면, 루프가 몇 번까지 돌아도 되는지의 상한입니다.

레슨 2의 뼈대에 대해, 변경은 작습니다.

여기서 무게를 지는 것은 둘입니다. 첫째, let turns = 0 은 루프의 에서 선언되어 있습니다. 라운드를 넘나들며 살아남아, 하나씩 더해 가야 합니다. 그렇지 않으면 게이트는 몇 바퀴를 돌았는지 알 길이 없습니다. 이것을 루프 본체 안으로 옮기면, 레벨 2 연습이 해체하는 바로 그 함정이 됩니다. 둘째, 게이트는 모델이 아직 도구를 요구하는지 신경 쓰지 않습니다 — 막혀 있든, 제자리를 맴돌든, 도구의 출력에 이끌려 탈선했든, 묻지 않습니다. 주회 수가 상한에 이르면, 호스트는 정지하고, 더는 요청을 보내지 않고, 제어를 자기 쪽으로 되찾습니다.

이것이 하드 스톱입니다. 경계에서 무조건 정지하고, 루프는 거기서 끝입니다. 이것은 모델이 "끝났다"고 판단하는 end_turn 에 의한 소프트한 종료와는 별개입니다 — 한쪽은 여러분이 설정한 상한, 다른 쪽은 모델 자신의 판단입니다. MAX_TURNS 를 얼마나 크게 해야 하는지에는 정석이 없고, 그 작업에 대략 몇 라운드가 필요한지에 의존함에 주의하십시오. 여기서의 10은 임시로 둔 값입니다. 중요한 것은, 게이트가 존재하고, 폭주한 루프를 실제로 멈출 수 있다는 것입니다.

하드 스톱 너머의 또 한 종류: 사람을 기다리기 위해 멈추기

최대 턴 수 같은 게이트에는 공통된 성질이 있습니다. 거기에 이르면 길은 끝이고, 루프는 종료되며, 자동으로는 이어지지 않습니다. 하지만 정지 조건은 그것뿐이 아닙니다. 같은 글은 또 하나를 이름 지어 부릅니다. "Agents can then pause for human feedback at checkpoints or when encountering blockers."(그러고 나서 에이전트는 체크포인트에서, 혹은 장애물에 부딪혔을 때 사람의 피드백을 기다리며 일시 정지할 수 있다)2 이것은 하드 스톱과는 다른 생물이며, 갈라놓을 가치가 있습니다.

  • 하드 스톱: 상한에서 정지하고, 루프는 완전히 종료, 아무것도 자동으로는 이어지지 않습니다. 최대 턴 수도 예산 소진도 여기에 속합니다. 종단 상태입니다.
  • 소프트 스톱 / 서스펜드: 루프가 체크포인트에서 의도적으로 멈추고, 제어를 사람에게 넘기며, 그 사람이 답하면 바로 그 지점에서 이어 갈 수 있습니다. 끝이 아니라, 재개 가능한 일시 정지입니다.

코드에서 그 차이는 무엇을 반환하는지로 드러납니다. 하드 스톱은 최종 결과를 반환합니다 — 여기서 끝났다고. 소프트 스톱은 상태를 보존해야 합니다. 재개할 수 있는 장면의 스냅숏을 반환하며, 현재의 messages 를 그것이 막힌 대기 중인 액션과 함께 넘겨, 사람이 그것을 처리하고 나면 그 스냅숏만으로 이어 갈 수 있게 합니다.

소프트 스톱의 전형적인 경우는, 모델의 다음 단계가 되돌릴 수 없는 무언가 — 데이터베이스를 떨어뜨리기, 이메일을 뿌리기, 주문을 넣기 — 라서, 그것이 통과되기 전에 사람이 보기를 원할 때입니다. 또는 모델이 스스로 막혀서 더 많은 정보가 필요하다고 보고하는 경우입니다. 하드 스톱 / 소프트 스톱의 선을 긋는 것으로 지금은 충분합니다. needsHumanApproval 이 실제로 어떻게 판단하는지, 그리고 사람이 답하면 루프가 그 스냅숏에서 어떻게 재개하는지는, 사람을 루프 안에 두는 것을 다루는 레슨 5의 주된 주제입니다.

하나의 틀: 먼저 "어떤 조건에서 멈춰야 하는가"를 묻기

하드 스톱과 소프트 스톱을 손에 쥐면, 에이전트를 설계하는 데 편리한 첫 수가 생깁니다. 어떤 루프를 쓰기 전에, 한 가지 질문에 답하십시오. 이것은 어떤 조건에서 멈춰야 하는가? 답을 나열하면, 대개 다음 넷으로 귀착합니다.

  1. 작업이 끝났다 — 모델이 end_turn 을 돌려준다. 이것이 넷 중 가장 부드러운 것으로, 모델이 판단하며, 정말로 끝났는지 아니면 도중에 포기했는지 여전히 확인해야 한다.
  2. 턴 상한 — 하드 스톱. 위의 MAX_TURNS 게이트가 그것으로, 루프가 굴러가기 시작해 스스로 고삐를 죌 수 없는 최악의 경우를 잡는다.
  3. 사람의 결정이 필요한 장애물 — 소프트 스톱 / 서스펜드로, 사람의 피드백을 기다리며 멈춘다.2 되돌릴 수 없는 작업이나, 모델이 막혔다고 명시적으로 보고하는 것으로 촉발된다.
  4. 예산 소진 — 하드 스톱. 토큰, 지출, 경과 시간 중 어느 것이 먼저 상한에 이르든 루프를 멈춘다. 그 세부(어떻게 세는지, 어디에 계측을 넣는지)는 레슨 4로 미룬다.

이 넷을 늘어놓으면 무언가가 보입니다. 멈춘다는 결정이 모두 모델에 있는 것은 아닙니다. 1번은 모델의 것이고, 2번과 4번은 호스트의 것이며(모델이 무엇을 생각하든 표시에서 멈춥니다), 3번은 공유입니다. 그 레슨 2의 뼈대 루프는 1번만 구현하고 나머지 셋을 떨어뜨렸습니다 — 이 레슨은 가장 기본적인 하드 게이트인 2번을 더하고, 3번과 4번은 각각 레슨 5와 레슨 4에서 옵니다.

이 틀의 가치는 네 항목을 외우는 데 있지 않습니다. 습관을 들이는 데 있습니다. 루프를 쓰기 전에, 모델이 어차피 멈출 것이라는 기본 가정 아래 묻어 두는 대신, "멈춰야 하는" 조건을 명시적으로 세어 보는 것입니다.

정지 조건은 값싼 보험이지, 과잉 설계가 아닙니다

누군가는 이 게이트들이 단순한 루프를 복잡한 것으로 만든다고 투덜댈지 모릅니다. 그것은 Anthropic이 거듭 돌아오는 원칙을 끌어냅니다. "you should consider adding complexity only when it demonstrably improves outcomes."(복잡성은 그것이 결과를 입증 가능하게 개선할 때에만 더하는 것을 고려해야 한다)2 그 줄은 대개 정교한 장치를 잔뜩 쌓는 것을 말리려고 인용되지만, 정지 조건에 대해서는 반대 방향을 가리킵니다 — 그것을 통과시킵니다.

산수를 해 보면 명백합니다. 최대 턴 카운터는 루프 밖의 선언 하나와 안의 비교 하나, 코드 몇 줄입니다. 그것이 막는 것 — 멈추지 않고 계속 도는 루프, 통제를 벗어나 치솟는 비용, 조작되거나 잘못된 출력에 대해 취해진 되돌릴 수 없는 액션 — 은 훨씬 더 비쌉니다. 에이전트의 자율성은 이미 더 높은 비용과 에러가 누적될 가능성을 안고 있고,2 정지 조건은 그 위험을 정면으로 겨눈 가장 값싼 브레이크입니다.

그러니 정지 조건은, 결과를 입증 가능하게 개선할 때에만 더해야 하는2 그런 종류의 복잡성이 아닙니다 — 그 기준을 단번에 넘어섭니다. 그것은 최악의 경계를 "무한"에서 "유한"으로 압축하며, 그 자체가 검증 가능한 결과의 개선입니다. 그것은 자율적인 루프를 감히 돌려도 될 것으로 만드는 가장 기본적인 제어이지, 장식적인 덤이 아닙니다.

Recap

  • 루프는 end_turn 에서 자연히 끝나지만, 그것은 모델 자신의 판단이다. 그 의사결정에는 어느 정도의 신뢰만 둘 수 있을 뿐이고, 모델은 다수의 턴에 걸쳐 동작할 수 있으므로, 모델의 자기 종료만에 기대는 것으로는 부족하다2
  • 가장 기본적인 하드 게이트는 최대 턴 수다: 제어를 유지하기 위해 최대 반복 횟수 같은 명시적인 정지 조건을 포함하는 것은 흔한 방법이며2, 카운터는 라운드를 넘나들며 쌓이도록 루프의 에 앉아야 하고, 그것을 본체 안으로 옮기면 아무것도 멈추지 못하는 죽은 코드가 된다
  • 하드 스톱 너머에는 소프트 스톱 / 서스펜드가 있다: 체크포인트에서, 혹은 장애물에 부딪혔을 때 사람의 피드백을 기다리며 멈춘다2 — 종단 상태가 아니라 장면의 스냅숏에서 이어 가는 재개 가능한 일시 정지다
  • 에이전트를 설계할 때는, 먼저 어떤 조건에서 멈춰야 하는지 물으라: 작업 완료(end_turn, 모델의 판단), 턴 상한(하드 스톱, 호스트의 판단), 사람의 결정이 필요한 장애물(소프트 스톱, 공유), 예산 소진(하드 스톱, 레슨 4에서 다룸)
  • 정지 조건은 값싼 제어로 큰 보상을 낸다: 자율성은 이미 더 높은 비용과 쌓여 가는 에러를 가져오고2, 최대 턴 게이트는 바로 그 최악의 경우를 잡는다. 결과를 입증 가능하게 개선할 때에만 복잡성을 더한다는 원칙에 비추어2, 그것은 기준을 단번에 넘어선다 — 무한을 유한으로 압축하는 것은 검증 가능한 개선이다

>> 레슨 4: 폭주와 폴백: 데드 루프, 헛돎, 예산 소진

Footnotes

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

  2. Building Effective AI Agents — Anthropic Engineering — https://www.anthropic.com/engineering/building-effective-agents 2 3 4 5 6 7 8 9 10 11 12 13 14

연습

01

여러분은 "CI를 자동으로 고친다"는 에이전트를 설계하고 있습니다. 실패한 파이프라인을 집어 들고, 다음 도구를 가집니다. read_logs(로그를 읽는다), edit_file(코드를 바꾼다), run_tests(테스트를 돌린다), push(원격에 푸시해, 새 CI 실행을 촉발한다). 목표는 테스트를 초록으로 만드는 것입니다. 이것에 대해 답하십시오.

레벨 1: 에이전트의 정지 조건을 세어 보기
  1. 이 에이전트가 멈춰야 하는 조건을 적어도 넷 나열하십시오.
  2. 각각에 대해, 하드 스톱인지 소프트 스톱 / 서스펜드인지 표시하고, 멈춘다는 결정이 모델의 것인지, 호스트의 것인지, 양쪽의 것인지 말하십시오.
  3. push(원격에 푸시해 다른 사람들이 볼 수 있는 CI 실행을 촉발한다)를 사람의 승인을 기다리는 소프트 스톱으로 설계하겠습니까? 한 줄의 근거를 대십시오.
완료 기준 · 로컬에서 확인
02

동료가 루프에 최대 턴 안전장치를 두고 싶어 아래 버전을 썼습니다. 도구 호출이 한두 번 필요한 작업에서 시험해 보고 "괜찮아 보였"습니다. 하지만 모델이 end_turn 을 돌려주지 않고 같은 도구를 몇 번이고 부르기 시작하자, 이 게이트는 아무것도 잡지 못했고 루프는 계속 폭주했습니다. 근본 원인을 찾아 고치십시오.

레벨 2: 왜 이 최대 턴 게이트는 아무것도 잡지 못했는가
완료 기준 · 로컬에서 확인