RAG용 테스트셋 생성

RAG용 테스트셋 생성 (Testset Generation for RAG)

이 가이드를 따라 하면 자신의 문서로 RAG 파이프라인을 평가할 테스트셋을 쉽게 만들 수 있어요. 먼저 퀵스타트로 전체 흐름을 잡고, 그다음 테스트셋 생성 파이프라인의 핵심 컴포넌트를 자세히 살펴볼 거예요.

출처: 문서

본문

이 간단한 가이드는 자신의 문서를 사용해서 RAG 파이프라인 평가용 테스트셋을 생성하는 방법을 알려줘요.

퀵스타트

RAG 파이프라인용 테스트셋을 생성하는 간단한 예제를 살펴볼게요. 그다음 테스트셋 생성 파이프라인의 주요 컴포넌트를 알아볼 거예요.

샘플 문서 로드

이 튜토리얼에서는 이 저장소의 샘플 문서를 사용해요. 자신의 문서로 바꿔도 돼요.

git clone https://huggingface.co/datasets/vibrantlabsai/Sample_Docs_Markdown

문서 로드

이제 langchain_community의 문서 로더 중 하나인 DirectoryLoader를 사용해서 샘플 데이터셋에서 문서를 로드해요. llama_index의 로더를 사용해도 돼요.

pip install langchain-community
from langchain_community.document_loaders import DirectoryLoader

path = "Sample_Docs_Markdown/"
loader = DirectoryLoader(path, glob="**/*.md")
docs = loader.load()

LLM 선택

어떤 LLM이든 선택할 수 있어요.

OpenAI

langchain-openai 패키지를 설치해요.

pip install langchain-openai

그리고 환경에 OpenAI 키가 준비되어 있어야 해요.

import os
os.environ["OPENAI_API_KEY"] = "your-openai-key"

ragas에서 사용할 수 있도록 LLM을 LangchainLLMWrapper로 감싸요.

from ragas.llms import LangchainLLMWrapper
from langchain_openai import ChatOpenAI
from ragas.embeddings import OpenAIEmbeddings
import openai

generator_llm = LangchainLLMWrapper(ChatOpenAI(model="gpt-4o"))
openai_client = openai.OpenAI()
generator_embeddings = OpenAIEmbeddings(client=openai_client)

AWS

langchain-aws 패키지를 설치해요.

pip install langchain-aws

그리고 AWS 자격 증명과 설정을 지정해요.

config = {
    "credentials_profile_name": "your-profile-name",  # E.g "default"
    "region_name": "your-region-name",  # E.g. "us-east-1"
    "llm": "your-llm-model-id",  # E.g "anthropic.claude-3-5-sonnet-20241022-v2:0"
    "embeddings": "your-embedding-model-id",  # E.g "amazon.titan-embed-text-v2:0"
    "temperature": 0.4,
}

LLM을 정의하고 ragas에서 사용할 수 있도록 LangchainLLMWrapper로 감싸요.

from langchain_aws import ChatBedrockConverse
from langchain_aws import BedrockEmbeddings
from ragas.llms import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper

generator_llm = LangchainLLMWrapper(ChatBedrockConverse(
    credentials_profile_name=config["credentials_profile_name"],
    region_name=config["region_name"],
    base_url=f"https://bedrock-runtime.{config['region_name']}.amazonaws.com",
    model=config["llm"],
    temperature=config["temperature"],
))
generator_embeddings = LangchainEmbeddingsWrapper(BedrockEmbeddings(
    credentials_profile_name=config["credentials_profile_name"],
    region_name=config["region_name"],
    model_id=config["embeddings"],
))

다른 AWS 서비스 사용법이 더 궁금하다면 langchain-aws 문서를 참고해요.

Google Cloud

Google은 모델에 접근하는 두 가지 방법을 제공해요: Google AI와 Google Cloud Vertex AI예요. Google AI는 Google 계정과 API 키만 있으면 되고, Vertex AI는 엔터프라이즈 기능이 있는 Google Cloud 계정이 필요해요.

먼저 필요한 패키지를 설치해요.

pip install langchain-google-genai langchain-google-vertexai

선택한 API에 따라 자격 증명을 설정해요.

Google AI의 경우:

import os
os.environ["GOOGLE_API_KEY"] = "your-google-ai-key"  # From https://ai.google.dev/

Vertex AI의 경우:

# 자격 증명(gcloud, workload identity 등)이 설정되어 있는지 확인해요
# 또는 서비스 계정 JSON 경로를 설정해요:
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "path/to/service-account.json"

구성을 정의해요:

config = {
    "model": "gemini-1.5-pro",  # or other model IDs
    "temperature": 0.4,
    "max_tokens": None,
    "top_p": 0.8,
    # Vertex AI 전용:
    "project": "your-project-id",  # Required for Vertex AI
    "location": "us-central1",     # Required for Vertex AI
}

