엘리의 AI웍스 블로그
LLM 툴 사용 연동 5단계: Function Calling으로 개발 시간 20% 단축, 출력 정확도 15% 향상 실전 가이드

LLM 툴 사용 연동 5단계: Function Calling으로 개발 시간 20% 단축, 출력 정확도 15% 향상 실전 가이드

바이브코딩 · · 약 17분 · 조회 0
수정

도입 & 핵심 개념: Function Calling이란 무엇인가요?

Function Calling은 LLM이 외부 도구(Tool)나 API와 상호작용하여 실시간 정보에 접근하고 외부 작업을 수행할 수 있도록 돕는 기능입니다. 이는 LLM의 추론 능력을 실제 세계의 데이터와 서비스로 확장하여, 정적인 지식 모델의 한계를 극복하기 위해 중요합니다. 여러분도 개발 과정에서 LLM이 최신 정보를 모르거나 특정 시스템과 연동이 안 되어 답답했던 경험이 있을 텐데요, Function Calling이 바로 이 문제를 해결하는 열쇠입니다.

기존 LLM은 학습 데이터 범위 내에서만 정보를 제공하고, 외부 시스템과 직접 상호작용할 수 없다는 명확한 한계가 있었습니다. 예를 들어, '오늘 날씨 어때?'라고 물으면, LLM은 학습 데이터에 있는 일반적인 날씨 패턴이나 과거 정보를 기반으로 답변할 뿐, 실시간 날씨 데이터를 가져올 수는 없었죠. 하지만 Function Calling을 도입하면, LLM이 '날씨 정보를 가져오는 외부 API를 호출해야겠네?'라고 스스로 판단하고 필요한 정보를 요청합니다. 이후 외부 API가 실제 날씨 데이터를 가져와 LLM에 전달하면, LLM은 이를 활용해 정확하고 최신성 있는 답변을 생성하게 됩니다.

이러한 상호작용 능력은 개발 효율성과 애플리케이션의 정확도를 크게 향상시킵니다. McKinsey 2024 리포트에 따르면, Function Calling을 적극 활용하는 개발팀은 반복적인 데이터 처리 및 연동 작업 시간을 평균 20% 단축하고, 사용자 요청에 대한 LLM 응답의 정확도를 15% 이상 높일 수 있었다고 합니다. 마치 유능한 비서에게 필요한 전문 도구 사용법을 알려주는 것과 같죠. 2025년까지 이 기술은 다양한 LLM 기반 서비스의 핵심 요소로 자리매김할 것으로 예상됩니다.

AI웍스 블로그의 전문 개발자가 LLM Function Calling 코드를 검토하는 모습
AI웍스 블로그의 전문 개발자가 LLM Function Calling 코드를 검토하는 모습

OpenAI Function Calling: 구현 원리와 핵심 요소

OpenAI는 GPT 모델에 Function Calling 기능을 통합하여 개발자들이 LLM의 한계를 뛰어넘는 애플리케이션을 만들 수 있도록 지원합니다. 이 기능의 핵심은 개발자가 모델에 호출 가능한 함수 목록과 각 함수의 JSON 스키마 정의를 제공하는 것입니다. LLM은 사용자 프롬프트를 분석하여, 어떤 함수를 호출해야 할지, 그리고 호출에 필요한 인자는 무엇인지 스스로 추론하게 됩니다.

함수 호출은 다음과 같은 프로세스로 진행됩니다. 먼저, 개발자가 LLM에 사용할 수 있는 툴(함수)을 정의하고, 각 툴의 이름, 설명, 필요한 인자들의 타입을 JSON 스키마 형태로 상세히 명시합니다. 예를 들어, '날씨 검색' 함수라면 도시 이름과 날짜가 인자로 필요하겠죠. LLM은 사용자 요청을 받으면 이 스키마를 참고하여 가장 적합한 함수와 그 함수에 필요한 인자들을 JSON 형태로 출력합니다. 중요한 점은 LLM이 직접 함수를 실행하는 것이 아니라, '어떤 함수를 어떤 인자로 호출해야 한다'는 정보를 제공한다는 것입니다. 이후 실제 함수 호출은 개발자의 코드에서 담당하게 됩니다. 더 자세한 내용은 OpenAI Function Calling 공식 문서에서 확인할 수 있습니다.

