[RAG 시리즈] 임베딩 모델별 RAG 성능 비교

Judy·2025년 2월 2일
1

[글또] RAG 시리즈

목록 보기
7/8

지난 포스팅에서 다음과 같은 고찰을 했는데요,

따라서 이번 포스팅에서는 embedding 모델별 RAG 품질을 비교합니다.
또한 유료로 사용하는 OpenAI 모델뿐만 아니라 무료(속도는 느리지만) HuggingFace 모델도 함께 비교합니다.

튜토리얼 코드 : GitHub

Embedding Model

Embedding Model 로 다음 4가지 모델을 사용합니다.

OpenAI

text-embedding-3-large

  • 튜토리얼에서 쭉 사용해 온 임베딩 모델
  • 기본적으로 3072 차원
  • (ChatGPT) 정확성과 고급 의미 분석이 중요한 경우에 더 적합한 모델로, 미세한 유사성 분석이나 정교한 NLP 작업에서 뛰어난 성능을 발휘합니다.

text-embedding-ada-002

  • text-embedding-3 가 나오기 전에 많이 사용된 OpenAI 임베딩 모델
  • 1536 차원
  • (ChatGPT) 비용 효율성과 대규모 처리에 강점을 가진 모델입니다. 즉, 대량의 텍스트 데이터를 빠르고 저렴하게 처리해야 할 때 적합합니다.

가격 차이는 다음과 같네요.

HuggingFace

intfloat/multilingual-e5-small

  • 레이어 12 개, 임베딩 크기 384
  • (공식문서) This model is initialized from microsoft/Multilingual-MiniLM-L12-H384 and continually trained on a mixture of multilingual datasets. It supports 100 languages from xlm-roberta, but low-resource languages may see performance degradation.
    • 이 모델은 microsoft/Multilingual-MiniLM-L12-H384 에서 초기화되었으며 다국어 데이터 세트의 혼합으로 지속적으로 학습되었습니다. xlm-roberta에서 100개 언어를 지원하지만 리소스가 부족한 언어는 성능 저하가 나타날 수 있습니다.

kakaobank/kf-deberta-base

Code

보험 약관문서를 읽어들여 Vector store 에 적재하는 코드와 Langchain 을 만드는 코드는 생략합니다. (전체 코드는 GitHub 참고)

Vector Store 세팅

벡터스토어의 임베딩 모델을 세팅합니다.

from langchain_postgres import PGVector
from langchain_postgres.vectorstores import PGVector
# OpenAI 임베딩을 이용할 경우
from langchain_openai import OpenAIEmbeddings
# HuggingFace 임베딩을 이용할 경우
from langchain_huggingface import HuggingFaceEmbeddings

# See docker command above to launch a postgres instance with pgvector enabled.
# connection = f"postgresql+psycopg2://user:password@host:5432/name",
connection=f"postgresql+psycopg2://rag_note:rag_note@localhost:5433/rag_note"

embedding_name = "text-embedding-3-large"

vector_store = PGVector(
    embeddings=OpenAIEmbeddings(model=embedding_name),
    # HuggingFaceEmbeddings(model_name=embedding_name),
    collection_name=embedding_name,
    connection=connection,
    use_jsonb=True,
)

질문에 맞는 문서 검색

vector_store.similarity_search(query="보험금의 지급사유")

결과

