대규모 언어 모델을 위한 검색-증강 생성(RAG) 기술 현황 - 1/2편

PyTorchKR​:fire::kr: :thinking::speech_balloon:


검색-증강 생성(RAG) 기술 소개

대규모 언어 모델(LLM)은 뛰어난 능력을 보이지만, 실제 사용을 위해서는 환각이나 느린 지식의 업데이트, 답변의 투명성 부족 등과 같은 문제들을 극복해야 합니다. RAG(Retrieval-Augmented Generation)는 이러한 문제를 해결하기 위해 제안된 기술입니다.

RAG는 대규모 언어 모델(LLM)에서 질문에 대한 답변이나 텍스트를 생성하기 전에 광범위한 문서 집합에서 관련 정보를 검색하고, 이를 이용하여 응답을 생성하는 방법입니다. 이는 LLM의 기존 문제점인 지식의 시대에 뒤떨어짐, 특정 영역에 대한 지식 부족, 그리고 응답의 투명성 부족을 해결하는 데 중점을 두고 있습니다.

이러한 RAG는 답변의 정확도를 크게 향상시키고, 특히 지식 집약적인 작업에서 모델의 환각을 줄이는 데 도움이 됩니다. 사용자가 출처를 인용하여 답변의 정확성을 검증할 수 있으며, 이는 모델 출력에 대한 신뢰를 증가시킵니다. 또한, 지식 업데이트와 특정 분야의 지식 도입에도 용이합니다.


RAG 외에 파인튜닝(fine-tuning)을 사용하여 대규모 언어 모델이 특정 지식에 집중하도록 할 수 있습니다. 하지만 이러한 파인튜닝은 실시간으로 업데이트되는 정보를 반영하는데 시간이 걸리며, 모델을 새로 학습시키는데 추가적인 자원이 소모됩니다. 이에 반해, RAG는 LLM에 특정 질의에 대한 정보를 검색할 수 있는 '참고서'를 제공하는 것과 유사합니다.

RAG의 3가지 주요 패러다임 - 개요

RAG 기술의 연구 패러다임은 시간에 따라 끊임없이 발전하고 있습니다. 주요 패러다임들은 기본 RAG, 고급 RAG, 모듈형 RAG의 3가지로, 초창기의 기본 RAG는 비용 효율적이고 LLM만 사용하는 것보다 성능이 뛰어났지만 많은 단점들이 있었습니다. 고급 RAG와 모듈러 RAG의 등장은 기본 RAG의 특정 결함을 해결하기 위한 것이었습니다.

RAG의 3가지 주요 패러다임 - 기본 RAG(Naive RAG)

기본 RAG는 RAG 연구의 초기 방법론을 지칭하며, 전통적인 인덱싱, 검색 및 생성 과정을 포함하고 있습니다. 기본 RAG는 주로 간단한 검색 및 생성 방식에 초점을 맞추고 있으며, RAG의 기본 개념과 원리를 설명하는데 중요합니다.

하지만, 낮은 검색 정확도, 응답 생성의 낮은 품질, 증강 과정의 어려움 등에 따라 발생하는 불필요한 반복, 부정확한 정보, 잘못된 문맥의 통합 등이 발생할 수 있습니다. 따라서 복잡하거나 도전적인 시나리오에 기본 RAG를 사용하기는 부적절할 수 있습니다.

기본 RAG의 주요 구성요소로는 인덱싱(Indexing), 검색(Retrieve), 생성(Generation)이 있습니다:

인덱싱(Indexing)

