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

도구 사용을 포함한 멀티턴 대화를 구축하려면 Claude의 다양한 응답 유형을 처리해야 합니다. Claude가 응답할 때, 도구를 사용해야 할 수도 있고, 직접적인 답변을 제공할 수도 있습니다. 코드는 두 시나리오를 모두 원활하게 처리해야 합니다.

단순한 도구 통합의 문제점

모든 대화에 도구 결과를 그냥 추가하면 문제가 발생합니다. Claude가 "1+1은 무엇인가요?"와 같은 간단한 질문에 답할 때는 어떤 도구도 필요하지 않습니다. 하지만 코드가 항상 도구 결과를 처리하려고 하면, 대화 기록에 빈 메시지를 추가하게 됩니다.

해결책은 모든 Claude 응답과 함께 반환되는 stop_reason을 확인하는 것입니다. 이는 Claude가 왜 생성을 멈췄는지 알려줍니다 - 자연스럽게 완료되었는지, 아니면 도구를 사용하려고 했는지 말입니다.

Stop Reasons

Claude는 여러 가지 이유로 멈출 수 있습니다:

  • "tool_use" - 모델이 도구를 호출하려고 함
  • "end_turn" - 모델이 응답 생성을 완료함
  • "max_tokens" - 출력 한도에 도달함
  • "stop_sequence" - 제공한 중지 시퀀스를 만남

채팅 함수 개선하기

먼저, 더 많은 정보를 반환하도록 채팅 함수를 업데이트하세요. 텍스트와 부분을 따로 반환하는 대신, 필요한 모든 것을 담은 딕셔너리를 반환하세요:

python
def chat(messages, tools=None, system=None, **kwargs):
    # ... 기존 코드 ...
    
    return {
        "parts": parts,
        "stop_reason": response["stopReason"],
        "text": "\n".join([p["text"] for p in parts if "text" in p])
    }

이 방식은 응답 부분에서 모든 텍스트 콘텐츠를 추출하므로, 첫 번째 부분이 항상 텍스트라고 가정하는 것보다 더 견고합니다.

대화 루프 구축하기

전체 대화 흐름을 처리하는 함수를 만드세요:

python
def run_conversation(messages):
    while True:
        result = chat(messages, tools=[get_current_datetime_schema])
        
        add_assistant_message(messages, result["parts"])
        print(result["text"])
        
        if result["stop_reason"] != "tool_use":
            break
            
        tool_result_parts = run_tools(result["parts"])
        add_user_message(messages, tool_result_parts)
    
    return messages

이 루프는 Claude가 도구 사용이 아닌 다른 이유로 멈출 때까지 계속됩니다. 각 반복마다:

  1. 현재 메시지를 Claude에 전송합니다
  2. Claude의 응답을 메시지 기록에 추가합니다
  3. Claude가 도구를 사용하려고 하는지 확인합니다
  4. 그렇다면, 도구를 실행하고 결과를 대화에 다시 추가합니다
  5. 그렇지 않다면, 루프를 종료합니다

구현 테스트하기

이 방식은 도구가 필요한 질문과 단순한 질문을 모두 처리합니다:

python
# 도구가 필요한 질문
messages = []
add_user_message(messages, "What time is it?")
run_conversation(messages)

# 간단한 질문
messages = []
add_user_message(messages, "What is 1+1?")
run_conversation(messages)

시간 관련 질문의 경우, Claude는 datetime 도구를 사용합니다. 수학 질문의 경우, 도구 호출 없이 직접 응답합니다. 대화 루프는 Claude의 stop reason에 따라 자동으로 적응합니다.

이 패턴은 더 많은 도구를 추가할 때도 잘 확장됩니다 - 동일한 루프가 도구 사용과 직접 응답의 모든 조합을 처리하여, 대화형 AI를 더 견고하고 자연스럽게 만들어줍니다.