관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

순환 신경망(RNN) 10 - 자연어 처리 8 : Seq2Seq 모델로 챗봇 구현 1 <챗봇 데이터 소개 및 탐색적 데이터 분석> 본문

인공지능/딥러닝

순환 신경망(RNN) 10 - 자연어 처리 8 : Seq2Seq 모델로 챗봇 구현 1 <챗봇 데이터 소개 및 탐색적 데이터 분석>

huenuri 2024. 12. 19. 14:46

다음으로는 챗봇을 구현하는 내용을 학습해 볼 차례이다.


 

 

 

 

Seq2Seq 모델로 챗봇 구현하기

 

1. Seq2Seq 모델 개요

시퀀스 투 시퀀스(Sequence to Sequence, 줄여서 Seq2Seq) 모델은 기계 번역, 챗봇, 텍스트 요약 등에 활용되는 대표적인 NLP 알고리즘이다. 앞서 소개한 [그림 5-4] 순환신경망 중에서 Many to many 유형에 속한다.

 

2014년에는 순환신경망을 이용한 Seq2Seq 모델이 소개되었고, 2015년에는 입력 데이터 중에서 중요한 단어에 집중하는 어텐션(Attention) 메커니즘을 Seq2Seq 모델에 적용했다. 2017년에는 트랜스포머(Transformer: All you need is Attention)가 등장했는데, Seq2Seq 모델에서 순환신경망을 제거하고 어텐션(Self-Attention)만으로 구축하는 개념이다. 순환신경망은 순차적으로 데이터를 입력하기 때문에 학습 속도가 느린 단점이 있었는데 트랜스포머를 통해 병렬화가 가능해서 속도 개선이 이루어졌다. 이를 바탕으로 트랜스포머의 인코더와 디코더를 활용한 GPT1, 2, 3과 Bert가 등장했다.

 

 

 

 

Seq2Seq는 크게 인코더와 디코더로 구성되어 있으며, [그림 5-37]과 같이 인코더에서 입력된 값을 맥락 벡터(context vector)로 인코딩한 후 디코더에 전달한다. 맥락 벡터와 디코더 입력값을 입력받아 순차적으로 결과를 출력한다.

 

 

 

 

인코더와 디코더는 앞에서 배운 LSTM, GRU와 같은 순환신경망을 사용한다. 맥락 벡터는 인코더의 마지막 출력 값으로 고정된 길이를 갖는다. 따라서 입력값이 길어지면 맥락 벡터로 압축해 표현하는 데 한계가 있다.

이번에는 Seq2Seq로 챗봇을 구현한다. 챗봇을 구현한 다음에는 어텐션을 활용하여 챗봇을 업그레이드 적용해 보기로 한다.

챗봇을 Seq2Seq 모델로 설명하면 [그림 5-38]로 표현할 수 있다. 인코더에 "반가워"를 입력했다. 앞서 학습한 순환신경망은 고정된 입력 크기를 가지고 있다. 문장의 최대 길이가 4일 때 나머지 자리는 패딩 값으로 채워지는 것을 확인할 수 있다.

 

 

 

디코더 입력의 시작은 <START>, <SOS> 등 시작을 나타낼 수 있는 토큰으로 표시하고, 문장의 끝은 <END>, <EOS> 등 문장의 끝을 나타내는 토큰을 사용한다.

제공된 데이터셋을 활용해 챗봇에 필요한 ① 인코더 입력 데이터(질문), ② <START>가 추가된 디코더 입력 데이터(답변), ③ <END>가 추가된 디코더 출력 데이터(답변)를 훈련 데이터셋으로 만들 예정이다.


 

 

 

 

 

2. 챗봇 데이터 소개

Korpora(Korean Corpora Archives)는 한국어 데이터셋이 있는 오픈소스 파이썬 패키지다. 캣봇, 댓글, 혐오, 국민 청원, 위치, 신문, 메신저 등 다양한 한글 말뭉치가 있다. 이 중 챗봇 데이터를 활용해 시퀀스 투 시퀀스 모델을 만들어보자.


 

 

 

 

