박정기
박정기
🗡️ AI 레전드
🎖️ 마스터 파트너

AutoRAG를 활용한 RAG 성능 평가 및 빠른 배포

과제 소개

  • AutoRAG 라이브러리를 활용하여 업로드한 PDF 데이터에 대한 QA 데이터셋 생성 부터, RAG에서의 여러가지 방법론에 대한 실험 및 검증을 자동으로 진행, 성능 평가를 하고, 최적의 RAG 파이프라인으로 Streamlit을 빠르게 배포

목적

  • 각 데이터에 최적인 RAG 파이프라인을 Metric을 통해 알아낸다.

  • QA 데이터 셋을 gpt-4o를 통해 빠르게 만든다.

  • YAML 파일만으로 python 코드 작성 없이 여러 RAG 모듈을 자동으로 테스트 한다.

  • 자동으로 찾은 성능이 가장 최적화된 RAG 파이프라인을 api 서버와 streamlit 웹 서버로 사용 가능

방법론

결론

  • AutoRAG를 통해서 RAG의 성능을 최적화 하는 pipeline을 정량적인 metric 평가를 통해 도출해 낼 수 있다.

  • Advanced RAG에 수많은 방법론들이 존재한다.

  • 각 문서에 맞는 각각의 RAG pipeline이 존재한다.

  • AutoRAG는 GPU 인프라가 갖춰진 LINUX 서버에서 돌리는것을 추천한다. (vllm 이슈)

AutoRAG의 개념

  • RAG의 성능을 최적화 하기 위해서는 수많은 실험을 진행해야 하는데, 이 실험들을 효율적이고 편하게 할 수 있도록 자동화한 툴이 AutoRAG

  • YAML 파일만으로 python 코드 작성 없이 여러 RAG 모듈을 자동으로 테스트한다.

  • Pdf, raw 문서에서 평가용 데이터를 자동 생성 가능

  • 자동으로 찾은 성능이 가장 최적화된 RAG 파이프라인을 api 서버와 streamlit 웹 서버로 사용 가능

  • 각 데이터에 최적인 RAG 파이프라인을 자동으로 찾는 것이 핵심!

AutoRAG 깃헙 주소

https://github.com/Marker-Inc-Korea/Auto

RAG 평가 방법

크게 2가지 인데, 검색기 평가와 LLM 생성 답변 평가로 나눠진다.

  1. 원하는 단락을 잘 가져왔는지

  2. 생성한 답변 A가 원하는 답변과 얼마나 일치하게 나오는지

데이터셋을 얼만큼 만들어야 할까요?

→ 제대로 된 데이터 100개 정도면 충분합니다.

→ 무조건 데이터가 많다고 좋은게 아니라, 인간이 관여한 퀄리티가 높은 데이터 셋이 필요합니다.

AutoRAG로 최적의 파이프라인 해를 구하는 방법

저희가 실습해던 RAG는 가장 기본적인 RAG였고,

Advanced RAG에서는 다음과 같이 많은 과정이 추가가 됩니다.

추가된 과정에서 최적의 해를 구하는 방법으로 AutoRAG를 쓸 수 있습니다.

각 단계를 하나씩 파워포인트 템플릿으로 최적화

RAG Retriver 평가지표에서는 Recall이 중요하다..!

정답 단락을 무조건 하나는 가져와야 한다(대부분의 RAG에서 유용) → Recall

환각을 줄이고 싶다(모르는것은 제발 모른다고 해달라) → precision

Recall과 Precision의 조화평균 → F1

Precision과 Recall만으로는 성능을 측정하기 어려우니, 다른 3개의 지표를 활용

NDCG (Normalized Discounted Cumulative Gain)

  • NDCG는 검색 결과의 순서가 중요할 때 사용되는 지표로, 검색 결과의 관련성에 따라 점수를 매기고, 이를 이상적인 순서와 비교하여 정규화합니다.

  • 높은 NDCG 값은 사용자가 더 관련성 높은 결과를 상위에 볼 확률이 높음을 의미합니다.

MAP (Mean Average Precision)

  • MAP는 여러 쿼리에 대해 평균적인 정밀도를 계산한 지표로, 각 쿼리에서의 평균 정밀도를 다시 평균하여 구합니다.

  • 이는 전체 쿼리 집합에 대한 검색 시스템의 전반적인 성능을 평가하는 데 유용합니다.

