이 프로젝트는 고려대학교 강필성 교수님의 자연어처리 수업에서 진행한 프로젝트입니다. Pre-training 모델(BERT)을 활용하여 Q&A 시스템을 개발하는 것의 가이드라인을 제공하기 위하여 기획한 프로젝트이며 제작물에서 사용한 방법론, 데이터, 코드를 다양한 곳에서 참조하여 개발하였습니다.
프로젝트와 관련된 제안, 중간, 최종 영상입니다.
- 검색엔진(네이버, 구글 등)을 활용하여 '질문'에 대한 '대답' 을 찾는 시스템을 개발
- 크롤링, 전처리, 언어모델, 후처리 모듈로 시스템 구성
- 웹 검색엔진으로부터 원천소스(Reference Text)를 크롤링 하는 과정
- 웹 검색엔진의 검색엔진을 활용하여 질문에 대한 검색결과(URL) 중 상위 N개 페이지(HTML)를 크롤링
- 네이버 블로그, 위키피디아 두가지 검색엔진에서 크롤링
- 크롤링 모듈의 정량적 평가 및 결과 참고
- 크롤링을 통해 얻은 페이지(HTML)를 줄글로 변환하는 과정
- 페이지의 구조적 특징 정보(TAG)를 토대로 문단을 분리하여 후보문단(Candidate Paragraph)을 생성
- 언어모델에 페이지의 테이블 구조, 리스트 구조 등이 반영될 수 있도록 특수토큰(Special Token) 적용
- 전처리 모듈의 정량적 평가 및 결과 참고
- 학습된 언어모델로 후보문단(Candidate Paragraph)에서 정답을 추출하는 과정
- 다양한 데이터셋에서 학습한 언어모델을 활용
- 후보문단들에서 각각 정답 범위(Answer Span)와 정답의 신뢰점수(Confidence Score)를 생성
- 언어모델 모듈의 정량적 평가 및 결과 참고
- 언어모델을 통해 얻은 결과물(정답, 정답의 신뢰점수)를 토대로 정답을 복원하는 과정
- 언어모델로부터 추출한 정답의 신뢰점수를 이용하여 확률이 높은 순으로 정답 범위를 정렬
- 정답 범위를 이용하여 후보문단으로부터 정답(Answer Text)를 추출
- 후처리 모듈의 정량적 평가 및 결과, 정성적 평가 및 결과 참고
pip install -r requirements.txt
Kobert, Hanbert 사용방법 및 설치 방법 참고
- 학습 명령어
python run_korquad.py --model_type hanbert --model_name_or_path HanBert-54kN-torch --output_dir result/ --do_train --train_dir resource/korquad2/train/ --gradient_accumulation_steps 4 --max_seq_length 512 --logging_steps 5000 --save_steps 5000 --num_train_epochs 1 --dataset_type korquad2 --version_2_with_negative
- 평가 명령어
python run_korquad.py --model_type hanbert --model_name_or_path aihub/ --output_dir result/ --do_eval --predict_dir resource/korquad2/dev/ --max_seq_length 512 --dataset_type korquad2 --version_2_with_negative
- options
- model_type : 모델타입(bert, kobert, hanbert) 선택
- model_name_or_path : 모델타입에 따라 선택(bert : bert-base-multilingual-cased, kobert : monologg/kobert, habert : HanBert-54kN-torch)하거나 모델이 있는 폴더 설정
- output_dir : 학습 또는 평가 결과를 저장할 폴더
- do_train : 학습 할 때 설정하는 옵션(true/false)
- train_dir : 학습에 필요한 파일(.json)이 있는 폴더
- do_eval : 평가 할 때 설정하는 옵션(true/false)
- predict_dir : 평가에 필요한 파일(.json)이 있는 폴더
- dataset_type : korquad1.0 또는 aibhub 데이터(.json)을 학습할 때는 korquad1, korquad2.0 을 학습할 때는 korquad2로 설정
- 총 3개 Model, 4개 Dataset에서 테스트를 진행
- Hyper-parameter를 고정하고 모델과 데이터를 변경하며 테스트를 진행
- 평가지표 (EM/F1)
- EM : Exact Match (%)
- F1 : F1 Score (%)
- Dataset 구성
- korquad1.0 + aihub : korquad1.0과 Aihub 데이터를 함께 학습하고, valid 데이터로 korquad1.0 dev를 사용
- aihub(8:2) : AIhub 데이터를 8:2나누어 train, valid 데이터로 사용
- Hyper-parameter Setting
- max_seq_length : 512
- max_answer_length : 100
- batch_size : 32
- learning_rate : 3e-5
- max_paragraph_length : 1
korquad1.0 | korquad1.0 + aihub | aihub (8:2) | korquad2.0 | |
---|---|---|---|---|
KoBERT | F1: 54.31 / EM: 45.30 | F1: 63.51 / EM: 53.42 | F1: 58.78 / EM: 42.48 | F1: 25.35 / EM: 20.65 |
Bert-multilingual | F1: 78.04 / EM: 70.69 | F1: 78.35 / EM: 71.04 | F1: 75.91 / EM: 62.37 | F1: 49.64 / EM: 43.13 |
Hanbert | F1: 84.87 / EM: 78.94 | F1: 85.62 / EM: 79.63 | F1: 79.24 / EM: 66.20 | F1: 46.43 / EM: 41.12 |
※ 표에 보이는 F1, EM score는 Korquad1.0, Korquad2.0에서 제공하는 공식적인 evaluation script과 평가 산출 방식이 다릅니다.
웹서버를 구동하기 위하여 학습된 모델이 준비되어야 합니다.
python korquad_server.py --model_name_or_path aihub_model/bert --device gpu
- options
- model_name_or_path : 학습한 모델이 있는 폴더
- device : 모델 구동 환경(GPU/CPU) | default:gpu