모델 선택

일반적으로 복잡한 도구와 모호한 쿼리에는 Claude Opus 4, Claude Sonnet 4, Claude Sonnet 3.7, Claude Sonnet 3.5 또는 Claude Opus 3을 사용하세요. 이들은 여러 도구를 더 잘 처리하고 필요할 때 명확화를 요청합니다.

간단한 도구에는 Claude Haiku 3.5 또는 Claude Haiku 3을 사용하되, 누락된 매개변수를 추론할 수 있다는 점에 유의하세요.

도구 사용과 확장된 사고 기능을 함께 사용하는 Claude Sonnet 3.7을 사용하는 경우, 자세한 정보는 여기의 가이드를 참조하세요.

클라이언트 도구 지정

클라이언트 도구(Anthropic 정의 도구와 사용자 정의 도구 모두)는 API 요청의 tools 최상위 매개변수에서 지정됩니다. 각 도구 정의에는 다음이 포함됩니다:

매개변수설명
name도구의 이름. ^[a-zA-Z0-9_-]{1,64}$ 정규식과 일치해야 합니다.
description도구가 무엇을 하는지, 언제 사용해야 하는지, 어떻게 작동하는지에 대한 자세한 일반 텍스트 설명.
input_schema도구에 대한 예상 매개변수를 정의하는 JSON Schema 객체.

도구 사용 시스템 프롬프트

tools 매개변수와 함께 Anthropic API를 호출하면, 도구 정의, 도구 구성 및 사용자 지정 시스템 프롬프트로부터 특별한 시스템 프롬프트를 구성합니다. 구성된 프롬프트는 모델이 지정된 도구를 사용하고 도구가 제대로 작동하는 데 필요한 컨텍스트를 제공하도록 지시하기 위해 설계되었습니다:

이 환경에서는 사용자의 질문에 답하기 위해 사용할 수 있는 도구 세트에 액세스할 수 있습니다.
{{ 형식 지침 }}
문자열 및 스칼라 매개변수는 그대로 지정해야 하며, 목록과 객체는 JSON 형식을 사용해야 합니다. 문자열 값의 공백은 제거되지 않습니다. 출력은 유효한 XML일 필요가 없으며 정규 표현식으로 파싱됩니다.
다음은 JSONSchema 형식으로 사용 가능한 함수들입니다:
{{ JSON SCHEMA의 도구 정의 }}
{{ 사용자 시스템 프롬프트 }}
{{ 도구 구성 }}

도구 정의 모범 사례

도구를 사용할 때 Claude에서 최상의 성능을 얻으려면 다음 지침을 따르세요:

  • 매우 자세한 설명을 제공하세요. 이것이 도구 성능에서 가장 중요한 요소입니다. 설명에는 도구에 대한 모든 세부 사항이 포함되어야 합니다:
    • 도구가 무엇을 하는지
    • 언제 사용해야 하는지(그리고 언제 사용하지 말아야 하는지)
    • 각 매개변수가 무엇을 의미하고 도구의 동작에 어떤 영향을 미치는지
    • 도구 이름이 불분명한 경우 도구가 반환하지 않는 정보와 같은 중요한 주의사항이나 제한사항. Claude에게 도구에 대한 더 많은 컨텍스트를 제공할수록 언제 어떻게 사용할지 더 잘 결정할 수 있습니다. 도구 설명당 최소 3-4문장을 목표로 하고, 도구가 복잡한 경우 더 많이 작성하세요.
  • 예제보다 설명을 우선시하세요. 설명이나 함께 제공되는 프롬프트에 도구 사용 방법의 예제를 포함할 수 있지만, 이는 도구의 목적과 매개변수에 대한 명확하고 포괄적인 설명을 갖는 것보다 덜 중요합니다. 설명을 완전히 작성한 후에만 예제를 추가하세요.

좋은 설명은 도구가 무엇을 하는지, 언제 사용하는지, 어떤 데이터를 반환하는지, ticker 매개변수가 무엇을 의미하는지 명확하게 설명합니다. 나쁜 설명은 너무 간단하고 Claude가 도구의 동작과 사용법에 대해 많은 의문을 갖게 합니다.

Claude의 출력 제어

도구 사용 강제

경우에 따라 Claude가 도구를 사용하지 않고도 답변을 제공할 수 있다고 생각하더라도 사용자의 질문에 답하기 위해 특정 도구를 사용하도록 하고 싶을 수 있습니다. 다음과 같이 tool_choice 필드에서 도구를 지정하여 이를 수행할 수 있습니다:

