CPN 한국어 자습서 · 러닝패스 2 / 4 — Building with the Claude API
도구 사용
Using multiple tools
루프와 라우팅을 한 번 만들고 나면, 도구를 여러 개 붙이는 일은 아주 쉬워집니다. run_conversation의 tools 목록에 스키마를 추가하고, run_tool에 elif 한 줄을 더하고, 도구 함수를 구현하면 끝입니다.
Stephen Grider · Anthropic 기술 스태프
마지막으로 할 일은 add_duration_to_datetime 도구와 set_reminder 도구를 붙이는 것입니다. 지난 영상이 좀 빡빡했던 것에 비하면 이번은 정말 쉽고 짧습니다. 사실 필요한 코드 상당수는 이미 Tools and Schemas 셀에 만들어 두었습니다.
그 셀을 보면 add_duration_to_datetime 구현이 이미 있고, 아래로 내리면 set_reminder 함수도 있습니다. set_reminder는 실제로 무언가를 예약하지는 않습니다 — 그냥 "이 시각에 이런 내용으로 리마인더를 설정했다"는 문장을 print하기만 합니다. add_duration_to_datetime 스키마와 set_reminder 스키마도 이미 제공돼 있습니다.
그러니 우리가 정말 해야 할 일은 두 가지뿐입니다. 이 두 스키마를 Claude에 넘기는 것, 그리고 Claude가 두 도구 중 하나라도 호출하면 알맞은 도구 함수를 부르는 것. 먼저 run_conversation 함수를 찾아, tools 목록에 add_duration_to_datetime_schema와 set_reminder_schema를 추가합니다. 이제 Claude는 이 두 도구의 존재를 알게 됩니다.
다음으로 run_tool 함수로 올라갑니다. 이 함수는 도구 이름과 인자를 받아 알맞은 도구 함수를 호출해 결과를 반환합니다. 추가는 정말 쉽습니다. elif를 더해 도구 이름이 add_duration_to_datetime이면 add_duration_to_datetime(**tool_input)을 반환하고, set_reminder이면 set_reminder(**tool_input)을 반환합니다. 그게 전부입니다.
이 run_tool과 run_conversation을 한 번 갖춰 두면, 초반의 어려움이 지나간 뒤로는 도구 사용이 정말 쉽고 단순해집니다. 도구를 추가하는 건 간단합니다 — run_tool을 업데이트하고, 도구 스키마를 추가하고, 실제 도구 함수를 구현하면 끝입니다.
테스트해 봅니다. 셀을 다시 실행하고, 맨 아래 질문을 바꿉니다. Claude에게 리마인더를 설정해 달라고 하되, 그 리마인더는 2050년 1월 1일에서 177일 뒤로 설정하라고 합니다. 이건 분명히 도구 호출이 두 번 이상 일어납니다. Claude는 먼저 add_duration_to_datetime으로 날짜를 구하고, 그다음 set_reminder를 호출해야 합니다.
실행하면 Claude는 먼저 1월 1일에서 177일 뒤를 계산해야 한다고 알려 줍니다. 계산이 끝나면 리마인더 설정을 시도합니다. 그러면 set_reminder 함수에서 나온 로그 문장이 보입니다 — set_reminder는 실제로 아무 일도 하지 않고 받은 인자를 print할 뿐이죠. 마지막으로 Claude가 약속이 올바른 날짜인 2050년 6월 27일 월요일로 설정됐다고 응답합니다.
메시지 대화 기록을 내려 보면, user 메시지, 텍스트 블록과 tool_use 블록을 가진 어시스턴트 메시지(또다시 여러 블록을 가진 메시지의 예), 우리의 tool_result, 그리고 후속 호출이 이어집니다. 이렇게 여러 도구를 노트북에 연결했습니다. 훌륭한 진전입니다.
이 장에서 배우는 것What you'll learn
약 8분이미 만들어 둔 add_duration_to_datetime·set_reminder 함수와 스키마
run_conversation의 tools 목록에 두 스키마를 추가
run_tool에 elif 한 줄씩 — 이름 → 함수 라우팅
도구 추가 = 스키마 + 구현 + elif, 그게 전부
테스트: “2050-01-01에서 177일 뒤 리마인더” → 두 도구 연쇄 호출
add_duration_to_datetime → set_reminder → 최종 응답
elif만 추가.필요한 코드 상당수는 Tools and Schemas 셀에 이미 있습니다. add_duration_to_datetime은 날짜에 기간을 더해 사람이 읽기 좋은 형식으로 돌려주고, set_reminder는 (데모용으로) 받은 인자를 print합니다. 두 도구의 스키마도 함께 준비돼 있습니다.
from datetime import datetime, timedelta def add_duration_to_datetime( datetime_str, duration=0, unit="days", input_format="%Y-%m-%d" ): date = datetime.strptime(datetime_str, input_format) if unit == "days": new_date = date + timedelta(days=duration) # … seconds / minutes / hours / weeks / months / years … return new_date.strftime("%A, %B %d, %Y %I:%M:%S %p") def set_reminder(content, timestamp): # 데모용 — 실제 예약 없이 인자만 출력 print(f"----\nSetting the following reminder for {timestamp}:\n{content}\n----")
실제로 무언가를 예약하지는 않습니다 — “이 시각에 이런 내용으로 설정했다”는 로그만 출력합니다. 도구 함수는 무엇이든 될 수 있다는 걸 보여 주는 예입니다.
할 일은 둘뿐입니다. ① run_conversation의 tools 목록에 두 스키마를 추가해 Claude에 도구의 존재를 알리고, ② run_tool에 elif를 더해 이름을 알맞은 함수로 보냅니다.
def run_conversation(messages): while True: response = chat( messages, tools=[ get_current_datetime_schema, add_duration_to_datetime_schema, # ← 추가 set_reminder_schema, # ← 추가 ], ) add_assistant_message(messages, response) print(text_from_message(response)) if response.stop_reason != "tool_use": break tool_results = run_tools(response) add_user_message(messages, tool_results) return messages
그다음 라우터. 이름마다 elif 한 줄이면 됩니다.
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)
도구를 늘리는 건 늘 같은 3단계입니다 — 스키마 추가 → 함수 구현 → run_tool에 elif. 루프와 라우터는 한 번만 만들면 됩니다.
이름을 함수로 보내는 흐름을 직접 눌러 보세요. 그다음 두 도구가 이어서 호출되는 실제 테스트를 봅니다.
Claude의 tool_use 블록 name →
새 도구를 붙이는 건 run_tool에 elif 한 줄을 더하는 일입니다. 이름이 어디에도 안 맞으면(unknown_tool) 함수가 None을 반환합니다.
리마인더를 “2050-01-01에서 177일 뒤”로 요청하면, Claude는 먼저 add_duration_to_datetime으로 날짜를 구하고 그 값으로 set_reminder를 호출합니다.
messages = []
add_user_message(
messages,
"Set a reminder for my doctors appointment. "
"Its 177 days after Jan 1st, 2050.",
)
run_conversation(messages)# 1) Claude: 먼저 날짜를 구해야 한다 → add_duration_to_datetime # 2) set_reminder 의 print 로그 ↓ ---- Setting the following reminder for 2050-06-27T00:00:00: Doctor's appointment ---- # 3) Claude 최종 응답 Your appointment reminder is set for Monday, June 27, 2050.
run_conversation의 tools에 스키마를 추가한다.run_tool에 elif를 더해 이름 → 함수로 라우팅한다.elif — 그게 전부.Q1새 도구를 추가하는 데 필요한 단계는?
루프와 라우터는 한 번만 만들면 됩니다. 이후 도구 추가는 늘 같은 3단계로 끝납니다.
Q2run_conversation에서 두 도구를 Claude가 쓸 수 있게 하려면?
tools 목록의 스키마가 Claude에 도구의 존재와 사용법을 알립니다. 라우팅은 run_tool이 따로 담당합니다.
Q3“2050-01-01에서 177일 뒤 리마인더” 요청이 두 번의 도구 호출이 되는 이유는?
한 도구의 결과(계산된 날짜)가 다음 도구(리마인더 설정)의 입력이 되는 연쇄 호출입니다.
여러 도구를 라우팅하는 법까지 익혔습니다. 다음은 호출을 더 정교하게 다루는 세분화된 도구 호출입니다. → 세분화된 도구 호출
전 코스는 계속 무료입니다. 등록하면 이 코스의 남은 76개 레슨을 끝까지 읽을 수 있습니다.
이미 등록하셨다면 그때 쓰신 이메일을 넣어 주세요.