[Document(id='c6c0092d-2e1d-48bc-a979-dc45b9f51dc0', metadata={'page': 50, 'source': '../data/[일반보험]_KB개인상해보험_보험약관.pdf'}, page_content='- 40 -(  )상해 (  )%미만 후유장해 특별약관\n제1조(보험금의 지급사유 ) \n회사는 피보험자가 보험기간 중 ( )특약 제( )조(보험금의 지급사유 )에 정한 상해의 직접결과로\n써 장해분류표 ([별표1] 참조. 이하 같습니다 )에서 정한 장해지급률이 (  )% 미만에 해당하는 \n장해상태가 되었을 때에는 후유장해보험금 (장해분류표에서 정한 지급률을 보험가입금액에 곱하\n여 산출한 금액)을 보험수익자에게 지급하여 드립니다 .\n제2조(준용규정 )\n이 특별약관에 정하지 않은 사항은 보통약관 또는 해당 특별약관을 따릅니다 .'),
 Document(id='8d1adc20-e08d-4a9f-9fed-a5f694b0388a', metadata={'page': 14, 'source': '../data/[일반보험]_KB개인상해보험_보험약관.pdf'}, page_content='- 4 - 4. 기타 보험수익자가 보험금의 수령에 필요하여 제출하는 서류(사망보험금 지급시 피보험\n자의 법정상속인이 아닌자가 청구하는 경우 법정상속인의 확인서 )\n② 제1항 제2호의 사고증명서는 의료법 제3조(의료기관 )에서 규정한 국내의 병원이나 의원 또\n는 국외의 의료관련법에서 정한 의료기관에서 발급한 것이어야 합니다 .\n제8조(보험금의 지급절차 ) \n① 회사는 제7조(보험금의 청구)에서 정한 서류를 접수한 때에는 접수증을 드리고 휴대전화 문\n자메시지 또는 전자우편 등으로도 송부하며 , 그 서류를 접수한 날부터 3영업일 이내에 보\n험금을 지급합니다 .\n② 회사가 보험금 지급사유를 조사․확인하기 위해 필요한 기간이 제1항의 지급기일을 초과할 \n것이 명백히 예상되는 경우에는 그 구체적인 사유와 지급예정일 및 보험금 가지급제도 (회사\n가 추정하는 보험금의 50% 이내를 지급)에 대하여 피보험자 또는 보험수익자에게 즉시 통\n지합니다 . 다만, 지급예정일은 다음 각 호의 어느 하나에 해당하는 경우를 제외하고는 제7\n조(보험금의 청구)에서 정한 서류를 접수한 날부터 30영업일 이내에서 정합니다 .\n 1. 소송제기\n 2. 분쟁조정 신청\n【분쟁조정 신청】\n분쟁조정 신청은 이 약관의 「분쟁의 조정」조항에 따르며 분쟁조정 신청 대상기관은 금융\n감독원의 금융분쟁조정위원회를 말합니다 .\n 3. 수사기관의 조사 \n 4. 해외에서 발생한 보험사고에 대한 조사\n 5. 제6항에 따른 회사의 조사요청에 대한 동의 거부 등 계약자 , 피보험자 또는 보험수익자\n의 책임있는 사유로 보험금 지급사유의 조사와 확인이 지연되는 경우\n 6. 제4조(보험금 지급에 관한 세부규정 ) 제6항에 따라 보험금 지급사유에 대해 제3자의 의\n견에 따르기로 한 경우\n③ 제2항에 의하여 장해지급률의 판정 및 지급할 보험금의 결정과 관련하여 확정된 장해지급\n률에 따른 보험금을 초과한 부분에 대한 분쟁으로 보험금 지급이 늦어지는 경우에는 보험\n수익자의 청구에 따라 이미 확정된 보험금을 먼저 가지급합니다 .\n④ 제2항에 의하여 추가적인 조사가 이루어지는 경우, 회사는 보험수익자의 청구에 따라 회사\n가 추정하는 보험금의 50% 상당액을 가지급보험금으로 지급합니다 .\n【가지급보험금 】\n보험금이 지급기한 내에 지급되지 못할 것으로 판단되는 경우 회사가 예상되는 보험금의 \n일부를 먼저 지급하는 제도로 피보험자가 필요로 하는 비용을 보전해 주기 위해 회사가 먼\n저 지급하는 임시 교부금을 말합니다 .\n⑤ 회사는 제1항에서 정한 지급기일내에 보험금을 지급하지 않았을 때(제2항에서 정한 지급예\n정일을 통지한 경우를 포함합니다 )에는 그 다음날부터 지급일까지의 기간에 대하여 <부표> \n‘보험금을 지급할 때의 적립이율 ’에 따라 연단위 복리로 계산한 금액을 보험금에 더하여 지\n급합니다 . 다만, 계약자 , 피보험자 또는 보험수익자에게 책임이 있는 사유로 지급이 지연된 \n경우에는 그 기간에 대한 이자는 지급하지 않습니다 .\n 기     간 지 급 이 자\n지급기일의 다음 날부터 30일 이내 기간 보험계약대출이율\n지급기일의 31일이후부터 60일이내 기간 보험계약대출이율 + 가산이율 (4.0%)\n지급기일의 61일이후부터 90일이내 기간 보험계약대출이율 + 가산이율 (6.0%)\n지급기일의 91일이후 기간 보험계약대출이율 + 가산이율 (8.0%)<부표> 보험금을 지급할 때의 적립이율'),
 Document(id='c303c659-fe41-4351-a600-8ae0087ef3b6', metadata={'page': 179, 'source': '../data/[일반보험]_KB개인상해보험_보험약관.pdf'}, page_content='- 169 - 4. 피보험자 및 지정대리청구인의 가족관계등록부 (가족관계증명서 ) 및 주민등록등본\n 5. 기타 지정대리청구인이 보험금 등의 수령에 필요하여 제출하는 서류\n제7조(준용규정 )\n이 특약에서 정하지 않은 사항에 대하여는 보통약관 및 해당 특별약관의 규정을 따릅니다 .'),
 Document(id='3451d792-9a0f-4415-9f41-a3bf3ddf1b48', metadata={'page': 9, 'source': '../data/[일반보험]_KB개인상해보험_보험약관.pdf'}, page_content='보험용어 해설\n보험용어 용어 해설\n보험약관보험계약에 관하여 보험계약자와 보험회사 상호간에 이행하여야 할 권리\n와 의무를 규정한 것\n보험증권보험계약의 성립과 그 내용을 증명하기 위하여 보험회사가 보험계약자에\n게 교부하는 증서\n보험계약자 보험회사와 계약을 체결하고 보험료 납입의무를 지는 사람\n피보험자 보험사고 발생의 대상이 되는 사람\n보험수익자 보험사고 발생시 보험금 청구권을 갖는 사람\n보험료 보험계약자가 보험계약에 의거하여 보험회사에게 지급하여야하는 요금\n보험목적 보험사고의 발생의 객체가 되는 경제상의 재화\n보험가액재산보험에 있어 피보험 이익을 금전으로 평가한 금액으로 보험의 목적\n에 발생할 수 있는 최대 손해액을 말합니다 .(회사가 실제 지급하는 보험\n금은 보험가액을 초과할 수 없습니다 ) \n보험가입금액보험사고 발생시 보험회사가 지급하여야 할 보험금의 기준이 되는 금액\n으로 보험증권에 기재된 금액\n보험금◦ 신체손해 ·비용손해 보장 : 피보험자의 사망, 장해, 입원 등 보험금 지\n급사유가 발생하였을 때 보험회사가 보험수익자에게 지급하는 금액\n◦ 재물손해 ·배상책임 보장 : 피보험자의 재물손해 , 배상책임손해 등 보험\n금 지급사유가 발생하였을 때 보험회사가 피보험자에게 지급하는 금액\n보험기간 계약에 따라 보장을 받는 기간으로 보험증권에 기재된 기간\n보장개시일 보험회사의 보험금 지급의무가 시작되는 날\n보험년도보험계약일로부터 매1년 단위의 연도(당해연도 보험계약 해당일부터 다\n음연도 보험계약 해당일 전일까지의 기간)를 말함\n영업일회사가 영업점에서 정상적으로 영업하는 날을 말하며 , “토요일 ”, “관공\n서의 공휴일에 관한 규정에 따른 공휴일 ” 및 “근로자의 날”을 제외한 날\n을 의미합니다 .')]