tool_choice = {"type": "tool", "name": "get_weather"}

tool_choice 매개변수를 사용할 때 네 가지 가능한 옵션이 있습니다:

  • auto는 Claude가 제공된 도구를 호출할지 여부를 결정할 수 있게 합니다. 이는 tools가 제공될 때의 기본값입니다.
  • any는 Claude가 제공된 도구 중 하나를 반드시 사용해야 한다고 알려주지만 특정 도구를 강제하지는 않습니다.
  • tool은 Claude가 항상 특정 도구를 사용하도록 강제할 수 있게 합니다.
  • none은 Claude가 어떤 도구도 사용하지 못하게 합니다. 이는 tools가 제공되지 않을 때의 기본값입니다.

프롬프트 캐싱을 사용할 때 tool_choice 매개변수의 변경은 캐시된 메시지 블록을 무효화합니다. 도구 정의와 시스템 프롬프트는 캐시된 상태로 유지되지만 메시지 내용은 다시 처리되어야 합니다.

이 다이어그램은 각 옵션이 어떻게 작동하는지 보여줍니다:

tool_choiceany 또는 tool일 때 도구를 강제로 사용하도록 어시스턴트 메시지를 미리 채웁니다. 이는 명시적으로 요청하더라도 모델이 tool_use 콘텐츠 블록 전에 연쇄 사고 text 콘텐츠 블록을 출력하지 않는다는 것을 의미합니다.

도구 사용과 함께 확장된 사고를 사용할 때 tool_choice: {"type": "any"}tool_choice: {"type": "tool", "name": "..."}는 지원되지 않으며 오류가 발생합니다. 확장된 사고와 호환되는 것은 tool_choice: {"type": "auto"}(기본값)와 tool_choice: {"type": "none"}뿐입니다.

우리의 테스트에 따르면 이것이 성능을 저하시키지 않아야 합니다. 모델이 특정 도구를 사용하도록 요청하면서 연쇄 사고를 유지하고 싶다면(특히 Opus의 경우) tool_choice{"type": "auto"}(기본값)를 사용하고 user 메시지에 명시적인 지시를 추가할 수 있습니다. 예: 런던의 날씨는 어떤가요? 응답에서 get_weather 도구를 사용하세요.

JSON 출력

도구가 반드시 클라이언트 함수일 필요는 없습니다. 제공된 스키마를 따르는 JSON 출력을 모델이 반환하도록 하고 싶을 때마다 도구를 사용할 수 있습니다. 예를 들어, 특정 스키마를 가진 record_summary 도구를 사용할 수 있습니다. 완전한 작동 예제는 Claude와 도구 사용을 참조하세요.

연쇄 사고

도구를 사용할 때 Claude는 종종 “연쇄 사고”를 보여줍니다. 즉, 문제를 분해하고 어떤 도구를 사용할지 결정하는 데 사용하는 단계별 추론입니다. Claude Opus 3 모델은 tool_choiceauto로 설정된 경우 이를 수행합니다(이는 기본값입니다. 도구 사용 강제 참조). Sonnet과 Haiku는 프롬프트를 통해 이를 수행하도록 유도할 수 있습니다.

예를 들어, “지금 샌프란시스코의 날씨는 어떻고, 그곳의 시간은 몇 시인가요?”라는 프롬프트가 주어지면 Claude는 다음과 같이 응답할 수 있습니다:

JSON
{
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "<thinking>이 질문에 답하기 위해 다음을 수행하겠습니다: 1. get_weather 도구를 사용하여 샌프란시스코의 현재 날씨를 가져옵니다. 2. get_time 도구를 사용하여 샌프란시스코, CA를 포함하는 America/Los_Angeles 시간대의 현재 시간을 가져옵니다.</thinking>"
    },
    {
      "type": "tool_use",
      "id": "toolu_01A09q90qw90lq917835lq9",
      "name": "get_weather",
      "input": {"location": "San Francisco, CA"}
    }
  ]
}

이 연쇄 사고는 Claude의 추론 과정에 대한 통찰을 제공하고 예상치 못한 동작을 디버깅하는 데 도움이 될 수 있습니다.

Claude Sonnet 3 모델의 경우 기본적으로 연쇄 사고가 덜 일반적이지만, 사용자 메시지나 시스템 프롬프트에 "답변하기 전에 <thinking> 태그에서 단계별로 추론을 설명하세요."와 같은 내용을 추가하여 Claude가 추론을 보여주도록 프롬프트할 수 있습니다.

