리트리버용 임베딩 비교하기

리트리버용 임베딩 비교하기 (Compare Embeddings for retriever)

리트리버의 성능은 RAG(Retrieval Augmented Generation) 시스템의 전반적인 효과를 결정하는 중요한 요소예요. 특히 사용하는 임베딩의 품질은 검색되는 콘텐츠의 품질을 결정하는 데 핵심적인 역할을 해요. 이 튜토리얼 노트북은 Ragas 라이브러리로 자신의 데이터에 가장 적합한 임베딩을 비교하고 선택하는 단계를 보여줘요.

출처: 문서

본문

리트리버의 성능은 RAG 시스템의 전반적인 효과를 결정하는 중요하고 영향력 있는 요소예요. 특히 사용된 임베딩의 품질은 검색된 콘텐츠의 품질을 결정하는 데 핵심적인 역할을 해요.

이 튜토리얼 노트북은 Ragas 라이브러리를 사용해서 자신의 데이터에 가장 적합한 임베딩을 비교하고 선택하는 단계별 가이드를 제공해요.

Compare Embeddings

Compare Embeddings

합성 테스트 데이터 만들기

팁: Ragas는 자신의 데이터셋으로도 작업할 수 있어요. data preparation을 참고해서 자신의 데이터셋을 ragas와 함께 사용하는 방법을 확인해요.

Ragas는 검색과 생성 작업에 특별히 맞춰진 평가 데이터셋을 만들 수 있는 독특한 테스트 생성 패러다임을 제공해요. 전통적인 QA 생성기와 달리 Ragas는 문서 코퍼스에서 다양한 도전적인 테스트 케이스를 생성할 수 있어요.

팁: 작동 방식에 대해 더 알고 싶다면 testset generation을 참고해요.

이 튜토리얼 노트북에서는 RAG를 구축하기 위해 대규모 언어 모델과 관련된 Semantic Scholar의 논문을 사용하고 있어요.

from llama_index.core import download_loader
from ragas.testset.evolutions import simple, reasoning, multi_context
from ragas.testset.generator import TestsetGenerator
from langchain_openai import ChatOpenAI
from ragas.embeddings import OpenAIEmbeddings
import openai

SemanticScholarReader = download_loader("SemanticScholarReader")
loader = SemanticScholarReader()
query_space = "large language models"
documents = loader.load_data(query=query_space, limit=100)

# openai 모델을 사용한 generator
generator_llm = ChatOpenAI(model="gpt-4o-mini")
critic_llm = ChatOpenAI(model="gpt-4o")
openai_client = openai.OpenAI()
embeddings = OpenAIEmbeddings(client=openai_client)

generator = TestsetGenerator.from_langchain(
    generator_llm,
    critic_llm,
    embeddings
)

distributions = {
    simple: 0.5,
    multi_context: 0.4,
    reasoning: 0.1
}

# testset 생성
testset = generator.generate_with_llamaindex_docs(documents, 100,distributions)
test_df = testset.to_pandas()

testset-output

Test Outputs

test_questions = test_df['question'].values.tolist()
test_answers = [[item] for item in test_df['answer'].values.tolist()]

RAG 구축

여기서는 llama-index를 사용해서 문서로 기본적인 RAG 파이프라인을 구축해요. 목표는 각 테스트 질문에 대해 파이프라인에서 검색된 컨텍스트와 생성된 답변을 수집하는 것이에요. Ragas는 다양한 RAG 프레임워크와 통합이 되어 있어서 ragas로 평가하기가 더 쉬워요.

참고: langchain-tutorial을 참고해서 langchain으로 평가하는 방법을 확인해요.

import nest_asyncio
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, ServiceContext
from langchain.embeddings import HuggingFaceEmbeddings
from ragas.embeddings import OpenAIEmbeddings
import openai
import pandas as pd

nest_asyncio.apply()

def build_query_engine(embed_model):
    vector_index = VectorStoreIndex.from_documents(
        documents, service_context=ServiceContext.from_defaults(chunk_size=512),
        embed_model=embed_model,
    )

    query_engine = vector_index.as_query_engine(similarity_top_k=2)
    return query_engine

ragas에서 메트릭 임포트

여기서는 리트리버 컴포넌트를 평가하는 데 필요한 메트릭을 임포트해요.

from ragas.metrics import (
    context_precision,
    context_recall,
)

metrics = [
    context_precision,
    context_recall,
]

OpenAI 임베딩 평가

from ragas.llama_index import evaluate

openai_model = OpenAIEmbedding()
query_engine1 = build_query_engine(openai_model)
result = evaluate(query_engine1, metrics, test_questions, test_answers)
{'context_precision': 0.2378, 'context_recall': 0.7159}

Bge 임베딩 평가

from ragas.llama_index import evaluate

flag_model = HuggingFaceEmbeddings(model_name="BAAI/bge-small-en-v1.5")
query_engine2 = build_query_engine(flag_model)
result = evaluate(query_engine2, metrics, test_questions, test_answers)
{'context_precision': 0.2655, 'context_recall': 0.7227}

점수 비교

평가 결과를 보면 BGE 모델의 context_precisioncontext_recall 메트릭이 내 RAG 파이프라인에서 OpenAI-Ada 모델보다 다소 우수한 것을 알 수 있어요. 단, 내 데이터셋에 적용했을 때의 이야기예요.

점수에 대한 추가 분석을 위해 결과를 pandas로 내보낼 수 있어요.

result_df = result.to_pandas()
result_df.head()

compare-embeddings-results

Compare Embeddings Results

더 알아보기 (Learn more)