지금 ‘춘추전국시대’마냥 경쟁을 벌이고 있는 각종 LLM이 현실 세계에서 사용되려면 여러가지 ‘문제점’ - 성능, 환각증상 등 - 을 잘 해결하도록 도와주는 틀이 필요합니다. 이 중 가장 광범위하게 활용되는 것이 바로 RAG일 겁니다.

2020년 “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks”를 통해서 처음 소개된 RAG는 당시 사전 학습된 Retriever (검색기)와 Generator (생성기)를 결합한 것이었고, 이 때 RAG의 가장 큰 목표는 모델의 파인튜닝을 통한 성능 개선에 있었습니다.

이후 2022년 말 챗GPT가 출시되면서 전환점을 맞이한 RAG는 LLM의 추론 능력을 어떻게 현실 어플리케이션에서 잘 활용할 수 있을 것이냐에 초점을 맞춘 프레임웍으로 변화하게 됩니다. 이런 방향에서 ‘외부 지식’을 통합적으로 검색하고 LLM에 넘겨줘서 더 좋은 Generation 결과를 만들고자 하는 구조로 바뀌게 되는 거죠.

길게 보면 아직도 초기 단계에 있는 프레임웍이라고 볼 수 있겠지만, 기본적인 RAG, GraphRAG, LongRAG 등 다양한 방향으로 빠르게 발전하고 있는 RAG. 이 RAG을 최적화해서 활용하기 위해서 어떤 관점의 평가가 가능한지, 어떤 도구와 지표들이 있는지 한 번 정리해 보는 건 의미가 있을 것 같습니다.

*이번 포스트는 기업용 AI 어플리케이션 개발을 위한 벡터 DB인 Zilliz의 알고리즘 엔지니어 Cheney Zhang의 글입니다. 이 글의 원본은 Zilliz Cloud 블로그에서 보실 수 있습니다.

RAG(Retrieval-Augmented Generation)는 챗GPT와 같은 거대 언어모델(LLM) - 엄밀히 말하자면 챗GPT가 LLM 그 자체는 아니지만 - 이 AI의 주류가 된 이 시대에 주목받는 AI 프레임웍이라는 건 잘 아실 겁니다. RAG은 외부의 데이터와 지식을 쉽게 통합해서 모델의 기능을 향상시키고, 더 정확한 답변, 더 최신의 답변을 할 수 있도록 해 주는데요.

생성형 AI 어플리케이션을 구축할 때 RAG 아키텍처를 채택하는 기업들이 점점 많아지면서, 그 효과를 평가하는 것이 중요한 이슈로 떠오르고 있습니다. 이번 글에서는 RAG 애플리케이션을 평가하는 데 사용하는 방법론을 살펴보고, 평가에 사용할 만한 몇 가지 도구들과 표준적인 지표들도 알아보려고 합니다.

RAG 평가지표

RAG 아키텍처 기반의 어플리케이션을 평가하는 것은 단순히 몇 가지 결과물 예시를 비교하는 것과는 차원이 다른 작업입니다. 중요한 것은, 이런 어플리케이션을 평가하는데 설득력있고 정량적이고 재현 가능한 지표를 사용하는 것인데요. 여기서는 세 가지 카테고리의 지표를 생각해 보려고 합니다:

  • Ground Truth - 즉, 우리가 원하는 실제 데이터 - 기반의 지표

  • Ground Truth가 없을 때의 지표

  • LLM 응답에 기반한 지표

Ground Truth 기반의 지표

Ground Truth라는 건, 사용자의 질의에 해당하는 데이터셋 내에 존재하는, 잘 정리된 답변 또는 답변을 담고 있는 문서의 덩어리를 의미한다고 보면 어떨까 합니다. Ground Truth가 ‘답변’이라는 카테고리에 해당되는 경우에는 RAG의 답변과 Ground Truth를 ‘의미적 유사도’라든가 ‘답변의 정확도’ 같은 지표를 사용해서 직접적으로 비교할 수 있으니까, 이런 경우는 End-to-end의 측정과 평가가 비교적 용이한 경우입니다.

아래, ‘정확성 (Correctness)’을 기준으로 답변을 평가해 보는 예시를 한 번 볼까요:

Ground truth: Einstein was born in 1879 in Germany.

정확도 높은 답변: In 1879, in Germany, Einstein was born.

정확도 낮은 답변: In Spain, Einstein was born in 1879.

