제 목 : 100억 대화 데이터 없이도 가능해요! - HyperCLOVA로 만드는 캐릭터 챗봇
발표자: NAVER CLOVA/Conversation 강재욱, 가순원, 이민영
메타버스 시대에서 인간과 소통하고 교감할 수 있는 가상 캐릭터는 핵심 콘텐츠가 될 것
하지만 기존의 가상 캐릭터는 이미 녹화된 영상에 face/motion/voice capture를 통해 구현되어 실시간 소통이 불가능하다.
→ 챗봇이 캐릭터 페르소나를 가진다면 소통이 가능하기 때문에 대화 가능한 가상 캐릭터를 만들 수 있다.
캐릭터 챗봇
챗봇에게 캐릭터를 부여하기 위해서는 대화체, 세계관, 성격 이 3가지의 페르소나 설정이 가능해야 한다.
기존 다수의 챗봇은 Retriever & Reranker 프레임워크로 이루어져 있으며,
이때 페르소나를 설정하기 위한 가장 확실한 방법은 대화 DB 검수이다
그러나, 페르소나를 가진 대량의 캐릭터 대화 DB를 구축하기는 어렵다는 한계가 있다.
→ HyperCLOVA로 대화 DB 생성
HyperCLOVA에 prompt로 task에 대한 description과 몇 개의 예시를 제공함으로써
주어진 예시를 기반으로 생성하는 방식이다
주어진 prompt 👇
# <음식>에 관한 대화
유저 : 안뇽
캐릭터 : 안녕하세여!
유저 : 나 짐 넘 배고파
캐릭터 : 오 이럴땐 떡볶이죠!
유저 : 오 떡볶이 좋은데? 떡볶이랑 뭐 먹지
캐릭터 : 떡볶이엔 역시 순대가 찰떡이죠~
유저 : 좋아 오늘은 떡튀순으로 간다!
캐릭터 : 아 튀김은 별론데...
# <게임>에 관한 대화
생성 결과👇
# <음식>에 관한 대화
유저 : 안뇽
캐릭터 : 안녕하세여!
유저 : 나 짐 넘 배고파
캐릭터 : 오 이럴땐 떡볶이죠!
유저 : 오 떡볶이 좋은데? 떡볶이랑 뭐 먹지
캐릭터 : 떡볶이엔 역시 순대가 찰떡이죠~
유저 : 좋아 오늘은 떡튀순으로 간다!
캐릭터 : 아 튀김은 별론데...
# <게임>에 관한 대화
유저 : 요즘 재밌는 게임 없나
캐릭터 : 흠.. 전 요즘 배그를 해요!
유저 : 오오 나도 그거 하는데ㅋㅋ
캐릭터 : 어 진짜요? 저도 같이해여!
유저 : 그래 나중에 하자
장 점
HyperCLOVA와 같이 큰 모델에 few-shot learning을 적용했을 때,
작은 모델에 비해 더 유창하다는 장점이 있다.단 점
① 피상적이고 단순한 대화로 마무리될 수 있음
few-shot learning을 위해 주어진 대화 세션과 유사하게 진행될 수 있다.
② 캐릭터 성격 불일치
③ <음식>, <게임>과 같은 키워드를 통해서는 시나리오 다양화가 어려움
시전학습 데이터의 bias로 인해, 확률적으로 등장 확률이 높은 대화 세션만 많이 생성되며
등장 확률이 낮은 대화 세션은 이끌어내기 힘들다
대화내용을 그래프로 구조화 한 것으로,
유저의 발화에 공감하는 발화를 생성한 경우 왼쪽 자식 노드, 유저의 발화에 능동적인 반응을 보인 경우 오른쪽 자식 노드로 표현하였다.
아래는 간단한 대화를 그래프로 표현한 것으로, 유저의 engagement를 이끌어내지 못한 대화내용이다.
위와 달리 유저의 engagement를 끌어낸 대화내용이다.
유저의 engagement를 이끌어내기 위해서는
구체적 질문, 공감, 경험담 공유 등 여러 발화 패턴 분리해야 한다.
💡 발화 패턴에 따라 대화 세션 생성을 어떻게 제어할 것인가?
→ Purpose-Action-Situation (PAS) 대화 모델 제안
Purpose : 캐릭터의 대화 목적 (ex 위로, 분노, 공감)
Action : 캐릭터의 발화 패턴 제어 (ex 피드백, 경험담 공유, 상황 직시)
Situation : 현 대화 세션에서 유저가 이야기하려는 대화 맥락, 상황 (ex 어제 차였어, 사기 당했어)
Naive Approach의 한계 극복
① 피상적이고 단순한 대화 → 깊은 대화 구조
Purpose & Action으로 다양한 발화기법을 통해 사용자의 대화 참여 유도
② 캐릭터 성격 불일치 → 캐릭터 성격 반영
캐릭터의 Purpose(대화 목적)와 그에 따른 Action(발화 기법)을 매핑함으로써 캐릭터의 성격 유지
③ 시나리오 다양화의 한계 → 다양한 시나리오
구체적인 상황을 묘사하는 Situation 리스트 확보
각 Situation에 대해 Purpose & Action을 조합하여 대화 세션을 생성함으로써 시나리오 커버리지 향상
PAS 대화 모델링 기법을 통한 대화 DB 생성
Purpose와 Purpose에 따른 Action 리스트 정의
사람이 직접 제작하며, Purpose에 대한 가능한 Action 리스트를 정의한다
Situation 리스트 확보
2단계로 구성되며 각각 다양성과 구체성을 확보하는 단계
2.1 다양성 확보
purpose에 대한 situation 예시를 One-shot으로 예시 제공
HyperCLOVA를 통해 Situation 리스트를 확보한다
2.2 구체성 확보
상황을 구체적으로 묘사한 Situation 확보
마찬가지로 One-shot으로 예시 제공
대화 세션 생성
3.1 시드 대화 DB 구축
Purpose, Action, Situation의 가능한 조합에 대해 대화 세션을 생성한다.
HyperCLOVA에 One-shot으로 사람이 직접 제작한 대화 세션 생성 예시를 함께 제공한다
3.2 생성 대화 DB 구축 (Paraphrasing)
동일한 (Purpose, Action, Situation)을 가지는 데이터 Augmentation
적절한 paraphrasing prompt를 구성하여 HyperCLOVA를 통해 생성
지금까지는 대량의 캐릭터 대화 DB를 구축하는 내용을 설명
HyperCLOVA 역시 확률 기반의 생성모델로,
일부에 대해서는 페르소나를 유지하는 데 실패할 수 있다.
→ 생성된 대화 DB 내 각 대화 세션에 대하여 3가지 페르소나를 검수해야 한다
자동 검수를 위해 4가지 딥러닝 모델을 사용
시드대화 DB의 일부를 사람에 의해 수동 검수하여 각 모델을 학습시키는 데 사용하였다.
성격이란 특정 상황(Purpose)에서 보이는 일관된 행동(Action)이며,
캐릭터의 성격을 Purpose와 Action을 매핑하여 나타냈다
Purpose-Action Classifier 개발
BERT를 기반으로 한 Multi-label Classifier
Input : 대화 세션
Output : Purpose label과 Action label
캐릭터를 생성할 때 작성했던 성격 map애 부합한지 판단하여 아닐 경우 삭제
생성 대화 DB는 시드 대화 DB를 Paraphrasing한 것으로,
시드 대화의 세계관과 생성 대화의 세계관이 일치하지 않는다면 다른 세계관을 가진 것으로 판단한다
DialogNLI Classifier 개발
BERT를 기반으로 한 Binary Classifier
시드 대화와 생성 대화 세션의 semantic이 일치하는지 판단하여, 일치하지 않는 경우 삭제
앞선 2개와 달리 텍스트의 syntatic 요소에만 의존한다.
Style Classifier 개발
BERT를 기반으로 한 Binary Classifier
캐릭터의 대화체와 부합하는 경우 right style 아닐 경우 wrong style로 판별하며,
wrong style의 경우 대화체 변환 모델로 대화체를 수정한다.
Style Classifier 개발
GPT2를 기반으로 기존 대화체에서 Target 대화체로 paraphrasing
깊은 대화 구조
단조로운 대화가 아닌 유저의 engagement를 이끌어내야 한다
캐릭터 성격 반영
성격을 나타내는 Purpose-Action map에 부합해야 한다
사람의 파이프라인과 PAS 파이프라인에 따라 각각 하루동안 캐릭터 대화 DB를 구축했을 때,
사람은 8시간 근무에 48개의 대화 세션을 생성하였고,
PAS 파이프라인은 총 7500개의 생성 대화 DB를 구축했다
PAS 검수 과정에서 성격 필터, 세계관 필터 모델에 의해 각각 a%, b%의 대화 세션을 확보했다면
7500ab개의 대화 세션을 생성한 것이다.
사람의 파이프라인에 비해 몇 백배는 효율적인 구축 과정이다
대화 데이터가 100 밀리언 단위로 들어가는 기존의 Retriever & Reranker 프레임워크를 벗어나
데이터가 거의 필요 없는 few-shot learning을 이용한 방식이라 신기했다!
카카오에서 공개한 KoGPT-3에 few-shot learning으로 챗봇을 간단하게 구현해봤는데
페르소나가 유지되지도 않고 '응', '알겠어' 등 단조로운 대답이 나오거나 example로 제시했던 내용이 반복적으로 나오기도 했다.
공유해주신 내용에 따라 챗봇에 페르소나를 부여할 수 있도록 도전해봐야겠다
대화 DB 생성 ✍️ | 대화 DB 검수 ✍️ |
---|---|