챗봇을 개발하다 보면 정확도보다 속도가 더 중요하다는 생각을 하게 된다.
인공지능과 채팅을 하는데 허무맹랑한 소리를 하는 건 어느 정도 유저가 인용해 줄 수 있지만
인공지능이 답장을 느리게 하는 것은 사실상 하는 이유가 없기 때문이다.
검색 기반 챗봇
- 우리 서비스는 생성모델이 아닌 검색모델을 사용하여 챗봇을 개발하였음
위에서 말했듯이 챗봇은 정확도 보다 속도를 우선시하게 되는 데
그래서 우리는(Bi-Encoder) 방식을 채택하여 빠른 속도를 우선시했다.
*Bi-Encoder : 임베딩 값을 미리 구해놓기 때문에 속도가 빠른 장점이 있지만 미리 구한 임베딩 값을 저장할 공간이 필요함.
Bi-Encoder로 구현했지만 서버에서 실행을 했더니 임베딩 값(numpy)이 많은 메모리를 점유하고 있었다.
(메모리 문제를 처음 직면하게 됨)
55만 건의 데이터를 사용했는데.
모델 , 데이터 프레임 , 임베딩 벡터(numpy)를 전부 메모리에 올려놓았을 때 많은 용량을 차지했다.
딥러닝 모델(Bi-encoder) | 1.08GB (BERT : KcBERT-base) |
데이터 프레임(chat data) | 518MB |
임베딩 벡터(768dim) .npy -> tensor로 변환 *변환 과정에서 메모리가 2배로 늘어남 |
1.86GM |
총합(전부 다 올렸을 때 메모리 용량) | 2.9GB |
우리 서버는 다행히도 메모리가 4GB이기 때문에 당장 문제가 없었지만 앞으로 55만 건 보다 더 많은 데이터를 사용하고 또 딥러닝뿐만 아니라 다른 작업에도 메모리를 사용해야 하기 때문에 이렇게 사용한다면 추후 문제가 될 것이다.
* 이루다의 경우 1억 개의 답변을 DB에 저장했다고 함.
그래서 모델을 제외하고 서버 메모리에서 들고 있지 않고 데이터 베이스의 저장하여 불러오는 방식을 사용했다. 이럴 경우 많은 스토리지를 차지할 순 있겠지만 서버의 메모리 부담을 줄여 줄 수 있다.
메모리를 줄이는 방법은 이 방법 말고도 다양하게 있다.
1. 벡터 사이즈를 줄인다.(정확도가 떨어질 수 있음)
2. 경량화 모델을 사용한다.(정확도가 떨어질 수 있음)
위 부분은 추후 고려해볼 만 하지만 임베딩 벡터를 DB에 저장하는 방법은 반드시 필요한 작업이라고 생각한다.
'Machine learning > Chatbot' 카테고리의 다른 글
[chatbot]. 핑퐁 빌더 API 연동하기 (1) | 2022.12.05 |
---|---|
[챗봇] faiss로 빠르게 유사도 검색하기(Similarity Search) (0) | 2022.07.18 |
[챗봇]. 편집거리 알고리즘을 통한 오타 확인 (0) | 2022.04.29 |
[챗봇]. 대화 텍스트 길이(length)에 대한 패널티(penalty)를 주는 방법 (0) | 2021.11.14 |
[챗봇] 아주 간단한 검색기반 챗봇 만들기(feat.pororo) (1) | 2021.08.31 |