watsonx와 함께 Python에서 Ragas를 사용하여 RAG 파이프라인 평가

이 튜토리얼에서는 LangChain을 사용하여 Python에서 검색 증강 생성(RAG) 평가를 위한 Ragas 프레임워크를 사용합니다.

RAG 는 정보 검색과 생성 모델을 결합하여 보다 정확하고 관련성이 높으며 컨텍스트에 맞는 응답을 생성하는 자연어 처리(NLP) 기술입니다. 전통적인 언어 생성 작업에서는 OpenAI의 GPT-4(Generative Pre-trained Transformer)나 IBM® Granite 모델과 같은 대규모 언어 모델(LLM)을 사용하여 입력 프롬프트를 기반으로 응답을 생성합니다. 이러한 대규모 언어 모델의 일반적인 실제 사용 사례는 챗봇입니다. 그러나 이러한 모델은 컨텍스트와 관련이 있거나 사실에 근거한 정확한 응답 또는 최신 응답을 생성하는 데 어려움을 겪을 수 있습니다.

RAG 애플리케이션은 응답을 생성하기 전에 검색 단계를 포함함으로써 이러한 한계를 해결합니다. 검색 단계에서는 일반적으로 벡터 데이터베이스에 저장된 대규모 텍스트 코퍼스에서 관련 문서와 같은 프롬프트와 관련된 추가 텍스트 조각을 지식 베이스에서 가져옵니다. 마지막으로, 검색된 컨텍스트가 추가된 원래 프롬프트를 기반으로 LLM이 응답을 생성합니다.

RAG 평가 개요

다양한 RAG 평가 프레임워크와 평가 지표가 존재합니다. Ragas 외에도 IBM의 Unitxt 및 OpenAI의 Evals과 같은 프레임워크가 있습니다. 다른 프레임워크와 달리 Ragas는 또 다른 LLM을 심판 역할로 사용하여 RAG 파이프라인의 성능을 평가합니다.

RAG 파이프라인의 성능을 측정하기 위해 사용할 수 있는 여러 평가 지표가 있습니다. 오픈 소스 Ragas 프레임워크에서 사용할 지표는 두 부분으로 나눌 수 있습니다.

  • 생성 평가                
    • 충실도는 생성된 모든 답변이 검색된 컨텍스트로부터 도출될 수 있는지를 측정합니다.
    • 답변 관련성은 생성된 응답이 질문과 얼마나 관련이 있는지를 측정합니다.
  • 검색 평가   
    • 컨텍스트 정밀도는 컨텍스트 내에서 참값과 관련된 엔티티의 순위를 측정합니다. 컨텍스트 정밀도가 높을수록 실제 관련 항목이 '노이즈'보다 높은 순위에 위치함을 의미합니다.
    • 컨텍스트 재현율은 LLM이 생성한 사용자 쿼리의 응답이 검색된 컨텍스트에서 얼마나 발견될 수 있는지를 측정합니다.

이러한 지표는 RAG 파이프라인이 지식 베이스에서 관련 정보를 검색하여 응답을 형성하는 능력을 측정하는 주관적인 대체 척도로 사용됩니다. 데이터, 프롬프트 또는 LLM에 대해 완벽한 기준은 존재하지 않는다는 점에 유의해야 합니다. context_relevance 점수가 낮은 컨텍스트라도 반드시 나쁜 컨텍스트라고 할 수는 없습니다. 낮은 점수는 일부 '노이즈' 또는 관련성이 낮은 정보 때문일 수도 있고 단순히 작업 자체가 여러 가지로 해석될 수 있기 때문일 수 있습니다. 노이즈 또한 반드시 부정적인 것은 아닙니다. 인간 역시 질문에 답변할 때 일정 수준의 노이즈를 포함하여 응답하면서도 이해 가능한 답변을 제공합니다.

RAG 파이프라인의 평가에는 짧은 응답이나 긴 응답을 선호하는 경향, 즉 길이 편향과 같은 여러 가지 편향도 영향을 미칩니다. 이러한 편향 때문에 한 응답이 내용이 아닌 길이로 인해 다른 응답보다 더 높은 평가를 받을 수 있습니다.

이러한 이유로 여러 평가를 수행하는 것이 최선의 방법입니다. 이 작업은 LLM의 프롬프트 템플릿, 지표, 평가 순서 등을 변경함으로써 수행할 수 있습니다. RAG 파이프라인용 데이터 세트를 생성하는 경우, 응답을 생성하는 LLM과 응답을 평가하는 LLM에 서로 다른 모델을 사용하는 것이 좋습니다. 두 작업에 동일한 모델을 사용하면 자기 평가 편향이 발생할 위험이 커집니다. 이러한 평가 지표는 주관적이기 때문에 프레임워크에서 생성된 결과는 사람에 의한 검증도 함께 이루어져야 합니다.

이 튜토리얼에서는 RAG 시스템을 구축하지 않습니다. 대신 Ragas를 사용하여 이전에 생성된 RAG 시스템의 아웃풋을 평가합니다. LangChain을 사용하여 RAG 시스템을 구축하는 방법에 대한 자세한 내용은 자세한 RAG 튜토리얼을 참조하세요.

전제조건

watsonx.ai 프로젝트를 생성하려면 IBM® Cloud 계정이 필요합니다. 무료 계정은 여기에서 등록할 수 있습니다.

단계

1단계. 환경 설정

여러 툴 중에서 선택할 수 있지만, 이 튜토리얼에서는 Jupyter Notebook을 사용하기 위해 IBM 계정을 설정하는 방법을 안내합니다.

  1. IBM Cloud 계정을 사용하여 watsonx.ai에 로그인합니다.

  2. watsonx.ai 프로젝트를 생성합니다.

    프로젝트 내에서 프로젝트 ID를 가져올 수 있습니다. 관리 탭을 클릭합니다. 그런 다음 일반 페이지의 세부 정보 섹션에서 프로젝트 ID를 복사합니다. 이 튜토리얼에서는 이 ID가 필요합니다.
     

  3. Jupyter Notebook을 만듭니다.

    이 단계에서는 노트북 환경이 열리며 튜토리얼의 코드를 복사하여 직접 사용자의 RAG 평가를 구현할 수 있습니다. 또는 이 노트북을 로컬 시스템에 다운로드하여 watsonx.ai 프로젝트에 에셋으로 업로드할 수 있습니다. Granite 관련 추가 튜토리얼은 IBM Granite Community에서 확인할 수 있습니다.이 Jupyter Notebook은 GitHub에서도 사용할 수 있습니다.

2단계. watsonx.ai Runtime 인스턴스 및 API 키 설정

  1. watsonx.ai 런타임 서비스 인스턴스를 생성합니다(적절한 지역을 선택하고 무료 인스턴스인 Lite 요금제를 선택합니다).

  2. API 키를 생성합니다.

  3. watsonx.ai 런타임 서비스 인스턴스를 watsonx.ai에서 생성한 프로젝트에 연결합니다.

3단계. 관련 라이브러리 설치, 가져오기 및 자격 증명 설정

이 튜토리얼에서는 몇 가지 라이브러리와 모듈이 필요합니다. 나열된 항목을 반드시 임포트하고 설치되어 있지 않다면 pip을 빠르게 실행하여 설치합니다. 이 튜토리얼은 Python 3.11.9 버전을 사용하여 작성되었습니다.

#installations
%pip install -q langchain_community
%pip install -q "ragas==0.2.1"
%pip install -q langchain_ibm
%pip install -q ibm_watson_machine_learning
%pip install -q ibm_watsonx_ai
%pip install -q langchain_core
%pip install -q nltk import os

from langchain_community.llms import WatsonxLLM as _WatsonxLLM
from langchain_ibm import WatsonxEmbeddings
from langchain.callbacks.manager import CallbackManagerForLLMRun
from langchain.schema import LLMResult
from ragas import evaluate
from ragas.llms import LangchainLLMWrapper
from ragas.metrics import answer_relevancy, context_precision, context_recall, faithfulness
from typing import List, Optional, Any
from datasets import load_dataset
from ibm_watson_machine_learning.metanames import GenTextParamsMetaNames as GenParams
from ibm_watsonx_ai.foundation_models.utils.enums import EmbeddingTypes

자격 증명을 설정합니다. API 키와 프로젝트 ID를 문자열로 입력합니다. 프로비저닝된 서비스 인스턴스에 따라 아래에 안내된 watsonx URL 중 하나를 사용합니다.

  • 댈러스: https://us-south.ml.cloud.ibm.com
  • 런던: https://eu-gb.ml.cloud.ibm.com
  • 프랑크푸르트: https://eu-de.ml.cloud.ibm.com
  • 도쿄: https://jp-tok.ml.cloud.ibm.com
os.environ["WATSONX_APIKEY"] = <API_KEY>
os.environ["WATSONX_PROJECT_ID"] = <PROJECT_ID>
os.environ["WATSONX_URL"] = "https://us-south.ml.cloud.ibm.com"

4단계. 데이터 세트 로드하기

Ragas 평가를 위해서는 여러 프롬프트에 대한 RAG 파이프라인 실행 결과가 포함된 데이터 세트가 필요합니다. 질문 자체뿐 아니라 데이터 세트에는 '참값'으로 알려진 예상 답변, LLM이 생성한 답변, 각 질문에 답할 때 RAG 파이프라인이 검색한 컨텍스트 목록이 포함되어야 합니다. 직접 엔드투엔드 데이터 세트를 생성할 수도 있지만 이번 튜토리얼에서는 Hugging Face에 등록된 데이터 세트를 사용합니다. 데이터 세트를 로드해 보겠습니다.

amnesty_qa = load_dataset(“explodinggradients/amnesty_qa”, “english_v2”)
amnesty_qa

아웃풋:

Repo card metadata block was not found. Setting CardData to empty.
DatasetDict({
    eval: Dataset({
        features: [‘question’, ‘ground_truth’, ‘answer’, ‘contexts’],
        num_rows: 20
    })
})

데이터는 DatasetDict로 로드되고 필요한 특성은 'eval' 분할 내에 있습니다.

dataset = amnesty_qa[“eval”]
dataset

아웃풋:

Dataset({
    features: [‘question’, ‘ground_truth’, ‘answer’, ‘contexts’],
    num_rows: 20
})

이제 데이터를 Pandas 데이터 프레임에 로드합니다. 이 데이터 세트의 항목 예를 보려면 HuggingFace 문서를 참조하세요.

df = dataset.to_pandas()        

RAG 평가를 위한 데이터 세트는 다양한 방법으로 만들 수 있습니다. 이 데이터 세트 생성의 핵심 요소는 LLM에 제공되는 외부 지식 베이스였습니다. 이 지식은 스크랩된 웹 페이지, 일반 텍스트 파일, 가져온 문서 등에서 얻을 수 있습니다. 이 경우 국제앰네스티에서 수집된 보고서가 사용됩니다. 데이터 세트의 콘텐츠는 엔드투엔드 방식 또는 Ragas의 TestsetGenerator와 같은 합성 데이터 생성 도구를 사용하여 만들어졌을 수 있습니다. TestsetGenerator를 사용하려면 문서가 로드되어 있어야 하며, 생성 LLM, 평가 LLM, 임베딩 모델이 필요합니다.

엔드투엔드 방식은 여러 단계를 포함합니다. 이 데이터 집합을 생성할 때 이러한 방식을 사용했다고 가정해 보겠습니다. 즉, question 열에 저장된 질문은 LLM 또는 사람이 생성한 것입니다. 각 질문의 참값은 사용자가 수동으로 직접 생성했거나 적절한 프롬프트 템플릿을 적용한 LLM을 이용해 만들었을 수 있습니다. 이러한 응답은 이상적인 답변으로 간주되어 ground_truth 열에 저장됩니다. 마지막으로, answer 열에 표시되는 답변은 RAG 파이프라인을 사용하여 생성되었습니다. RAG 파이프라인을 구축할 때 외부 지식 베이스는 벡터화됩니다. 이후 RAG 시스템에 쿼리를 실행할 때 각 답변 생성을 위해 LLM이 활용한 관련 텍스트 조각은 top-k 검색 등 유사도 기반 알고리즘을 통해 벡터 스토어에서 추출됩니다. 이렇게 수집된 데이터 세트는 contexts 열에 저장되었습니다.

5단계. 평가 및 임베딩을 위한 모델 설정

이 튜토리얼에서는 평가 기준으로 IBM Granite 모델을 사용합니다.

Ragas는 기본적으로 Open AI 모델을 사용합니다. WatsonxLLM은 IBM® watsonx.ai 파운데이션 모델을 위한 래퍼입니다. Ragas와 호환되는 WatsonxLLM 래퍼는 현재 개발 중이며 아직 제공되지 않습니다. 현재로서는 Ragas를 Granite 모델과 함께 사용하기 위해 래퍼의 속성을 변경해야 합니다.

class WatsonxLLM(_WatsonxLLM):
    temperature: float = 0.05
    “””
    A workaround for interface incompatibility: Ragas expected all LLMs to
    have a `temperature` property whereas WatsonxLLM does not define it.
    “””

    def _generate(
        self,
        prompts: List[str],
        stop: Optional[List[str]] = None,
        run_manager: Optional[CallbackManagerForLLMRun] = None,
        stream: Optional[bool] = None,
        **kwargs: Any,
    ) -> LLMResult:
        “””
        A workaround for interface incompatibility: Ragas expected the
        `token_usage` property of the LLM result be of a particular shape.
        WatsonX returns it in a slightly different shape.
        “””
        result: LLMResult = super()._generate(prompts, stop, run_manager, stream, **kwargs)
        if not result.llm_output or “token_usage” not in result.llm_output:
            return result
        usage = result.llm_output[“token_usage”]
        if not isinstance(usage, dict):
            return result
        result.llm_output[“token_usage”] = {
            “prompt_tokens”: usage[“input_token_count”],
            “completion_tokens”: usage[“generated_token_count”],
            “total_tokens”: usage[“input_token_count”] + usage[“generated_token_count”],
        }
    return result

이 튜토리얼에서는 유사한 결과를 얻기 위해 IBM Granite-3.0-8B-Instruct 모델을 LLM으로 사용할 것을 권장합니다. 사용자는 이 벤치마크와 비교하여 애플리케이션에 가장 적합한 AI 모델을 자유롭게 선택할 수 있습니다. watsonx.ai를 통해 제공되는 기반 모델은 여기에서 확인할 수 있습니다. 이러한 모델들은 LLM 애플리케이션에서 어떤 행동을 수행하고 어떤 응답을 생성할지를 결정하는 추론 엔진 역할을 합니다. Ragas와 함께WatsonxLLM 래퍼를 사용하려면 LangchainLLMWrapper를 사용해야 합니다.

watsonx_llm = LangchainLLMWrapper(
    langchain_llm = WatsonxLLM(
        model_id = “ibm/granite-3-8b-instruct”,
        url = os.getenv(“WATSONX_URL”),
        apikey = os.getenv(“WATSONX_APIKEY”),
        project_id = os.getenv(“WATSONX_PROJECT_ID”),
        params = {
            GenParams.MAX_NEW_TOKENS: 200,
            GenParams.MIN_NEW_TOKENS: 1,
            GenParams.STOP_SEQUENCES: [“<|endoftext|>“],
            GenParams.TEMPERATURE: 0.2,
            GenParams.TOP_K: 50,
            GenParams.TOP_P: 1,
        }
    )
)

평가 모델은 Granite 모델을 사용합니다. 응답은 이미 데이터세트의 answer 열에 저장되어 있으므로 별도의 모델을 사용해 응답을 생성하지는 않습니다.

