본문 바로가기
C.W.K.
Stream
Lesson 03 of 05 · published

Tool Choice 와 Agentic Loop

~22 min · tool-choice, auto, any, loop

Level 0호기심 많은 독자
0 XP0/48 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

Tool 리스트를 깔았으면 다음은 tool choice 야. 이번 turn 에 모델한테 자유를 얼마나 줄 거냐는 얘기지. Major provider 는 다 같은 세 모드를 이름만 바꿔서 내놔.

  • auto (기본값): tool 을 부를지 그냥 텍스트로 답할지 모델이 알아서 골라. 평범한 대화형 agent 는 이걸로 충분해.
  • any / required: 뭐가 됐든 tool 은 하나 불러야 해 — 맨 텍스트 답변은 막혀. 다음 step 이 tool 결과를 꼭 받아야 하는 구조일 때 써 (예를 들면 늘 라우팅 판단을 내려야 하는 router).
  • specific tool: 특정 tool 하나를 못박아. 정해진 순서로 도는 workflow 의 첫 turn 용이야 ("무조건 plan_steps 부터").

Tool choice 는 agentic loop 의 압력 밸브야. 가장 흔한 버그 — 아무것도 안 하면서 철학만 늘어놓는 agent — 는 첫 turn 을 any 나 특정 tool 로 바꾸면 잡혀. 반대쪽 흔한 버그 — 같은 tool 만 무한히 부르는 agent — 는 첫 turn 이후에 auto 로 풀어주면 모델이 멈추고 답할 수 있게 돼.

Agentic loop 는 그 판단들 위에 뼈대를 세워줘. 튼튼한 loop 에는 안전장치가 셋 있어. max_turns 상한 — 잘못 쓴 description 하나가 영원히 도는 loop 로 번지지 않게. error feedback 경로 — tool 이 예외를 던지면 그 에러를 tool result 로 모델한테 돌려줘서 스스로 고쳐잡게. 그리고 production 이라면 cost guard — 토큰이나 시간이 선을 넘으면 멈추고 물어봐. 이건 미리 최적화하는 게 아니라, 스스로 회복하는 agent 와 조용히 죽는 agent 를 가르는 차이야.

Code

Tool choice — provider 셋, 같은 생각·python
# Anthropic
client.messages.create(..., tool_choice={"type": "any"})
client.messages.create(..., tool_choice={"type": "tool", "name": "plan_steps"})

# OpenAI Responses
client.responses.create(..., tool_choice="required")
client.responses.create(..., tool_choice={"type": "function", "name": "plan_steps"})

# Gemini
GenerationConfig(tool_config=ToolConfig(function_calling_config=FunctionCallingConfig(mode="ANY")))
에러를 되돌려주는 loop·python
def call_tool_safely(name, args, executors):
    try:
        return {"ok": True, "result": executors[name](**args)}
    except Exception as e:
        return {"ok": False, "error": f"{type(e).__name__}: {e}"}

# Loop 안에서 에러 결과를 tool_result 로 — 'content' 에 실패 메시지 담아서 —
# 돌려줘. 모델은 retry 할지 tool 바꿀지 user 한테 사과할지 알아서 결정해.

External links

Exercise

Tool 두 개로 agent 를 짜. 항상 성공하는 'lookup' 과 항상 예외를 던지는 'broken'. Broken 을 고르게 만드는 prompt 로 돌려봐. 에러를 tool_result 로 돌려줬을 때 모델이 'lookup' 으로 갈아타서 회복하는지 — loop 가 죽지 않고 — 확인해. 그 회복 경로가 네 loop 가 실패 앞에서 정직한지 보는 test 야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.