지난 한국어 임베딩 모델 벤치마크에 이은 두번째 벤치마크 실습 프로젝트이다.
AutoRAG를 사용한 덕분에 빠르게 결과를 확인할 수 있었다. 이 블로그를 통해 직접 다양한 RAG 벤치마크를 만들 수 있을 것이다. Follow me!
=> 이 레포에서 전체 코드를 확인할 수 있습니다.
벤치마크에 있어서 데이터를 준비해야 한다. 데이터로는 지난 실험에서 사용했던 Allganize 한국어 RAG 리더보드에 쓰였던 데이터셋을 그대로 사용하겠다.
데이터에 대한 자세한 내용을 알고 싶다면 블로그나 유튜브 영상을 참고해도 좋다!
자, 실험에 앞서서 개념을 한 번만 설명하고 넘어가면 좋을 것 같다.
BM25는 임베딩 모델을 사용한 검색 방법과는 다르게, 검색 쿼리에 있는 키워드의 등장 빈도 수를 통해서 문서의 유사도를 계산하는 것이다.
임베딩 모델을 사용하면 임베딩 벡터를 통해 의미론적 유사도를 비교할텐데, BM25는 특정 키워드가 얼마나 자주 나오는지를 통해 계산한다.
더 자세한 원리는 여기를 참고해보자.
토크나이즈 과정은 문장을 토큰으로 나누는 과정으로, 이 토큰이 곧 키워드이다. 즉, 키워드를 어떻게 나누느냐가 BM25의 성능에 큰 영향을 미치는 것은 자명하다.
얼마나 성능 차이가 나는지 벤치마크를 해보는 것이 이번 벤치마크의 목적이 되겠다.
이번 실험에서 사용할 네 가지 토크나이저들은 다음과 같다.
가장 기본 토크나이저이다. (토크나이저라고 불러야 할까?)
말 그대로, 띄어쓰기를 기준으로 각 토큰을 나눈다.
놀라셨죠? 준비 하셔야 돼요. 이런 거는 뜬겁새로 뜬급 뜬겁
이 문장을 space 토크나이저로 토큰화하면 다음과 같다.
['놀라셨죠', '준비', '하셔야', '돼요', '이런', '거는', '뜬겁새로', '뜬급', '뜬겁']
문장 기호와 같은 것들은 제거를 해주지만, 한국어의 형태소 등은 전혀 고려가 안 된 형태를 보인다.
이렇게 한국어 특성에 대한 고려가 잘 안된 기본적인 방법이기 때문에, 성능이 낮은 편일 것으로 보인다.
Kiwi 형태소 분석기를 이용한다. 높은 정확도로 한국어 형태소를 분석할 수 있는 형태소 분석기라고 한다.
역시 앞에서 쓰였던 문장을 kiwi 토크나이저를 이용해 토큰화하면 아래와 같다.
['놀라', '시', '었', '죠', '?', '준비', '하', '시', '어야', '되', '어요', '.', '이런', '거', '는', '뜬겁', '새로', '뜨', 'ᆫ', '급', '뜬겁']
kkma 형태소 분석기 또는 꼬꼬마 형태소 분석기는 서울대학교에서 개발한 형태소 분석기이다.
konlpy 라이브러리에서 바로 이용할 수 있다.
앞의 문장을 kkma 토크나이저로 토큰화하면 다음과 같다.
['놀라','시','었','죠','?','준비','하','시','어야','되','어요','.','이런','거','는','뜨','ㄴ','겁','새로','뜨','ㄴ','급','뜨','ㄴ','겁']
kiwi 토크나이저와 결과가 살짝 다른 모습을 볼 수 있다.
okt (Open Korean Text) 형태소 분석기 역시 konlpy에서 사용할 수 있는 형태소 분석기이다.
okt 토크나이저의 토큰화 결과는 아래와 같다.
['놀라셨죠', '?', '준비', '하셔야', '돼요', '.', '이런', '거', '는', '뜬', '겁', '새로', '뜬', '급', '뜬', '겁']
역시 kkma와 kiwi와 결과가 살짝 다른 모습을 볼 수 있다.
이제 실험을 위해 YAML 파일을 작성해보자.
BM25 토크나이저의 성능을 실험하기 위함이므로, 위에서 말한 4개의 토크나이저를 모두 적어주어야 한다.
또한, 비교를 위하여 임베딩 모델 중에 가장 높은 성능을 보여주었던 업스테이지 임베딩 모델을 비교군으로 넣어 주었다.
여기에 더불어 top-k를 1, 3, 5, 10, 50으로 설정하여 실험을 진행하였다.
또한, 이 데이터셋에서는 retrieval gt가 모두 하나이기 때문에 mRR 메트릭은 제외하고 5가지 메트릭을 사용했다.
(retrieval gt가 하나인 경우 mAP와 mRR은 동일한 값을 가진다.)
node_lines:
- node_line_name: retrieve_node_line
nodes:
- node_type: retrieval
strategy:
metrics: [retrieval_f1, retrieval_recall, retrieval_precision, retrieval_map, retrieval_ndcg]
top_k: [ 1, 3, 5, 10, 50 ]
modules:
- module_type: vectordb
embedding_model: upstage_embed
- module_type: bm25
bm25_tokenizer: [space, ko_kiwi, ko_okt, ko_kkma]
아주 간단하게 YAMl 파일을 완성하였다.
실험에 앞서서, 먼저 AutoRAG를 설치해야 한다.
주의할 점은, 한국어 토크나이저를 활용하기 때문에 한국어 버전으로 설치가 필요하다.
아래처럼 [ko]
를 포함시켜서 설치해보자.
pip install AutoRAG[ko]
여기에 더불어, konlpy 이용을 위해 반드시 jdk를 설치해 주어야 한다. 필자의 경우 맥북 프로 m2를 이용중인데, jdk 17을 설치해주니 문제 없이 작동하였다.
마지막으로, .env
파일에 업스테이지 임베딩 실행을 위한 업스테이지 API 키 정보를 입력하자.
아래 코드를 통해 간단하게 AutoRAG를 실행할 수 있다. 실행 전, 업스테이지 임베딩 모델을 추가하는 것은 필수다.
load_dotenv() # 환경 변수 설정
autorag.embedding_models['upstage_embed'] = autorag.LazyInit(UpstageEmbedding) # 업스테이지 임베딩 모델 추가
evaluator = Evaluator(qa_data_path, corpus_data_path, project_dir=project_dir)
evaluator.start_trial(config) # AutoRAG 실행
Module Name | F1 Score | Recall | Precision | mAP | NDCG |
---|---|---|---|---|---|
ko_kkma | 0.7544 | 0.7544 | 0.7544 | 0.7544 | 0.7544 |
ko_kiwi | 0.7281 | 0.7281 | 0.7281 | 0.7281 | 0.7281 |
space | 0.6667 | 0.6667 | 0.6667 | 0.6667 | 0.6667 |
ko_okt | 0.7982 | 0.7982 | 0.7982 | 0.7982 | 0.7982 |
upstage_embed | 0.6667 | 0.6667 | 0.6667 | 0.6667 | 0.6667 |
Module Name | F1 Score | Recall | Precision | mAP | NDCG |
---|---|---|---|---|---|
ko_kkma | 0.4649 | 0.9298 | 0.3099 | 0.8319 | 0.8570 |
ko_kiwi | 0.4430 | 0.8860 | 0.2953 | 0.7968 | 0.8197 |
space | 0.4167 | 0.8333 | 0.2778 | 0.7383 | 0.7626 |
ko_okt | 0.4781 | 0.9561 | 0.3187 | 0.8684 | 0.8910 |
upstage_embed | 0.4298 | 0.8596 | 0.2865 | 0.75 | 0.778 |
Module Name | F1 Score | Recall | Precision | mAP | NDCG |
---|---|---|---|---|---|
ko_kkma | 0.3216 | 0.9649 | 0.1930 | 0.8402 | 0.8718 |
ko_kiwi | 0.3158 | 0.9474 | 0.1895 | 0.8108 | 0.8449 |
space | 0.2836 | 0.8509 | 0.1702 | 0.7418 | 0.7694 |
ko_okt | 0.3216 | 0.9649 | 0.1930 | 0.8706 | 0.8948 |
upstage_embed | 0.3041 | 0.9123 | 0.1825 | 0.7618 | 0.7996 |
Module Name | F1 Score | Recall | Precision | mAP | NDCG |
---|---|---|---|---|---|
ko_kkma | 0.1770 | 0.9737 | 0.0974 | 0.8417 | 0.8749 |
ko_kiwi | 0.1754 | 0.9649 | 0.0965 | 0.8129 | 0.8504 |
space | 0.1659 | 0.9123 | 0.0912 | 0.7509 | 0.7901 |
ko_okt | 0.1786 | 0.9825 | 0.0982 | 0.8731 | 0.9005 |
upstage_embed | 0.1738 | 0.9561 | 0.0956 | 0.7682 | 0.7996 |
Module Name | F1 Score | Recall | Precision | mAP | NDCG |
---|---|---|---|---|---|
ko_kkma | 0.0392 | 1.0000 | 0.0200 | 0.8427 | 0.8804 |
ko_kiwi | 0.0389 | 0.9912 | 0.0198 | 0.8144 | 0.8566 |
space | 0.0372 | 0.9474 | 0.0189 | 0.7532 | 0.7988 |
ko_okt | 0.0392 | 1.0000 | 0.0200 | 0.8743 | 0.9050 |
upstage_embed | 0.0392 | 1.0000 | 0.0200 | 0.7792 | 0.8317 |
이 데이터셋에서의 벤치마크 결과, 가장 좋은 성능을 보였던 토크나이저는 okt 토크나이저였다.
또한, 예상했던대로 space 토크나이저가 가장 낮은 성능을 보여주었다.
흥미로웠던 점은, BM25에 비하여 임베딩 모델의 성능이 rank-aware 메트릭에서 크게 낮았다는 것이다.
이렇게, 한국어 데이터셋에서는 BM25의 성능이 임베딩 모델을 활용한 것보다 좋은 경우를 가끔 관찰할 수 있다.
마지막으로, AutoRAG를 이용해서 아주 간단하게 벤치마크를 만들 수 있었다.
이렇게 AutoRAG는 RAG에서의 성능 측정과 최적화에 맞춤 설계된 AutoML 툴이다.
도움이 되었다면 깃허브 스타도 누르고, 한 번씩 사용해보면 좋을 것 같다.