Ground Truth가 문서의 덩어리인 경우, 검색된 컨텍스트와 문서 덩어리 간의 상관 관계를 EM (Exact Match), Rough-L, F1 같이 전통적으로 사용되는 지표를 사용해서 평가할 수 있습니다. 이 방법은 본질적으로 RAG 어플리케이션이 얼마나 검색을 효과적으로 하는지를 평가하는 셈이죠.

나만의 데이터셋을 위한 Ground Truth는 어떻게 생성해야 할까?

RAG 어플리케이션을 평가할 때, Ground Truth가 포함된 데이터셋을 사용하는게 중요하다는 건 알겠는데, 그럼 ‘이 데이터가 맞고 틀린 데이터다’라는 식의 Ground Truth를 판단할 수 있는 방법이 없는, 비공개 데이터셋을 사용하는 RAG 어플리케이션은 어떻게 평가할까요? 평가에 필요한 Ground Truth를 어떻게 생성할 수 있을까요?

가장 간단한 방법은, 챗GPT와 같은 LLM을 활용해서, 비공개 데이터셋을 기반으로 질문과 답변 예제를 생성하는 겁니다. Raga나 LlamaIndex같은 도구들도 당신이 사용하는 문서들에 맞는 테스트 데이터를 생성하는 방법을 제공합니다.

The sample questions and answers generated by the Ragas evaluation tool. Image Credit: Ragas

질문, 컨텍스트, 그리고 해당 답변으로 구성된 이 테스트 데이터셋을 사용해서, 외부의 기준 데이터셋이 없는 상태에서도 정량적 평가를 할 수 있습니다. 이렇게 하면, 나만 가지고 있는 비공개 데이터를 활용해서 RAG 시스템을 평가할 수 있기 때문에, 더 맞춤화되고 의미있는 평가 프로세스를 운영할 수 있습니다.

Ground Truth가 없을 때의 지표

각각의 질의에 대한 Ground Truth가 없다 하더라도, RAG 어플리케이션을 평가할 수 있습니다. 우선 ‘RAG Triad’라는 개념이 있는데, 이건 ‘질의 (Query)’, ‘컨텍스트 (Context)’, ‘응답 (Response)’의 세 요소가 ‘적절한 (Relevance)’ 내용을 담고 있는지 평가하려고 하는 틀입니다. 오픈소스로 공개된 평가 도구 TruLens-Eval이 이 RAG Triad 개념을 개선해서 Ground Truth가 없는 RAG 어플리케이션을 평가할 수 있게 해 줍니다. 평가에 사용하는 세 가지 지표를 살펴보면:

  • Context Relevance: 검색된 컨텍스트가 질의 내용을 얼마나 잘 뒷받침하는지 측정합니다.

  • Groundedness: LLM의 응답이 검색된 컨텍스트와 얼마나 잘 합치하는지 평가합니다.

  • Answer Relevance: 질의와 최종 응답을 비교해서 둘 사이의 관련성을 측정합니다.

아래는, ‘Answer Relevance’를 평가하는 예시입니다: 

질문: Where is France and what is its capital?

낮은 Answer Relevance: France is in western Europe.

높은 Answer Relevance: France is in western Europe and Paris is its capital.

위에 설명한 세 가지의 지표를 더 세분화해서 더 정교한 평가를 할 수도 있습니다. 예를 들어, Ragas - RAG 시스템 성능을 평가하는 오픈소스 프레임웍 - 에서는 Context Relevance를 Context Precision, Context Relevance, Context Recall이라는 세부 지표로 나눠서 평가하도록 합니다.

LLM 응답에 기반한 지표

이 카테고리의 지표는, 친근함 (Friendliness), 유해성 (Harmfulness), 간결성 (Conciseness) 등의 요소를 고려해서 LLM의 응답을 평가합니다. 예를 들어서, LangChain에서는 간결성, 연관성, 정확성, 일관성, 유해성, 악의 여부, 도움되는지 여부, 논란 가능성, 여성 혐오, 범죄 가능성, 무신경함 등의 지표를 제안합니다

아래는, LLM 응답을 ‘간결성’ 관점에서 평가한 예시입니다:

질문: What's 2+2?

간결하지 못한 답변: What's 2+2? That's an elementary question. The answer you're looking for is that two and two is four.

간결한 답변: 4

LLM을 사용해서 지표 평가하기

앞서 언급한 대부분의 지표는 점수를 내거 평가를 하려면 텍스트를 입력해야 하는 수작업의 과정이 필요합니다. 물론 이 과정은 GPT-4 같은 LLM이 등장하면서 적절하게 프롬프트만 짜서 실행하면 되게 되었기 때문에 관리는 더 쉬워졌습니다.

Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena” 논문에서는 사용자의 질문에 대한 AI 어시스턴트의 응답 품질이 어떤지 판단하기 위해서 어떻게 GPT-4 프롬프트 설계를 할 것인지에 대해 제안하고 있는데요. 아래 간단한 예시를 한 번 보죠:

