AI Sparkup

복잡한 AI 세상을 읽는 힘

Arize Phoenix, Langflow, NVIDIA를 활용한 RAG 챗봇 정확도 향상 기법

AI 앱 정확도, 사용자 신뢰의 핵심

AI 앱 개발자들이 직면하는 가장 큰 과제 중 하나는 앱이 정확한 답변을 제공하도록 보장하는 것입니다. AI가 부정확할 때 사용자들은 빠르게 앱에 대한 신뢰를 잃게 됩니다. 개발자로서 앱이 정확한 응답을 제공하고 고객에게 훌륭한 경험을 만들어 낼 것이라는 확신을 어떻게 가질 수 있을까요?

높은 정확도를 달성하려면 다양한 기술, 도구, 매개변수를 시도하고 각 옵션을 측정하여 최상의 결과를 찾아야 합니다. 많은 개발자에게 이 과정은 며칠 또는 몇 주가 걸릴 수 있습니다.

이 글에서는 생성형 AI를 다루는 개발자들이 AI 앱의 정확도를 쉽게 측정하고, 다양한 접근법과 기술을 빠르게 테스트하여 더 정확한 AI 결과를 얻는 방법을 알아보겠습니다.

표준 RAG 챗봇으로 정확도 측정하기

이 글에서 논의하는 모든 내용은 에이전트와 검색 보강 생성(RAG) 등 모든 AI 사용 사례에 적용됩니다. 그러나 간단한 예시로 표준 RAG 챗봇과 성능 평가를 위한 표준 벤치마크 데이터셋을 사용한 다음, AI 앱의 정확도를 개선하기 위해 몇 가지 빠른 개선 사항을 적용해 보겠습니다.

이 프로세스는 AI 워크플로우를 수정하고 결과가 개선되고 있는지 확인하는 방법의 기초를 설정합니다. 이 튜토리얼을 완료한 후에는 정확도를 개선하기 위한 더 고급 기술을 시험할 준비가 될 것이며, AI가 더 잘 작동한다는 확신을 가질 수 있을 것입니다.

다음 구성 요소들을 사용할 것입니다:

  • Langflow: RAG 애플리케이션을 빠르게 구축하기 위한 오픈 소스 플랫폼
  • Astra DB: 벡터 지원 NoSQL 데이터베이스
  • NVIDIA NIM 마이크로서비스: NVIDIA AI Enterprise 소프트웨어 플랫폼의 일부
  • NVIDIA LLM NIM 마이크로서비스: 텍스트 생성에 사용
  • NeMo Retriever 임베딩 모델: llama-3.2-nv-embedqa-1b-v2
  • NeMo Retriever 리랭킹 모델: nvidia/rerank-qa-mistral-4b(정확도 향상용)
  • Python: 코드 개발용
  • Arize Phoenix: 오픈 소스 AI 관측성 및 평가 도구
  • Stanford Question Answering Dataset (SQuAD): 앱 정확도 측정용
Langflow와 NVIDIA 컴포넌트

SQuAD로 RAG 평가를 위한 기준 데이터 만들기

기준 데이터셋(ground truth dataset)이란 생성형 AI 앱에 대한 입력과 정확한 출력의 세트입니다. 챗봇의 경우 이는 질문이나 쿼리와 우리가 RAG 프로세스가 올바르게 작동하고 있는지 확인하는 데 사용할 수 있는 정확한 답변의 집합이 됩니다.

SQuAD는 문서당 여러 질문과 답변이 있는 위키피디아 기사의 대규모 데이터셋을 구축했습니다. 개발자를 위한 작은 버전 데이터셋은 약 6,000개의 질문과 답변이 있는 35개의 기사로 구성되어 있습니다.

이 데이터셋은 사용할 준비를 위해 약간의 처리가 필요합니다. 이 연습을 시작하기 위해 Pandas 데이터프레임으로 직접 가져올 수 있는 CSV 파일을 사용할 수 있습니다.

import pandas as pd
df = pd.read_csv("qa_pairs.csv")
with pd.option_context('display.max_colwidth', None):
    display(df.head(3))

Arize Phoenix에 기준 데이터셋 추가하기

기준 데이터셋이 준비되었으니 Arize Phoenix에 추가해 보겠습니다. 이를 위해 약간의 코드가 필요합니다.

import phoenix as px
px.launch_app()

client = px.Client()
dataset = client.upload_dataset(
    dataframe=df,
    dataset_name="squad-dev-v2.0",
    input_keys=["question"],
    output_keys=["answer"],
)

