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) }
]
});
}
실전 적용 시 주의점
- 함수 설명이 중요하다:
description을 명확히 작성해야 GPT가 적절한 타이밍에 함수를 호출한다. - 에러 핸들링: API 호출 실패 시 GPT에게 에러 메시지를 전달해 대체 응답을 생성하게 했다.
- 비용: Function calling도 토큰을 소모한다. 함수 정의가 프롬프트에 포함되므로 불필요한 함수는 제거했다.
결과
실시간 데이터가 필요한 20% 정도의 질문에서 자동으로 함수를 호출했다. 나머지는 일반 지식으로 답변했다. 토큰 사용량은 약 15% 증가했지만, 답변 정확도가 크게 개선됐다.