<thinking> 태그는 Claude가 연쇄 사고를 나타내는 데 사용하는 일반적인 관례이지만, 정확한 형식(예: 이 XML 태그의 이름)은 시간이 지남에 따라 변경될 수 있다는 점에 유의하는 것이 중요합니다. 코드는 연쇄 사고를 다른 어시스턴트 생성 텍스트처럼 처리해야 하며, <thinking> 태그의 존재나 특정 형식에 의존해서는 안 됩니다.

병렬 도구 사용

기본적으로 Claude는 사용자 쿼리에 답하기 위해 여러 도구를 사용할 수 있습니다. 다음과 같이 이 동작을 비활성화할 수 있습니다:

  • tool_choice 유형이 auto일 때 disable_parallel_tool_use=true로 설정하면 Claude가 최대 하나의 도구를 사용하도록 보장합니다
  • tool_choice 유형이 any 또는 tool일 때 disable_parallel_tool_use=true로 설정하면 Claude가 정확히 하나의 도구를 사용하도록 보장합니다

병렬 도구 사용 최대화

Claude 4 모델은 기본적으로 뛰어난 병렬 도구 사용 기능을 가지고 있지만, 타겟 프롬프팅으로 모든 모델에서 병렬 도구 실행 가능성을 높일 수 있습니다:

Claude Sonnet 3.7의 병렬 도구 사용

Claude Sonnet 3.7은 disable_parallel_tool_use를 설정하지 않았더라도 응답에서 병렬 도구 호출을 할 가능성이 낮을 수 있습니다. 이를 해결하려면 Claude가 병렬 도구를 사용하도록 장려하는 데 도움이 되는 토큰 효율적인 도구 사용을 활성화하는 것을 권장합니다. 이 베타 기능은 또한 지연 시간을 줄이고 출력 토큰을 평균 14% 절약합니다.

토큰 효율적인 도구 사용 베타를 선택하지 않으려면 다른 도구에 대한 호출을 동시에 래핑하는 메타 도구 역할을 할 수 있는 “배치 도구”를 도입할 수도 있습니다. 이 도구가 있으면 모델이 이를 사용하여 여러 도구를 병렬로 동시에 호출한다는 것을 발견했습니다.

이 해결 방법을 사용하는 방법은 쿡북의 이 예제를 참조하세요.

도구 사용 및 도구 결과 콘텐츠 블록 처리

Claude의 응답은 클라이언트 도구를 사용하는지 서버 도구를 사용하는지에 따라 다릅니다.

클라이언트 도구의 결과 처리

응답은 tool_usestop_reason과 다음을 포함하는 하나 이상의 tool_use 콘텐츠 블록을 가집니다:

  • id: 이 특정 도구 사용 블록에 대한 고유 식별자. 나중에 도구 결과를 매칭하는 데 사용됩니다.
  • name: 사용되는 도구의 이름.
  • input: 도구의 input_schema에 맞는 도구에 전달되는 입력을 포함하는 객체.

클라이언트 도구에 대한 도구 사용 응답을 받으면 다음을 수행해야 합니다:

  1. tool_use 블록에서 name, id, input을 추출합니다.
  2. 해당 도구 이름에 해당하는 코드베이스의 실제 도구를 실행하여 도구 input을 전달합니다.
  3. user 역할과 tool_result 유형을 포함하는 콘텐츠 블록이 있는 새 메시지를 보내 대화를 계속합니다:
    • tool_use_id: 이것이 결과인 도구 사용 요청의 id.
    • content: 문자열로서의 도구 결과(예: "content": "15도") 또는 중첩된 콘텐츠 블록 목록(예: "content": [{"type": "text", "text": "15도"}]). 이러한 콘텐츠 블록은 text 또는 image 유형을 사용할 수 있습니다.
    • is_error(선택사항): 도구 실행이 오류를 발생시킨 경우 true로 설정합니다.

중요한 형식 요구사항:

  • 도구 결과 블록은 메시지 기록에서 해당 도구 사용 블록 바로 다음에 와야 합니다. 어시스턴트의 도구 사용 메시지와 사용자의 도구 결과 메시지 사이에 다른 메시지를 포함할 수 없습니다.
  • 도구 결과를 포함하는 사용자 메시지에서 tool_result 블록은 콘텐츠 배열에서 먼저 와야 합니다. 모든 텍스트는 모든 도구 결과 다음에 와야 합니다.