[System]

Please act as an impartial judge and evaluate the quality of the response provided by an AI assistant to the user question displayed below. Your evaluation should consider factors such as the helpfulness, relevance, accuracy, depth, creativity, and level of detail of the response. Begin your evaluation by providing a short explanation. Be as objective as possible. After providing your explanation, please rate the response on a scale of 1 to 10 by strictly following this format: "[[rating]]", for example: "Rating: [[5]]".

[Question]

{question}

[The Start of Assistant's Answer]

{answer}

[The End of Assistant's Answer]

유의할 점은, GPT-4도 다른 모든 평가 수단과 마찬가지로 오류가 있을 수 있고, 그 뿐 아니라 내부에 고유의 편견 (Bias)이나 잠재적인 오류가 있을 수 있다는 점입니다 - 결국, 프롬프트를 잘 설계하는 것이 중요하죠. Multi-shot이나 CoT (Chain-of-Thought) 같은 고급 프롬프트 엔지니어링 기술이 필요할 수도 있습니다. 다행히 RAG 어플리케이션을 대상으로 한 많은 평가 도구에 이미 잘 설계된 프롬프트가 통합되어 있는 경우가 많으니, 큰 걱정을 하실 필요는 없습니다. 

RAG 평가 도구

자, RAG 어플리케이션의 ‘평가’에 대해서 좀 살펴봤으니까, 이제 RAG 어플리케이션을 평가하는데 쓰는 도구 몇 가지를 살펴보고, 도구의 작동 방식, 도구에 적합한 응용 사례에 대해서 이야기해 보죠.

Ragas: 간결한 RAG 평가 도구

Ragas는 RAG 어플리케이션 평가를 위한 오픈소스 도구입니다. 인터페이스가 간단하고 평가 프로세스도 간소해서, 사용자는 필요한 형식으로 데이터셋 인스턴스를 생성, 빠르게 평가를 시작하고 'ragas_score', 'context_precision', 'faithfulness', 'answer_relevancy' 등의 지표에 대한 점수를 확인할 수 있습니다.

```python

from ragas import evaluate

from datasets import Dataset

dataset: Dataset

results = evaluate(dataset)

# {'ragas_score': 0.860, 'context_precision': 0.817,

# 'faithfulness': 0.892, 'answer_relevancy': 0.874}

```

Ragas는 많은 지표를 지원하면서도 특정한 프레임웍에 대한 요구사항이 없어서 다양한 RAG 어플리케이션에 대해서 유연하게 적용할 수 있다는 장점이 있습니다. Ragas는 LangSmith를 사용해서 평가 점수를 실시간으로 모니터링하면서 각각 평가 점수가 나온 이유와 API 키의 사용량에 대한 분석 정보도 제공합니다.

LlamaIndex: 구축과 평가를 모두 손쉽게 하게 해 주는 프레임웍

LlamaIndex는 RAG 어플리케이션을 구축할 때 많은 분들이 사용하는 강력한 AI 프레임웍인데, 그 안에 RAG 평가 도구가 포함되어 있습니다. 이 도구는 당연히 LlamaIndex 프레임웍을 기반으로 구축한 어플리케이션을 평가하는데 편리하겠죠.

```python

from llama_index.evaluation import BatchEvalRunner

from llama_index.evaluation import FaithfulnessEvaluator, RelevancyEvaluator

service_context_gpt4 = ...

vector_index = ...

question_list = ...

faithfulness_gpt4 = FaithfulnessEvaluator(service_context=service_context_gpt4)

relevancy_gpt4 = RelevancyEvaluator(service_context=service_context_gpt4)

runner = BatchEvalRunner(

   {"faithfulness": faithfulness_gpt4, "relevancy": relevancy_gpt4},

workers=8,

)

eval_results = runner.evaluate_queries(

   vector_index.as_query_engine(), queries=question_list

)

TruLens-Eval: 다양한 프레임웍을 위한 통합 평가 도구

TruLens Eval은 LangChain 및 LlamaIndex로 구축한 RAG 어플리케이션을 쉽게 평가할 수 있게 해 니다. 아래의 코드에서 LangChain 기반 어플리케이션을 평가하기 위한 설정 방법을 볼 수 있습니다.

```python

from trulens_eval import TruChain, Feedback, Tru, Select

from trulens_eval.feedbackimport Groundedness

from trulens_eval.feedback.provider import OpenAI

import numpy as np

tru = Tru()

rag_chain = ...

# Initialization and feedback setup...

tru_recorder = TruChain(rag_chain,

app_id='Chain1_ChatApplication',

feedbacks=[f_qa_relevance, f_groundedness])

tru.run_dashboard()

```

그리고, Trulens-Eval은 브라우저 기반으로 평가 점수가 나온 이유를 분석하고 API 키 사용량을 확인할 수 있는 모니터링 기능도 제공합니다.

Trulens-Eval을 사용해서 다른 프레임웍으로 구축한 RAG 앱을 평가할 수 있기는한데, 코드로 이걸 구현하는 건 좀 복잡할 수 있습니다. 자세한 내용은 공식 문서에서 보실 수 있습니다.

Phoenix: 유연한 LLM 평가 도구

Phoenix는 생성된 임베딩의 품질, LLM의 만들어내는 응답 등을 포함해서 LLM을 평가할 수 있는 종합적인 지표 셋을 제공합니다. 또, RAG 어플리케이션에 대한 진단도 할 수 있지만, 앞서 언급했던 다른 평가 도구들보다는 지표의 수가 적습니다. 아래 코드에서 Phoenix를 사용해서 LlamaIndex 기반으로 구축한 RAG 어플리케이션을 평가하는 방법을 볼 수 있습니다.

```python

import phoenix as px

from llama_index import set_global_handler

from phoenix.experimental.evals import llm_classify, OpenAIModel, RAG_RELEVANCY_PROMPT_TEMPLATE, \

   RAG_RELEVANCY_PROMPT_RAILS_MAP

from phoenix.session.evaluation import get_retrieved_documents

px.launch_app()

set_global_handler("arize_phoenix")

print("phoenix URL", px.active_session().url)

query_engine = ...

question_list = ...

for question in question_list:

   response_vector = query_engine.query(question)

retrieved_documents = get_retrieved_documents(px.active_session())

retrieved_documents_relevance = llm_classify(

dataframe=retrieved_documents,

model=OpenAIModel(model_name="gpt-4-1106-preview"),

template=RAG_RELEVANCY_PROMPT_TEMPLATE,

rails=list(RAG_RELEVANCY_PROMPT_RAILS_MAP.values()),

provide_explanation=True,

)

```

다른 도구들

위에서 언급한 도구들 외에도, DeepEval, LangSmith, OpenAI Evals 등 다른 플랫폼들도 RAG 어플리케이션을 평가할 수 있는 기능을 제공하고 있습니다. 방법론은 비슷하지만 프롬프트의 설계라든가 및 구현에 관련한 세부 사항이 다르기 때문에, 본인의 상황에 가장 적합한 도구를 선택해야 합니다.

요약

이 글에서는 RAG 어플리케이션 평가를 위한 몇 가지 방법론, 지표 그리고 평가 도구들을 살펴 보았습니다:

  • Ground Truth - 즉, 우리가 원하는 실제 데이터 - 기반의 지표

  • Ground Truth가 없을 때의 지표

  • LLM 응답에 기반한 지표 

Ground Truth 기반의 지표는 RAG의 응답을 기존에 존재하는 답변과 비교하는 겁니다. 이와 대조해 보면, RAG Triad 같이 근거 - 즉 기존에 존재하는 - 데이터가 없는 경우의 지표는 질의, 컨텍스트, 응답 간의 관련성을 평가하는데 중점을 두게 됩니다. LLM의 응답을 기반으로 한 지표는 친근함, 유해성, 간결성 등의 다소 일반적인 관점을 고려합니다.

그리고, 프롬프를 설계해서 LLM을 활용해서 지표 점수를 매기는 방법도 살펴보았는데요. 이 작업을 할 수 있도록 해 주는 Ragas, LlamaIndex, TruLens-Eval 및 Phoenix 등을 포함한 도구들이 있다는 걸 알아봤습니다.

하루가 다르게 변화하는 AI의 세계에서, RAG 어플리케이션을 정기적으로 평가하고 개선하는 것은 시스템의 안정성과 리스크에 대한 대응을 위해서 매우 중요한 일입니다. 이 글에서 알아보신 방법론, 지표, 도구들을 이용해서 개발자 및 기업이 RAG 시스템 성능과 기능에 대해 확인하고, 그 정보에 기반한 의사결정을 내려 AI 어플리케이션을 더 나은 방향으로 개선할 수 있습니다.

읽어주셔서 감사합니다. 재미있게 보셨다면 친구와 동료 분들에게도 뉴스레터를 추천해 주세요.

Reply

Avatar

or to participate

Keep Reading