본문 바로가기
C.W.K.
Stream
Lesson 02 of 06 · published

독립적인 도구 호출은 한 턴에 함께 실행해

~14 min · parallel, tool-use, concurrency

Level 0Observer
0 XP0/64 lessons0/13 achievements
0/150 XP to next level150 XP to go0% complete

한 응답에 tool_use가 여러 개 올 수 있어

“서울과 도쿄 날씨”처럼 독립된 두 작업을 물으면 Claude는 한 도우미 턴에 여러 tool_use 블록을 돌려줄 수 있어. 애플리케이션은 모두 실행한 뒤 대응하는 tool_result 블록을 사용자 턴 하나에 담아 보내. 도구 수만큼 왕복하지 않아 지연이 크게 줄어.

동시 실행은 애플리케이션 책임이야

프로토콜은 병렬 요청을 표현할 뿐 실제 실행 순서는 정하지 않아. Python에서는 asyncio.gather, TypeScript에서는 Promise.all로 독립 작업을 함께 기다릴 수 있어. 결과 배열의 위치가 아니라 tool_use_id로 원래 호출과 연결해야 해.

의존성이 있을 때만 순서를 강제해

B가 A의 결과를 필요로 하면 첫 턴에 tool_choice: {"type": "tool", "name": "A"}로 A를 지정하고 다음 턴에서 B를 실행해. 또는 disable_parallel_tool_use: True로 병렬 호출을 막을 수 있어. 대부분의 도구는 독립적이므로 실제 의존성이 확인된 곳에서만 직렬화해.

원칙: 독립적인 도구는 기본적으로 함께 실행해. 순서는 데이터 의존성이 있을 때만 비용을 지불해.

Code

모든 tool_use 블록 동시 실행·python
import asyncio, json
from anthropic import AsyncAnthropic

client = AsyncAnthropic()

async def execute(block):
    handler = HANDLERS[block.name]
    result = await handler(**block.input)
    return {
        "type": "tool_result",
        "tool_use_id": block.id,
        "content": json.dumps(result),
    }

async def round_with_parallel(messages):
    resp = await client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        tools=TOOLS,
        messages=messages,
    )
    messages.append({"role": "assistant", "content": resp.content})
    if resp.stop_reason != "tool_use":
        return resp, messages
    tool_blocks = [b for b in resp.content if b.type == "tool_use"]
    results = await asyncio.gather(*(execute(b) for b in tool_blocks))
    messages.append({"role": "user", "content": results})
    return resp, messages
특정 도구 강제 또는 병렬 비활성·python
# 모델이 이 도구를 먼저 호출하도록 강제.
resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    tools=TOOLS,
    tool_choice={"type": "tool", "name": "validate_input"},
    messages=messages,
)

# 또는 downstream operations이 독립 아닐 때 병렬 호출 비활성.
resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    tools=TOOLS,
    tool_choice={"type": "auto", "disable_parallel_tool_use": True},
    messages=messages,
)

External links

Exercise

한 라운드의 모든 tool_use를 동시에 실행하도록 루프를 고쳐. 서로 독립이고 느린 도구 세 개로 지연이 3×T에서 약 T로 줄어드는지 재.
Hint
속도가 그대로라면 처리기 안에 순차 await가 숨어 있는지 찾아.

Progress

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

댓글 0

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

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