상담 대화로부터 자동으로 FAQ 추출하기

FAQ 자동완성 프로젝트를 소개합니다

Jave • Jave Jang, AI Team :D

  • 테크 인사이트

안녕하세요. 채널톡의 AI팀 제이브입니다!

이번 포스팅에서는 제가 처음 채널톡에 합류해 인턴 기간 동안 진행했던 FAQ 자동완성 프로젝트에 대해서 소개드리려고 합니다. FAQ가 생소하실 분들을 위해 간단하게 FAQ에 대해서 정리하고, 제가 맡았던 FAQ 자동완성 기능에 대해 설명드린 후 실제 FAQ 자동완성 샘플 결과를 보시면서 어느정도의 퀄리티인지 직접 확인하는 것으로 포스팅을 진행하려고 합니다!


FAQ란?

FAQFreuquently Asked Questions의 약자로, 말 그대로의 자주 묻는 질문과 이에 대응하는 답변 문서 혹은 리스트를 의미합니다. FAQ는 정말 많은 곳에서 발견할 수 있는데요, 저희 채널톡에서도 채널톡 사용 방법을 돕기 위한 사용 가이드 문서에서도 FAQ를 제공하고 있습니다.

FAQ는 주로 상품 등의 설명만으로 부족한 부분이 있어 고객들이 자주 하는 질문들을 취합해 사전에 제공하는 용도로 사용됩니다. 설명에서 이해가 어렵거나 헷갈리는 부분 등이 발생하면서 생기는 문의를 해결하기 위해 제공되는 추가 문서의 개념인거죠. 이러한 측면에서 FAQ는 원본 문서를 수정할 필요 없이 FAQ를 덧붙임으로써 고객들에게 더 많은, 더 좋은 정보를 전달할 수 있습니다.

또 고객들에게 제공될 뿐만 아니라 자사에서 다른 용도로도 사용될 수가 있습니다. 예를 들어, 채널톡을 사용하는 기업의 경우 상담사들이 자신이 잘 모르는 문의가 들어왔을 때, FAQ 문서를 참고해서 더 유익한 답변을 제공할 수 있습니다.

위와 같이 FAQ는 단순히 고객에게 정보 제공이라는 특징 외에도 다양한 목적으로써 사용될 수 있는 역할을 가지고 있습니다.

FAQ 작성의 어려움

그러나 이러한 장점에도 불구하고, FAQ를 만드는데 많은 어려움이 따르는데요.

먼저, 자주 하는 질문을 수집하고 정리하는데도 많은 리소스 소모를 요구합니다. 예를 들면, 고객들이 설명에서 어떤 부분에서 혼동하거나 질문이 생길지 미리 예측하고, 이를 질문과 답변의 형태로 만들어놔야 하죠. 사전에 이러한 작업이 어렵다면, 실제 문의를 모니터링하면서 어떤 질문들이 주로 문의되는지 통계를 내서 정리하는 작업이 진행되어야 합니다.

설명 이렇게 한 번 FAQ를 만들었다고 하더라도, 꾸준히 FAQ를 업데이트해야 합니다. 예를 들어, 어떤 제품에 신기능이 출시되었다고 할 때, 이에 대비해서 신기능 관련한 FAQ가 추가가 되어야겠죠.

FAQ 만드는 작업은 처음 만들 때 뿐만 아니라 꾸준히 리소스를 요구하는 작업임을 알 수 있습니다. 실제로도 다양한 웹사이트에서 FAQ 항목을 제공하고 있지만, 처음 만들어진 상태로 방치되거나 업데이트가 느린 곳이 상당히 많은 것을 확인할 수 있습니다.

반면에 FAQ 자동완성 기능을 사용하면, 채널톡을 사용하는 모든 기업들은 메세지 기반으로 생성되는 FAQ 문서를 이러한 리소스 소요 없이 얻을 수 있게 됩니다. 그럼 FAQ 자동완성 기능이 어떤 과정으로 동작하는지 확인해보실까요?


FAQ 자동완성

FAQ 자동완성 과정을 간단하게 정리하면 다음과 같습니다.

  1. 상담 대화(유저챗)로부터 고객과 상담사 메세지 수집 및 전처리

  2. 메세지 텍스트로부터 메세지 임베딩 벡터 계산

  3. 클러스터링 알고리즘(w. 메세지 임베딩)을 통한 고객 메세지 그룹화

  4. 각 그룹으로부터 QnA 생성

  5. 생성된 QnA를 취합하고, 비슷한 QnA끼리 묶어주는 카테고리 작업

