챗봇 기술이 발전하면서 사람들은 그럴싸하게 대화만 하는 챗봇 이상을 원하고 있다. 즉, 대화뿐 아니라 외부 세계와 상호 작용을 하면서 적절한 서비스(예를 들어 호텔 예약)를 수행해 주는 챗봇을 기대하고 있다. 특히 LLM이 로봇 기술과 접목 되면서 대화를 하면서 행동도 하는 로봇을 만들고자 하는 움직임이 활발하다. 챗봇이 대화를 하면서 어떤 행동을 할지를 적절하게 선택하게 하려면 어떻게 해야 할까?
Paper title: Large Language Models as Zero-shot Dialogue State Tracker through Function Calling
챗봇이 대화 맥락에 따라 어떤 행동을 할지 결정하게 하려면, 대화의 context로부터 사용자의 의도를 추론하여 정해진 형식에 맞춰 행동해야 할 action을 출력하도록 해야 한다. 이러한 Process를 Dialog State Tracking(DST)이라고 하며, 이것이 행동하는 챗봇을 만드는 핵심 기술이다.
DST를 좀 더 직접적으로 표현하면 어떤 행동을 할지를 정해진 Pool에서 선택하고, 그 행동을 실행할 때 필요한 부가 정보를 대화로부터 추출하는 과정이라고 정의할 수 있다. 예를 들어 대화 중 사용자가 호텔을 예약해 달라고 하면 행동 가능한 Action Pool에서 "Hotel_Reservation"을 선택하고 예약할 호텔의 요구 조건(일정, 사람 수, 위치 등)을 대화부터 추출하여 정한다. 이상의 추출된 정보를 JSON과 같은 format으로 출력하여 외부 API에 제공하고, 그 실행 결과를 받은 후 언어로 실행 결과를 알려 준다. 따라서 DST를 정확히 수행할 수 있으면 챗봇은 대화를 넘어 행동을 통해 서비스를 제공해 줄 수 있게 된다.
하지만 대화, 특히 멀티턴 대화를 통해 Action과 부가정보(argument)를 정확히 추출하는 것은 아직 Challenging한 분야이다. 물론 GPT-4와 같은 고성능 LLM을 이용하면 좀 더 높은 성능을 기대할 수 있으나 (놀랍게도) 아직 실용화하기에 성능이 부족할 뿐 아니라, 서비스 하는 입장에서 GPT-4의 비용을 생각하면 가급적 작은 모델로 서비스 가능한 챗봇을 만들고 싶을 것이다. 이 논문은 DST의 성능을 높이기 위한 시도와 경험을 공유해 주고 있다.
이 논문을 통해 취할 수 있는 DST 성능 개선 전략은 다음과 같이 요약할 수 있다.
먼저 Action을 결정하고, 결정된 Action을 다시 프롬프트로 넣어 부가 정보를 결정하는 단계적인 방식이 성능 개선에 도움이 되었다. Chain-of-Thought가 LLM 성능 개선에 도움이 됨과 일맥 상통한다.
Action과 부가 정보 description에 JSON format을 사용하였다. 정보를 명확하게 챗봇에게 제공하기 위해서는 JSON과 같은 format을 활용하는 것이 유용하다. 실험에 있어 자연어로 제공한 것과 성능 차이는 없었긴 하지만 프롬프트 관리상에 있어서도 JSON 형식으로 행동과 부가정보를 정의하는 것은 유용하다고 생각한다.
Few-shot sample을 제공해주면 DST 성능이 올라간다. 여기서는 토큰 제한 때문에 1~5개의 Few-shot sample을 제공했지만 sample을 늘릴 수록 DST의 성능이 올라갔다고 보고하고 있다.
비교적 적은 수의 sample로도 Fine-tuning으로 DST의 성능을 높일 수 있었다. 36가지의 Action에 대해 200개의 sample을 사용했을 때 성능 개선 효과가 가장 컸다고 한다. 더 많은 샘플을 사용하면 오히려 overfitting이 되어 성능이 떨어진다고 보고하고 있다. 숫자는 분야마다 다를 수 있으니 실험적으로 정하면 되나, 그리 많지 않은 샘플을 이용한 fine-tuning으로도 성능 개선이 가능하다는 것이 key point이다.
대단한 방법을 이 논문에서 제시해 주고 있지 않지만 행동하는 챗봇을 만들 생각이 있다면 어떤 방식으로 할 수 있는지 사례 중 하나로 참고해볼만한 논문이다.