iBetter Books
수정

종료 조건과 반복 깊이

루프를 시작하는 것보다 어렵고, 시험에서 더 자주 출제되는 것은 루프를 언제 멈추느냐다. 종료 판단의 1차 신호는 응답의 stop_reason이다. 이 값이 무엇이냐에 따라 루프를 계속 돌릴지, 끝낼지, 다른 처리를 할지가 갈린다. 그런데 모든 stop_reason이 곧 종료를 뜻하지는 않는다는 점이 함정의 핵심이다.

먼저 모델이 정의하는 종료 신호인 stop_reason 값들을 정리한다. end_turn은 모델이 자연스럽게 답을 마친 경우로, 도구 요청 없이 텍스트로 끝났다는 뜻이며 루프를 종료한다. tool_use는 모델이 도구를 요청한 경우로, 루프를 계속 돌려야 한다. 여기까지는 직관적이다. 함정은 pause_turn이다. pause_turn은 오래 걸리는 턴이 잠시 멈춘 것으로, 종료가 아니라 재개 신호다. 이 응답을 그대로 다음 요청에 다시 담아 보내면 모델이 이어서 작업을 계속한다. 따라서 pause_turn을 종료 조건으로 처리하면 작업이 중간에 끊긴다. 시험은 "다음 중 루프를 계속해야 하는 stop_reason은", "pause_turn을 받으면 무엇을 해야 하는가"를 묻는다. 정답은 재개, 즉 루프 계속이다.

나머지 값들도 구별해서 다뤄야 한다. max_tokens는 출력 토큰 한계에 걸려 잘린 경우로, 단순 종료가 아니라 응답이 불완전할 수 있으니 이어 받기나 한계 상향 같은 별도 처리가 필요하다. stop_sequence는 지정한 중지 문자열을 만난 경우다. refusal은 안전 분류기가 개입해 생성을 멈춘 경우로, 정상 완료가 아니므로 재시도가 아니라 입력을 점검해야 한다. 이 외에도 컨텍스트 관리와 관련된 값(예: compaction, model_context_window_exceeded)이 베타 기능 맥락에서 나타날 수 있으나, 핵심 구별은 end_turn(완료), tool_use(계속), pause_turn(재개로 계속)이다.

아래 표가 시험 대비 핵심 요약이다.

stop_reason 의미 루프 처리
end_turn 도구 없이 자연 종료 종료, 작업 완료
tool_use 도구 요청 계속, 도구 실행 후 회신
pause_turn 긴 턴의 일시 중지 계속, 응답을 다시 보내 재개
max_tokens 출력 한계 도달 불완전, 이어 받기 등 별도 처리
refusal 안전 분류기 개입 종료, 입력 점검
%% stop_reason 분기 flowchart TB R["응답 수신"] Q{"stop_reason?"} A["end_turn\n작업 완료, 루프 종료"] B["tool_use\n도구 실행 후 계속"] C["pause_turn\n응답 그대로 재전송, 재개"] D["max_tokens\n불완전, 이어받기·한도 상향"] E["refusal\n입력 점검, 재시도 금지"] R --> Q Q --> A Q --> B Q --> C Q --> D Q --> E

stop_reason이 모델 측 신호라면, 반복 깊이 제한은 클라이언트 측 안전장치다. 모델이 종료 신호를 내지 못하고 도구를 끝없이 요청하는 상황, 즉 무한 루프와 그에 따른 비용 폭주를 막기 위해 애플리케이션이 최대 반복 횟수를 둔다. 이 한계는 모델이 정하는 것이 아니라 클라이언트 코드가 정한다는 점이 중요하다. 시험에서 "무한 루프를 어떻게 방지하는가"의 정답은 클라이언트 측 반복 한계이며, 이를 모델 파라미터로 오인하면 틀린다.

# 새 파일: agent/terminate.pydef step(messages, tools):    response = client.messages.create(        model="claude-opus-4-8",        max_tokens=4096,        messages=messages,        tools=tools,    )    messages.append({"role": "assistant", "content": response.content})    if response.stop_reason == "tool_use":        return "continue", response    if response.stop_reason == "pause_turn":        return "continue", response  # 재개 신호이므로 다시 보냄    return "done", response  # end_turn 등은 종료로 처리

정리하면 종료 판단은 두 축이다. 하나는 stop_reason이라는 모델 신호이고, 다른 하나는 반복 깊이 제한이라는 클라이언트 안전장치다. 가장 흔한 실수는 pause_turn을 종료로 오인하는 것, 그리고 무한 루프 방지를 모델 설정으로 처리하려는 것이다. 두 함정을 피하면 이 절의 출제 포인트는 대부분 막을 수 있다.

정리

  • 종료 판단의 1차 신호는 stop_reason이며, end_turn은 완료, tool_use는 계속, pause_turn은 재개로 계속을 뜻한다.
  • pause_turn을 종료로 처리하면 작업이 끊긴다. 응답을 다시 보내 재개해야 한다. 시험의 단골 함정이다.
  • max_tokens는 불완전 종료라 별도 처리가 필요하고, refusal은 입력 점검이 필요하며 단순 재시도 대상이 아니다.
  • 무한 루프와 비용 폭주를 막는 반복 깊이 제한은 모델 파라미터가 아니라 클라이언트 코드가 두는 안전장치다.
  • 종료 설계는 모델 신호(stop_reason)와 클라이언트 안전장치(반복 한계)라는 두 축으로 이해해야 한다.