먼저 상담 대화로부터 고객 메세지 및 상담사의 메세지를 수집합니다. 그리고 메세지의 수가 상당히 많아 이로부터 한번에 QnA를 생성하기 어렵기 때문에 임베딩 벡터와 클러스터링 알고리즘을 사용해 비슷한 메세지끼리 그룹지어주는 작업을 거쳐, 각 그룹으로부터 QnA를 생성합니다. 마지막으로 좀 더 완성도 있는 FAQ를 만들기 위해, 비슷한 QnA끼리 묶어 카테고리를 만들어주는 작업을 거쳐 FAQ 최종본이 완성됩니다.

그럼 각 단계 별로 더 자세하게 딥다이브 해보도록 하겠습니다. ☺️

1. 🔄 상담 대화(유저챗)로부터 고객과 상담사 메세지 수집 및 전처리

FAQ를 생성하기 위해 가장 먼저 해야하는 작업은 해당 채널의 상담 대화(*유저챗)으로부터 메세지들을 수집하고, 적절한 전처리를 거치는 작업입니다. 메세지 데이터에는 메세지 내용을 포함하는 텍스트 뿐만 아니라 다양한 정보를 포함하고 있는데, FAQ 자동완성에서는 해당 메세지가 어느 상담 대화에 속하는지, 해당 메세지가 고객의 메세지인지 상담사의 메세지인지의 정보 등을 사용합니다.

그리고나서 추후의 작업을 위해 약간의 가공을 거치는 전처리(pre-processing) 과정을 거칩니다. 먼저 연속된 고객 혹은 상담사의 메세지를 하나의 메세지로 합칩니다.

Plaintext
# 전처리 전
상담사 A: 안녕하세요! 무엇을 도와드릴까요?
고객 B: 안녕하세요.
고객 B: 제가 어제 불량건 때문에 제품 반품을 했는데요.
고객 B: 보통 교환하는데 얼마나 걸리나요?
Plaintext
# 전처리 후
상담사 A: 안녕하세요! 무엇을 도와드릴까요?
고객 B: 안녕하세요. 제가 어제 불량건 때문에 제품 반품을 했는데요. 보통 교환하는데 얼마나 걸리나요?

위와 같이 하나의 연속된 메세지는 하나로 합쳐도 같은 의미를 담고 있는 경우가 많기 때문에, 그리고 상당히 많은 텍스트 양을 줄이기 위해 하나로 합치는 과정을 거칩니다.

그리고나서 오래되어 잘못된 정보(outdated)가 FAQ에 반영되어 나타나는 것을 방지하기 위해 최근 일정 기간 내의 상담 대화의 메세지만 포함되도록 하는 작업을 거칩니다. 이를 통해, 최근 메세지를 기반으로 최신의 FAQ를 생성할 수 있게 됩니다. 실제로 채널톡에서는 최근 요금제 개편으로 인해 많은 분들이 변경된 요금제 관련 문의를 주셨는데, 채널톡에 대해 최근 FAQ 자동완성 샘플을 뽑았을 때 변경된 요금제 관련해서 QnA가 생성되는 것을 확인할 수 있었습니다!

2. 💬 메세지 텍스트로부터 메세지 임베딩 벡터 계산

필요한 데이터(메세지)들을 수집하고 나면, 메세지의 텍스트로부터 임베딩 벡터를 뽑는 과정을 거칩니다.

임베딩 벡터(Embedding Vector)는 간단하게 정리하면 어떤 데이터의 특징이나 특성을 벡터로 표현되는 것을 말합니다. 사람은 텍스트로부터 의미 등을 읽어낼 수 있지만, 기계는 불가능하기 때문에 기계가 이해할 수 있는 형태의 벡터로 표현하게 되는거죠. 임베딩 벡터는 이전 포스팅에서 다루었으니 관심 있으신 분들은 한번 읽어보는 것을 추천드립니다!

이렇게 텍스트로부터 잘 임베딩된 벡터를 추출하게 되면, 이러한 벡터들을 어떤 연산을 거쳐 유의미한 관계를 계산할 수 있게됩니다. 예를 들어, “남자” 임베딩 벡터와 “남성” 임베딩 벡터는 서로 벡터 간 거리(혹은 유사도)가 가깝고, “남성” 임베딩 벡터와 “여성” 임베딩 벡터는 서로 벡터간 거리가 멀어지게 됩니다.

3. 📌  클러스터링 알고리즘(w. 메세지 임베딩)을 통한 고객 메세지 그룹화