성공적으로 실행되면 이제 Arize Phoenix UI의 왼쪽 탐색에서 ‘Datasets’로 이동할 수 있습니다. ‘squad-dev-v2.0’이라는 데이터셋이 표시될 것입니다. 데이터셋을 클릭하여 질문과 답변 예시를 확인할 수 있습니다.

Langflow에서 위키피디아 기사를 위한 데이터 수집 흐름 만들기

이 섹션에서는 다음이 필요합니다:

  • SQuAD에서 35개의 위키피디아 기사 다운로드
  • NVIDIA AI Enterprise 평가판 API 키
  • Astra DB 가입(무료)

Astra DB 계정에서는 다음을 수행해야 합니다:

  1. ‘demo_db’라는 데이터베이스 생성
  2. ‘squad’라는 벡터 지원 컬렉션 생성
  3. 차원 필드에 2048 입력

이 컬렉션을 사용하면 NVIDIA NeMo Retriever 임베딩 NIM llama-3.2-nv-embedqa-1b-v2를 통해 Astra DB에 벡터 데이터를 저장할 수 있습니다.

Langflow를 이용한 RAG 챗플로우

기본 챗봇 설계

이제 간단한 RAG 챗봇을 구축할 것입니다. Langflow의 기본 설계에서 다음과 같은 변경 사항을 적용합니다:

  1. OpenAI 임베딩 컴포넌트를 삭제하고 NVIDIA 임베딩 컴포넌트로 교체
  2. NVIDIA API 키 추가
  3. Astra DB 컴포넌트에 Astra 토큰 추가
  4. OpenAI 컴포넌트를 삭제하고 NVIDIA 컴포넌트로 교체

이제 챗봇이 준비되었습니다. Langflow 상단 오른쪽의 “Playground” 버튼을 클릭하고 다음 질문을 시도해 보세요:

“What is the highest peak in Victoria?”

“Mount Bogong”를 포함한 답변을 받아야 합니다.

정확도 측정을 위해 Arize Phoenix를 Langflow에 연결하기

RAG 챗봇의 정확도를 측정하려면 다음 단계를 따라야 합니다:

  1. Langflow를 호출할 채팅 플로우 ID 가져오기
  2. 평가를 실행할 Arize Phoenix에서 태스크 정의하기
  3. 결과를 측정할 평가자 정의하기
  4. 실험 실행 및 결과를 Arize Phoenix에 로깅하기
CHAT_FLOW_ID = "YOUR_FLOW_ID"

def task(dataset_row) -> str:
    question = dataset_row["question"]
    response = run_flow(question, CHAT_FLOW_ID)
    text = response['outputs'][0]['outputs'][0]['results']['message']['text']
    return text 

이제 평가자를 정의해야 합니다. Arize Phoenix의 평가자는 태스크가 올바르게 해결되었는지 또는 잘못 해결되었는지 판단하는 데 사용됩니다.

RAG 챗봇을 측정하는 데 사용할 수 있는 여러 지표가 있습니다. 우리는 답변 정확성에 초점을 맞출 것입니다. 이는 챗봇의 응답이 질문에 올바르게 답변했는지 측정합니다. LLM을 판단자로 사용하는 방법을 사용할 것입니다.

import openai
import os

judge_model = OpenAIModel(
    model="gpt-4o-mini",
    temperature=0.0,
)

from phoenix.evals import (
    QA_PROMPT_RAILS_MAP,
    QA_PROMPT_TEMPLATE,
    OpenAIModel,
    llm_classify,
)
from phoenix.experiments.evaluators import create_evaluator

@create_evaluator(name="Answer Correctness", kind="LLM")
def answer_correctness(input, output, expected) -> int:
    df_in = pd.DataFrame({
        "input": input["question"],
        "output": output,
        "reference": expected["answer"]
    }, index=[0])
             
    rails = list(QA_PROMPT_RAILS_MAP.values())

    eval_df = llm_classify(
        data=df_in,
        template=QA_PROMPT_TEMPLATE,
        model=judge_model,
        rails=rails,
        provide_explanation=True,
        run_sync=True,
    )

    label = eval_df["label"][0]
    explanation = eval_df["explanation"][0]
    score = 1 if label == "correct" else 0

    return score

이 코드는 많은 일을 처리하고 있습니다. QA_PROMPT_TEMPLATE를 출력하면 다음과 같은 프롬프트 템플릿이 표시됩니다:

You are given a question, an answer and reference text. You must determine whether the given answer correctly answers the question based on the reference text. Here is the data:

    [BEGIN DATA]

    ************

    [Question]: {input}

    ************

    [Reference]: {reference}

    ************

    [Answer]: {output}

    [END DATA]

Your response must be a single word, either "correct" or "incorrect", and should not contain any text or characters aside from that word.

"correct" means that the question is correctly and fully answered by the answer.

"incorrect" means that the question is not correctly or only partially answered by the answer.

위 코드는 템플릿의 변수를 채우고 LLM 쿼리를 실행합니다. 그런 다음 ‘correct’를 점수 1로, ‘incorrect’를 점수 0으로 변환하며, LLM이 왜 올바른지 또는 올바르지 않은지 결정했는지에 대한 설명을 생성합니다.

점수는 Arize Phoenix에 기록되고 데이터셋 전체에서 정확도 점수의 평균을 확인할 수 있습니다.

결과를 찾으려면 Python 코드 출력에서 링크를 클릭하거나 왼쪽 탐색에서 ‘Datasets’로 이동한 다음 데이터셋 이름 ‘squad-dev-v2.0’을 클릭하면 실험 점수 목록이 표시됩니다. 실험을 클릭하여 정확한 결과를 확인할 수 있습니다.

다음과 같은 내용이 표시될 것입니다:

  • 입력 – 질문
  • 참조 출력 – SQuAD 데이터셋의 정확한 답변
  • 실험 이름 – RAG 챗봇의 출력과 답변 정확도 점수가 모두 포함됩니다

축하합니다! 이제 Langflow의 플로우를 기반으로 실험을 성공적으로 실행하고 결과를 Arize Phoenix에 기록했습니다.

리랭킹 모델을 추가해 RAG 챗봇의 정확도 향상시키기

리랭킹 모델이 추가된 Langflow 구성

RAG 챗봇에 리랭킹 모델을 추가하는 이유는 무엇일까요? 리랭킹 모델은 순수한 벡터 검색 결과보다 쿼리에 더 나은 매칭 결과를 제공합니다. NVIDIA AI Enterprise는 RAG 사용 사례에서 결과의 정확도를 향상시키는 데 사용할 수 있는 여러 리랭킹 모델을 제공합니다.

NVIDIA AI Enterprise API 키가 필요합니다. 그런 다음 Langflow에서 Astra DB를 사용한 벡터 검색과 프롬프트 사이에 NVIDIA NeMo Retriever 리랭킹 마이크로서비스 컴포넌트를 추가합니다. 모델로는 nvidia/rerank-qa-mistral-4b를 선택합니다. 채팅 입력도 리랭크 컴포넌트에 연결해야 합니다. 또한 리랭크 출력을 프롬프트 컴포넌트의 입력 유형으로 변환하기 위해 Data to Message 컴포넌트가 필요합니다.

NVIDIA NeMo Retriever 리랭킹 NIM 마이크로서비스를 추가하는 데는 이것이 전부입니다.

Astra DB 컴포넌트를 클릭하고 Controls를 클릭한 다음 Number of Search Results를 찾아 25 이상과 같은 더 큰 숫자로 늘려 더 나은 결과를 얻어야 합니다. 이 숫자에 대해 다양한 값을 실험해 보세요.

이제 Arize Phoenix 코드로 돌아가서 실험을 다시 실행합니다. 결과가 어떻게 변했나요?

결론

정확도가 높은 RAG 및 에이전트 앱을 구축하는 것은 어렵습니다. 개발자는 많은 다른 AI 설계 패턴을 테스트하고 데이터와 사용 사례에 가장 적합한 것을 파악해야 합니다.

Langflow는 다양한 AI 설계 패턴을 빠르게 실험하고, NVIDIA, Arize Phoenix 및 Astra DB와 같은 GenAI 애플리케이션을 위한 최첨단 도구의 기능을 통합할 수 있는 오픈 소스 플랫폼을 제공합니다.

Arize Phoenix는 개발자가 결과를 수집하고 시간이 지남에 따라 변경 사항이 앱의 정확도에 어떤 영향을 미치는지 추적할 수 있는 오픈 소스 평가, 측정 및 관측성 플랫폼을 제공합니다.

우리는 Langflow와 다양한 NVIDIA AI Enterprise 서비스를 연결하는 방법을 살펴보았습니다. 여기에는 Astra DB를 통한 NeMo Retriever 임베딩 NIM, LLM 및 리랭킹을 위한 NIM 마이크로서비스가 포함됩니다. Arize Phoenix와의 통합을 통해 개발자는 이러한 모든 다양한 도구와 기능이 어떻게 측정되고 AI 앱의 정확도를 높일 수 있는지 확인할 수 있습니다.

이러한 방법을 활용하면 개발자는 더 정확하고 신뢰할 수 있는 AI 애플리케이션을 빠르게 구축하고 개선할 수 있습니다.

참고자료:


Awsom GPT에서 더 알아보기

구독을 신청하면 최신 게시물을 이메일로 받아볼 수 있습니다.

Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다