OpenAI Function Calling으로 챗봇에 실시간 데이터 연동하기
배경
사내 고객 지원 챗봇에 실시간 주문 조회 기능을 추가해야 했다. 처음엔 프롬프트에 "JSON 형식으로 응답해줘"라고 요청했지만, 파싱 실패가 잦았다.
6월에 출시된 OpenAI Function Calling API를 적용해보니 문제가 깔끔하게 해결됐다.
구현
const functions = [
{
name: "get_order_status",
description: "주문 번호로 배송 상태를 조회한다",
parameters: {
type: "object",
properties: {
order_id: {
type: "string",
description: "주문 번호 (예: ORD-12345)"
}
},
required: ["order_id"]
}
}
];
const response = await openai.chat.completions.create({
model: "gpt-4-0613",
messages: [{role: "user", content: "ORD-12345 배송 어디쯤 왔어?"}],
functions: functions,
function_call: "auto"
});
const functionCall = response.choices[0].message.function_call;
if (functionCall?.name === "get_order_status") {
const args = JSON.parse(functionCall.arguments);
const orderData = await fetchOrderStatus(args.order_id);
// 결과를 다시 GPT에게 전달
const finalResponse = await openai.chat.completions.create({
model: "gpt-4-0613",
messages: [
{role: "user", content: "ORD-12345 배송 어디쯤 왔어?"},
response.choices[0].message,
{role: "function", name: "get_order_status", content: JSON.stringify(orderData)}
]
});
}
결과
- JSON 파싱 에러가 사라졌다
- 사용자 의도 파악 정확도가 올라갔다
- 여러 function을 등록해두면 GPT가 알아서 적절한 걸 선택한다
단점은 GPT-4만 지원하고, 응답이 두 번 필요해서 레이턴시가 증가한다는 점이다. 하지만 안정성 면에서 충분히 trade-off 할 만했다.
주의사항
function description을 한글로 써도 작동하지만, 영어가 더 정확하게 인식되는 것 같았다. 파라미터 검증은 여전히 서버에서 해야 한다.