코딩

[Chatbot] kochat 구조

obin01 2024. 10. 31. 21:22

1. 데이터세트 모듈

사용자의 입력 데이터를 전처리하기 위한 모듈

사용자로부터 문장이 입력되면 네이버 맞춤법 검사기를 이용하여 오탈자를 교정후, 품사를 기반으로 토큰화를 진행

토크나이저는 Open Korean Text 토크나이저를 사용

 

2. 임베딩 모듈

워드 임베딩을 수행하며, FastText와 Word2Vec을 지원

사용자는 입력한 코퍼스를 이용하여 워드 임베딩 모델을 직접 학습

 

3. 인텐트 모듈

사용자 발화의 의도를 파악하기 위해 사용

사용자 발화를 분류하기 위해 합성곱신경망(CNN)과 장단기메모리신경망(LSTM)을 지원

 

4. 폴백 모듈

폴백이란 정해진 도메인 이외의 문장이 입력된 경우, “잘 모르겠어요.”와 같은 문장을 반환하여 대화가 지정된 도메인 안에서 진행되게 유도하는 것

모델의 출력 로직을 소프트맥스 계층에 통과시켜서 분류하는 방식은 이미 널리 사용되며 잘 작동하지만, 이러한 방식은 학습된 도메인 이외의 데이터를 처리하기 어렵다는 문제가 있습니다. 일반적으로 소프트맥스 기반의 분류를 수행 시에 모델로부터 출력되는 확률 값에 대한 임계치를 설정하여 분류 결과의 신뢰 여부를 판단할 수 있지만 다른 연구에 의하면 학습된 도메인 이외의 입력에 대하여 모델의 출력 확률값이 높다고 해서 그것이 높은 신뢰도를 의미하지는 않습니다. 따라서 Kochat에서는 이러한 문제를 해결하기 위해 메트릭 러닝 기법을 도입하였습니다. 먼저 유사한 문장은 거리를 가깝게, 유사하지 않은 문장은 거리가 멀리 임베딩되도록 모델을 학습합니다. 추론 시에는 사용자의 입력 문장에 대한 표현과 학습시에 사용되었던 코퍼스 내의 문장들의 표현과의 거리를 측정하여 최근접 이웃 방식으로 분류를 수행합니다. 분류 결과의 신뢰 여부를 판단하기 위해 입력 문장의 표현과 코퍼스 내에서 가장 인접한 문장의 표현과의 거리에 대한 임계값을 설정하는 것 입니다. 즉, 사용자의 입력 문장과 가장 가까운 문장이 임계치로 설정한 거리보다 멀리 있으면 이를 도메인 이외의 입력이라고 판단하게 됩니다. 이러한 기법을 통해 도메인 외의 입력을 구분하는 폴백 성능을 크게 개선할 수 있었습니다.

 

5. 엔티티 모듈

문장 내에 존재하는 개체명을 인식하기 위해 사용

예를 들어 “수요일 부산 날씨 어때?”라는 문장이 주어지면, ‘수요일’을 날짜(DATE)로, ‘부산’을 장소(LOCATION)로 인식

엔티티 인식 모델로 LSTM을 사용, 출력 레이어에 CRF 모듈을 사용

 

6. 슬롯필링 + API 모듈

슬롯필링은 목적지향 챗봇 구현시 주로 이용되는 기법

먼저 인텐트 모듈을 통해 슬롯을 고르고 엔티티 모듈을 통해 해당 슬롯을 채움

예를 들어, 사용자가 “수요일 부산 날씨 어때?”라는 문장을 입력하면 인텐트 모듈은 이 문장을 날씨에 관련된 문장으로 분류하여 여러 슬롯 중, 날씨 API 를 호출하기 위한 슬롯을 선택합니다. 엔티티 모듈은 ‘수요일’을 날짜, ‘부산’을 장소로 인식하여 날씨 API 슬롯을 채웁니다. 마지막으로 해당 API를 호출하여 결과를 사용자에게 반환합니다.

 

7. 시각화 모듈

여러가지 시각화 자료를 제공하는 모듈

 

8. 사용자 인터페이스

인터페이스를 통해 자신만의 챗봇을 구축할 수 있음

 

 

 

 

 

참고 : https://uipac.com/721

 

Kochat : 한국어 오픈소스 챗봇

아마 개인용 챗봇을 만들고 싶어하는 사람이 많을 것으로 생각하고 있습니다. 저도 그러한 사람 중에 한 사람인데 이러한 것을 구축하는 것은 쉽지 않습니다. 물론 시중에 오픈 빌더 형태로 제

uipac.com