임베딩 모델별 검색 결과 및 Langchain 생성 답변 비교

공통 질문 : '보험금의 지급사유'

  • text-embedding-3-large 모델 성능이 가장 준수.
    • 질문 의도에 가장 잘 맞는 문서 (약관에서 언급하는 보험금의 지급사유 중 가장 대표적인 지급사유) 검색
  • 무료 임베딩 모델을 사용할 경우 multilingual-e5-small 의 성능이 준수함.
  • kakaobank/kf-deberta-base 모델 성능이 가장 낮음
    • 금융 데이터와 생명보험 약관 데이터가 비슷하지 않기 때문으로 추정
  • Retriever 검색 결과를 비교하여 적합한 임베딩 모델을 사용하거나 도메인에 맞게 임베딩 모델을 파인튜닝하여 사용할 경우 검색 결과가 더 좋아질 수 있고, 이는 답변 품질 향상으로 이어짐
  • RAG 의 품질은 결국 Retriever 성능에 좌우됨 (검색을 잘 해야 좋은 답변을 만들 수 있음)
  • 임베딩 모델의 차원수가 클수록 성능이 좋겠으나, Vector store (본 튜토리얼에서는 pgvector) 에 저장되는 벡터의 차원수가 클수록 저장 용량도 커짐.
    • 서비스 관점에서는 임베딩 성능과 저장 용량을 모두 고려하여 적합한 임베딩 차원수 또는 모델을 선정하는 것을 추천.
profile
NLP Researcher

0개의 댓글

관련 채용 정보