데이터 소스에서 데이터를 얻고 인덱스를 생성하는 과정으로 오프라인 상태에서 일반적으로 수행됩니다. 이 과정은 데이터 정제, 청크 분할, 벡터 인코딩 및 인덱스 생성을 포함합니다.

  • 데이터 인덱싱: 이 단계는 원본 데이터를 정제하고 추출하는 것으로 시작합니다. 여기에는 다양한 파일 형식(예: PDF, HTML, Word, Markdown 등)을 일반 텍스트로 변환하는 작업이 포함됩니다. 이 과정은 데이터를 효율적으로 처리하고 검색하기 위한 기초를 마련합니다.

  • 청크(chunk) 분할: 불러온 텍스트를 더 작은 조각(chunk)으로 나누는 작업입니다. 언어 모델은 일반적으로 처리할 수 있는 맥락의 양에 한계가 있기 때문에, 가능한 한 작은 텍스트 청크를 생성하는 것이 필요합니다. 이는 검색 과정에서 모델이 처리할 수 있는 데이터 양을 최적화합니다.

  • 임베딩 및 인덱스 생성: 텍스트를 벡터로 인코딩하는 과정입니다. 이렇게 생성된 벡터는 후속 검색 과정에서 질문 벡터와의 유사성을 계산하는 데 사용됩니다. 임베딩 모델은 높은 추론 속도를 요구하며, 사용자가 질문을 할 때 대량의 코퍼스를 실시간으로 인코딩해야 합니다. 이후에는 원본 말뭉치(corpus) 청크와 임베딩을 키-값 쌍 형태로 저장하여, 자주 발생하는 검색에 대비합니다.

검색(Retrieve)

사용자의 입력을 벡터로 변환하고, 해당 벡터와 문서 블록의 벡터 간 유사성을 계산하여 상위 K 문서 블록을 선택합니다.

생성(Generation)

주어진 질문과 관련 문서를 결합하여 새로운 프롬프트를 생성하고, 대규모 언어 모델이 이 정보를 기반으로 질문에 답변합니다.

RAG의 3가지 주요 패러다임 - 고급 RAG(Advanced RAG)

고급 RAG는 기본 RAG의 부족한 점을 개선하기 위해 개발된 패러다임입니다. 이는 주로 검색 및 생성의 질을 향상시키기 위한 사전 및 사후 검색 방법을 포함합니다. 고급 RAG는 크게 검색 전 절차(Pre-Retrieval Process), 검색 후 절차(Post-Retrieval Process), RAG 파이프라인 최적화(RAG Pipeline Optimization)의 3단계로 나누어볼 수 있습니다:

검색 전 절차(Pre-Retrieval Process)

검색 전 절차는 RAG 시스템의 검색 효율성과 결과의 질을 향상시키기 위해 필수적입니다. 이 절차는 데이터 인덱싱 최적화 및 임베딩을 통해서 검색 결과의 관련성과 정확성을 높이는 데 중점을 둡니다​​.

1. 데이터 인덱싱 최적화(Optimizing Data Indexing)

인덱싱된 콘텐츠 품질을 향상시키기 위해서는 데이터 인덱싱을 최적화하는 것이 필요합니다. 데이터 인덱싱 최적화를 위해서는 다음의 5가지 전략들이 주로 사용됩니다.

  • 데이터 세분화 강화(Enhancing Data Granularity): 텍스트의 표준화, 일관성, 사실적 정확성 및 문맥적 풍부함을 향상시키기 위한 절차입니다. 불필요한 정보와 특수 문자를 제거하여 검색기의 효율성을 높이고, 엔티티와 용어의 모호성을 제거하며, 중복되거나 불필요한 정보를 최소화합니다. 이러한 최적화는 RAG 시스템의 정확도와 맥락적 적합성을 보장하는 데 기여합니다​​.
  • 인덱스 구조 최적화(Optimizing Index Structures): 검색의 정확도와 관련성을 향상시키기 위한 방법입니다. 청크(chunk) 크기를 조정하거나 인덱스 경로의 변경, 그래프 구조 정보의 도입을 포함합니다. 이를 통해 검색 결과의 관련성을 높이고 노드 간 관계를 활용하여 정확도를 개선할 수 있습니다.
  • 메타데이터 정보 추가(Adding Metadata Information): * 검색 효율성과 관련성을 향상시키기 위한 방법으로, 각 데이터 청크(data chunk)에 날짜, 목적 등과 같은 메타데이터를 포함시키고, 필터링을 통해 검색 효율성을 향상시키는 것입니다. 이 메타데이터 필터링을 통해 검색의 효율성과 관련성이 개선됩니다.
  • 정렬 최적화(Alignment Optimization): * 문서 간의 불일치 문제를 해결하기 위한 최적화로, 가상의 질문을 생성하고 이를 각 문서와 결합하여 문서 간의 정렬 문제를 해결합니다. 이러한 정렬 최적화는 문서 간의 불일치와 차이를 해소하는 데 도움을 줄 수 있습니다.
  • 혼합 검색(Mixed Retrieval): 검색 기술의 강점을 활용하여 가장 관련성 높고 맥락이 풍부한 정보를 검색하기 위한 방법입니다. 키워드 기반 검색, 의미 검색, 벡터 검색과 같은 다양한 검색 기술을 지능적으로 결합하여 검색 전략을 강화하고 RAG 파이프라인의 전체 성능을 향상시킵니다​​.