LLM을 초기화하고 ragas에서 사용할 수 있도록 감싸요:

from ragas.llms import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper

# API에 따라 적절한 import를 선택해요:
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_google_vertexai import ChatVertexAI

# Google AI Studio로 초기화
generator_llm = LangchainLLMWrapper(ChatGoogleGenerativeAI(
    model=config["model"],
    temperature=config["temperature"],
    max_tokens=config["max_tokens"],
    top_p=config["top_p"],
))

# 또는 Vertex AI로 초기화
generator_llm = LangchainLLMWrapper(ChatVertexAI(
    model=config["model"],
    temperature=config["temperature"],
    max_tokens=config["max_tokens"],
    top_p=config["top_p"],
    project=config["project"],
    location=config["location"],
))

선택적으로 안전 설정을 구성할 수 있어요:

from langchain_google_genai import HarmCategory, HarmBlockThreshold

safety_settings = {
    HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE,
    # 필요에 따라 다른 안전 설정 추가
}

# LLM 초기화에 적용
generator_llm = LangchainLLMWrapper(ChatGoogleGenerativeAI(
    model=config["model"],
    temperature=config["temperature"],
    safety_settings=safety_settings,
))

임베딩을 초기화하고 ragas에서 사용할 수 있도록 감싸요:

# Google AI Studio Embeddings
from langchain_google_genai import GoogleGenerativeAIEmbeddings

generator_embeddings = LangchainEmbeddingsWrapper(GoogleGenerativeAIEmbeddings(
    model="models/embedding-001",  # Google's text embedding model
    task_type="retrieval_document"  # Optional: specify the task type
))
# Vertex AI Embeddings
from langchain_google_vertexai import VertexAIEmbeddings

generator_embeddings = LangchainEmbeddingsWrapper(VertexAIEmbeddings(
    model_name="textembedding-gecko@001",  # or other available model
    project=config["project"],  # Your GCP project ID
    location=config["location"]  # Your GCP location
))

사용 가능한 모델, 기능, 구성에 대한 자세한 내용은 Google AI 문서, Vertex AI 문서, LangChain Google AI 통합, LangChain Vertex AI 통합을 참고해요.

Azure

langchain-openai 패키지를 설치해요.

pip install langchain-openai

환경에 Azure OpenAI 키가 준비되어 있어야 해요.

import os
os.environ["AZURE_OPENAI_API_KEY"] = "your-azure-openai-key"

# 기타 구성
azure_config = {
    "base_url": "",  # your endpoint
    "model_deployment": "",  # your model deployment name
    "model_name": "",  # your model name
    "embedding_deployment": "",  # your embedding deployment name
    "embedding_name": "",  # your embedding name
}

LLM을 정의하고 ragas에서 사용할 수 있도록 LangchainLLMWrapper로 감싸요.

from langchain_openai import AzureChatOpenAI
from langchain_openai import AzureOpenAIEmbeddings
from ragas.llms import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper
generator_llm = LangchainLLMWrapper(AzureChatOpenAI(
    openai_api_version="2023-05-15",
    azure_endpoint=azure_configs["base_url"],
    azure_deployment=azure_configs["model_deployment"],
    model=azure_configs["model_name"],
    validate_base_url=False,
))

# answer_relevancy, answer_correctness, answer_similarity 용 임베딩 초기화
generator_embeddings = LangchainEmbeddingsWrapper(AzureOpenAIEmbeddings(
    openai_api_version="2023-05-15",
    azure_endpoint=azure_configs["base_url"],
    azure_deployment=azure_configs["embedding_deployment"],
    model=azure_configs["embedding_name"],
))

다른 Azure 서비스 사용법이 더 궁금하다면 langchain-azure 문서를 참고해요.

기타 (Others)

다른 LLM 프로바이더를 사용하고, LangChain으로 상호작용한다면 LLM을 LangchainLLMWrapper로 감싸서 ragas에서 사용할 수 있어요.

from ragas.llms import LangchainLLMWrapper
generator_llm = LangchainLLMWrapper(your_llm_instance)

더 자세한 가이드는 모델 커스터마이즈 가이드를 참고해요.

LlamaIndex를 사용한다면 LlamaIndexLLMWrapper로 LLM을 감싸서 ragas에서 사용할 수 있어요.

from ragas.llms import LlamaIndexLLMWrapper
generator_llm = LlamaIndexLLMWrapper(your_llm_instance)

LlamaIndex 사용법에 대한 자세한 내용은 LlamaIndex 통합 가이드를 참고해요.

여전히 좋아하는 LLM 프로바이더로 Ragas를 사용할 수 없다면 이 이슈에 댓글을 남겨주세요. 지원을 추가해드릴게요 🙂.