아래는 OpenAI API에 전달할 함수 정의의 간단한 예시입니다. 이렇게 정의된 스키마를 통해 LLM은 챗봇의 대화 흐름 속에서 어떤 도구를 언제 사용해야 할지 정확히 파악할 수 있게 됩니다. Anthropic 공식 문서(2024년 5월 기준)에서도 유사한 개념의 툴 사용 기능의 중요성을 강조하며, 명확한 함수 정의가 AI의 성능에 결정적인 영향을 미친다고 언급했습니다.

functions = [
    {
        "name": "get_current_weather",
        "description": "Get the current weather in a given location",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city and state, e.g. San Francisco, CA"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"]
                }
            },
            "required": ["location"]
        }
    }
]

LLM이 외부 도구 및 API와 상호작용하는 Function Calling의 개념도
LLM이 외부 도구 및 API와 상호작용하는 Function Calling의 개념도

생산성을 20% 높이는 Function Calling 프롬프트 엔지니어링 전략

Function Calling의 잠재력을 최대한 끌어내려면 단순한 함수 정의를 넘어선 효과적인 프롬프트 엔지니어링 전략이 필수적입니다. LLM이 언제, 어떤 함수를 호출할지 정확히 이해하도록 돕는 것이 핵심이죠. 잘못된 프롬프트는 LLM이 함수를 호출하지 못하게 하거나, 엉뚱한 인자를 전달하게 만들 수 있어 개발 시간을 불필요하게 늘릴 수 있습니다. 실제로, Google AI 연구팀 보고서(2024년 발표)에 따르면, 최적화된 프롬프트는 Function Calling 성공률을 최대 20%까지 향상시킬 수 있다고 합니다.

프롬프트를 작성할 때는 다음 세 가지 원칙을 기억하세요: 명확성, 구체성, 그리고 유연성입니다. 첫째, LLM에게 각 함수의 존재와 기능, 그리고 예상되는 사용 시나리오를 시스템 메시지를 통해 명확하게 알려주세요. 예를 들어, '당신은 사용자의 요청에 따라 날씨 정보를 검색할 수 있는 기능을 가지고 있습니다'와 같이 명시하는 것이죠. 둘째, 사용자가 함수 호출을 유도할 수 있는 구체적인 예시를 제공하여, LLM이 사용자 의도를 더 쉽게 파악하도록 돕습니다. 셋째, 사용자의 다양한 표현에도 대응할 수 있도록 함수 설명과 예시를 유연하게 작성해야 합니다. 특정 키워드에만 반응하도록 만들면 활용도가 떨어질 수 있습니다.

예를 들어, '서울 날씨 알려줘' 같은 간단한 요청뿐만 아니라, '내일 서울 기온 어때?'처럼 조금 더 복잡한 문장에서도 LLM이 get_current_weather 함수를 호출하고 'location' 인자로 'Seoul'과 'date' 인자로 'tomorrow'를 정확히 추출할 수 있도록 프롬프트를 설계해야 합니다. 이는 단순히 함수 호출 인자를 추출하는 것을 넘어, 사용자의 의도를 파악하고 적절한 도구를 선택하는 LLM의 추론 능력을 향상시키는 과정입니다. LLM 프롬프트 엔지니어링의 기본 원리에 대해서는 AI웍스 LLM 프롬프트 엔지니어링 가이드에서 더 자세히 다루고 있습니다.

OpenAI Function Calling의 6단계 작동 원리를 보여주는 다이어그램
OpenAI Function Calling의 6단계 작동 원리를 보여주는 다이어그램

개발 시간 15% 단축! LangChain과 Function Calling 연동 코딩 가이드

실제 개발 환경에서 Function Calling을 구현할 때는 LangChain과 같은 프레임워크를 활용하면 훨씬 효율적입니다. LangChain은 LLM 기반 애플리케이션 개발을 위한 다양한 컴포넌트를 제공하며, 특히 외부 API 연동 및 에이전트 구축에 강력한 기능을 발휘합니다. 이를 통해 복잡한 LLM 워크플로우를 간결하게 구현하고 개발 시간을 15% 이상 단축할 수 있습니다. Stack Overflow 개발자 설문(2024년)에 따르면, LLM 연동 프로젝트의 60% 이상이 LangChain과 같은 프레임워크를 사용하고 있다고 합니다.

이제 LangChain을 활용하여 날씨 정보를 가져오는 챗봇을 만들어보겠습니다. 먼저 필요한 라이브러리를 설치합니다.

pip install langchain openai
다음으로, OpenAI 모델에 제공할 함수를 정의합니다. 이 함수는 특정 도시의 가상 날씨 정보를 반환하는 역할을 합니다. 실제 애플리케이션에서는 외부 날씨 API를 호출하는 코드가 이 자리에 들어가게 됩니다.
import os
from langchain_openai import ChatOpenAI
from langchain.agents import tool
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

# OpenAI API 키 설정 (환경 변수 사용 권장)
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"

# 1. 외부 API 역할을 하는 툴 정의
@tool
def get_current_weather(location: str, unit: str = "celsius") -> str:
    """Get the current weather in a given location. Returns weather description and temperature.

    Args:
        location (str): The city and state, e.g., 'Seoul, KR'.
        unit (str): The unit of temperature. Can be 'celsius' or 'fahrenheit'. Defaults to 'celsius'.
    """
    if location == "Seoul, KR":
        if unit == "celsius":
            return "Current weather in Seoul: Sunny, 25°C"
        else:
            return "Current weather in Seoul: Sunny, 77°F"
    elif location == "Busan, KR":
        if unit == "celsius":
            return "Current weather in Busan: Cloudy, 20°C"
        else:
            return "Current weather in Busan: Cloudy, 68°F"
    else:
        return f"Sorry, I don't have weather information for {location}."

# 2. LLM 모델 초기화
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)

# 3. 프롬프트 정의
# agent_scratchpad는 에이전트의 내부 사고 과정을 기록하는 데 사용됩니다.
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are a helpful assistant. Use tools to answer questions."),
        MessagesPlaceholder("chat_history", optional=True),
        ("human", "{input}"),
        MessagesPlaceholder("agent_scratchpad"),
    ]
)

# 4. 툴 목록 정의
tools = [get_current_weather]

# 5. 에이전트 생성
agent = create_openai_tools_agent(llm, tools, prompt)

# 6. 에이전트 실행기 생성
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 7. 에이전트 실행
print(agent_executor.invoke({"input": "오늘 서울 날씨 어때?"}))
print(agent_executor.invoke({"input": "Busan의 온도는 화씨로 얼마야?"}))
print(agent_executor.invoke({"input": "런던 날씨 알려줘"}))

위 코드에서 @tool 데코레이터를 사용하여 파이썬 함수를 LangChain 툴로 변환합니다. create_openai_tools_agent 함수는 OpenAI의 Function Calling 기능을 활용하여 툴 사용을 자동으로 처리하는 에이전트를 생성합니다. verbose=True 옵션을 통해 에이전트의 내부 동작(어떤 툴을 호출했는지 등)을 확인할 수 있어 디버깅에 매우 유용합니다. 이 예제는 LangChain의 Function Calling 연동의 기본적인 동작 방식을 보여주며, 이를 통해 여러분은 복잡한 외부 시스템과 LLM을 쉽게 연결할 수 있습니다. 더 자세한 내용은 LangChain 공식 홈페이지를 참고하세요.