MRR (Mean Reciprocal Rank)

  • MRR은 첫 번째 관련 문서가 검색 결과 리스트에서 얼마나 빨리 나타나는지를 평가하는 지표로, 각 쿼리의 첫 번째 관련 문서의 역순위를 평균하여 계산합니다.

  • 높은 MRR 값은 관련 문서를 상위에 배치하는 검색 시스템의 능력을 의미합니다.

LLM의 답변을 평가할수 있는 방법

N-gram based metrics

  • N-gram 기반 지표는 모델의 출력과 정답 간의 N-gram 일치도를 측정하여 텍스트 생성의 정확도를 평가합니다.

  • 대표적인 지표로 BLEU, ROUGE 등이 있으며, 주로 번역 및 요약 작업에 사용됩니다.

LM-based metrics

  • 언어 모델 기반 지표는 생성된 텍스트의 유창성과 일관성을 평가하기 위해 사전 학습된 언어 모델을 사용합니다.

  • 예를 들어, Perplexity는 모델이 텍스트를 얼마나 잘 예측하는지를 나타내는 지표입니다.

Sem Score

  • Sem Score는 생성된 텍스트와 참조 텍스트 간의 의미적 유사성을 평가하는 지표입니다.

  • 이는 주로 임베딩 벡터 간의 코사인 유사도를 사용하여 계산됩니다.

LLM-based metrics

  • 대규모 언어 모델 기반 지표는 LLM을 활용하여 생성된 텍스트의 품질을 평가하며, 휴리스틱 평가나 인간 평가를 모델이 모방합니다.

  • 이는 특히 문맥적 일관성, 창의성, 논리적 연결성을 평가하는 데 유용합니다.

실습

< 이 글은 노션에서 먼저 작성됐습니다. 노션에서 보시길 추천드립니다! >

노션 링크 : https://www.notion.so/AutoRAG-f42add7e424243998d71cf67718d93fb

AutoRAG 다운로드 받기

먼저 git clone을 해줍니다.

git clone https://github.com/Marker-Inc-Korea/AutoRAG.git

git clone 또는 Download zip 을 해줍니다.

https://github.com/Marker-Inc-Korea/AutoRAG?tab=readme-ov-file

데이터 셋만들기

링크 참조

https://marker-inc-korea.github.io/AutoRAG/data_creation/tutorial.html

렝체인 코드가 동작하지 않아서 (왜 그런지 에러코드 조차 뜨지않음)

라마 인덱스 코드로 진행하겠습니다

import logging
from llama_index.core import SimpleDirectoryReader
from llama_index.core.node_parser import TokenTextSplitter
from autorag.data.corpus import llama_text_node_to_parquet

# 설정: 로그 형식 및 레벨 설정
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

try:
    # Load documents from a specified directory.
    # 'directory_path'는 문서가 위치한 디렉토리 경로입니다.
    logging.info("Loading documents from directory...")
    directory_path = r'C:\Users\c\AutoRAG\make_dataset'
    documents = SimpleDirectoryReader(directory_path).load_data()
    logging.info(f"Loaded {len(documents)} documents.")

    # Split the loaded documents into smaller chunks.
    # 'chunk_size'는 각 청크의 크기(512 문자)입니다.
    # 'chunk_overlap'는 청크 간의 겹치는 문자 수(128 문자)입니다.
    logging.info("Splitting documents into smaller chunks...")
    nodes = TokenTextSplitter().get_nodes_from_documents(documents=documents, chunk_size=512, chunk_overlap=128)
    logging.info(f"Split documents into {len(nodes)} chunks.")

    # Convert the split document nodes into a Parquet file.
    # 'nodes'는 변환할 문서 노드의 리스트입니다.
    # 'output_path'는 Parquet 파일이 저장될 경로입니다.
    logging.info("Converting document nodes to Parquet file...")
    output_path = r'C:\Users\c\AutoRAG\make_dataset\corpus.parquet'
    corpus_df = llama_text_node_to_parquet(nodes, output_path)
    logging.info("Conversion to Parquet file completed.")

except Exception as e:
    logging.error(f"An error occurred: {e}")

-> 저는 .pdf 파일을 넣어서 진행해보겠습니다.

→ 만들어진 코퍼스 파일

많은 텍스트가 포함된 컴퓨터 화면의 스크린샷

그리고 .py를 실행시키기 전에 venv를 만들고 진행하겠습니다.

  • 가상환경 만들기

python -m venv .venv

  • autorag 설치하기

pip install autorag

  • requirements.txt 설치하기

pip install requiremenst.txt

  • unstructured 설치하기

pip install unstructured

  • openai API KEY 등록하기

set OPENAI_API_KEY=your_openai_api_key

코퍼스 데이터에서 qa 데이터 만들기

content_size값을 n개 설정할 시 QA가 n개 만들어집니다.

따라서 QA를 50개 정도 만들어 보도록 하겠습니다.

→ 50개 QA데이터 셋 확보 완료

예시 1개

"자수성가형 부자와 금수저형 부자의 금융자산 평균은 각각 얼마인가요?","generation_gt":["자수성가형 부자의 금융자산 평균은 52억 1천만 원이고, 금수저형 부자의 금융자산 평균은 46억 원입니다."]}

다양한 RAG 모듈에 대한 데이터 평가

심플 yaml을 사용해서 먼저 해보겠습니다.

데이터 평가 대시보드 만들기

autorag dashboard --trial_dir ./1

→ 웹 상에서 RAG 파이프라인 데이터 평가 가능

Adobe Adobe Adobe Adobe adobe a의 대시보드 스크린샷

api server 실행해보기

autorag run_api --config_path C:\\Users\\c\\AutoRAG\\deploy\\pipeline.yaml --host 0.0.0.0 --port 8000

Streamlit server 올리기

-> 이 기능을 많은 사람들이 정말로 마음에 들어 하셨습니다..!!

autorag run_web --trial_path ./1

→ 최적화 된 flow로 만든 RAG를 바로 streamlit 배포

답안지 데이터

{"qid":"c51e2a78-b6fa-4db3-9721-a0730cf17e61","retrieval_gt":[["ed94dcd4-7d92-4e0b-983c-9ffa6152f525"]],"query":"유언대용신탁이란 무엇인가요?","generation_gt":["유언대용신탁은 생전에 수탁자인 은행, 증권사 등과 신탁 계약을 맺고 각종 재산 소유권을 이전한 뒤 생전은 물론 사후 관리와 배분을 맡기는 신탁상품입니다."]}

-> 정말로 잘 나옵니다!!

로컬 LLM을 활용한 RAG 구축시 Local config yaml 사용

-> 윈도우, MacOS 에서는 실행 불가

이유 : vllm 이라는 라이브러리를 통해서 로컬 LLM을 실행시키는데, 여기서 vllm은 리눅스 환경에 최적화 돼있음

따라서, Window WSL or LINUX 환경에서 진행하는 것을 추천하고,

또한 LLM을 실행시키기 위해서는 다음과 같은 환경이 필수적임

Installation

vLLM is a Python library that also contains pre-compiled C++ and CUDA (12.1) binaries.

Requirements

  • OS: Linux

  • Python: 3.8 – 3.11

  • GPU: compute capability 7.0 or higher (e.g., V100, T4, RTX20xx, A100, L4, H100, etc.)

참고 링크 : https://docs.vllm.ai/en/stable/getting_started/installation.html#

Local config yaml을 돌리기 위해

윈도우 → WSL 설치 후 우분투 20.04 환경에서 진행

MAC → Docker 환경에서 우분투 20.04 환경에서 진행

M2 pro 맥에 우분투 20.04 설치 → 챗 지피티 답변

https://chatgpt.com/share/b96dd865-1a96-4714-980d-4e3fae8cc6fa

3시간 삽질을 통해 M2 pro는 불가능 하다는것을 깨달음.

결론 : vllm은 완벽한 리눅스 환경 or 좋은 컴퓨터 WSL 설치 완벽하게 된 곳 + GPU 인프라가 갖춰진 서버에서 돌리는 것을 추천드립니다!!

참고 사이트

vllm : https://lsjsj92.tistory.com/668

autorag :

https://youtu.be/ckHAvm-L6Sc

https://youtu.be/Hs4L6f4WPhs

https://youtu.be/8DvuCiQoB7s

https://youtu.be/uOWYV1T_g-w

너무나 좋은 라이브러리를 소개해주신 테디 님에게 감사의 인사를 올립니다.

(🚧 이 글은 2024.06.09에 이미 발행된 글을 재발행 한 글입니다!)

6

👉 이 게시글도 읽어보세요