Sign in to save your progressYou can keep reading without an account, but completed lessons won't be saved.
Sign in

Claude의 도구 호출 기능을 사용할 때, Claude가 하나의 어시스턴트 메시지에 여러 개의 도구 사용 블록을 포함할 수 있다는 것을 알게 될 수 있습니다. 이를 통해 Claude는 각 도구마다 별도의 요청을 하는 대신 여러 도구를 병렬로 실행할 수 있습니다. 하지만 실제로 Claude가 이를 일관되게 수행하도록 만드는 것은 쉽지 않을 수 있습니다.

여러 도구 호출의 문제점

같은 날짜에 두 개의 알림을 설정하도록 Claude에게 요청한다고 가정해 보겠습니다. 이론적으로는 Claude가 각 알림에 대해 하나씩, 총 두 개의 도구 사용 블록을 포함한 단일 응답을 보낼 수 있어야 합니다. 하지만 실제로는 Claude가 대신 별도의 응답을 보내는 경우가 많습니다.

일반적으로 발생하는 현상은 Claude가 첫 번째 도구 호출을 수행하고, 결과를 기다린 다음, 후속 메시지에서 두 번째 도구 호출을 수행하는 것입니다. 이는 동시에 수행할 수 있었던 작업에 대해 불필요한 주고받기식 통신을 발생시킵니다.

배치 도구 솔루션

해결책은 "배치 도구(batch tool)"를 구현하는 것입니다. 이는 동시에 실행할 다른 도구 호출 목록을 받는 특수한 도구입니다. 이는 본질적으로 Claude가 한 번에 여러 도구 호출을 하도록 유도하는 일종의 우회 방법입니다.

작동 방식은 다음과 같습니다:

  • Claude에게 다른 여러 도구를 병렬로 실행할 수 있다고 알려주는 배치 도구 스키마를 정의합니다
  • Claude는 도구를 직접 호출하는 대신, 도구 호출 목록과 함께 배치 도구를 호출합니다
  • 여러분의 코드는 이 목록을 처리하고 각 도구 호출을 실행합니다
  • 결합된 결과를 Claude에게 반환합니다

배치 도구 스키마 구현하기

배치 도구 스키마는 Claude가 여러 도구를 실행하려고 할 때 요청을 어떻게 구성해야 하는지를 정의합니다:

python
batch_tool_schema = {
    "name": "batch_tool",
    "description": "Invoke multiple other tool calls simultaneously",
    "input_schema": {
        "type": "object",
        "properties": {
            "invocations": {
                "type": "array",
                "description": "The tool calls to invoke",
                "items": {
                    "type": "object",
                    "properties": {
                        "name": {
                            "type": "string",
                            "description": "The name of the tool to invoke"
                        },
                        "arguments": {
                            "type": "object",
                            "description": "The arguments to pass to the tool"
                        }
                    }
                }
            }
        }
    }
}

배치 도구 호출 처리하기

Claude가 배치 도구를 사용할 때, 여러분은 호출 목록을 처리하고 각각을 실행해야 합니다. 구현 방법은 다음과 같습니다:

python
def run_batch(invocations=[]):
    batch_output = []
    
    for invocation in invocations:
        name = invocation["name"]
        args = json.loads(invocation["arguments"])
        
        tool_output = run_tool(name, args)
        
        batch_output.append({
            "tool_name": name,
            "output": tool_output
        })
    
    return batch_output

또한 배치 도구 호출을 처리하도록 메인 도구 라우팅 함수를 업데이트해야 합니다:

python
def run_tool(tool_name, tool_input):
    if tool_name == "get_current_datetime":
        return get_current_datetime(**tool_input)
    elif tool_name == "add_duration_to_datetime":
        return add_duration_to_datetime(**tool_input)
    elif tool_name == "set_reminder":
        return set_reminder(**tool_input)
    elif tool_name == "batch_tool":
        return run_batch(**tool_input)

결과

배치 도구를 구현하면, Claude가 관련 작업들을 함께 그룹화할 가능성이 훨씬 높아집니다. 각 알림에 대해 별도의 요청을 하는 대신, Claude는 배치 도구를 사용하여 두 알림을 동시에 설정합니다.

대화 흐름이 훨씬 깔끔해집니다 - 사용자로부터의 요청 하나, 배치 도구 호출이 포함된 Claude의 응답 하나, 그리고 모든 결과가 담긴 후속 메시지 하나로 이루어집니다. 이는 지연 시간을 줄이고 애플리케이션을 더 효율적으로 만듭니다.

우회 방법처럼 보일 수 있지만(실제로 그렇습니다), 배치 도구 패턴은 Claude가 병렬화할 수 있는 작업을 고려하고 이를 더 효율적으로 실행하도록 유도하는 효과적인 방법입니다.