위 과정에서 임베딩 벡터를 추출하고 나면, 클러스터링 알고리즘을 사용하여 비슷한 고객 메세지끼리 묶는 작업을 거치게 됩니다. 단순히 메세지 세트로부터 바로 QnA를 뽑기보다는, 먼저 비슷한 메세지끼리 1차로 묶어주고, 묶인 작은 세트로부터 QnA를 만드는 것이죠. 전체 메세지가 아닌 고객 메세지만 사용하는 이유는 FAQ에서 중요한 요소는 질문(문의)이고, 이 질문은 주로 고객 메세지에 담겨있기 때문입니다.

클러스터링 알고리즘

클러스터링에 대해 생소하신 분들도 계실텐데요. 클러스터링이란 유사한 특징 혹은 특성을 갖는 데이터들을 같은 그룹으로 묶는 방법(알고리즘)을 말합니다. 여기서 벡터끼리 얼마나 유사한 특성을 가지고 있는지 계산하기 위해 앞에서 추출한 임베딩 벡터가 사용되는 거죠!

FAQ 자동완성에서는 비슷한 것끼리 묶어주는게 전체 과정에서 중요한 역할을 담당하기 때문에 다양한 알고리즘으로 실험을 진행했습니다. 클러스터링 알고리즘으로는 대표적으로 K-Means, HDBSCAN, OPTICS 등이 있는데, FAQ 자동완성에서는 K-Means 알고리즘을 선택했습니다.

K-Means 알고리즘은 K개의 그룹(클러스터)가 만들어진다고 해서 K-Means라고 불리는데요. 빠른 클러스터링 속도가 특징입니다.

이 외에도 중점적으로 봤던 알고리즘은 HDBSCAN이였습니다. HDBSCAN은 DBSCAN 알고리즘에 계층적(Hierarchical)인 개념이 추가된 알고리즘으로, 생성되는 클러스터의 크기가 다양할 수 있고, 어느 클러스터에도 속하지 않는 노이즈 처리 기능이 특징입니다. 그러나 HDBSCAN 알고리즘은 데이터 크기가 커질수록 클러스터링 속도가 느려지는 단점으로 실적용하기 어려워 제외되었습니다.

K-Means 알고리즘은 비록 몇 개의 클러스터를 만들 것인지 설정해줘야 하고 따로 노이즈를 처리하는 기능은 가지고 있지 않지만, 많은 실험을 통해 적절한 K 값을 적용하고, 노이즈 처리의 경우 뒤의 과정에서 충분히 노이즈를 스스로 제거하고 적절한 QnA를 제거하는 것이 확인되어 K-Means 알고리즘을 선택하게 되었습니다!

4. 🤖 각 그룹으로부터 QnA 생성

클러스터링을 통해 비슷한 고객 메세지끼리 같은 그룹으로 묶어주는 작업을 거치면, 각 그룹에서 각 고객 메세지를 포함하는 상담 대화 내역들을 기반으로 QnA(Question and Answer)를 생성합니다.

비슷한 고객 메세지 그룹에서 각 고객 메세지를 포함하는 상담 대화들은 비슷한 유형의 문의에 대해서 다룰 것이라고 생각할 수 있고, 이를 통해 일반화된 QnA를 만드는 방법입니다. 상담 대화들로부터 일반화된 QnA를 만들 때에는 잘 정의된 프롬프트와 함께 OpenAI의 GPT 모델을 통해 QnA를 생성합니다. 특히 최근에 GPT-4 모델이 수용가능한 입력 프롬프트의 크기가 상당히 길어지면서(128K) 더욱 좋은 퀄리티의 FAQ를 얻을 수 있었습니다.

상담 대화들로부터 QnA를 만드는 과정에서도 작은 디테일들이 있습니다. 먼저 한 그룹으로부터 가져온 상담 대화 내역들을 모두 사용하기 어렵기 때문에 그 안에서도 어떤 상담 대화들을 사용할지 결정(샘플링)해야 하는데요. 이 때에도 임베딩 벡터가 사용됩니다.

먼저 해당 그룹(클러스터)의 중심 벡터를 계산하고, 그 그룹에 속한 고객 메세지의 임베딩 벡터 간의 거리를 계산하여 가까운 순으로 일정 개수만큼 뽑아, 해당 상담 대화들을 사용합니다.

프롬프트 엔지니어링

