(24년 12월 추가)
글 내용과 관련해 강의를 런칭하였습니다. 더 많은 정보가 필요하신 분들은 참고해주세요!!
▪ 쿠폰코드: PRDTEA241202_auto
▪ 할인액: 4만원 (~25/1/5 까지 사용가능)
▪ 강의링크: https://bit.ly/3BayH1F
AutoRAG는 RAG AutoML 툴로 최적의 RAG 조합을 찾기 위해서 만들어졌지만, 벤치마크를 진행하는 데에도 안성맞춤이다.
그래서 AutoRAG를 사용해서 빠르게 한국어 임베딩 벤치마크를 진행해보자. 정말 코드를 많이 적지 않아도 된다는 것에 놀랄 것이다!
=> 여기서 이 벤치마크의 전체 코드를 확인할 수 있다.
벤치마크를 진행하기 위해서는 당연히 데이터가 가장 중요하다. 한국어 임베딩 모델 벤치마크이기 때문에 반드시 한국어 데이터를 준비해야 한다.
그래서 한국어 RAG 데이터 중 Allganize에서 제작한 RAG 벤치마크 데이터를 선정했다.
하지만 이 데이터를 곧바로 AutoRAG에 활용할 수는 없다. AutoRAG에 알맞은 형식으로 약간의 전처리를 진행해주어야 한다.
먼저, Allganize의 데이터에는 따로 corpus가 공개되어 있지 않다. corpus라 하면, 원본 문서들을 파서를 이용해 모두 텍스트화 시킨 데이터를 의미한다. 따로 corpus가 공개되어 있지는 않지만 원본 문서들의 pdf 제목과 그 링크들은 공개되어 있었다.
그래서 일단 각 pdf들을 모두 다운로드 받았다. 그리고, 네이버 OCR 모델을 사용하여 파싱을 진행하였다. 왜 하필 네이버 OCR 모델을 골랐는지 궁금하다면, OCR 모델을 실험한 포스트를 참고하자!
이렇게 파싱을 모두 한 뒤에는, AutoRAG 데이터 제작에 중요한 과정 중에 하나인 retrieval gt를 매핑해주어야 한다.
retrieval gt란, 한 질문에 대하여 답변과 관련한 지식이나 정보가 들어있는 단락들을 의미한다. 다르게 말하자면, retrieval이 주어진 질문에 대해 찾아야 하는 정답 단락을들 의미한다.
Allganize 데이터셋에서는 이러한 retrieval gt가 어떤 pdf 문서에 어느 페이지에 정답이 있는지에 대한 라벨링이 되어 있었다. 이를 활용해 아래와 같은 과정을 거치면 retrieval gt를 매핑한 데이터를 완성할 수 있다.
이렇게 720개의 chunk와 114개의 질의 응답으로 이루어진 데이터셋이 완성되었다.
데이터셋은 여기서 바로 확인해볼 수 있다.
우리는 오직 retrieval 성능만 평가할 것이다. (임베딩 모델 벤치마크니깐)
그래서 아래처럼 하나의 Retrieval Node와 vectordb 모듈 만이 필요하다. 대신, top-k와 embedding model 종류를 여러개 적어주자.
또한, 보다 정확한 측정을 위해 지원하는 모든 메트릭을 적어주었다.
node_lines:
- node_line_name: retrieve_node_line
nodes:
- node_type: retrieval
strategy:
metrics: [retrieval_f1, retrieval_recall, retrieval_precision,
retrieval_map, retrieval_mrr, retrieval_ndcg]
top_k: [1, 3, 5, 10, 50]
modules:
- module_type: vectordb
embedding_model:
- openai
- openai_embed_3_small
- openai_embed_3_large
- upstage_embed
- cohere_embed
- ko-sroberta-multitask # jhgan/ko-sroberta-multitask
- KoSimCSE-roberta # BM-K/KoSimCSE-roberta
- paraphrase-multilingual-mpnet-base-v2
- paraphrase-multilingual-MiniLM-L12-v2
- multilingual-e5-large-instruct
이렇게 되면 총 10개의 임베딩 모델에 대한 벤치마크를 바로 수행할 수 있다.
하지만, AutoRAG의 기본 지원 임베딩 모델은 얼마 되지 않는다. 그래서, 해당 YAML 파일을 통해 곧바로 AutoRAG를 실행하면 당연히 오류가 날 것이다.
그래서, main.py
와 같은 python 실행 파일을 작성하며 새로운 임베딩 모델들을 추가해 주어야 한다. main.py
는 아래와 같이 만들어 볼 수 있다.
import os
import autorag
import click
from autorag.evaluator import Evaluator
from dotenv import load_dotenv
from llama_index.embeddings.cohere import CohereEmbedding
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.embeddings.upstage import UpstageEmbedding
root_path = os.path.dirname(os.path.realpath(__file__))
data_path = os.path.join(root_path, 'data')
@click.command()
@click.option('--config', type=click.Path(exists=True), default=os.path.join(root_path, 'config',
'embedding_benchmark.yaml'))
@click.option('--qa_data_path', type=click.Path(exists=True), default=os.path.join(data_path, 'qa_v4.parquet'))
@click.option('--corpus_data_path', type=click.Path(exists=True),
default=os.path.join(data_path, 'ocr_corpus_v3.parquet'))
@click.option('--project_dir', type=click.Path(exists=False), default=os.path.join(root_path, 'benchmark'))
def main(config, qa_data_path, corpus_data_path, project_dir):
load_dotenv()
autorag.embedding_models['ko-sroberta-multitask'] = autorag.LazyInit(HuggingFaceEmbedding,
model_name="jhgan/ko-sroberta-multitask")
autorag.embedding_models['KoSimCSE-roberta'] = autorag.LazyInit(HuggingFaceEmbedding,
model_name="BM-K/KoSimCSE-roberta")
autorag.embedding_models['paraphrase-multilingual-mpnet-base-v2'] = autorag.LazyInit(
HuggingFaceEmbedding, model_name="sentence-transformers/paraphrase-multilingual-mpnet-base-v2")
autorag.embedding_models['paraphrase-multilingual-MiniLM-L12-v2'] = autorag.LazyInit(
HuggingFaceEmbedding, model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
autorag.embedding_models['multilingual-e5-large-instruct'] = autorag.LazyInit(
HuggingFaceEmbedding, model_name="intfloat/multilingual-e5-large-instruct")
autorag.embedding_models['upstage_embed'] = autorag.LazyInit(UpstageEmbedding)
autorag.embedding_models['cohere_embed'] = autorag.LazyInit(CohereEmbedding, model_name="embed-multilingual-v3.0",
api_key=os.getenv('COHERE_API_KEY'))
if not os.path.exists(project_dir):
os.makedirs(project_dir)
evaluator = Evaluator(qa_data_path, corpus_data_path, project_dir=project_dir)
evaluator.start_trial(config)
if __name__ == '__main__':
main()
여기서 주목할 부분은 두가지이다.
autorag.embedding_models['ko-sroberta-multitask'] = autorag.LazyInit(HuggingFaceEmbedding, model_name="jhgan/ko-sroberta-multitask")
먼저 위와 같이, autorag.embedding_models
에 직접 새로운 임베딩 모델을 추가해주는 것으로 AutoRAG에서 여러 임베딩 모델을 바로 사용해 볼 수 있다.
꼭 주의할 점은, 그냥 python에서 한 번 실행하면 임베딩 모델이 영구 추가되지 않는다. 반드시 AutoRAG 평가 실행 전에 해당 코드를 실행해야 한다.
그렇기 때문에 위와 같이 Evaluator
를 이용한 AutoRAG 실행을 한번에 진행하는 것이다.
evaluator = Evaluator(qa_data_path, corpus_data_path, project_dir=project_dir)
evaluator.start_trial(config)
위 코드는 AutoRAG를 실행시키는 코드이다. cli로 실행하는 것과 똑같은 기능을 한다.
이 벤치마크를 실행하기 위해서는 반드시 CUDA gpu가 장착된 컴퓨터를 사용하는 것을 추천한다. 임베딩 모델을 여러 번 작동시켜야 하기 때문이다.
또한, 모델 용량이 클 수 있으므로 20기가 이상의 넉넉한 용량 확보도 필요하다.
OpenAI 임베딩과 Upstage, Cohere 임베딩 모델을 사용하므로 각 업체의 사이트에 접속하여 api 키를 발급받자.
그 이후, 레포지토리의 .env
파일에 각 api 키를 추가하거나 환경변수로 설정해주자.
반드시 api 키를 설정해야 정상적으로 작동한다!!
top-k는 몇 개의 passage를 retrieve 하는지를 의미한다. 만약 top-k가 3이면 3개의 passage 중에서 정답이 얼마나 있는지를 평가하는 것이다.
(주의!) mAP, mRR, NDCG 값에 오류가 있습니다. 참고해주세요.
Model name | F1 | Recall | Precision | mAP | mRR | NDCG |
---|---|---|---|---|---|---|
paraphrase-multilingual-mpnet-base-v2 | 0.3596 | 0.3596 | 0.3596 | 0.3596 | 0.3596 | 0.3596 |
KoSimCSE-roberta | 0.4298 | 0.4298 | 0.4298 | 0.4298 | 0.4298 | 0.4298 |
Cohere embed-multilingual-v3.0 | 0.3596 | 0.3596 | 0.3596 | 0.3596 | 0.3596 | 0.3596 |
openai ada 002 | 0.4737 | 0.4737 | 0.4737 | 0.4737 | 0.4737 | 0.4737 |
multilingual-e5-large-instruct | 0.4649 | 0.4649 | 0.4649 | 0.4649 | 0.4649 | 0.4649 |
Upstage Embedding | 0.6579 | 0.6579 | 0.6579 | 0.6579 | 0.6579 | 0.6579 |
paraphrase-multilingual-MiniLM-L12-v2 | 0.2982 | 0.2982 | 0.2982 | 0.2982 | 0.2982 | 0.2982 |
openai_embed_3_small | 0.5439 | 0.5439 | 0.5439 | 0.5439 | 0.5439 | 0.5439 |
ko-sroberta-multitask | 0.4211 | 0.4211 | 0.4211 | 0.4211 | 0.4211 | 0.4211 |
openai_embed_3_large | 0.6053 | 0.6053 | 0.6053 | 0.6053 | 0.6053 | 0.6053 |
top-k가 1이기 때문에 모든 지표들의 점수가 각각 같다.
업스테이지 임베딩 모델이 가장 높은 성능을 보여주었다!
Model name | F1 | Recall | Precision | mAP | mRR | NDCG |
---|---|---|---|---|---|---|
paraphrase-multilingual-mpnet-base-v2 | 0.2368 | 0.4737 | 0.1579 | 0.2032 | 0.2032 | 0.2712 |
KoSimCSE-roberta | 0.3026 | 0.6053 | 0.2018 | 0.2661 | 0.2661 | 0.3515 |
Cohere embed-multilingual-v3.0 | 0.2851 | 0.5702 | 0.1901 | 0.2515 | 0.2515 | 0.3321 |
openai ada 002 | 0.3553 | 0.7105 | 0.2368 | 0.3202 | 0.3202 | 0.4186 |
multilingual-e5-large-instruct | 0.3333 | 0.6667 | 0.2222 | 0.2909 | 0.2909 | 0.3856 |
Upstage Embedding | 0.4211 | 0.8421 | 0.2807 | 0.3509 | 0.3509 | 0.4743 |
paraphrase-multilingual-MiniLM-L12-v2 | 0.2061 | 0.4123 | 0.1374 | 0.1740 | 0.1740 | 0.2340 |
openai_embed_3_small | 0.3640 | 0.7281 | 0.2427 | 0.3026 | 0.3026 | 0.4097 |
ko-sroberta-multitask | 0.2939 | 0.5877 | 0.1959 | 0.2500 | 0.2500 | 0.3351 |
openai_embed_3_large | 0.3947 | 0.7895 | 0.2632 | 0.3348 | 0.3348 | 0.4491 |
top-k가 3개일때에도 upstage 임베딩이 모든 지표에서 가장 높은 결과를 보여주었다.
Model name | F1 | Recall | Precision | mAP | mRR | NDCG |
---|---|---|---|---|---|---|
paraphrase-multilingual-mpnet-base-v2 | 0.1813 | 0.5439 | 0.1088 | 0.1575 | 0.1575 | 0.2491 |
KoSimCSE-roberta | 0.2164 | 0.6491 | 0.1298 | 0.1751 | 0.1751 | 0.2873 |
Cohere embed-multilingual-v3.0 | 0.2076 | 0.6228 | 0.1246 | 0.1640 | 0.1640 | 0.2731 |
openai ada 002 | 0.2602 | 0.7807 | 0.1561 | 0.2139 | 0.2139 | 0.3486 |
multilingual-e5-large-instruct | 0.2544 | 0.7632 | 0.1526 | 0.2194 | 0.2194 | 0.3487 |
Upstage Embedding | 0.2982 | 0.8947 | 0.1789 | 0.2237 | 0.2237 | 0.3822 |
paraphrase-multilingual-MiniLM-L12-v2 | 0.1637 | 0.4912 | 0.0982 | 0.1437 | 0.1437 | 0.2264 |
openai_embed_3_small | 0.2690 | 0.8070 | 0.1614 | 0.2148 | 0.2148 | 0.3553 |
ko-sroberta-multitask | 0.2164 | 0.6491 | 0.1298 | 0.1697 | 0.1697 | 0.2835 |
openai_embed_3_large | 0.2807 | 0.8421 | 0.1684 | 0.2088 | 0.2088 | 0.3586 |
top-k가 5개일때 역시 upstage 임베딩이 모든 지표에서 가장 높은 결과를 보여주었다.
Model name | F1 | Recall | Precision | mAP | mRR | NDCG |
---|---|---|---|---|---|---|
paraphrase-multilingual-mpnet-base-v2 | 0.1212 | 0.6667 | 0.0667 | 0.1197 | 0.1197 | 0.2382 |
KoSimCSE-roberta | 0.1324 | 0.7281 | 0.0728 | 0.1080 | 0.1080 | 0.2411 |
Cohere embed-multilingual-v3.0 | 0.1324 | 0.7281 | 0.0728 | 0.1150 | 0.1150 | 0.2473 |
openai ada 002 | 0.1563 | 0.8596 | 0.0860 | 0.1051 | 0.1051 | 0.2673 |
multilingual-e5-large-instruct | 0.1483 | 0.8158 | 0.0816 | 0.0980 | 0.0980 | 0.2520 |
Upstage Embedding | 0.1707 | 0.9386 | 0.0939 | 0.1078 | 0.1078 | 0.2848 |
paraphrase-multilingual-MiniLM-L12-v2 | 0.1053 | 0.5789 | 0.0579 | 0.0961 | 0.0961 | 0.2006 |
openai_embed_3_small | 0.1547 | 0.8509 | 0.0851 | 0.0984 | 0.0984 | 0.2593 |
ko-sroberta-multitask | 0.1276 | 0.7018 | 0.0702 | 0.0986 | 0.0986 | 0.2275 |
openai_embed_3_large | 0.1643 | 0.9035 | 0.0904 | 0.1180 | 0.1180 | 0.2855 |
top-k가 10개일때는 f1, recall, precision과 같이 랭킹과 관련없는 메트릭에서 Upstage 임베딩 모델이 가장 높은 성능을 보여주었다.
반면, mAP(mRR)에서는 mpnet-base-v2 모델이, NDCG 모델에서는 OpenAI의 embed 3 large 임베딩 모델이 가장 높은 성능을 보였다.
Upstage 임베딩의 경우 고순위(5순위 안)로 정답이 나오지 않은 경우, 다른 모델에 비해 좀 더 낮은 순위에서 정답 passage가 등장하는 모양이다.
Model name | F1 | Recall | Precision | mAP | mRR | NDCG |
---|---|---|---|---|---|---|
paraphrase-multilingual-mpnet-base-v2 | 0.0320 | 0.8158 | 0.0163 | 0.0233 | 0.0233 | 0.1529 |
KoSimCSE-roberta | 0.0368 | 0.9386 | 0.0188 | 0.0270 | 0.0270 | 0.1758 |
Cohere embed-multilingual-v3.0 | 0.0382 | 0.9737 | 0.0195 | 0.0220 | 0.0220 | 0.1763 |
openai ada 002 | 0.0375 | 0.9561 | 0.0191 | 0.0295 | 0.0295 | 0.1789 |
multilingual-e5-large-instruct | 0.0378 | 0.9649 | 0.0193 | 0.0295 | 0.0295 | 0.1804 |
Upstage Embedding | 0.0392 | 1.0000 | 0.0200 | 0.0206 | 0.0206 | 0.1776 |
paraphrase-multilingual-MiniLM-L12-v2 | 0.0313 | 0.7982 | 0.0160 | 0.0218 | 0.0218 | 0.1503 |
openai_embed_3_small | 0.0382 | 0.9737 | 0.0195 | 0.0202 | 0.0202 | 0.1731 |
ko-sroberta-multitask | 0.0354 | 0.9035 | 0.0181 | 0.0245 | 0.0245 | 0.1691 |
openai_embed_3_large | 0.0382 | 0.9737 | 0.0195 | 0.0210 | 0.0210 | 0.1741 |
top-k를 훨씬 큰 폭으로 넓힌 50개의 경우, 업스테이지 임베딩이 무려 Recall 1.0이라는 성능을 보여주었다. 모든 질문에 있어서 정답이 50개 안에 들어있는 것이다. 아주 대단하다.
다만, mAP와 NDCG는 다른 오픈소스 모델이 조금 더 높았다. 이는 역시 특정 단락의 경우 다른 모델에 비해 저순위에 배치되는 경우가 있는 것으로 보인다.
이 데이터셋에 대해서는, Upstage Embedding으로 50개 정도의 많은 양을 retrieve하고, 다른 임베딩 모델 혹은 리랭커 모델을 이용해 리랭킹을 진행하는 것도 좋은 전략으로 보여진다.
Upstage 임베딩의 성능이 매우 괜찮았다! top-k가 1개일 때부터 50개일 때까지 모두 준수한 성능을 보여주며, 한국어에 있어서는 꽤나 좋은 임베딩 모델이라는 생각이 들었다.
또한, 이런 벤치마크를 할 때에 YAML 파일 작성과 데이터 전처리를 제외하면 코드를 거의 작성하지 않았다. (사소한 전처리, YAML 파일, main.py가 끝!)
AutoRAG를 내가 만들었지만 참 편하다^^
AutoRAG를 사용해보고 싶다면 이 벨로그 계정에 여러 포스트가 있다. 또한, 테디노트 유튜브에서 AutoRAG 관련 간단한 강의도 볼 수 있다. 그리고 꼭! 공식 docs를 참고하자.
마지막으로 도움이 되었다면 AutoRAG에 스타 한 번씩 꼭 부탁드린다^^
Experience the best of both worlds with Tez888, India’s premier destination for thrilling online experiences. From cricket and football to dynamic games and interactive challenges, Tez888 provides a secure, exhilarating, and immersive environment. Play smart, make confident choices, and elevate your experience with our diverse range of gaming options! Discover more at: https://tez888in.in
At 11exch, immerse yourself in a world of exciting online gaming, where sports, card games, and roulette await. Effortlessly manage your account, track your games, and access exclusive features. With a simple sign-up process, 11Exch App ensures a personalized and secure gaming experience tailored just for you. Get 11 exchange app now! Know more: https://11exch.ind.in/
openai 이게 text-embedding-ada-002 를 말하는것인가요?