용어집
GEO·AI 검색

함수 호출

함수 호출(Function Calling)은 LLM이 개발자가 정의한 함수/도구의 스키마를 읽고, 호출에 필요한 인자를 정해진 JSON 형식의 구조화된 데이터로 생성해 주는 기능입니다. 모델이 함수를 직접 실행하지는 않으며, 생성된 인자를 받아 실제 코드를 실행하는 것은 애플리케이션의 몫입니다.

  • 함수 호출은 LLM이 자연어 요청을 보고, 미리 정의된 함수의 JSON Schema에 맞는 구조화된 인자를 생성해 내는 메커니즘입니다.
  • 핵심은 '인자 생성'에 있습니다. 모델은 함수를 실행하지 않고, 어떤 함수를 어떤 값으로 호출하면 좋을지를 JSON으로 출력할 뿐이며, 실제 실행과 결과 회신은 애플리케이션이 담당합니다.
  • OpenAI·Anthropic·Google Gemini 모두 동일한 패턴을 따르며, Anthropic 공식 문서는 '툴 사용(tool use)과 함수 호출(function calling)은 같은 뜻으로 호환된다'고 명시합니다.
  • 함수 호출은 더 넓은 툴 사용 흐름의 한 단계이며, 그중에서도 'LLM이 호출 인자를 만들어 내는 부분'에 초점이 맞춰진 개념입니다.
  • strict 모드(스키마 강제)를 켜면 생성된 인자가 제공한 JSON Schema와 정확히 일치하도록 보장받을 수 있습니다.

함수 호출이란 무엇인가

함수 호출(Function Calling)은 LLM이 사용자의 자연어 요청과 개발자가 제공한 함수 정의(이름·설명·파라미터 스키마)를 함께 읽고, 그 함수를 호출하는 데 필요한 인자를 정해진 JSON 형식의 구조화된 데이터로 생성해 주는 기능입니다. 예를 들어 사용자가 "파리 날씨 알려줘"라고 입력하면, 모델은 자유 텍스트로 답하는 대신 get_weather 함수를 {"location": "Paris, France"}라는 인자로 호출하면 된다는 사실을 JSON으로 출력합니다.

여기서 가장 중요한 점은 모델이 함수를 직접 실행하지는 않는다는 사실입니다. OpenAI, Google 공식 문서 모두 "모델은 함수를 실행하지 않으며, 인자를 생성할 뿐"이라고 명시합니다. 생성된 인자를 받아 실제 코드(API 호출, DB 조회 등)를 실행하고 그 결과를 다시 모델에 돌려주는 일은 전적으로 애플리케이션의 책임입니다. 즉 함수 호출은 'LLM이 자연어를 구조화된 호출 명세로 번역하는 단계'에 초점이 맞춰진 개념입니다.

툴 사용(tool use)과의 관계

실무에서 '함수 호출'과 '툴 사용(tool use)'은 사실상 같은 뜻으로 쓰입니다. Anthropic 공식 문서는 "Tool use is also known as function calling, and the two terms are interchangeable(툴 사용은 함수 호출로도 불리며 두 용어는 서로 호환됩니다)"고 명확히 적고 있습니다. 다만 강조점에는 미묘한 차이가 있습니다. 툴 사용은 도구 정의 → 인자 생성 → 실행 → 결과 회신 → 최종 답변으로 이어지는 전체 루프를 가리키는 넓은 개념이고, 함수 호출은 그 루프 안에서 'LLM이 호출에 필요한 인자를 생성하는 부분'을 가리키는 메커니즘에 가깝습니다.

작동 흐름

세 제공사의 문서가 거의 동일하게 설명하는 표준 흐름은 다음과 같습니다.

  1. 도구(함수) 정의 전달: 사용자 메시지와 함께, 호출 가능한 함수 목록을 각 함수의 이름·설명·파라미터 스키마(JSON Schema)와 함께 모델에 전달합니다.
  2. 모델의 판단과 인자 생성: 모델은 요청과 각 함수 설명을 비교해, 도구가 도움이 된다고 판단하면 자유 텍스트 답변 대신 '어떤 함수를 어떤 인자로 호출할지'를 구조화된 JSON으로 출력합니다.
  3. 애플리케이션의 실행: 애플리케이션이 그 JSON을 파싱해 실제 함수/API를 실행합니다. (이 단계는 모델이 아니라 개발자 코드가 수행합니다.)
  4. 결과 회신: 실행 결과를 다시 모델에 전달합니다. Anthropic은 tool_result 블록으로, OpenAI·Gemini는 함수 출력 메시지로 돌려주며, Gemini는 호출마다 부여된 id를 맞춰서 회신하기를 권장합니다.
  5. 최종 응답 생성: 모델이 함수 결과를 반영해 사용자에게 최종 답변을 생성하거나, 필요하면 추가 함수 호출을 이어갑니다.

Anthropic의 경우, 모델이 도구를 호출하기로 결정하면 응답의 stop_reason"tool_use"가 되고 하나 이상의 tool_use 블록이 반환됩니다. 또한 tool_choice를 통해 호출 동작을 제어할 수 있는데, 기본값 {"type": "auto"}에서는 모델이 매 턴마다 도구 호출과 직접 답변 중 무엇을 할지 스스로 결정하고, any나 특정 tool로 지정하면 호출을 강제할 수 있습니다.

스키마와 코드 예시

함수 정의의 핵심은 모델이 읽을 JSON Schema입니다. OpenAI 함수 정의는 type·name·description·parameters 필드로 구성되며, strict: true를 켜면 생성되는 인자가 스키마와 정확히 일치하도록 보장됩니다(이때 additionalProperties: false가 요구됩니다).

{
  "type": "function",
  "name": "get_weather",
  "description": "주어진 위치의 현재 날씨를 조회합니다.",
  "parameters": {
    "type": "object",
    "properties": {
      "location": { "type": "string", "description": "도시와 국가, 예: Paris, France" },
      "unit": { "type": "string", "enum": ["celsius", "fahrenheit"] }
    },
    "required": ["location"],
    "additionalProperties": false
  },
  "strict": true
}

사용자가 "파리 날씨"라고 물으면, 모델은 함수를 실행하는 대신 위 스키마에 맞는 인자만 생성합니다. OpenAI에서는 다음과 같은 구조화된 인자가 반환됩니다.

{ "location": "Paris, France" }

Anthropic Claude는 같은 의도를 tool_use 블록으로 표현합니다. 아래는 공식 문서의 예시로, 모델이 생성한 인자가 input 필드에 담겨 있습니다.

{
  "type": "tool_use",
  "id": "toolu_01A09q90qw90lq917835lq9",
  "name": "get_weather",
  "input": { "location": "New York, NY", "unit": "fahrenheit" }
}

Google Gemini도 동일하게 함수 선언(function declarations)을 OpenAPI 호환 JSON Schema 일부로 정의하고, 모델은 함수 이름·인자·고유 id를 담은 구조화된 JSON으로 응답합니다. 세 제공사 모두 'LLM이 스키마에 맞춰 인자 JSON을 만들어 낸다'는 메커니즘은 공통입니다.

근거

OpenAI 공식 함수 호출 가이드는 함수 호출을 5단계 흐름으로 설명하며, "모델은 함수를 실행하지 않고, 스키마에 맞는 JSON 형식의 인자를 생성한다"고 명시합니다. 또한 strict: true를 통한 Structured Outputs가 "생성된 인자가 제공한 JSON Schema와 정확히 일치함을 보장한다"고 밝힙니다.

Anthropic 공식 문서(Tool use with Claude)는 "툴 사용은 함수 호출로도 불리며 두 용어는 호환된다"고 명시하고, 클라이언트 도구의 경우 모델이 stop_reason: "tool_use"tool_use 블록을 반환하면 개발자 코드가 실행한 뒤 tool_result로 회신하는 구조라고 설명합니다.

Google Gemini 공식 문서(Function calling with the Gemini API)는 "모델이 함수를 직접 실행하지 않으며, 응답을 처리하는 것은 애플리케이션의 책임"이라고 밝히고, 함수 선언이 OpenAPI 스키마의 일부(subset)를 사용한다고 안내합니다. 최근 Gemini 모델은 모든 함수 호출에 고유 id를 부여합니다.

참고·출처