2. 임베딩(Embedding)

임베딩은 효과적인 검색을 위한 RAG의 핵심 구성요소입니다. 임베딩은 검색된 내용과 질문 간의 관련성을 강화하고 최종 생성된 출력에 대한 영향을 최적화하는 데 중요합니다. 특히, 질문과 문서 간의 의미론적 유사성을 측정하고 이를 개선하는 데 필수적입니다​​. 임베딩에는 크게 2가지 전략이 있습니다.

  • 정밀 조정 임베딩(Fine-tuning Embedding): 검색된 내용과 질문 간의 관련성을 향상시키기 위해 임베딩 모델을 정밀 조정(fine-tuning)하는 방법입니다. 즉, 도메인 특화하여 맥락에 맞게 임베딩을 조정하고 검색 단계를 최적화합니다. 전문 분야에서 발전하는 용어나 드문 용어를 다룰 때 이러한 맞춤형 임베딩 방법이 검색 관련성을 향상시킬 수 있습니다. 예를 들어, BGE(BAAI 2023) 임베딩 모델은 고성능의 정밀 조정이 가능한 모델입니다. 이 모델은 대규모 언어 모델(Large Language Models, LLM)을 사용하여 문서 청크를 바탕으로 질문을 구성하고, 이를 통해 정밀 조정 데이터를 생성할 수 있습니다.
  • 동적 임베딩(Dynamic Embedding): 동적 임베딩은 단어가 등장하는 맥락에 따라 임베딩을 조정하는 방법입니다. 이는 각 단어에 대해 하나의 벡터만을 사용하는 정적 임베딩과는 달리, 주변 단어에 따라 단어의 임베딩이 달라질 수 있습니다. 이러한 동적 임베딩은 맥락을 포착하는 데 있어 더 정교합니다. 예를 들어 BERT와 같은 트랜스포머 모델에서는 동일한 단어가 주변 단어에 따라 다른 임베딩을 가질 수 있습니다. 하지만 최신의 대형 언어 모델(GPT-4 등)과 비교할 때, 동일한 맥락 감도를 보이지 않을 수 있습니다. OpenAI의 embeddings-ada-02와 같은 모델은 맥락 이해에 뛰어나지만 최신 대형 언어 모델만큼의 맥락 민감도를 보이지 않을 수 있습니다​​.

검색 후 절차(Post-Retrieval Process)

검색 후 절차는 고급 RAG에서 매우 중요한 단계로, 데이터베이스에서 검색된 중요한 문맥을 질의와 결합하여 LLM에 입력하는 과정입니다. 예를 들어, 검색 결과로 나온 모든 문서들을 한꺼번에 LLM에 제공하는 것은 비효율적이며, LLM의 컨텍스트 윈도우(context window) 크기를 초과할 수도 있습니다. 이러한 문제를 해결하기 위해서는 검색된 문서들의 추가적인 후처리가 필요합니다. 크게 2가지 방법들을 살펴보겠습니다.