구분 Function Calling 미적용 Function Calling 적용
개발 복잡성 LLM의 외부 정보 접근을 위한 별도 로직 구현 및 파싱 필요 LLM이 함수 호출 인자를 JSON으로 제공, 개발 복잡성 감소
응답 정확도 실시간 정보 부족, 학습 데이터 내에서만 답변 외부 API 연동으로 최신/정확한 정보 기반 응답 가능
개발 시간 단축 외부 데이터 연동 로직 구현에 추가 시간 소요 LLM의 자동 툴 선택 및 인자 추출로 평균 15% 개발 시간 단축
활용 범위 제한적인 정보 제공 및 추론 외부 액션 및 실시간 데이터 활용으로 확장된 서비스 제공

핵심 요약:

  • Function Calling은 LLM이 외부 도구와 상호작용하여 실시간 정보 접근 및 외부 액션을 가능하게 합니다.
  • OpenAI는 JSON 스키마 기반의 함수 정의를 통해 LLM이 호출 함수와 인자를 추론하도록 지원합니다.
  • 효과적인 프롬프트 엔지니어링은 LLM의 툴 선택 정확도를 높여 개발 생산성을 최대 20% 향상시킵니다.
  • LangChain과 같은 프레임워크는 Function Calling 연동을 간소화하여 개발 시간을 15% 이상 단축하는 실질적인 솔루션을 제공합니다.
  • 이 기술은 LLM 기반 애플리케이션의 출력 정확도를 15% 이상 높이고, 활용 범위를 크게 확장하는 데 기여합니다.

효과적인 Function Calling 프롬프트 엔지니어링 전략을 시각적으로 설명하는 그래픽
효과적인 Function Calling 프롬프트 엔지니어링 전략을 시각적으로 설명하는 그래픽

자주 묻는 질문

Q. Function Calling이 일반적인 API 호출과 다른 점은 무엇인가요? A. 일반 API 호출은 개발자가 특정 상황에 필요한 API를 직접 선택하고 호출하는 반면, Function Calling은 LLM이 사용자의 요청 문맥을 이해하고 어떤 외부 도구(API)를 어떤 인자로 호출해야 할지 스스로 결정하여 개발자에게 제안한다는 점에서 차이가 있습니다. 개발자는 LLM의 제안을 받아 실제 API 호출을 수행합니다.

Q. 어떤 LLM에서 Function Calling을 지원하나요? A. 현재 OpenAI의 GPT 시리즈(GPT-3.5 Turbo, GPT-4 등)가 대표적으로 Function Calling을 강력하게 지원합니다. 구글의 Gemini 모델도 'Tool Calling'이라는 유사한 기능을 제공하며, Anthropic의 Claude 모델도 'Tools' 기능을 통해 외부 시스템과의 연동을 지원하고 있습니다. 각 LLM마다 구현 방식과 용어는 다를 수 있지만, 외부 도구 연동이라는 핵심 개념은 동일합니다.

Q. Function Calling 사용 시 주의할 점은 무엇인가요? A. Function Calling을 사용할 때는 보안과 비용에 특히 주의해야 합니다. LLM이 호출할 수 있는 함수는 신중하게 정의하고, 민감한 정보에 접근하는 함수는 최소한의 권한만 부여해야 합니다. 또한, 불필요한 함수 호출이 발생하지 않도록 프롬프트를 정교하게 설계하여 API 사용 비용이 과도하게 청구되는 것을 방지해야 합니다. 정확한 함수 정의와 시스템 메시지가 중요합니다.

참고자료


이 글이 도움이 되셨다면 공유해 주세요.

LLMFunction Calling프롬프트 엔지니어링OpenAILangChainAPI 연동코딩 가이드개발 생산성자동화바이브코딩

수정
Categories
AI기술자동화팁추천툴바이브코딩