Function Calling은 대규모 언어 모델이 외부 기능을 활용하는 가장 일반적인 방식입니다. 개발자는 먼저 JSON Schema로 "어떤 함수가 있고 매개변수는 어떤 형태인지"를 정의해 두고, 모델은 대화 중 데이터 조회나 작업이 필요해지면 구조화된 호출 요청을 출력합니다. 프로그램이 실제 함수를 실행하고 그 결과를 모델에 되돌려 주면 답변이 이어집니다. 핵심은 한 문장으로 정리됩니다. 모델이 정하는 것은 "무엇을 호출할지, 매개변수에 무엇을 넣을지"뿐이며, 코드를 실제로 실행하는 것은 언제나 여러분의 프로그램입니다.
어떤 문제를 해결하는가
모델은 원래 텍스트를 출력하는 것밖에 못 합니다. 날씨 확인, 데이터베이스 읽기, 주문 같은 "손으로 하는" 일은 못 합니다. Function Calling은 그 사이에 다리를 놓습니다. 모델은 자연어로 요청을 이해하고, "어떤 함수를 어떤 매개변수로 호출하고 싶은지"를 구조화된 형식으로 표현하며, 실행은 프로그램에 맡깁니다. 이것이 바로 도구 호출이 성립하는 토대입니다.
함수 호출의 전체 흐름
- 정의: 요청에 tools 배열을 포함해 각 함수의 이름, 설명, 매개변수 구조(JSON Schema)를 적습니다.
- 판단: 모델은 외부 기능이 필요하다고 판단하면 직접 답하지 않고 tool_calls(함수 이름 + 매개변수 JSON)를 반환합니다.
- 실행: 여러분의 프로그램이 tool_calls를 해석해 실제 함수를 호출합니다. API 호출, 데이터베이스 읽기, 스크립트 실행 등입니다.
- 반환: 실행 결과를 tool 메시지로 대화에 되돌리면, 모델은 이를 바탕으로 최종 답변을 만듭니다.
핵심 구성 요소
- tools 정의: 모델을 위한 "함수 설명서"입니다. 설명이 명확할수록 매개변수 정확도가 올라갑니다. description은 사람이 아니라 모델을 위해 쓰는 것입니다.
- tool_choice: 모델이 특정 함수를 "반드시 호출 / 호출해도 됨 / 호출하지 않음" 중 어떻게 다룰지 제어합니다. auto, none, 함수 이름 지정이 일반적입니다.
- 병렬 호출: 한 번에 여러 tool_calls를 반환해, 한 바퀴에 서로 무관한 여러 일을 처리할 수 있습니다.
- 구조적 제약: 매개변수는 유효한 JSON이어야 하며, 타입이 틀리면 프로그램 측에서 에러가 납니다. Schema 제약은 엄격합니다.
도구 호출·MCP·플러그인 호출과의 실질적인 차이
| 구분 | Function Calling | 도구 호출 | MCP | 플러그인 호출 |
|---|---|---|---|---|
| 본질 | 호출 메커니즘 | 총칭 | 연결 프로토콜 | 기능 배포 형태 |
| 도구 정의 주체 | 요청 안에서 개발자가 정의 | 경우에 따라 다름 | MCP server가 공개 | 플랫폼이 패키징 |
| 해결하는 문제 | 모델이 호출을 어떻게 시작하는가 | 모델이 외부 기능을 어떻게 쓰는가 | 도구를 어떻게 찾고 통일적으로 연결하는가 | 기능을 사용자에게 어떻게 전달하는가 |
Function Calling은 2023년 OpenAI가 확산시켰고, 지금은 주류 모델 대부분이 호환 구현을 갖추고 있습니다. 도구 호출은 더 큰 틀이며, Function Calling과 코드 실행, MCP 도구 등을 모두 담습니다. 한 문장으로 기억하세요. MCP는 "어떻게 연결하는가", 플러그인은 "어떻게 배포하는가", Function Calling은 "어떻게 호출을 시작하는가"를 맡습니다. 셋은 사슬의 관계이지 서로를 대체하지 않습니다. 플러그인 호출과의 경계도 같은 논리로 정리됩니다.
경계와 제한
- 매개변수 환각: 모델은 없는 매개변수 이름을 지어내거나 타입을 틀릴 수 있습니다. 프로그램 측 검증은 필수입니다.
- 토큰과 지연: 호출마다 대화가 한 바퀴 늘고, tools 정의 자체도 컨텍스트를 차지합니다. 도구가 많아질수록 비싸고 느려집니다.
- 안전 레드라인: 데이터베이스 삭제, 송금, 대량 메일 발송 같은 되돌릴 수 없는 작업을 모델에 직접 시키면 안 됩니다. 중요한 작업에는 사람의 확인을 넣습니다.
- 지원 수준 차이: Function Calling 지원 수준의 성숙도는 모델마다 다르며, 작은 모델은 "말만 하고 호출하지 않는" 경우나 형식을 틀리는 경우가 잦습니다.
흔한 오해
- "모델이 실제로 코드를 실행한다"——아닙니다. 모델이 출력하는 것은 호출 요청뿐이며, 실행은 여러분의 프로그램 안에서 일어납니다.
- "Function Calling은 MCP와 같다"——아닙니다. MCP는 프로토콜 계층이며, MCP가 공개한 도구도 Function Calling 같은 메커니즘을 거쳐 모델이 사용할 수 있습니다.
- "Function Calling이 있으면 플러그인은 불필요하다"——플러그인은 사용자용 배포 형태, Function Calling은 개발자용 메커니즘으로 층이 다릅니다.
- "정의만 하면 모델이 반드시 호출한다"——기본값은 auto이며, 모델이 필요 없다고 판단하면 호출하지 않습니다. 강제하려면 함수 이름을 명시합니다.
FAQ
Q: Function Calling은 각 회사 API의 도구 매개변수와 같은 것인가요?
A: 같은 계열입니다. "모델이 구조화된 호출을 출력하고 프로그램이 실행한다"는 발상은 공통이며, 다른 것은 필드 이름과 패키징입니다. 이전할 때는 주로 정의를 고치게 됩니다.
Q: 이미 MCP를 쓰고 있는데 Function Calling도 신경 써야 하나요?
A: 필요합니다. MCP는 도구를 어떻게 연결하는가를 해결하고, Function Calling은 모델이 호출을 어떻게 시작하는가를 해결합니다. 상류와 하류의 관계이지 둘 중 하나를 고르는 문제가 아닙니다.
Q: Function Calling으로 로컬 스크립트를 호출할 수 있나요?
A: 가능합니다. 함수는 여러분 프로그램의 입구에 불과하고, 뒤가 API 호출이든 스크립트 실행이든 데이터베이스 조회든 모델은 관여하지 않습니다. 모델이 말하는 것은 "무엇을, 어떤 매개변수로"뿐입니다.