예를 들어, 다음은 400 오류를 발생시킵니다:

{"role": "user", "content": [
  {"type": "text", "text": "결과는 다음과 같습니다:"},  // ❌ tool_result 전의 텍스트
  {"type": "tool_result", "tool_use_id": "toolu_01", ...}
]}

다음이 올바릅니다:

{"role": "user", "content": [
  {"type": "tool_result", "tool_use_id": "toolu_01", ...},
  {"type": "text", "text": "다음에 무엇을 해야 하나요?"}  // ✅ tool_result 다음의 텍스트
]}

“tool_use ids were found without tool_result blocks immediately after”와 같은 오류가 발생하면 도구 결과가 올바르게 형식화되었는지 확인하세요.

도구 결과를 받은 후 Claude는 해당 정보를 사용하여 원래 사용자 프롬프트에 대한 응답을 계속 생성합니다.

서버 도구의 결과 처리

Claude는 내부적으로 도구를 실행하고 추가 사용자 상호작용 없이 결과를 응답에 직접 통합합니다.

다른 API와의 차이점

도구 사용을 분리하거나 tool 또는 function과 같은 특수 역할을 사용하는 API와 달리 Anthropic의 API는 도구를 userassistant 메시지 구조에 직접 통합합니다.

메시지는 text, image, tool_use, tool_result 블록의 배열을 포함합니다. user 메시지는 클라이언트 콘텐츠와 tool_result를 포함하고, assistant 메시지는 AI 생성 콘텐츠와 tool_use를 포함합니다.

max_tokens 중지 이유 처리

Claude의 응답이 max_tokens 제한에 도달하여 잘린 경우 잘린 응답에 불완전한 도구 사용 블록이 포함되어 있으면 전체 도구 사용을 얻기 위해 더 높은 max_tokens 값으로 요청을 다시 시도해야 합니다.

# 도구 사용 중 응답이 잘렸는지 확인
if response.stop_reason == "max_tokens":
    # 마지막 콘텐츠 블록이 불완전한 tool_use인지 확인
    last_block = response.content[-1]
    if last_block.type == "tool_use":
        # 더 높은 max_tokens로 요청 보내기
        response = client.messages.create(
            model="claude-opus-4-20250514",
            max_tokens=4096,  # 증가된 제한
            messages=messages,
            tools=tools
        )

pause_turn 중지 이유 처리

웹 검색과 같은 서버 도구를 사용할 때 API는 pause_turn 중지 이유를 반환할 수 있으며, 이는 API가 장시간 실행되는 턴을 일시 중지했음을 나타냅니다.

다음은 pause_turn 중지 이유를 처리하는 방법입니다:

import anthropic

client = anthropic.Anthropic()

# 웹 검색을 사용한 초기 요청
response = client.messages.create(
    model="claude-3-7-sonnet-latest",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": "2025년 양자 컴퓨팅 혁신에 대한 포괄적인 정보를 검색하세요"
        }
    ],
    tools=[{
        "type": "web_search_20250305",
        "name": "web_search",
        "max_uses": 10
    }]
)

# 응답에 pause_turn 중지 이유가 있는지 확인
if response.stop_reason == "pause_turn":
    # 일시 중지된 콘텐츠로 대화 계속
    messages = [
        {"role": "user", "content": "2025년 양자 컴퓨팅 혁신에 대한 포괄적인 정보를 검색하세요"},
        {"role": "assistant", "content": response.content}
    ]
    
    # 계속 요청 보내기
    continuation = client.messages.create(
        model="claude-3-7-sonnet-latest",
        max_tokens=1024,
        messages=messages,
        tools=[{
            "type": "web_search_20250305",
            "name": "web_search",
            "max_uses": 10
        }]
    )
    
    print(continuation)
else:
    print(response)

pause_turn을 처리할 때:

  • 대화 계속: 일시 중지된 응답을 후속 요청에서 그대로 다시 전달하여 Claude가 턴을 계속하도록 합니다
  • 필요시 수정: 대화를 중단하거나 방향을 바꾸고 싶다면 계속하기 전에 콘텐츠를 선택적으로 수정할 수 있습니다
  • 도구 상태 보존: 기능을 유지하기 위해 계속 요청에 동일한 도구를 포함합니다

오류 문제 해결

Claude와 도구를 사용할 때 발생할 수 있는 몇 가지 다른 유형의 오류가 있습니다: