
LLM 함수 호출은 언어 모델을 단순한 텍스트 생성기에서 실제로 작업을 수행할 수 있는 에이전트로 변환하는 메커니즘입니다. 날씨를 확인하고, 데이터베이스를 쿼리하고, 이메일을 보내고, 항공권을 예약할 수 있는 에이전트 말입니다. 문제는? 제대로 구현하려면 3개의 서로 다른 공급업체 문서를 읽어야 하고, 산재된 블로그 게시물에서 프로덕션 패턴을 조합해야 하며, 찾은 보안 조언이 여전히 최신인지 기도해야 한다는 것입니다. 이 가이드는 OpenAI, Anthropic, Gemini에서 동일한 도구를 구현한 다음, 다른 누구도 작성하지 않는 프로덕션 패턴을 다룹니다.
빠른 요약: LLM 함수 호출 한눈에 보기
아래의 각 섹션은 특정 측면을 자세히 살펴봅니다. 특정 프로바이더만 관심 있다면 구현 섹션으로 바로 이동하세요. 프로바이더를 평가 중이라면 9번 섹션의 비교 표를 확인하세요.
LLM 함수 호출이란 무엇인가 (그리고 왜 모든 AI 에이전트가 필요한가)?
모든 것이 명확해지는 정신 모델이 있습니다: LLM을 실행자가 아닌 라우터로 생각하세요. 도구 정의가 포함된 프롬프트를 전송하면 LLM은 사용자의 요청을 분석하고, 호출할 함수를 결정한 후, 인수를 구조화된 JSON으로 생성합니다. 그 다음 애플리케이션이 인수를 받아 함수를 실행하고, 결과를 얻은 후, 최종 응답을 위해 LLM으로 다시 전달합니다.
함수 호출은 LLM이 사용자 입력과 사용 가능한 도구 정의를 기반으로 호출할 함수와 인수를 지정하는 구조화된 JSON 출력을 생성할 수 있게 하는 기능입니다. LLM은 절대 함수를 직접 실행하지 않습니다. 당신의 코드가 실행합니다.
왜 이것이 중요할까요? 함수 호출이 없으면 LLM은 텍스트 생성에만 국한됩니다. 계좌 잔액을 확인하거나, 실시간 항공권 가격을 조회하거나, 데이터베이스를 쿼리할 수 없습니다. 이를 통해 LLM은 실제 작업을 수행할 수 있는 애플리케이션의 뇌가 되며, 이것이 바로 프로덕션 AI 에이전트를 가능하게 하는 것입니다.
사용 사례는 매우 다양합니다: API 통합, 자연어 데이터베이스 쿼리, 실시간 데이터 검색, 다단계 에이전트 워크플로우, 그리고 LLM이 무엇을 해야 할지와 어떻게 호출할지를 결정해야 하는 모든 경우입니다. Martin Fowler 팀이 설명하듯이, LLM-as-router 패턴은 함수 호출 코드를 한 줄이라도 작성하기 전에 모든 개발자가 내면화해야 하는 개념적 기초입니다.
결론: 함수 호출은 챗봇과 에이전트를 구분하는 가장 중요한 기능입니다. 모든 주요 LLM 프로바이더가 이를 지원하며, AI 기반 애플리케이션을 구축하려면 이해하는 것이 필수적입니다.
함수 호출 루프는 어떻게 작동하는가? 완전한 요청-응답 사이클
함수 호출 루프는 5단계로 구성됩니다. API 형식은 다르지만 모든 프로바이더가 동일한 패턴을 따릅니다.
4단계가 결정적입니다: 여기서 당신의 코드가 실행됩니다. LLM은 2, 3, 5단계에만 관여합니다. 대부분의 튜토리얼이 간과하는 부분이며, 프로덕션에서 버그가 발생하는 정확한 지점입니다.
모든 프로바이더가 이해하는 범용 JSON Schema 형식의 도구 정의는 다음과 같습니다:
좋은 설명이 중요합니다. LLM은 설명 필드를 사용하여 함수를 언제 호출할지, 인수를 어떻게 채울지 결정합니다. 모호한 설명은 환상적인 인수와 놓친 호출로 이어집니다.
프로바이더가 유효한 JSON을 보장하는 방식에 대해 알아야 할 한 가지: 제약된 디코딩을 사용합니다. 모델이 구문적으로 올바른 JSON을 생성하기를 바라는 대신(이전 모델은 때때로 그렇지 않았습니다), 프로바이더는 토큰 생성을 제한하여 스키마와 일치하는 유효한 JSON을 형성하는 토큰만 생성하도록 합니다. 이것이 함수 호출이 모델에 "JSON을 출력해주세요"라고 요청하는 것보다 훨씬 더 안정적인 이유입니다.
루프는 반복될 수 있습니다. LLM이 여러 함수를 순차적으로 호출해야 하는 경우, 예를 들어 먼저 사용자의 위치를 조회한 후 해당 위치의 날씨를 가져와야 할 경우, 한 번 호출하고 결과를 받은 후 다음 호출을 합니다. 이 다단계 패턴이 복잡한 에이전트 워크플로우를 구동하는 것입니다.
함수 호출 vs 도구 사용, 차이점이 뭔가요?
간단한 답: 다른 이름의 같은 것입니다.
OpenAI는 원래 2023년 6월에 "함수 호출"을 소개했으며 여전히 이 용어를 사용하지만, API 매개변수는 이제 tools입니다. Anthropic은 문서에서 동일한 개념을 "tool use"라고 부릅니다. Google Gemini는 OpenAI의 용어와 일치하는 "함수 호출"을 사용합니다. 오픈 소스 모델은 일반적으로 "도구 호출" 또는 "함수 호출"을 같은 의미로 사용합니다.
기본 메커니즘은 모든 프로바이더 간에 동일합니다: LLM은 어떤 인수로 호출할 함수를 지정하는 구조화된 JSON 객체를 생성합니다. API 형식만 다릅니다. 명칭 혼동으로 인해 진행이 지연되지 않도록 하세요. 한 프로바이더를 이해하면 모두를 이해합니다.
OpenAI를 사용한 함수 호출 구현
OpenAI의 Chat Completions API부터 시작하여 3개의 모든 프로바이더에 걸쳐 동일한 get_weather 도구를 구현해봅시다. 이것은 가장 널리 사용되는 함수 호출 구현이며, 대부분의 개발자가 먼저 만나는 것입니다.
주목할 몇 가지 OpenAI 특정 세부 사항입니다. tool_choice 매개변수는 모델이 함수를 호출할 수 있는지 여부를 제어합니다: "auto"는 결정을 맡기고, "required"는 함수 호출을 강제하고, "none"은 호출을 완전히 비활성화합니다. 이름으로 특정 함수를 강제할 수도 있습니다.
strict: true 옵션은 구조화된 출력 모드를 활성화하여 생성된 인수가 제약된 디코딩을 통해 스키마를 준수하도록 보장합니다. 안정성 면에서 훌륭하지만 주의할 점이 있습니다: strict: true는 병렬 함수 호출과 호환되지 않습니다. 하나를 선택해야 하며, 이것은 명시적으로 문서화되지 않습니다.
OpenAI는 또한 일부 사용 사례에 대해 점진적으로 Chat Completions를 대체하는 새로운 Responses API를 제공합니다. 함수 호출은 둘 다에서 작동하지만, Chat Completions는 OpenAI의 함수 호출 가이드에 설명된 대로 현재는 표준으로 남아 있습니다.
Anthropic Claude를 사용한 도구 사용 구현
이제 Anthropic의 Messages API에서 동일한 get_weather 도구입니다. 개념은 동일하지만 API 구조는 Anthropic의 도구 사용 문서에 자세히 설명된 대로 몇 가지 중요한 방식으로 다릅니다.
OpenAI와의 주요 차이점: 도구 정의는 parameters 대신 input_schema를 사용합니다. 응답은 메시지의 tool_calls 대신 tool_use 콘텐츠 블록을 포함합니다. 그리고 도구 역할 메시지 대신 tool_result 콘텐츠 블록을 반환합니다.
Anthropic을 고유하게 만드는 것은 서버 측 도구입니다. Claude는 당신의 서버가 아닌 Anthropic의 서버에서 실행되는 내장 도구를 제공합니다: 인터넷 쿼리를 위한 web_search, 샌드박스에서 Python을 실행하기 위한 code_execution, 파일 편집을 위한 text_editor입니다. 다른 프로바이더는 이를 제공하지 않습니다. 도구 체인에 웹 검색 또는 코드 실행이 필요한 경우, Anthropic이 인프라를 처리하므로 당신은 그럴 필요가 없습니다.
Anthropic은 또한 LLM이 모든 것을 결정하도록 하는 대신 코드 기반 도구 오케스트레이션을 원하는 복잡한 워크플로우를 위한 프로그래매틱 도구 호출을 지원합니다.
Google Gemini를 사용한 함수 호출 구현
세 번째 구현: Google Gemini API의 동일한 get_weather 도구입니다. Gemini의 접근 방식은 OpenAI의 용어에 더 가깝지만 Google의 함수 호출 문서에 설명된 대로 원본 JSON 대신 자체 SDK 객체를 사용합니다.
Gemini는 원본 JSON Schema 대신 FunctionDeclaration 객체를 사용하며, 약간 더 자세하지만 SDK를 통한 더 나은 타입 안정성이 있습니다. 도구 구성은 function_calling_config를 사용하며 모드는 AUTO, ANY, NONE이고, OpenAI의 auto, required, none에 매핑됩니다.
Gemini를 구별하는 것은 함수 호출 인수 스트리밍입니다. Gemini 2.5 이상의 모델로는 인수가 생성될 때 스트리밍되어 복잡한 함수 호출의 첫 바이트까지의 시간을 줄입니다. 이것은 함수가 큰 인수 스키마를 가지고 있고 전체 인수가 도착하기 전에 검증 또는 준비를 시작하려고 할 때 중요합니다. Gemini는 또한 함수 호출을 실시간 스트리밍 애플리케이션을 위한 Live API와 통합하며, 다단계 도구 체인을 위한 컴포지셔널 함수 호출을 지원합니다.
...