1. 순위 다시 매기기(ReRank):

검색 결과들 중 관련성(relevant)이 가장 높은 정보를 프롬프트의 앞부분(edge)으로 재배치하는 직관적인 아이디어입니다. 이미 LlamaIndex, LangChain, HayStack 등과 같은 프레임워크들에 이 개념이 구현되어 있습니다. 예를 들어 Diversity Ranker는 문서 다양성을 기반으로 재정렬을 우선시하며, LostInTheMiddleRanker는 최상의 문서를 콘텍스트 창의 시작과 끝에 번갈아 배치합니다. cohereAI rerank, bge-rerank, LongLLMLingua와 같은 접근 방식은 관련 텍스트와 질의 간의 의미론적 유사성을 다시 계산하여 벡터 기반의 시뮬레이션 검색을 해석하는 문제를 해결하고자 합니다​​.

2. 프롬프트 압축(Prompt Compression)

관련 연구들에 따르면 검색된 문서에서 발생하는 잡음(noise)이 RAG 성능에 부정적인 영향을 끼친다고 합니다. 따라서 후처리 단계에서는 검색 문서들 중 중요하지 않은 맥락을 압축하고, 중요한 문단을 강조하면서 전체 콘텍스트 길이를 줄이는 데 중점을 둡니다. Selective Context, LLMLingua와 같은 접근 방식은 작은 언어 모델을 사용하여 프롬프트의 상호 정보 또는 복잡성을 계산하여 요소의 중요성을 추정합니다. Recomp는 다양한 수준의 압축기를 훈련시키며, Long Context는 광범위한 맥락을 다루며, “Walking in the Memory Maze”같은 방법론은 LLM의 주요 정보 인식을 향상시키기 위해 계층적 요약 트리를 설계합니다​​.

RAG 파이프라인 최적화 (RAG Pipeline Optimization)

RAG 파이프라인 최적화는 RAG 시스템의 효율성과 정보 품질을 향상시키는 것을 목표로 합니다. 현재까지의 연구들은 다양한 검색 기술을 지능적으로 결합하고, 검색 단계를 최적화하며, 인지적 역추적(cognitive backtracking) 개념을 도입하고, 다양한 질의 전략을 유연하게 적용하며, 임베딩 유사도를 활용하는 데 초점을 맞추고 있습니다. RAG 파이프라인 최적화는 효율성과 RAG 검색에서의 맥락적 정보의 풍부함 사이의 균형을 달성하는 것이 목표입니다. 주요한 RAG 파이프라인 최적화 방법론들은 다음과 같습니다:

1. 하이브리드 검색(Hybrid Search)

키워드 기반 검색, 의미론적 검색, 벡터 검색과 같은 다양한 기술을 지능적으로 혼합하여 검색하는 방법으로, RAG 시스템이 다양한 질의 유형과 정보 요구에 적응할 수 있게 하여 가장 관련성 높고 맥락이 풍부한 정보를 일관되게 검색하는 것이 목표입니다. 이러한 하이브리드 검색은 검색 전략을 강화하고 RAG 파이프라인의 전반적인 성능을 향상시킬 수 있습니다.

2. 재귀적 검색 및 쿼리 엔진(Recursive Retrieval and Query Engine)

초기 검색 단계에서 더 작은 문서 블록을 획득하여 주요 의미를 포착한 후, 후반 단계에서 더 많은 맥락적 정보를 가진 더 큰 블록을 언어 모델에 제공하는 방법입니다. 이는 효율성과 맥락적으로 풍부한 응답 사이의 균형을 이루는 데 도움이 되며, 이러한 두 단계의 검색 방법은 효율성과 맥락적 풍부함을 조화롭게 결합할 수 있습니다.

3. 역추적 프롬프트(StepBack-prompt)

LLM이 특정 사례에서 벗어나 일반적인 개념이나 원리에 대해 추론하도록 장려하기 위한 방법입니다. 이러한 역추적 프롬프트를 도입하면 다양한 도전적인 추론 집약적 작업에서 눈에 띄는 성능 향상을 보여줍니다. 이 방법은 역추적 프롬프트에 대한 답변 생성과 최종 질문-응답 과정 모두에 적용할 수 있습니다.

4. 서브쿼리(Subqueries)

서브쿼리는 다양한 질의 전략을 다양한 시나리오에 적용할 수 있으며, LlamaIndex와 같은 프레임워크에서 제공하는 쿼리 엔진을 사용할 수 있습니다. 예를 들어, 트리 쿼리, 벡터 쿼리 또는 가장 기본적인 순차적 청크 쿼리 등에서 사용할 수 있어 다양한 질의 전략을 통해 효율적인 검색을 도모할 수 있습니다.

5. HyDE(Hypothetical Document Embeddings)

HyDE는 LLM이 생성한 문장이 사용자의 질의보다 임베딩 공간에서 더 가까울 수 있다는 가정에 기반한 방법론입니다. 즉, LLM을 사용하여 가상의 문서(= LLM의 답변)를 생성하고, 이를 임베딩한 후, 이 임베딩을 사용하여 실제 문서를 검색하는 방법입니다. HyDE는 질의 기반의 임베딩 유사성을 추구하는 것과 달리, 이 방법은 답변 간의 임베딩 유사성에 중점을 두고 있습니다.

RAG의 3가지 주요 패러다임 - 모듈형 RAG(Modular RAG)

모듈식 RAG은 고급 RAG의 발전된 형태로, 기존의 RAG 프레임워크에서 한 단계 더 나아가 다양한 모듈과 기능을 통합하여 더 큰 다양성과 유연성을 제공합니다. 이 접근 방식은 RAG 시스템을 다양한 시나리오와 요구 사항에 맞게 조정할 수 있도록 하는 여러 새로운 모듈과 패턴을 포함하고 있습니다.

새로운 모듈들(New Modules)

1. 검색 모듈(Search Module)

기본 및 고급 RAG의 유사성 검색과 달리, 검색 모듈은 특정 시나리오에 맞춰 LLM이 생성한 코드나 SQL, 사용자 도구 등을 사용하여 직접 검색을 수행하는 모듈입니다. 이러한 검색 모듈을 사용하는 경우, 외부 검색 엔진이나 텍스트 데이터, 테이블 데이터 또는 지식 그래프 등을 데이터 소스로 사용할 수 있습니다.

2. 메모리 모듈(Memory Module)

LLM 자체의 메모리 기능을 사용하여 검색을 개선(guide)하며, 현재 입력과 가장 유사한 기억을 찾는 모듈입니다. 예를 들어, Self-mem 방법론은 검색 강화 생성기(Retrieval-Enhanced Generator)를 반복적으로 사용하여 사용자의 질문(original question)과 이중 질문(dual question)을 결합한 무제한 메모리 풀(unbounded memory pool)을 생성합니다. 이러한 과정을 통하여 추론 과정을 향상시킵니다.

3. 추가 생성 모듈(Extra Generation Module)

검색된 내용의 중복 및 잡음 문제에 대응하기 위한 모듈로, LLM을 활용하여 검색을 위한 문서를 별도로 생성합니다. 사용자의 질문을 데이터 소스에서 직접 검색하는 것보다, 이렇게 LLM에 의해 생성된 콘텐를 사용하였을 때 관련 정보를 더 많이 포함할 가능성이 높습니다.

4. 태스크 적응 모듈(Task Adaptable Module)

다양한 다운스트림(downstream) 작업에 적응할 수 있도록 조정하는 모듈입니다. 각 세부 작업과 모델의 범용성을 강화하는 것을 목표로, 필요한 제로샷 프롬프트를 검색하여 사용(UPRISE 방법)하거나, 제로샷 쿼리를 생성하는 LLM을 별도로 사용(PROMPTAGATOR 방법)하기도 합니다.

