도구 사용
도구 사용 (Tool use)
채팅 모델은 흔히 "함수 호출(function-calling)" 또는 "도구 사용(tool-use)"을 지원하도록 학습됩니다. 도구는 사용자가 제공하는 함수로, 모델이 응답의 일부로 호출할지 선택할 수 있어요. 예를 들어 모델은 계산을 내부적으로 수행하지 않고 산술을 처리하는 계산기 도구에 접근할 수 있습니다.
이 가이드는 도구를 정의하고, 채팅 모델에 전달하며, 모델이 도구를 호출할 때 출력을 처리하는 방법을 보여줍니다.
출처: 공식문서 - Tool use
도구 전달하기
모델이 도구 사용을 지원하면 apply_chat_template()의 tools 인자에 함수를 전달해요. 도구는 JSON 스키마나 Python 함수로 전달합니다.
Python 함수로 전달하면 인자·인자 타입·함수 docstring이 파싱되어 JSON 스키마를 자동 생성합니다. Python 함수 전달이 매우 편리하지만, 파서는 Google 스타일 docstring만 처리할 수 있어요. 도구 준비 함수를 포맷하는 예시는 아래를 참고하세요.
핵심은 함수 이름·인자 이름·인자 타입·함수 목적과 인자 목적을 설명하는 docstring이에요. 이것들이 모델이 도구를 호출할지 결정하는 데 쓰는 "시그니처"를 만듭니다.
도구 호출 예시
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
checkpoint = "NousResearch/Hermes-2-Pro-Llama-3-8B"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint, dtype="auto", device_map="auto")
채팅 기록을 만듭니다. 그다음 messages와 도구 목록을 apply_chat_template()에 전달합니다. 채팅을 토크나이즈하고 응답을 생성합니다.
채팅 모델은 docstring의 올바른 파라미터로 get_current_temperature 도구를 호출했어요. Paris를 보고 위치가 프랑스임을 추론했고, 온도 단위로 섭씨(celsius)를 써야 한다고 추론했죠.
모델은 실제로 도구 자체를 호출할 수는 없어요. 도구 호출을 요청할 뿐이며, 그 호출을 처리해 채팅 기록에 결과와 함께 추가하는 것은 당신의 몫입니다. 응답 파싱을 지원하는 모델은 응답 파싱이 자동으로 처리되므로, 그냥 쓸 수 있어요.
어떤 접근을 쓰든 도구 호출은 assistant 메시지의 tool_calls 키에 들어가야 합니다. 이것이 권장 API이며 대부분의 도구 사용 모델 채팅 템플릿이 지원합니다.
tool_call = {"name": "get_current_temperature", "arguments": {"location": "Paris, France", "unit": "celsius"}}
messages.append({"role": "assistant", "tool_calls": [{"type": "function", "function": tool_call}]})
도구 응답을 tool 역할로 채팅 기록에 추가합니다.
JSON 스키마
JSON 스키마 자체의 세부 사항은 이미 잘 문서화되어 있으니 여기서 다루지 않아요.