Claude Platform Docs
Messages사고

도구 및 멀티턴 워크플로에서의 사고

사고 블록을 올바르게 보존하는 완전한 2턴 도구 사용 왕복 과정을 단계별로 살펴보고, 인터리브 사고가 흐름을 어떻게 바꾸는지 확인합니다.

이 페이지는 사고가 활성화된 상태에서 완전한 2턴 "tool use"(도구 사용) 왕복 과정을 단계별로 살펴봅니다. Claude가 사고하고, 도구 호출을 요청하고, 결과를 받은 뒤 답변을 마무리하며, 모든 단계에서 사고 블록이 올바르게 처리됩니다. 전체 규칙은 사고 페이지의 도구 사용과 함께하는 사고사고 블록 보존에 있으며, 이 페이지는 해당 규칙을 실행 가능한 코드에 적용한 모습을 보여줍니다.

이 안내에서 적용하는 규칙

각 링크는 사고 페이지의 전체 설명으로 연결됩니다:

샘플은 적응형 사고를 사용합니다. 확장 사고만 지원하는 모델에서는 thinking: {type: "enabled", budget_tokens: N}으로 대체하세요. 왕복 규칙은 동일합니다.

2턴 도구 사용 왕복 과정 살펴보기

이 예제는 get_weather 도구를 정의하고, Claude가 사고한 뒤 도구 호출을 요청하게 한 다음, 사고 블록을 포함하여 받은 그대로 정확히 되돌린 어시스턴트 턴과 함께 도구 결과를 반환합니다.

  1. 도구를 사용 가능하게 하여 첫 번째 요청 보내기

    적응형 사고를 활성화하고 도구를 정의한 요청을 보냅니다. thinking 파라미터를 제외하면 이는 표준 도구 사용 요청입니다:

    
    client = anthropic.Anthropic()
    
    weather_tool = {
        "name": "get_weather",
        "description": "Get current weather for a location",
        "input_schema": {
            "type": "object",
            "properties": {"location": {"type": "string", "description": "City name"}},
            "required": ["location"],
        },
    }
    
    # 첫 번째 요청 - Claude가 사고 과정과 도구 요청으로 응답합니다
    response = client.messages.create(
        model="claude-opus-4-8",
        max_tokens=16000,
        thinking={"type": "adaptive"},
        tools=[weather_tool],
        messages=[{"role": "user", "content": "What's the weather in Paris?"}],
    )
    print(response)
  2. 되돌려 보낼 content 배열 캡처하기

    Claude가 사고하기로 선택한 실행에서는 응답 content에 thinking, text, tool_use 블록이 표시됩니다(더 단순한 요청에서는 적응형 모드가 사고 블록을 건너뛸 수 있습니다). 이 content 배열을 그대로 유지하세요. 다음 단계에서 이를 그대로 다시 보냅니다.

    Output
    {
      "content": [
        {
          "type": "thinking",
          "thinking": "The user wants to know the current weather in Paris. I have access to a function `get_weather`...",
          "signature": "BDaL4VrbR2Oj0hO4XpJxT28J5T...."
        },
        {
          "type": "text",
          "text": "I can help you get the current weather information for Paris. Let me check that for you"
        },
        {
          "type": "tool_use",
          "id": "toolu_01CswdEQBMshySk6Y9DFKrfq",
          "name": "get_weather",
          "input": {
            "location": "Paris"
          }
        }
      ]
    }
  3. 어시스턴트 턴을 그대로 되돌리며 도구 결과 반환하기

    여러분 측에서 도구를 실행한 다음, 대화에 두 개의 메시지를 추가하는 두 번째 요청을 보냅니다. 첫 번째는 받은 그대로 정확히 되돌린 어시스턴트 content로, 사고 블록이 tool_use 블록과 함께 변경 없이 유지됩니다. 두 번째는 tool_result를 담은 사용자 메시지입니다.

    각 샘플은 독립적으로 실행되는 스크립트입니다. 첫 번째 요청을 반복한 다음, 방금 받은 응답을 사용하여 즉시 후속 요청을 보냅니다.

    
    client = anthropic.Anthropic()
    weather_tool = {
        "name": "get_weather",
        "description": "Get current weather for a location",
        "input_schema": {
            "type": "object",
            "properties": {"location": {"type": "string", "description": "City name"}},
            "required": ["location"],
        },
    }
    response = client.messages.create(
        model="claude-opus-4-8",
        max_tokens=16000,
        thinking={"type": "adaptive"},
        tools=[weather_tool],
        messages=[{"role": "user", "content": "What's the weather in Paris?"}],
    )
    # 도구 결과에 사용할 ID를 얻기 위해 도구 사용 블록을 추출합니다
    tool_use_block = next(block for block in response.content if block.type == "tool_use")
    
    # 실제 날씨 API를 호출합니다. 실제 API 호출이 들어갈 위치입니다
    # 이것이 반환된 결과라고 가정합니다
    weather_data = {"temperature": 88}
    
    # 두 번째 요청 - 어시스턴트 턴과 도구 결과를 포함합니다
    continuation = client.messages.create(
        model="claude-opus-4-8",
        max_tokens=16000,
        thinking={"type": "adaptive"},
        tools=[weather_tool],
        messages=[
            {"role": "user", "content": "What's the weather in Paris?"},
            # 어시스턴트 콘텐츠를 받은 그대로 다시 전달합니다. thinking
            # 블록이 있는 경우 반드시 tool_use 블록과 함께 포함해야 합니다.
            {"role": "assistant", "content": response.content},
            {
                "role": "user",
                "content": [
                    {
                        "type": "tool_result",
                        "tool_use_id": tool_use_block.id,
                        "content": f"Current temperature: {weather_data['temperature']}°F",
                    }
                ],
            },
        ],
    )
    print(continuation)
  4. 최종 응답 읽기

    Claude가 텍스트로 턴을 완료하는 것을 볼 수 있습니다. 적응형 모드에서는 인터리브 사고가 자동이므로, 이어지는 응답이 최종 텍스트 앞에 새로운 사고 블록으로 시작할 수도 있습니다:

    Output
    {
      "content": [
        {
          "type": "text",
          "text": "Currently in Paris, the temperature is 88°F (31°C)"
        }
      ]
    }

인터리브 사고가 흐름을 바꾸는 방식

"Interleaved thinking"(인터리브 사고)은 Claude가 도구 호출 사이에 사고하여, 각 도구 결과에 따라 행동하기 전에 그 결과에 대해 추론할 수 있게 합니다. 개념과 모델별 지원 여부는 사고 페이지의 인터리브 사고에서 다룹니다. 인터리빙은 사고 블록이 나타나는 위치를 바꿀 뿐, 도구 호출을 연쇄할 수 있는지 여부를 바꾸지는 않습니다. 다음 비교는 두 개의 도구를 사용하는 워크플로에서 인터리브 사고가 무엇을 바꾸는지 보여줍니다:

다음 단계

개요: 사고를 켜고, 사고 출력을 읽고, 도구 사용, 캐싱, 스트리밍에 대한 전체 규칙을 검토합니다.

노력 수준과 프롬프트 기반 안내를 통해 Claude가 얼마나 자주, 얼마나 깊이 사고할지 조정합니다.

이전 모델에서의 수동 사고 예산: budget_tokens 동작 방식과 적응형으로의 마이그레이션.

Was this page helpful?