먼저 코랩 환경에 Korpora 설치가 필요하다.

 

설치는 잘 되었지만 새 버전을 사용하려면 런타임을 재시작해야 한다.

 

 

 

한번 더 실행했다.


 

 

 

 

챗봇용 데이터셋을 불러온다.

 

에러 메시지에서 HTTP Error 404: Not Found가 발생했다. 이는 KoreanChatbotKorpus를 다운로드하려는 URL이 더 이상 유효하지 않다는 것을 의미한다. 이 문제는 보통 다음 이유 중 하나로 발생한다.

  1. 데이터셋 경로 변경 : Korpora 라이브러리의 데이터셋 경로가 변경되었거나 삭제됨
  2. 인터넷 연결 문제 : 인터넷 연결 문제로 URL에 접근하지 못함
  3. 라이브러리 업데이트 필요 : Korpora 라이브러리 버전이 오래되어 최신 데이터셋을 지원하지 않을 수 있음

 

 

해결 방법

1. Korpora 최신 버전 확인 및 업데이트

최신 버전을 설치하여 경로 문제가 해결되었는지 확인

pip install --upgrade Korpora

 


 

 

 

 

2. 데이터셋 직접 다운로드

KoreanChatbotKorpus 데이터를 직접 다운로드하여 로컬에 저장하고 불러오는 방법을 사용할 수 있다.

 

 

 

 

 

챗봇 라이브러리를 불러오는 건 아무리 해도 되지 않아서 코드를 다음과 같이 수정했다. 

Korpora 대신 로컬 파일 사용

  • Korpora에서 제공하는 KoreanChatbotKorpus는 더 이상 리소스를 다운로드할 수 없는 상태이다. 따라서 직접 다운로드한 ChatbotData.csv 파일을 사용하는 게 적합하다.
  • 이미 wget을 통해 파일을 다운로드했으므로, 아래와 같이 직접 데이터를 읽어와 사용하면 된다.

 


 

 

 

 

 

3. 탐색적 데이터 분석(EDA)

진물과 답변 중에서 각각 5개씩의 샘플을 추출해서 확인한다.

 

 

이 코드 역시 쓸 수가 없어 수정해 보았다.

 

 

 

 

 

실행 결과를 표로 정리하면 다음과 같다. 질문과 답변이 각각 매칭되어 있음을 볼 수 있다.


 

 

 

 

하나의 문장을 확인하고 싶을 때는 다음과 같이 활용한다.

 

전체 데이터셋 크기는 11823쌍이다. 구글 코랩 무료 환경 기준으로 1.1만 개의 쌍을 훈련하게 되면 에러 메시지가 뜨며 코랩이 재시작된다.

우리는 학습하는 차원에서 코랩에서 훈련 가능한 사이즈로 데이터를 샘플링한다.

 

 

 

 

11,823개의 데이터 중에서 앞에서부터 2,001개만 가져와서 texts와 pairs에 리스트 형태로 저장한다. texts는 질문으로 pairs는 답변으로 활용한다.

 

책에는 for문을 활용했지만 pandas를 사용하면 더 간단하게 처리할 수 있다. 

 

 

 

책은 리스트 형태로 되어 있지만 이렇게 하면 알아보기가 힘들어 다음 문장에 띄어서 담고 출력문도 만들었다.


 

 

 

 

학습을 마치고

이번 코드를 실행하는 중 깃허브 주소가 바뀐 데다 사용할 수 없는 URL이라고 떴다. corpus 이름도 사용할 수 없어서 대체 코드로 수정했는데 그래도 이렇게나마 코드를 실행할 수 있어 기뻤다.

다음 실습도 진행하며 공부를 이어갈 것이다. 언어지능 공부도 나름 할만하다. 이것도 하지 못하면 이번에 거금을 들여 구입한 생성형 AI 책으로 학습을 못할 테니까.