사용 중인 임베딩 모델은 watsonx.ai LangChain 래퍼를 통해 접근하는 IBM® Slate 모델입니다. 임베딩 모델이 정의되지 않은 경우 Ragas는 기본적으로 OpenAI 임베딩을 사용합니다. 임베딩 모델은 개별 열의 데이터를 임베딩하고 열 사이의 거리를 측정하는 데 사용되므로 평가에 필수적입니다.

watsonx_embeddings = WatsonxEmbeddings(
    model_id = EmbeddingTypes.IBM_SLATE_30M_ENG.value,
    url = os.getenv(“WATSONX_URL”),
    apikey = os.getenv(“WATSONX_APIKEY”),
    project_id = os.getenv(“WATSONX_PROJECT_ID”)
)

6단계. Ragas로 평가 생성

이제 마지막 단계로 데이터 세트에 대해 Ragas 평가를 실행할 수 있습니다. 여기에서는 데이터 세트, 평가를 위한 지표, LLM 및 임베딩 모델을 매개변수로 전달합니다.

경고 메시지가 표시되더라도 무시하고 평가가 완료될 때까지 기다린 다음 결과를 예시와 같이 출력합니다.

result = evaluate(
    amnesty_qa[“eval”],
    metrics=[
        context_precision,
        faithfulness,
        answer_relevancy,
        context_recall,
    ],
    llm=watsonx_llm,
    embeddings=watsonx_embeddings)
print(result)

아웃풋:

{‘context_precision’: 0.9444, ‘faithfulness’: 0.6000, ‘answer_relevancy’: 0.6917, ‘context_recall’: 0.8333}

그게 전부입니다. RAG 파이프라인에 대한 한 차례 평가가 완료되었습니다. 앞서 언급했듯이 여러 평가를 수행하고 다양한 모델을 시도하거나 매개변수를 변경할 수 있습니다. 평가를 더 많이 반복할수록 RAG를 사용하는 LLM 시스템의 정확성과 효율성을 더욱 종합적으로 평가할 수 있습니다.

요약 

이 튜토리얼에서는 Ragas를 사용하여 RAG 파이프라인을 평가했습니다. 아웃풋에는 context_precision, faithfulness, answer_relevancy, 그리고 context_recall 지표가 포함됩니다. 평가에 사용된 LLM은 IBM Granite 모델이며, 임베딩 모델은 watsonx.ai의 임베딩 API를 통해 액세스한 IBM Slate 모델입니다.

수행된 평가는 향후 생성형 AI 워크플로우에서 RAG 시스템의 성능을 평가하고 개선하는 데 활용될 수 있으므로 중요합니다.

평가 지표와 평가 절차에 대한 자세한 내용은 Ragas 문서 페이지를 참고하시기 바랍니다.

관련 솔루션
IBM watsonx.ai

AI 빌더를 위한 차세대 엔터프라이즈 스튜디오인 IBM watsonx.ai로 생성형 AI, 파운데이션 모델 및 머신 러닝 기능을 학습, 검증, 조정 및 배포하세요. 적은 데이터로 짧은 시간 내에 AI 애플리케이션을 구축하세요.

watsonx.ai에 대해 알아보기
인공 지능 솔루션

업계 최고의 AI 전문성과 솔루션 포트폴리오를 보유한 IBM과 함께 AI를 비즈니스에 활용하세요.

AI 솔루션 살펴보기
AI 서비스

AI 추가를 통해 중요한 워크플로와 운영을 혁신함으로써 경험, 실시간 의사 결정 및 비즈니스 가치를 극대화합니다.

AI 서비스 살펴보기
다음 단계 안내

AI 개발 라이프사이클 전반에 걸친 기능에 원스톱으로 액세스하세요. 사용자 친화적인 인터페이스, 워크플로, 업계 표준 API 및 SDK에 대한 액세스를 통해 강력한 AI 솔루션을 제작할 수 있습니다.

watsonx.ai 살펴보기 라이브 데모 예약하기