함수 호출 (Function Calling)

함수 호출 (Function Calling) — 모델이 도구를 고르고 인자를 만들도록

함수 호출, 혹은 도구 호출(tool calling)은 모델이 사용자 요청에서 도구를 하나 고르고 그 인자를 만들어 내도록 하는 기능이에요. 여기서 중요한 점은 모델이 그 도구를 직접 실행하지 않는다는 거예요. 실제 실행은 여러분의 애플리케이션이 맡고, 실행 결과를 다시 모델에 보내 최종 사용자 응답을 만들어 냅니다.

BIS-LLM과 Engine-Builder-LLM 같은 Baseten 엔진이 함수 호출을 지원하고, 즉시 접근이 필요하면 Model APIs도 쓸 수 있어요. vLLM이나 SGLang 같은 다른 추론 프레임워크도 지원합니다. 이 기능은 LLM을 단순 텍스트 생성기에서 실제 행동을 일으키는 에이전트로 업그레이드해 주는 핵심이에요.

출처: Baseten - Function calling

도구 호출 루프

전형적인 도구 호출 흐름은 이렇게 다섯 단계로 이뤄져요.

  1. 사용자 메시지와 도구 목록을 보낸다.
  2. 모델이 일반 텍스트 또는 하나 이상의 도구 호출(이름과 JSON 인자)을 반환한다.
  3. 애플리케이션에서 도구 호출을 실행한다.
  4. 도구 출력을 다시 모델에 보낸다.
  5. 최종 응답 또는 추가 도구 호출을 받는다.

도구 정의하기

도구는 API 호출, 데이터베이스 질의, 내부 스크립트 등 무엇이든 될 수 있어요. 여기서 docstring이 중요합니다. 모델이 docstring을 보고 어떤 도구를 호출할지, 파라미터를 어떻게 채울지를 결정하거든요.

def multiply(a: float, b: float):
    """Multiply two numbers.

    Args:
        a: The first number.
        b: The second number.
    """
    return a * b

작고 단일 목적의 도구를 설계하고, 단위·허용 값·필수 필드 같은 제약을 docstring에 담아 두는 게 좋아요. 그리고 모델이 주는 인자는 신뢰할 수 없는 입력으로 취급해 실행 전에 반드시 검증해야 합니다.

모델 호출과 도구 선택 제어

Model APIs는 https://inference.baseten.co/v1/chat/completionstoolstool_choice를 담아 호출해요. 자체 배포는 /production/predict를 사용합니다.

url = "https://inference.baseten.co/v1/chat/completions"
payload = {
    "model": "deepseek-ai/DeepSeek-V4-Pro",
    "messages": [
        {"role": "user", "content": "What is 3.14 + 3.14?"},
    ],
    "tools": tools,
    "tool_choice": "auto",  # default
}

tool_choice로 모델의 도구 사용을 제어할 수 있어요. auto(기본)는 텍스트 또는 도구 호출 중 자유롭게 응답하고, required는 최소 하나의 도구 호출을 강제하며, none은 일반 텍스트만 반환합니다. 특정 도구를 강제하려면 {"type": "function", "function": {"name": "subtract"}}처럼 함수 이름을 지정하면 돼요. 엔진과 모델에 따라 도구 호출은 보통 assistant 메시지의 tool_calls 아래에 담겨 돌아오고, 거기서 파싱해 실행하면 됩니다.

더 알아보기