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

여러 도구를 사용하는 애플리케이션을 구축할 때는 Claude가 하나의 사용자 질문에 답하기 위해 여러 도구를 순차적으로 호출해야 하는 상황을 처리해야 합니다. 예를 들어, 사용자가 "오늘부터 103일 후는 무슨 요일인가요?"라고 질문하면, Claude는 먼저 현재 날짜를 가져온 다음 여기에 103일을 더해야 합니다.

이는 Claude가 최종 답변을 제공하기 전에 여러 번의 도구 요청을 수행하는 다중 턴 대화 패턴을 만들어냅니다. 애플리케이션은 이를 자동으로 처리해야 합니다.

다중 턴 도구 패턴

Claude가 여러 도구를 필요로 할 때 내부적으로 일어나는 일은 다음과 같습니다:

  1. 사용자가 질문합니다: "오늘부터 103일 후는 무슨 요일인가요?"
  2. Claude가 get_current_datetime을 요청하는 도구 사용 블록으로 응답합니다
  3. 서버가 해당 함수를 호출하고 결과를 반환합니다
  4. Claude는 더 많은 정보가 필요하다는 것을 깨닫고 add_duration_to_datetime을 요청합니다
  5. 서버가 해당 함수를 호출하고 결과를 반환합니다
  6. Claude는 이제 최종 답변을 제공할 수 있는 충분한 정보를 갖게 됩니다

대화 루프 구축하기

이 패턴을 처리하려면 Claude가 도구 요청을 멈출 때까지 계속되는 대화 루프가 필요합니다:

python
def run_conversation(messages):
    while True:
        response = chat(messages)

        add_assistant_message(messages, response)

        # 의사 코드
        if response isn't asking for a tool:
            break

        tool_result_blocks = run_tools(response)
        add_user_message(messages, tool_result_blocks)
        
    return messages

헬퍼 함수 리팩토링하기

대화 루프를 구현하기 전에, 여러 메시지 블록을 제대로 처리할 수 있도록 헬퍼 함수를 업데이트해야 합니다.

메시지 핸들러 업데이트하기

현재 add_user_messageadd_assistant_message 함수는 항상 일반 텍스트를 다룬다고 가정합니다. 전체 메시지 객체를 처리할 수 있도록 업데이트하세요:

python
from anthropic.types import Message

def add_user_message(messages, message):
    user_message = {
        "role": "user",
        "content": message.content if isinstance(message, Message) else message
    }
    messages.append(user_message)

이렇게 하면 문자열, 블록 목록, 또는 완전한 메시지 객체 중 어느 것이든 전달할 수 있습니다.

채팅 함수 업데이트하기

채팅 함수가 도구 목록을 받아들이고 텍스트만이 아닌 전체 메시지를 반환하도록 수정하세요:

python
def chat(messages, system=None, temperature=1.0, stop_sequences=[], tools=None):
    params = {
        "model": model,
        "max_tokens": 1000,
        "messages": messages,
        "temperature": temperature,
        "stop_sequences": stop_sequences,
    }
    
    if tools:
        params["tools"] = tools
        
    if system:
        params["system"] = system
        
    message = client.messages.create(**params)
    return message

메시지에서 텍스트 추출하기

채팅 함수가 이제 텍스트만이 아닌 전체 메시지를 반환하므로, 필요할 때 텍스트를 추출할 수 있는 헬퍼를 추가하세요:

python
def text_from_message(message):
    return "\n".join(
        [block.text for block in message.content if block.type == "text"]
    )

이 함수는 메시지 내의 모든 텍스트 블록을 찾아 하나로 합치며, 사용자에게 최종 응답을 표시해야 할 때 유용합니다.

이러한 변경이 중요한 이유

이러한 리팩토링 단계는 도구가 활성화된 대화의 현실에 맞춰 코드를 준비시켜 줍니다:

  • 메시지당 여러 블록 - Claude의 응답에는 텍스트와 도구 사용 블록이 모두 포함될 수 있습니다
  • 유연한 메시지 처리 - 이제 함수가 다양한 메시지 형식을 처리할 수 있습니다
  • 전체 메시지 보존 - 텍스트 부분만이 아니라 Claude가 제공하는 모든 정보를 유지합니다
  • 도구 목록 지원 - 이제 채팅 함수가 여러 도구를 받아 사용할 수 있습니다

이러한 기반이 마련되면, 여러 도구 호출을 자동으로 처리하는 완전한 대화 루프를 구현할 준비가 된 것입니다. 이를 통해 Claude가 사용자 질문에 완전히 답하기 위해 필요한 도구를 자유롭게 사용할 수 있는 매끄러운 경험을 만들 수 있습니다.