OpenAI Function Calling으로 LLM에 실시간 데이터 주입하기

문제 상황

고객 문의 챗봇에 GPT-4를 도입했는데, 주문 상태나 재고 정보 같은 실시간 데이터를 답변에 포함해야 했다. LLM의 학습 데이터는 2023년 4월까지라 최신 정보를 알 수 없었다.

Function Calling 적용

OpenAI가 6월에 공개한 Function Calling을 사용했다. LLM이 필요 시 특정 함수를 호출하도록 유도하는 방식이다.

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',
  messages: [{ role: 'user', content: '주문 ABC123 어디까지 왔나요?' }],
  functions: functions,
  function_call: 'auto'
});

if (response.choices[0].message.function_call) {
  const args = JSON.parse(response.choices[0].message.function_call.arguments);
  const orderData = await fetchOrderStatus(args.order_id);
  
  // 함수 결과를 다시 GPT에 전달
  const finalResponse = await openai.chat.completions.create({
    model: 'gpt-4',
    messages: [
      { role: 'user', content: '주문 ABC123 어디까지 왔나요?' },
      response.choices[0].message,
      { role: 'function', name: 'get_order_status', content: JSON.stringify(orderData) }
    ]
  });
}

실전 적용 시 주의점

  1. 함수 설명이 중요하다: description을 명확히 작성해야 GPT가 적절한 타이밍에 함수를 호출한다.
  2. 에러 핸들링: API 호출 실패 시 GPT에게 에러 메시지를 전달해 대체 응답을 생성하게 했다.
  3. 비용: Function calling도 토큰을 소모한다. 함수 정의가 프롬프트에 포함되므로 불필요한 함수는 제거했다.

결과

실시간 데이터가 필요한 20% 정도의 질문에서 자동으로 함수를 호출했다. 나머지는 일반 지식으로 답변했다. 토큰 사용량은 약 15% 증가했지만, 답변 정확도가 크게 개선됐다.