Ragas 평가로 LLM 비교하기
Ragas 평가로 LLM 비교하기 (Compare LLMs using Ragas Evaluations)
RAG(Retrieval Augmented Generation) 시스템에 사용되는 LLM은 생성되는 출력의 품질에 큰 영향을 미쳐요. 서로 다른 LLM이 생성한 결과를 평가하면 특정 사용 사례에 맞는 올바른 LLM을 고르는 데 도움이 돼요. 이 튜토리얼 노트북은 Ragas 라이브러리로 자신의 데이터에 가장 적합한 LLM을 비교하고 선택하는 단계를 보여줘요.
출처: 문서
본문
RAG 시스템에 사용되는 LLM은 생성된 출력의 품질에 큰 영향을 미쳐요. 서로 다른 LLM이 생성한 결과를 평가하면 특정 사용 사례에 맞는 올바른 LLM을 고르는 아이디어를 얻을 수 있어요.
이 튜토리얼 노트북은 Ragas 라이브러리를 사용해서 자신의 데이터에 가장 적합한 LLM을 비교하고 선택하는 단계별 가이드를 제공해요.
Compare LLMs
합성 테스트 데이터 만들기
팁: Ragas는 자신의 데이터셋으로도 작업할 수 있어요. data preparation을 참고해서 자신의 데이터셋을 ragas와 함께 사용하는 방법을 확인해요.
Ragas는 검색과 생성 작업에 특별히 맞춰진 평가 데이터셋을 만들 수 있는 독특한 테스트 생성 패러다임을 제공해요. 전통적인 QA 생성기와 달리 Ragas는 문서 코퍼스에서 다양한 도전적인 테스트 케이스를 생성할 수 있어요.
팁: 작동 방식에 대해 더 알고 싶다면 testset generation을 참고해요.
이 튜토리얼 노트북에서는 RAG를 구축하기 위해 대규모 언어 모델과 관련된 Arxiv의 논문을 사용하고 있어요.
참고: 더 나은 결과를 위해 Testset 생성기로 50개 이상의 샘플을 생성해요.
import os
from llama_index import download_loader, SimpleDirectoryReader
from ragas.testset import TestsetGenerator
from ragas.testset.generator import TestsetGenerator
from ragas.testset.evolutions import simple, reasoning, multi_context
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
os.environ['OPENAI_API_KEY'] = 'Your OPEN AI key'
# 문서 로드
reader = SimpleDirectoryReader("./arxiv-papers/",num_files_limit=30)
documents = reader.load_data()
# openai 모델을 사용한 generator
generator_llm = ChatOpenAI(model="gpt-4o-mini")
critic_llm = ChatOpenAI(model="gpt-4o")
embeddings = OpenAIEmbeddings()
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_llama_index_docs(documents, 100,distributions)
testset.to_pandas()
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 import VectorStoreIndex, SimpleDirectoryReader, ServiceContext
from llama_index.llms import HuggingFaceInferenceAPI
from llama_index.embeddings import HuggingFaceInferenceAPIEmbedding
import pandas as pd
nest_asyncio.apply()
def build_query_engine(llm):
vector_index = VectorStoreIndex.from_documents(
documents, service_context=ServiceContext.from_defaults(chunk_size=512, llm=llm),
embed_model=HuggingFaceInferenceAPIEmbedding,
)
query_engine = vector_index.as_query_engine(similarity_top_k=2)
return query_engine
# Llama index가 HFInference API의 비동기 평가를 지원하지 않기 때문에 평가할 함수
def generate_responses(query_engine, test_questions, test_answers):
responses = [query_engine.query(q) for q in test_questions]
answers = []
contexts = []
for r in responses:
answers.append(r.response)
contexts.append([c.node.get_content() for c in r.source_nodes])
dataset_dict = {
"question": test_questions,
"answer": answers,
"contexts": contexts,
}
if test_answers is not None:
dataset_dict["ground_truth"] = test_answers
ds = Dataset.from_dict(dataset_dict)
return ds
ragas에서 메트릭 임포트
여기서는 리트리버 컴포넌트를 평가하는 데 필요한 메트릭을 임포트해요.
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import (
faithfulness,
answer_relevancy,
answer_correctness,
)
metrics = [
faithfulness,
answer_relevancy,
answer_correctness,
]
Zephyr 7B Alpha LLM 평가
첫 번째 LLM으로 HuggingFace zephyr-7b-alpha를 사용할게요. HuggingFaceInferenceAPI를 사용해서 모델로 답변을 생성해요. HuggingFaceInferenceAPI는 무료로 사용할 수 있고, 토큰은 HuggingFaceToken으로 설정할 수 있어요.
# HFInference API로 zephyr 모델 사용
zephyr_llm = HuggingFaceInferenceAPI(
model_name="HuggingFaceH4/zephyr-7b-alpha",
token="Your Hugging Face token"
)
query_engine1 = build_query_engine(zephyr_llm)
result_ds = generate_responses(query_engine1, test_questions, test_answers)
result_zephyr = evaluate(
result_ds,
metrics=metrics,
)
result_zephyr
{'faithfulness': 0.8365, 'answer_relevancy': 0.8831, 'answer_correctness': 0.6605}
Falcon-7B-Instruct LLM 평가
두 번째 평가 모델로 Falcon-7B-Instruct를 사용해요. 이것도 HuggingFaceInferenceAPI로 사용할 수 있어요.
falcon_llm = HuggingFaceInferenceAPI(
model_name="tiiuae/falcon-7b-instruct",
token="Your Huggingface token"
)
query_engine2 = build_query_engine(falcon_llm)
result_ds_falcon = generate_responses(query_engine2, test_questions, test_answers)
result = evaluate(
result_ds_falcon,
metrics=metrics,
)
result
{'faithfulness': 0.6909, 'answer_relevancy': 0.8651, 'answer_correctness': 0.5850}
점수 비교
평가 결과를 보면 HuggingFace zephyr-7b-alpha 모델의 faithfulness, answer_correctness, answer_relevancy 메트릭이 내 RAG 파이프라인에서 falcon-7b-instruct 모델보다 다소 우수한 것을 알 수 있어요. 단, 내 데이터셋에 적용했을 때의 이야기예요.
전체 Colab 노트북은 여기를 참고해요.
import numpy as np
import matplotlib.pyplot as plt
def analysis(zephyr_df, falcon_df):
sns.set_style("whitegrid")
fig, axs = plt.subplots(1,3, figsize=(12, 5))
for i,col in enumerate(zephyr_df.columns):
sns.kdeplot(data=[zephyr_df[col].values,falcon_df[col].values],legend=False,ax=axs[i],fill=True)
axs[i].set_title(f'{col} scores distribution')
axs[i].legend(labels=["zephyr", "falcon"])
plt.tight_layout()
plt.show()
result_zephyr_df = result_zephyr.to_pandas()
result_falcon_df = result.to_pandas()
analysis(
result_zephyr_df[['faithfulness', 'answer_relevancy', 'answer_correctness']],
result_falcon_df[['faithfulness', 'answer_relevancy', 'answer_correctness']]
)
점수 분포 분석
Compare LLMs


