LabelledRagDataset으로 RAG 성능 평가하기
LabelledRagDataset으로 RAG 성능 평가하기
RAG 시스템을 제대로 평가하려면 평가 방법도, 시스템도, 그리고 평가용 데이터셋도 필요해요. 좋은 관행은 서로 다른 출처·도메인의 여러 데이터셋으로 LLM 애플리케이션을 시험하는 거예요. 그래야 시스템이 보지 못한 새 사례에서도 잘 동작하는지 — 시스템의 견고성(robustness)을 확인할 수 있거든요.
출처: 공식문서
이를 위해 LlamaIndex는 LabelledRagDataset 추상화를 제공해요. 다양한 데이터셋에서 시스템을 평가하기 쉽게 만들고, 만들기 쉽고 쓰기 쉽고 널리 구할 수 있게 하는 게 핵심 목적이에요.
이 데이터셋은 예시(examples)로 구성되는데, 각 예시는 query, reference_answer, reference_contexts를 담아요. LabelledRagDataset을 쓰는 주된 이유는 주어진 query에 대한 응답을 먼저 예측하고, 그 예측(생성) 응답을 reference_answer와 비교해 RAG 시스템의 성능을 시험하기 위해서예요.
from llama_index.core.llama_dataset import (
LabelledRagDataset,
CreatedBy,
CreatedByType,
LabelledRagDataExample,
)
example1 = LabelledRagDataExample(
query="This is some user query.",
query_by=CreatedBy(type=CreatedByType.HUMAN),
reference_answer="This is a reference answer. Otherwise known as ground-truth answer.",
reference_contexts=[
"This is a list",
"of contexts used to",
"generate the reference_answer",
],
reference_by=CreatedBy(type=CreatedByType.HUMAN),
)
# a sad dataset consisting of one measely example
rag_dataset = LabelledRagDataset(examples=[example1])
LabelledRagDataset 만들기
앞에서 본 것처럼 LabelledRagDataExample을 하나씩 만들어 수동으로 LabelledRagDataset을 구성할 수 있어요. 다만 이건 좀 번거롭죠. 사람이 주석을 단 데이터셋은 매우 값지지만, 강력한 LLM이 생성한 데이터셋도 매우 유용해요.
그래서 llama_dataset 모듈에는 소스 Document 집합 위에서 LabelledRagDataset을 생성할 수 있는 **RagDatasetGenerator**가 있어요.
from llama_index.core.llama_dataset.generator import RagDatasetGenerator
from llama_index.llms.openai import OpenAI
import nest_asyncio
nest_asyncio.apply()
documents = ... # a set of documents loaded by using for example a Reader
llm = OpenAI(model="gpt-4")
dataset_generator = RagDatasetGenerator.from_documents(
documents=documents,
llm=llm,
num_questions_per_chunk=10, # set the number of questions per nodes
)
rag_dataset = dataset_generator.generate_dataset_from_nodes()
LabelledRagDataset 사용하기
LabelledRagDataset으로 같은 소스 Document 위에 만든 RAG 시스템의 성능을 평가하려면 두 단계가 필요해요. (1) 데이터셋에 예측 만들기 — 각 예시의 query에 대한 응답 생성, (2) 예측 응답을 reference answer와 비교해 평가하기. 2단계에서는 RAG 시스템이 검색한 컨텍스트를 reference contexts와 비교해, RAG의 검색 컴포넌트도 함께 평가해요.
편의를 위해 이 평가 과정을 단순화하는 RagEvaluatorPack이라는 LlamaPack이 있어요.
from llama_index.core.llama_pack import download_llama_pack
RagEvaluatorPack = download_llama_pack("RagEvaluatorPack", "./pack")
rag_evaluator = RagEvaluatorPack(
query_engine=query_engine, # built with the same source Documents as the rag_dataset
rag_dataset=rag_dataset,
)
benchmark_df = await rag_evaluator.run()
위 benchmark_df에는 이전에 소개한 평가 지표의 평균 점수가 담겨요: Correctness, Relevancy, Faithfulness, 그리고 참조 컨텍스트와 RAG 시스템이 예측 응답 생성에 검색한 컨텍스트 사이의 의미적 유사도를 측정하는 Context Similarity까지요.
LabelledRagDataset 찾기
모든 LabelledRagDataset은 llamahub에서 찾을 수 있어요. 하나씩 둘러보고, 원하는 걸 골라 RAG 워크플로우 벤치마크에 쓰고 싶다면 데이터셋과 소스 Document를 두 가지 방법 중 하나로 편리하게 다운로드할 수 있어요 — llamaindex-cli 또는 Python 코드의 download_llama_dataset 유틸리티 함수요.
# using cli
llamaindex-cli download-llamadataset PaulGrahamEssayDataset --download-dir ./data
# using python
from llama_index.core.llama_dataset import download_llama_dataset
# a LabelledRagDataset and a list of source Document's
rag_dataset, documents = download_llama_dataset(
"PaulGrahamEssayDataset", "./data"
)
LabelledRagDataset 기여하기
LabelledRagDataset을 llamahub에 기여할 수도 있어요. 크게 두 단계를 거쳐요. LabelledRagDataset을 만들고 JSON으로 저장한 뒤, 이 JSON 파일과 소스 텍스트 파일을 llama_datasets 저장소에 제출해야 해요. 추가로 llama_hub 저장소에 데이터셋의 필수 메타데이터를 올리는 풀 리퀘스트를 만들어야 해요. 자세한 절차는 "LlamaDataset Submission Template Notebook"을 참고하세요.
더 알아보기
- Labelled RAG datasets 예제
- Downloading Llama datasets 예제
- Observability — 시스템 관찰·디버깅·평가