사용할 상담 대화가 결정되면, 이를 사용하여 적절한 프롬프트와 함께 GPT 모델에 전달하여 QnA를 만들게 됩니다. 이 때에도, 좋은 결과를 얻기 위해 다양한 프롬프트를 사용하여 실험을 진행했는데 효과를 봤던 방법들을 간단하게 정리하면 다음과 같습니다.

  • 예시 넣어주기(Few-Shot)

    • 좋은 결과를 얻는데 있어 특히 효과적인 방법으로, 주어진 작업에 대해 하나 혹은 여러 개의 예시를 넣어주는 것입니다. 예시를 통해 모델이 주어진 입력에 대해 어떤 결과를 생성해야하는지 참고하게 되는거죠.

    • FAQ 자동완성에서도 어떤 스타일과 포맷의 QnA가 생성되면 좋을지 참고하도록 여러 개의 QnA 결과 예시를 프롬프트에 넣어주었습니다. 이를 통해 일관된 문체를 가지면서 적절하게 일반화된 QnA가 만들어지는 것을 확인할 수 있었습니다.

  • 조건 잘 정의하기

    • 당연한 말이지만 단순히 FAQ를 만들어달라는 간단한 프롬프트보다 잘 만들어진 조건이 주어지면, 해당 조건에 맞는 결과를 얻을 수 있습니다. 특히 FAQ는 잘 일반화된 QnA를 얻는 것이 중요하기 때문에 이러한 결과를 얻기 위해 어떤 것들을 고려해야하는지 프롬프트에 넣어주는 것이 좋습니다.

5. 🧺 생성된 QnA를 취합하고, 비슷한 QnA끼리 묶는 카테고리 작업

마지막으로 단순히 QnA 목록에서 완성도 있는 FAQ들 만들기 위해 비슷한 QnA끼리 묶어주고, 적절한 카테고리 이름을 붙여주는 작업을 거쳐 최종 FAQ가 완성됩니다.

생성된 QnA 목록은 GPT 모델이 한번에 처리가 가능한 크기이므로 GPT 모델을 통해 비슷한 것끼리 묶어주고, 여기에 적절한 카테고리 이름을 붙여주는 것까지 한번에 처리합니다. 혹시 GPT 모델로 비슷한 작업을 하려 하는데 어려움을 겪고 계신 분들을 위해 팁을 드리자면, OpenAI GPT 모델의 Function Calling 기능을 사용해서 구현했습니다. 각 QnA에 적절한 ID 값을 부여하고, Function Calling을 사용하여 아래와 같이 카테고리 이름과 같이 묶인 QnA ID 배열을 속성으로 갖도록 정의해주었습니다.

JSON

드디어 모든 과정을 거쳐 자동완성된 FAQ을 얻을 수 있게 되었습니다. 실제 어느정도의 FAQ가 만들어지는지 궁금하실 분들을 위해 저희 채널톡을 대상으로 만든 자동완성된 FAQ 샘플을 만들어봤는데요. 같이 한 번 보시죠!

보라색 텍스트는 카테고리 이름으로, 그 아래에 같은 카테고리로 묶인 QnA들이 나열된 형태입니다.

아까 말씀드린 것처럼 ‘요금 및 결제’ 카테고리에서 최근에 진행된 가격제 개편 관련 QnA가 생성된 것을 확인하실 수 있습니다! 이와 같이 FAQ 자동완성을 사용하면 손쉽게 최신의 FAQ를 만들 수 있게 됩니다..!


마치며

여러분들이 보셨을 때 생성된 FAQ 결과가 어떠신가요?!

개인적으로는 만족스러운 결과라고 생각하지만… 아직 넘어야할 여러 산들이 가로막고 있습니다. 😭

  • 현재는 충분한 메세지가 주어졌다고 가정하고 실험을 진행했지만, 새로 채널을 사용한 기업들에게도 충분한 퀄리티의 FAQ를 만들 수 있을지 검증 혹은 개선이 필요

  • 상담 대화를 샘플링해서 줄이긴 했지만 여전히 많은 OpenAI GPT 모델의 토큰 사용량

크게는 위 두가지 정도의 개선 사항이 있는 것 같습니다. FAQ가 다양한 곳에서 사용될 수 있는만큼 사내에서도 많은 분들이 관심을 가져주셨는데요. 다음번에는 또 한 단계 발전한 FAQ 자동완성으로 찾아뵙도록 하겠습니다!

지금까지 AI팀의 제이브였습니다. 읽어주셔서 감사합니다. 🙇‍♂️

We Make a Future Classic Product

채널팀과 함께 성장하고 싶은 분을 기다립니다

사이트에 무료로 채널톡을 붙이세요.

써보면서 이해하는게 가장 빠릅니다

회사 이메일을 입력해주세요