로드 중

도구 사용을 포함한 멀티턴 대화를 구축하려면 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를 더 견고하고 자연스럽게 만들어줍니다.