Advanced RAG와 Reranker

jihyelee·2024년 4월 21일
3

사전지식: RAG란

  • RAG란 Retrieval-Augmented Generation의 약자
  • 언어모델에게 질의할 때 외부에서 가져온 데이터를 결합하여, 언어모델이 더욱 정확한 답변을 생성하도록 하는 방법론
  • RAG 활용 시나리오 (간단한 예시)
    • 사용자가 언어모델에 질문(prompt)을 던짐 ("여권 재발급 시에 챙겨야 할 서류가 뭐야?")
    • 사용자의 질문을 임베딩 벡터로 변환하여, 사전에 임베딩 벡터로 저장된 문서들 중에 가장 유사도가 높은 문서들을 반환함
    • 사용자의 질문과 해당 문서들을 결합해 언어모델로 하여금 답변을 생성하도록 함
  • RAG가 해결할 수 있는 문제
    • 언어모델이 학습한 데이터가 오래되어(outdated) 부정확한 답변을 생성하는 경우 방지
    • 언어모델이 그럴듯한 거짓말을 생성하는 환각(hallucination) 현상 완화 가능

Advanced RAG

  • 하지만 외부에서 데이터를 가져온다고 할 때, 어떤 문서를 가져와 프롬프트와 결합시키느냐에 따라 RAG의 성능이 좌우될 수 있음
  • 최근 Advanced RAG는 문서 검색(회수; Retrieval)의 성능을 향상시키기 위해 다양한 방법을 고안

검색 전

  • 문서 인덱싱 성능 향상
    • 문서 인덱싱이란, 추후 문서의 검색을 용이하게 하기 위해 문서에 일종의 책갈피를 달아뒀다고 이해할 수 있음
    • 이를 더욱 효율적으로 하기 위해 데이터의 세부 정도(granularity)를 조정하고, 인덱스 구조를 최적화하고, 메타데이터를 추가하는 등의 최적화 기법을 도입
  • 사용자 쿼리 수정
    • 사용자의 쿼리를 재작성하거나 확장시켜 관련 문서를 더욱 잘 검색할 수 있도록 변경

검색 후

  • 언어모델이 받아들일 수 있는 글자의 수(context window)가 제한적이기 때문에 이를 고려해야 함
  • 잡음이 많고 혼란을 줄 수 있는 정보들을 제거해야 함
  • Reranking
    • 관련도가 높은 문맥을 프롬프트 근처로 위치시킬 수 있음 (위치 변경)
      • 관련 문맥의 존재 유무가 아닌 순서가 모델 답변 성능 향상에 중요하다는 사실이 밝혀짐
    • 사용자 쿼리와 관련 문맥들 사이의 의미론적 유사성을 재탐색
  • Prompt compression
    • 프롬프트 압축과 관련해서 이전에 작성한 LLMLingua에 관한 설명 참고 가능 (link)

ReRanker

  • 질문과 문서 사이의 유사도를 측정할 때 질문과 문서를 하나의 인풋으로 사용
  • 일반적인 벡터 검색이 활용하는 Bi-encoder가 아닌 Cross-encoder 구조를 활용함으로써 더욱 정확한 유사도 측정이 가능
  • 하지만 Cross-encoder는 모든 조합들을 활용해 인풋으로 활용해야 하기 때문에, 비용이 높음
  • 때문에 일반적인 벡터 검색(retrieval)을 진행한 후, reranker 기반으로 순위를 재정렬하는 경우가 일반적

llamaindex에서 제공하는 reranker 목록

CohereReRank

from llama_index.postprocessor.cohere_rerank import CohereRerank

postprocessor = CohereRerank(
    top_n=2, model="rerank-english-v2.0", api_key="YOUR COHERE API KEY"
)

postprocessor.postprocess_nodes(nodes)

SentenceTransformerRerank

  • cross-encoder를 활용한 reranker
from llama_index.core.postprocessor import SentenceTransformerRerank

# We choose a model with relatively high speed and decent accuracy.
postprocessor = SentenceTransformerRerank(
    model="cross-encoder/ms-marco-MiniLM-L-2-v2", top_n=3
)

postprocessor.postprocess_nodes(nodes)

LLM Rerank

  • 거대언어모델을 활용한 reranker
from llama_index.core.postprocessor import LLMRerank

postprocessor = LLMRerank(top_n=2, service_context=service_context)

postprocessor.postprocess_nodes(nodes)

JinaRerank

from llama_index.postprocessor.jinaai_rerank import JinaRerank

postprocessor = JinaRerank(
    top_n=2, model="jina-reranker-v1-base-en", api_key="YOUR JINA API KEY"
)

postprocessor.postprocess_nodes(nodes)

Colbert Reranker

from llama_index.postprocessor.colbert_rerank import ColbertRerank

colbert_reranker = ColbertRerank(
    top_n=5,
    model="colbert-ir/colbertv2.0",
    tokenizer="colbert-ir/colbertv2.0",
    keep_retrieval_score=True,
)

query_engine = index.as_query_engine(
    similarity_top_k=10,
    node_postprocessors=[colbert_reranker],
)
response = query_engine.query(
    query_str,
)

rankLLM

from llama_index.postprocessor import RankLLMRerank

postprocessor = RankLLMRerank(top_n=5, model="zephyr")
postprocessor.postprocess_nodes(nodes)

참고자료

  • AWS 기술 블로그 "한국어 Reranker를 활용한 검색 증강 생성(RAG) 성능 올리기" (link)
  • Retrieval Augmented Generation (RAG) for LLMs (link)
  • llamaindex node postprocessor modules (link)
profile
Graduate student at Seoul National University, majoring in Artificial Intelligence (NLP). Currently AI Researcher and Engineer at LG CNS AI Lab

0개의 댓글

관련 채용 정보