5. 정렬 모듈(Alignment Module)

질의와 텍스트 간의 정렬 문제를 해결하기 위해 검색기에 별도의 학습 가능한 어댑터를 추가하는 모듈입니다. PRCA, AAR, RRR 등의 방법론들이 있으며, 이를 통해 검색된 정보를 최적화하고 RAG의 효과를 향상시키는 것이 목적입니다.

6. 검증 모듈(Validation Module)

검색된 정보의 신뢰성을 평가하기 위해 도입되었으며, 실제 문서와 질의 간의 관련성을 평가하는 모듈입니다. 이 모듈은 RAG의 강건성(robustness)을 향상시키는 것이 목표입니다.

새로운 패턴들(New Patterns)

모듈 추가 또는 교체(Adding or Replacing Modules)

기존의 검색-읽기(RR; Retrieval-Read) 구조를 유지하면서 특정 기능을 향상시키기 위해 추가 모듈을 도입합니다. 예를 들어, 재작성-검색-읽기(RRR; Rewrite-Retrieve-Read) 프로세스를 통해 검색 쿼리를 조작하고, 읽기 모듈의 하위 작업 성능을 향상시킬 수 있습니다.

모듈 간 조직적 흐름 조정(Adjusting the Flow between Modules)

언어 모델과 검색 모델 간의 상호작용을 강화하기 위해 모듈 간 조직적 흐름을 조정합니다. 이는 특정 문제 맥락에 기반하여 모듈 내에서의 대체 또는 재구성을 가능하게 합니다.


:warning: (2/2편에서 RAG의 주요 구성 요소 및 평가 방법, 앞으로의 연구 주제들에 대해서 계속됩니다)

더 읽어보기

서베이 논문

관련 주제들


:fire:파이토치 한국 사용자 모임:kr:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:incoming_envelope:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:gift: 아래:arrow_lower_right:쪽에 좋아요:heart:를 눌러주시면 뉴스 발행에 힘이 됩니다~ :bowing_man:

11개의 좋아요

정말 좋은자료 너무 감사드립니다.

덕분에 자료를 한눈에 이해할 수 있어서 늘 감사드립니다.

1개의 좋아요

진산님의 덧글이 항상 큰 힘이 됩니다! :bowing_man:
새해에도 항상 행복한 일만 가득하시길 기원합니다! :pray:
2편도 곧 준비하도록 하겠습니다! 감사합니다! ^^

1개의 좋아요

실례가 아니라면 자료 정리 읽어보고 수정해서 정보 자료 공유하는데 사용해봐도 될까요?

최근에 블로그를 시작했는데 내용이 너무 좋습니다. 허락하여 주신다면 인용 및 출처는 달도록 하겠습니다

1개의 좋아요

물론입니다! 잘 부탁드립니다~ :bowing_man:

저도 궁금했던 내용인데 깔끔한 정리 감사합니다 :+1:
나중에 이 내용으로 세미나도 해주세요.
새해 복 많이 받으세요!

2개의 좋아요

감사합니다! 아직 깊이가 부족한데, 세미나 전까지 열심히 더 쌓아보겠습니다 :raising_hand_man:

2개의 좋아요

그럼 얘기 나온 김에 마감 드리븐을 위해 세미나 일정을 잡아야겠네요. 온라인이든 오프라인이든 내용 공유해 주세요!

챗봇을 만들고자 하는 BE 개발자 입니다. 정리가 잘 되어있는 것 뿐만 아니라 이해하기 쉽게 잘 써주셔서 감사합니다!

1개의 좋아요

읽어주시고, 덧글도 남겨주셔서 감사합니다. :smiley:

최근 RAG의 평가 방식이나 멀티모달(텍스트 + 이미지) RAG에 대한 연구들도 종종 눈에 띄는데... 현생이 바빠 아직 정리를 못하고 있네요ㅠ

가급적 빠른 시일 내에 정리해보겠습니다. :smiley:

1개의 좋아요