OpenAI Function Calling으로 챗봇에 실시간 데이터 연동하기

문제 상황

사내 고객 지원 챗봇을 개선하는 과제를 받았다. 기존에는 GPT-3.5로 FAQ만 답변했는데, 실시간 주문 조회나 배송 상태 확인은 불가능했다. 사용자가 "내 주문 어디까지 왔어?"라고 물어도 일반적인 답변만 할 수 밖에 없었다.

Function Calling 도입

OpenAI가 6월에 공개한 Function Calling을 적용했다. 모델이 필요 시 특정 함수 호출을 요청하고, 그 결과를 다시 컨텍스트에 넣어 답변하는 방식이다.

const functions = [
  {
    name: "get_order_status",
    description: "주문 번호로 배송 상태를 조회한다",
    parameters: {
      type: "object",
      properties: {
        order_id: {
          type: "string",
          description: "주문 번호"
        }
      },
      required: ["order_id"]
    }
  }
];

const response = await openai.chat.completions.create({
  model: "gpt-4-0613",
  messages: messages,
  functions: functions,
  function_call: "auto"
});

if (response.choices[0].message.function_call) {
  const functionName = response.choices[0].message.function_call.name;
  const args = JSON.parse(response.choices[0].message.function_call.arguments);
  
  const orderStatus = await fetchOrderStatus(args.order_id);
  
  messages.push({
    role: "function",
    name: functionName,
    content: JSON.stringify(orderStatus)
  });
  
  const finalResponse = await openai.chat.completions.create({
    model: "gpt-4-0613",
    messages: messages
  });
}

결과

배송 조회, 재고 확인, 환불 가능 여부 등 5개 함수를 연동했다. GPT-4가 사용자 의도를 파악해 적절한 함수를 선택하는 정확도가 생각보다 높았다. 다만 토큰 비용이 기존 대비 1.5배 증가해서 캐싱 전략을 추가로 고민 중이다.

함수 스키마 정의를 명확히 하는 게 핵심이었다. description을 상세히 작성할수록 호출 정확도가 올라갔다.