테스트셋 생성

이제 로드한 문서와 LLM 설정을 사용해서 테스트 생성을 실행해요. llama_index로 문서를 로드했다면 generate_with_llama_index_docs 메서드를 사용해요.

from ragas.testset import TestsetGenerator

generator = TestsetGenerator(llm=generator_llm, embedding_model=generator_embeddings)
dataset = generator.generate_with_langchain_docs(docs, testset_size=10)

테스트셋 분석

테스트셋을 생성한 뒤에는 내용을 확인하고 최종 테스트셋에 포함할 쿼리를 골라봐요. 테스트셋을 pandas DataFrame으로 내보내서 다양한 분석을 할 수 있어요.

dataset.to_pandas()

출력

testset

참고: 합성 테스트 데이터 생성은 헷갈리고 어려울 수 있어요. 하지만 필요하다면 기꺼이 도와드릴게요. 다양한 사용 사례를 위한 테스트 데이터 생성 파이프라인을 구축해 두었어요. 도움이 필요하다면 슬롯 예약 또는 [email protected]으로 연락 주세요.

더 깊이 들여다보기 (A Deeper Look)

테스트셋을 생성하는 방법을 봤으니, 이제 테스트셋 생성 파이프라인의 주요 컴포넌트와 빠르게 커스터마이즈하는 방법을 자세히 살펴볼게요.

핵심에는 테스트셋을 생성하기 위한 2가지 주요 작업이 있어요.

  1. KnowledgeGraph 생성: 먼저 제공한 문서로 KnowledgeGraph를 만들고, 다양한 Transformations를 사용해서 테스트셋 생성에 쓸 추가 정보로 지식 그래프를 풍부하게 만들어요. 자세한 내용은 핵심 개념 섹션에서 확인할 수 있어요.
  2. Testset 생성: KnowledgeGraph를 사용해서 시나리오 집합을 생성해요. 이 시나리오는 testset 생성에 사용돼요. 자세한 내용은 핵심 개념 섹션에서 확인할 수 있어요.

이제 이 컴포넌트들이 함께 작동해서 테스트셋을 생성하는 예시를 볼게요.

KnowledgeGraph 생성

먼저 앞서 로드한 문서로 KnowledgeGraph를 만들어요.

from ragas.testset.graph import KnowledgeGraph

kg = KnowledgeGraph()

출력

KnowledgeGraph(nodes: 0, relationships: 0)

그리고 문서를 지식 그래프에 추가해요.

from ragas.testset.graph import Node, NodeType

for doc in docs:
    kg.nodes.append(
        Node(
            type=NodeType.DOCUMENT,
            properties={"page_content": doc.page_content, "document_metadata": doc.metadata}
        )
    )

출력

KnowledgeGraph(nodes: 10, relationships: 0)

이제 Transformations를 사용해서 지식 그래프를 추가 정보로 풍부하게 만들어요. 여기서는 default_transforms를 사용해서 선택한 LLM과 임베딩 모델로 적용할 기본 변환 집합을 만들어요. 필요에 따라 변환을 섞거나 직접 만들어도 돼요.

from ragas.testset.transforms import default_transforms, apply_transforms

# LLM과 임베딩 모델 정의
# 여기서는 테스트셋 생성에 사용한 것과 동일한 LLM과 임베딩 모델을 사용해요
transformer_llm = generator_llm
embedding_model = generator_embeddings

trans = default_transforms(documents=docs, llm=transformer_llm, embedding_model=embedding_model)
apply_transforms(kg, trans)

이제 추가 정보가 있는 지식 그래프가 생겼어요. 지식 그래프를 저장할 수도 있어요.

kg.save("knowledge_graph.json")
loaded_kg = KnowledgeGraph.load("knowledge_graph.json")
loaded_kg

출력

KnowledgeGraph(nodes: 48, relationships: 605)

Testset 생성

이제 loaded_kg를 사용해서 TestsetGenerator를 만들어요.

from ragas.testset import TestsetGenerator

generator = TestsetGenerator(llm=generator_llm, embedding_model=embedding_model, knowledge_graph=loaded_kg)

생성하고 싶은 쿼리 분포도 정의할 수 있어요. 여기서는 기본 분포를 사용할게요.

from ragas.testset.synthesizers import default_query_distribution

query_distribution = default_query_distribution(generator_llm)

출력

[
    (SingleHopSpecificQuerySynthesizer(llm=llm), 0.5),
    (MultiHopAbstractQuerySynthesizer(llm=llm), 0.25),
    (MultiHopSpecificQuerySynthesizer(llm=llm), 0.25),
]

이제 테스트셋을 생성할 수 있어요.

testset = generator.generate(testset_size=10, query_distribution=query_distribution)
testset.to_pandas()

출력

testset