이 글은 Searching for Best Practices in Retrieval-Augmented
Generation
논문을 보고 정리한 글입니다.


Abstract:

  • 기존 RAG 방식은 복잡한 구현과 긴 응답시간을 가지는 문제가 있음.
  • 이 논문에서는 성능과 효율성을 균형 있게 고려한 RAG 전략을 제안하는 논문임.

 

 

RAG Workflow 에서 필요한 Step 들:

  • query classification (determining whether retrieval is necessary for a given input query)
  • retrieval (efficiently obtaining relevant documents for the query)
  • reranking (refining the order of retrieved documents based on their relevance to the query)
  • repacking (organizing the retrieved documents into a structured one for better generation)
    • LLM 의 응답 생성 기능은 문서 제공 순서에 의해 영향을 받을 수 있기 때문에 문서의 순서를 어떻게 재구성할건지에 대한 작업임.
    • 대표적인 기법인 forward 는 reranking 단계에서 얻은 점수에 따라서 내림차순하는 것. (관련성이 가장 높은 문서를 먼저 제공)
    • 대표적인 기법인 reverse 는 오름차순으로 정렬. (관련성이 가장 높은 문서가 가장 마지막에 등장)
  • summarization (extracting key information for response generation from the repacked document and eliminating redundancies):
    • Repacking된 문서에서 응답 생성에 필요한 핵심 정보를 추출하고 중복을 제거하는 기법.
    • 그러니까 중요한 정보를 식별하고 추출, 불필요한 세부 사항을 제거, 핵심 아이디어를 간결하게 표현 등을 하는 것.
  • Repacking은 정보를 구조화하고 조직화하는 반면, Summarization은 그 정보를 압축한다.

 

 

여기서는 위 이미지에 있는 대표적인 기법들 조합에 대해서 실험을 해보고, 최적의 RAG 기법에 대해 알아볼거임.

 

 

Query Classification:

  • 먼저 모든 쿼리가 retrieval-augmented(검색 증강) 방식을 필요로 하지 않음을 알고 있어야 한다.
  • Query Classification 은 불필요한 검색을 줄여 응답 시간을 개선하고 시스템 효율성을 높이기 위함임.
  • 여기서는 BERT-base-multilingual 모델을 사용해서 쿼리를 분석하고, “sufficient” 와 “insufficient” 으로 분류함.
  • 성능은 다음 표와 같이 엄청 잘나온다.

 

 

Embedding 모델의 비교:

  • MRR (Mean Reciprocal Rank) 과 R (Recall) 지표를 이용해서 비교:
    • MRR 은 가장 관련성이 높은 문서를 상위로 추출할 수 있는지를 측정하는 지표
    • Recall 은 관련성이 있는 문서를 누락없이 조회할 수 있는지를 측정하는 지표.
  • 아래의 표를 보면 BAAI/LLM-Embedder 모델이 Recall 에서는 가장 높은 성능을 보였고, BAAI/bge-large-en 모델이 MRR 관련해서 가장 높은 성능을 보였음.

 

 

3가지 수준의 Chunking:

  • Token Level:
    • 토큰 단위로 Chunking 을 분할하는 기법.
    • 간단하지만 퀄리티는 떨어짐
  • Semantic Level:
    • LLM 을 이용해서 의미 단위로 Chunking 을 하는 기법
    • 시간이 많이 소요된다는 단점이 있음.
  • Sentence Level:
    • 문장 단위로 Chunking 을 하는 기법
    • Simplicity 와 Efficiency 의 균형점을 찾는 기법.
    • 벡터 스토어에 검색된 문장은 이후 원본 문서로 변경되어서 사용될거임. (기법은 약간씩 다를 수 있음)
  • 여기서는 Sentence Level Chunking 전략에 대해서 주로 다룸.

 

 

Chunk Size:

  • 청크 사이즈는 분명 RAG 시스템 성능에 영향을 미침:
    • 큰 청크는 더 많은 맥락을 제공하나, 컨택스트 윈도우 사이즈를 차지하고, 검색이 안될 가능성이 있고, 불필요한 맥락도 포함될 가능성이 있음.
    • 작은 청크는 검색이 잘 될 확률이 높고, 비용 효율적인 솔루션이긴 하나, 맥락이 부족할 수 있음.
  • 여기서는 LlamaIndex 를 통해서 다음과 같은 실험 조건을 설정해서 어떤 Chunk size 가 가장 효율적인지 실험해봄:
    • 임베딩 모델: text-embedding-ada-002 (긴 입력 길이 지원)
    • 생성 모델: zephyr-7b-alpha
    • 평가 모델: gpt-3.5-turbo
    • 청크 Metadata Addition:
    • 청킹에다가 메타 데이터 (e.g Title, Keyword, hypothetical questions) 등을 추가해주고, 이를 이용해서 후처리하는 방식으로 검색된 결과를 더 강화시킬 수 있음.
    • 코퍼스: lyft_2021 문서의 첫 60페이지
    • 약 170개의 쿼리 생성
  • 그리고 두 가지 지표를 기준으로 평가함. Faithfulness, Relevancy
    • Faithfulness: 응답이 검색된 결과를 얼마나 잘 이용하고 있는지 나타내는 지표.
    • Relevancy: 검색된 결과와 응답이 주어진 쿼리와 얼마나 연관이 있는지 나타내는 지표
  • 다음과 같이 결과를 보았을 때 256, 512 청크 사이즈가 가장 성능이 좋게 나옴.

 

 

Chunking Techniques:

  • Original Chunking (= 고정된 사이즈로 청킹을 자르는 방법) 보다는 작은 청킹으로 만든 후 검색된 이후에 큰 청킹으로 변환시키는 small2big 기법이나 sliding window 기법이 더 효과적임.
  • small2big:
    • 작은 청크 175 토큰으로 자른 후, 큰 청킹 512 토큰으로 이후에 치환하는 방법. overlapping 은 20토큰 정도로.
  • sliding window:
    • 작은 청크 175 토큰으로 자른 후, overlapping 20 토큰을 고려해서 슬라이딩 윈도우로 이동. 그리고 검색되면 큰 청킹인 512 토큰으로 치환하는 기법
    • Sentence Window 기법 같은거임.

 

 

Embedding Model Selection:

  • 쿼리와 청크 블록 간의 효과적인 의미적 매칭을 위해 적절한 임베딩 모델 선택이 중요함.
  • 여기서는 임베딩 모듈을 평가하는 FlagEmbedding6 를 이용해서 평가를 해봤다고 함.
  • 성능 상으론 LLM-Embedder 와 BAAI/bge-large-en 이 가장 뛰어났지만, LLM-Embedder 의 크기가 1/3 정도로 작기 때문에, 이걸 이용하는게 좋다고 추천함.

 

 

Metadata Addition:

  • 청킹에다가 메타 데이터 (e.g Title, Keyword, hypothetical questions) 등을 추가해주고, 이를 이용해서 후처리하는 방식으로 검색된 결과를 더 강화시킬 수 있음.
    • 제목을 활용한 방법: 제목을 보고 문서의 주제를 파악해서 연관성을 판단하는 방법.
    • 키워드를 활용한 방법: 키워드를 추가해서 더 검색이 잘되도록 하는 방법
    • 가상 질문 (Hypothetical Questions) 를 활용하는 방법: 청킹 텍스트가 어떠한 질문에 대한 답변인지 알 수 있도록 하는 방법.
  • 대표적인 후처리 방법:
    • 검색 결과 분류: 메타데이터를 활용해 검색 결과를 카테고리별로 분류하거나 우선순위를 매길 수 있 - 이런 요구사항을 참고했을 때 Table 5 를 보면
    • 요약 제공: 메타데이터를 기반으로 검색된 텍스트의 요약을 제공하여 사용자가 원하는 정보를 더 빠르게 찾을 수 있음.
    • 필터링: 특정 메타데이터를 기반으로 불필요한 검색 결과를 필터링하여 사용자에게 더 정확한 정보를 제공할 수 있음.

 

 

Vector Databases:

  • 벡터 데이터베이스를 선정할 때 다양한 기준들에 대해서 소개함:
    • Multiple Index Type 지원 유무
    • Billion Scale 지원 유무
    • Hybrid Search 지원 유무
    • Cloud Native 지원 유무
    • Table 5 를 보면 이런 요구사항을 참고했을 때 Milvus 가 가장 낫다고 함. (하지만 최근 Qdrant 에서 제시한 BM42 알고리즘을 생각한다면, Qdrant 도 나은듯)

  • Table 6 의 벡터 데이터베이스에서 검색하는 기법을 보면 HyDE + Hybrid Search 가 가장 성능적으로 우수함:
    • HyDE + Hybrid Search 는 HyDE 기법으로 생성한 가상 문서를 이용해서 Hybrid Search (유사도 벡터 검색 + BM25 와 같은 전통적인 키워드 검색 기법) 을 이용한 검색 방법을 말함.
  • 여기서 사용하는 지표로는 mAP, mDCG, R 을 사용함:
    • mAP (Mean Average Precision): 정밀도를 말함. 정확하게 쿼리와 관련된 문서를 찾아냈는지
    • nDCG (Normalized Discounted Cumulative Gain): 검색된 문서와 쿼리와의 연관성을 측정하는데, 상위 랭크의 문서는 더 가중치를 줘서 스코어링을 매기는 기법임.
    • R (Recall): 전체 문서들 중에서 관련된 문서들을 찾아내는 능력을 측정하는 지표임.

  • HyDE 를 이용한 검색 방법으로는 다양한 설정이 있는데 w/ 8 pseudo-doc + query (= 8개의 가상 문서와 쿼리를 함께 사용한 검색 방법) 이 가장 성능적으로 뛰어남.

 

 

Retrieval Methods:

  • 벡터 스토어에 데이터를 그대로 조회하는 방법 보다는 쿼리를 더 잘 표현된 형태로 변환하는 Query Rewriting, 원래의 복잡한 쿼리를 더 작은 서브 질문으로 분해하는 Query Decomposition, 사용자의 쿼리에 기반한 가상 문서를 생성하고 이를 통해 검색하는 기법인 Pseudo-documents Generation (HyDE) 가 있음.
  • Table 6 자료를 보면 이것들 중에서는 HyDE 가 가장 성능이 뛰어남.
  • 추가로 HyDE + Hybrid Search 를 결합한 것이 가장 뛰어나다.
  • HyDE 의 경우에도 w/ 8 pseudo-doc + query 로 적용하는게 가장 성능이 뛰어나지만 가장 비용이 많이 나가는 방법이긴 함.

 

 

Hybrid Search:

  • Hybrid Search 의 공식은 다음과 같이 Spatial Search + Dense Search 조합으로 구성됨.
  • 여기서는 알파 값을 0.3 으로 주는 것이 가장 성능적으로 뛰어난 결과를 보였다고 함. 그러니까 스코어링을 매길 때 희소 검색의 점수 비중을 0.3 을 곱해서 주는거지.
  • 하이퍼파라미터 같은 거임. 최적의 값을 찾는 건 상당한 검색 결과에 영향을 끼칠 수 있다고 한다.

 

 

 

 

Reranking Methods:

  • 리랭킹(Reranking) 단계는 검색된 문서들을 정렬 하는 작업을 말함.
  • 크게 두 가지 랭킹 방법이 있음:
    • DLM Reranking:
      • 주어진 쿼리가 문서와 연관되어 있는지 평가하는 작업을 파인튜닝한 모델을 사용하는 기법임.
      • 모델은 쿼리와 문서가 연관이 있는지 True or False 로 평가함. 그리고 이렇게 예측한 확률에 기반해서 스코어링이 측정된다.
    • TILDE Reranking:
      • 모델이 주어진 쿼리에 있는 용어들을 독립적으로 분할해서 해당 용어가 문서 내에서 발생할 확률을 계산해서 랭킹을 하는 기법임.
  • 실험 결과를 보면 알겠지만 DLM Reranking 에서 RankLLaMA 가 가장 랭킹을 잘 매김.
  • monoT5 가 종합적인 면에서는 가장 낫다고 함. 모델의 크기가 작으니까.

 

 

Document Repacking:

  • Repacking 은 LLM 의 응답 생성 기능이 문서 제공 순서에 의해 영향을 받을 수 있기 때문에 문서를 어떤 순서로 제공할 건지에 대한 거임.
  • 대표적인 Repacking 방법:
    • Forward Method:
      • 리랭킹 단계에서 얻은 관련성 점수에 따라 문서를 내림차순으로 정렬
    • Reverse Method:
      • 리랭킹 단계에서 얻은 관련성 점수에 따라 문서를 오름차순으로 정렬
    • Sides Method:
      • Liu et al.의 연구에서 영감을 받아, 관련성 높은 정보를 입력의 앞이나 뒤에 배치하는 방법
      • 그러니까 관련성 높은 문서를 리스트의 앞쪽과 뒤쪽에 배치하고, 덜 중요한 문서는 중간에 배치하는 방법
      • 이 방법이 가장 효과적이라고 함.

 

 

Summarization:

  • RAG 에서 검색된 문서의 내용이 불필요하거나, 중복되거나, 너무 길거나 하면 LLM 의 답변 성능에 영향을 미칠 수 있음.
  • 여기서 Summarization 방법은 검색된 결과에서 extractive or abstractive 방법을 이용해서 요약하는 방법에 대해 볼거임.
    • Extractive: 문서에서 중요한 문장을 선택하는 것.
    • Abstractive: 여러 문서의 내용을 통합하고 추상화해서 재구성하는 것.
  • 대표적인 기법에 대해서 보자:
    • Recomp:
      • extractive or abstractive 두 가지 기법을 지원함.
    • LongLLMLingua:
      • 먼저 쿼리와 관련해서 연관이 없는 정보는 대량으로 제거함.
      • 다음으로 남은 정보를 세밀하게 분석해서 주요 정보는 유지하면서도 세밀하게 압축을 한번 더한다.
      • 압축 후에는 평가를 거쳐서 중요한 정보가 손실되었는지 확인하고 복구 매커니즘을 해서 중요한 정보가 사라지지 않도록 만든다.
    • Selective Context:
      • 입력 컨텍스트에서 중복 정보를 식별하고 제거하는 방법임.
  • Recomp(Abstractive) 방법이 가장 효과적이라고 함.

 

 

Generator Fine-tuning:

  • 모델을 파인튜닝 할 때 관련성이 있는 문서만 넣는게 아니라 관련성이 없는 문서를 같이 섞어서 제공했을 때 모델의 답변이 견고해진다는 실험을 관측했다고 함.

 

 

Searching for Best RAG Practices:

  • 여기서는 RAG 시스템에서 가장 성능이 잘 나오는 조합을 찾아봄. 중요한 건 모델에 따라, 벡터 데이터스토어, 데이터 셋에 따라서 최선의 조합이 달라질 수 있다는 걸 알고 있어야할듯.
  • 그리고 Best Performance 가 중요한 지, Balanced Efficiency 가 중요한 지 결정을 해야한다. 이것에 따라서 선택지가 달라질거임.
  • 여기서 선택한 모델: Llama2-7B-Chat model fine-tuned
  • Vector Store: Milvus
  • 사용한 데이터 셋: 10 million text of English Wikipedia and 4 million text of medical data.
  • Results and Analysis:
    • Query Classification Module:
      • 이 모듈은 쿼리의 정확성과 효율성을 모두 향상시키므로 있는게 좋음.
    • Retrieval Module:
      • Hybrid with HyDE” 방법이 가장 높은 RAG 점수(0.58)를 기록했으나, 쿼리당 11.71초의 높은 계산 비용이 수반됨.
      • Latency 를 고려한다면 Hybrid 방법이 나을 수 있음.
    • Reranking Module:
      • 재랭킹 모듈이 없을 때 성능이 눈에 띄게 떨어져, 재랭킹이 중요함.
      • MonoT5가 가장 높은 평균 점수를 기록, 검색된 문서의 관련성을 크게 향상시킴.
    • Repacking Module:
      • Reverse” 구성은 문맥을 쿼리에 더 가까이 배치함으로써 성능을 가장 높게 발휘함.
    • Summarization Module:
      • Recomp가 최상의 성능을 보이지만, 요약 모듈을 제거하면 지연 시간이 줄어드는 효과가 있음.
      • 요약 모듈을 제거하여도 큰 성능 차이는 없으므로 지연 시간과 약간의 성능을 고려해서 판단하면 됨.

 

 

Limitations:

  • 논문에서 말하는 한계점과 향후 연구의 방향성 제시를 함.
  • 여기서는 Generator 는 Fine-tuning 된 걸 이용했지만, Retriever 쪽에서도 Fine-tuning 된 걸 사용할 가능성이 있음. 이것에 대한 고려도 필요하다고 함.
  • 최적의 RAG 구현을 찾기 위해 모듈식 설계를 채택했음. 모듈식으로 나눠서 각 모듈마다 최선의 접근을 하는 Greedy 방식으로 접근을 했음. 이런 방식은 모든 조합을 탐색하는 건 아니라서 최적을 달성할 수는 없지만 용이한 방법임.
  • 다양한 청킹 기술이 전체 RAG 시스템에 미치는 영향을 줄 수 있음. 여기서는 Chunking 기술을 제한했었음.
  • RAG 시스템은 멀티 모달에서의 적용도 될 수 있음.

+ Recent posts