Generative AI/Prompt Engineering & Tuning

[Prompt Engineering] RAG(Retrieval Augmented Generation)

데이터 세상 2023. 7. 11. 18:57

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks

논문: Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks

 

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks

Large pre-trained language models have been shown to store factual knowledge in their parameters, and achieve state-of-the-art results when fine-tuned on downstream NLP tasks. However, their ability to access and precisely manipulate knowledge is still lim

arxiv.org

 

2020 NIPS에 발표

pre-training으로 미처 parameterize하지 못한 외부의 지식들을 활용할 수 있는 general한 seq2seq 구조를 제안한 논문

 

 

a versatile pattern that can unlock a number of use cases requiring factual recall of information, such as querying a knowledge base in natural language.

자연어로 기술 자료를 쿼리하는 것과 같이 사실에 입각한 정보 회수가 필요한 다양한 사용 사례를 잠금 해제할 수 있는 다목적 패턴

 


ChatGPT의 경우 2021년 9월까지의 데이터를 기준으로 학습하였습니다. 그러나, 21년 9월 이후의 정보에 대해서도 응답을 생성해서 질문에 답을 합니다. 이는 Hallucination(환각)이라고 부르는데, 이것은 ChatGPT에서 사용한 GPT 모델이 "auto-regression LLM"이기 때문입니다.

Auto-Regression LLM은 이전 단어를 보고 가장 높은 확률의 단어를 다음 단어로 예측하므로 단어의 순서에 따라 얼마든지 다른 답변을 출력할 수 있습니다.

즉, 학습한 정보에 해답이 없더라도, 학습한 방식을 기준으로 확률적으로 그럴 듯한 응답을 생성합니다.

 

그러나, 최신의 지식 정보를 기준으로 정확한 답변을 전달해야 하는 요구사항이 있는 경우, LLM을 재학습하지 않고 RAG를 사용해서 언어 모델이 정확한 응답을 하게 할 수 있습니다.

RAG를 사용하면,

사용자 질문에 해당되는 응답 정보의 문서 정보를 미리 저장한 Vector Score에서 검색하고, 그 검색 결과에 해당되는 본문을 LLM에 전달하여, LLM이 생성한 본문의 요약된 결과를 사용자에게 응답하는 방식입니다.



가장 간단한 형태의 RAG 3단계

  • Index knowledge base passages (once): 지식 기반 구절 색인화(1회)
  • Retrieve relevant passage(s) from knowledge base (for every user query): 기술 자료에서 관련 구절 검색(모든 사용자 쿼리에 대해)
  • Generate a response by feeding retrieved passage into a large language model (for every user query): 검색된 구절을 대규모 언어 모델에 공급하여 응답 생성(모든 사용자 쿼리에 대해)

 

Conversational Search

Phase #1. Ingest your own data (자체 데이터 수집)

  • 원본 파일에서 문서 데이터 추출
  • 문서를 청크 단위로 구분
  • 청크를 임베딩화
  • 임베딩을 벡터 저장소에 저장

 

Phase #2. Query your documents (문서 쿼리)

   (a) 임베딩에 대한 쿼리

   (b) 가장 일치하는 청크를 얻기

   (c) 프롬프트를 작성해서 LLM에 전달

   (d) LLM의 응답을 사용자에게 전달

Query your documents


개요

Pre-trained 언어 모델은 factual knowledge를 매개변수에 저장하고 downstream NLP task에 대해 fine-tuning을 수행할 때 좋은 결과를 얻는것으로 나타났습니다. 그러나 knowledge에 접근하고 정확하게 조작하는 것은 여전히 제한되어 있으므로 knowledge-intensive task에 대해서는 task-specific architecture보다 성능이 떨어집니다.


언어 생성을 위해 Pre-trained model(parametic memory)과 non-parametric memory(=retrieval-based)를 결합한 Retrieval-Augmented Generation(RAG)를 제안하고 범용적인 fine-tuning 방법에 대해 제안합니다.

이는, 광범위하고 지식집약적인 NLP task에서 모델을 평가하고 3개의 Open-domain QA Task에서 seq2seq model 및 task-specific retrieve&extract architecture보다 더 우수한 성능을 보여줍니다.


Language Generation task의 경우 RAG model이 SotA seq2seq baseline보다 더 구체적이고 다양하며 사실적인 언어를 생성하는것을 보여줍니다.

 

Pre-trained 언어 모델은 암시적인 지식기반으로서 외부 메모리에 접근하지 않고도 Pre-train 과정을 통해 많은 지식을 배우는 것으로 나타났지만, 메모리를 쉽게 확장하거나 수정할 수 없으며 예측에 대한 통찰력을 직접적으로 제공할 수 없는 단점이 있습니다.
Parametric memory와 non-Parametric memory를 결합한 model은 지식을 수정하고 확장할 수 있으며 해석할 수 있기 때문에 이러한 문제 중 일부를 해결했습니다.

최근에 제안된 REALM 및 ORQA는 좋은 결과를 보여주었지만 Open-domain extractive QA에 대해서는 성능평가를 하였습니다.

 

본 논문에서는 RAG(Retrieval-Augmented Generation)를 제안하며 이는 general-purpose fine-tuning approach를 통해 non-parametric memory를 사용한 pre-trained parametric memory generation model입니다.

여기서 parametric memory는 Pre-trained seq2seq transformer이고 non-parametric memory는 pre-trained neural retriever를 사용하는 wikipedia의 dense vector index입니다. 이러한 요소들은 end-to-end probabilistic model로 결합합니다.

 

Document retriever는 입력(Query)을 통해 latent document를 제공하고 seq2seq model은 latent document와 입력(Query)을 통해 출력을 생성합니다.

Answer basis 또는 answer token basis를 기준으로 top-k 근사치를 통해 latent variable을 marginalization 합니다.

 

T5 및 BART와 마찬가지로 RAG는 seq2seq task에서 fine-tuning되기 때문에 sequence genetor와 retriever가 함께 학습됩니다.

 

본 논문에서는 광범위하고 지식 집약적인 task에 대해 RAG를 실험합니다. 모든 실험에서 Wikipedia 덤프(18년 12월)를 사용하고 100-word chnunk로 분할하여 총 21,015,324개의 document를 만듭니다.

DPR document encoder를 사용하여 각 document에 대한 document embedding을 계산하고 (inference:)효율적인 검색을 위해 Hierarchical Navigable Small World approximation를 사용하는 FAISS를 통해 단일 index를 만듭니다.

 

  • Parameterizing : 모델의 가중치에 지식을 주입하는 과정입니다. 우리가 다양한 목적함수를 바탕으로 Large Language Model을 Pre-training하는 이유가 결국 knowledge를 parameterizing하기 위함이라고 볼 수 있습니다.
  • Knowledge Intensive Tasks : 사람조차도 외부지식 (ex. 위키피디아 검색) 없이 해결하기 어려운 문제를 일컫습니다. 즉 모델의 관점에서 보면, parameterized되지 못한 외부 지식이 필요한 문제입니다.
  • MIPS : Maximum Inner Product Search의 약어로, 우리에게 vector space에 mapping된 query  가 있고 여러 외부 정보들 가 있다고 가정할 때 query 와 내적(or 코사인 유사도)가 높은 외부 정보들 를 찾는 과정을 의미합니다. 최근의 Facebook의 FAISS가 이를 빠르게 구현해놓은 좋은 라이브러리로 각광받고 있습니다.

Method

저자들이 제시한 framework를 QA System으로 한정지어 예시를 들어보면, 우선 question을 BERT에 태운 후 [CLS] Token을 빼와서 query vectory를 만든 후, wikipedia 각 document 역시 BERT(question encoding한 BERT와 다른 객체)를 태워 [CLS] Token을 빼와서 DB를 구축합니다. 다음, query vectory와 가장 유사한 (=내적 값이 큰) k개의 document vector에 해당하는 문서를 retrieve 합니다. 마지막으로 retrieved된 document와 question을 concat해 seq2seq의 encoder 입력에 넣은 후 answer을 decoder에서 generate하도록 훈련합니다.


Facebook에서 제공한 RAG의 전체적인 학습 방법

 

 

RAG는 크게 2가지 모델로 나누어집니다.
1. Retriever : question 를 기반으로 유사한 document 를 retrieve하는 모델 (=)
2. Seq2Seq Generator : Retriever가 반환한 유사한 document 와 question 를encoder에 넣고 decoder에서 answer 를 generate 하는 모델 (=

 


K개의 유사한 document들을 가져와서 answer를 generate하는데 활용한다고 했는데 이 K개를 어떠한 식으로 concat하는가?

 

1. Models

RAG-Sequence Model

맨 처음에 question vector 와 유사한 document를 뽑고 각 document 1개랑 question vector 를 concat시켜서 총 K개의 forwarding을 진행한 후 이를 marginalize하는 방법입니다.

수식의 오른편을 보면 하나의 유사한 document 에 대해서 answer y를 generate한 후 그 document와 question의 유사도인 와 곱한 후 이를 모든 documents에 대해서 marginalize해 가중 평균하는 구조입니다.

 

RAG-Token Model

매 target token마다 다른 document를 retreive하면서 answer를 생성하는 방법입니다. 수식의 오른편을 보시면 매 time-step마다 유사한 K개의 document가 각각 question vector 와 concat해서 output token 에 대한 확률을 계산하고 마찬가지로 document와 question의 유사도인 와 곱하면서 marginalize해 가중 평균하는 구조입니다.

 

2. Retriever: DPR

Retrievers는 상당히 직관적입니다. 이전에 설명드린것처럼 question과 document를 서로 다른 BERT를 통과해 [CLS] Token을 계산한 후 내적을 통해 유사도를 구하는 모델입니다. 저자들은 이미 wikipedia document로 pre-trained된 모델을 활용했다고 하며, 각각 document index를 non-parametric memory로 지정하였습니다.

 

검색 구성요소 는 DPR을 기준으로 하며 DPR은 bi-encoder architecture를 따릅니다.

여기서  transformer에 의해 생성된 document의 dense representation이고 는 다른 매개변수를 가진  transformer에 의해 생성된 query representation입니다.
가장 높은 prior probability 를 갖는 k개의 요소  의 리스트 를 효율적으로 계산하기 위해 FAISS 라이브러리에서 제공하는 MIPS(Maximum Inner Product Search) index를 사용합니다.

학습은 TriviaQA, Natural Question를 통해 답변이 포함된 document를 검색하도록 수행합니다.

 

3. Generator: BART

Generator로는 BART-large를 활용했고, 이전에 언급한 것처럼 [document;question]식으로 concat된 encoder input을 만들어 answer를 generate 하였습니다.

Generator 구성요소 는 BART의 encoder, decoder를 사용하여 모델링하며 400M parameter를 가진 BART-large를 사용합니다. BART를 통해 생성할때 input 와 검색된 컨텐츠 를 결합하기위해 간단하게 concatenation합니다.

 

4. Training

저자들은 매 question마다 유사한 K개의 document에 대한 정답 label 없이 훈련을 진행하였고, DPR의 경우 question을 encoding하는 BERT만 gradient를 흘리고 document를 encoding하는 BERT는 학습하지 않았습니다.

 

검색할 document를 감독하지 않고 Retriever와 Generator를 공동으로 학습합니다. 입력/출력 쌍 가 주어지면 Adam을 통해

를 minimize합니다. 학습 중 document encoder를 업데이트하면 docmuent indexing을 정기적으로 업데이트 해야하므로 비용이 많이 소모됩니다. 그래서 query encoder와 generator를 fine-tuning하고 document encoder를 고정상태로 유지합니다.

 

5. Decoding

Test 및 decoding 단계에서 RAG-sequence와 RAG-token은 를 근사하는 다른 방법을 필요로 합니다.

 

RAG-Token

Token 별로 새로운 document를 condition해주는 모델인 RAG-Token Model은 기존의 beam-search를 그대로 활용해주어도 됩니다. 왜냐하면 어차피 각 hypothesis가 이미 이전 time-step까지 도출해낸 text-sequence는 주어져 있고, 와 새롭게 retrieve된 document 와 함께 다음 time-step의 vocab distribution을 계산하는 것은 추가적인 input만 생길 뿐, 기존의 beam-search에서 벗어나는게 없기 때문입니다.

 

RAG-Token Model은 transition probability를 가진 auto-regressive seq2seq generator로 볼 수 있습니다.

 

Decoding 단계에서 를 standard beam decoder를 사용하여 구할 수 있습니다.

 

RAG-Sequence

문제는 RAG-Sequence Model입니다. 애초에 answer을 generate할 때 하나의 document 은 서로 다른 answer을 generate할 것이기 때문에 기존의 beam-search에서 이를 marginalize하기는 불가능합니다. 따라서 저자들은 우선은 각각의 document 에 대해서 beam-search를 진행하고, 모든 document 가 공통된 beam을 갖도록 각 document 에 등장한 beam에 대해서 추가적인 forward pass를 진행해주고, 이를 와 곱하면서 marginalize해준다고 하였습니다. 하지만 이렇게 계산해줄 경우, 각 document별로 수많은 beam을 generate하는 forward pass를 진행해주어야 함으로, 저자들은 애초에 question 와 document 에서 등장하지 않는 beam은 전부 등장확률을 0으로 지정했다고 합니다.

 

각 candidate codument 에 대해 beam search를 사용하여 에 대해 각 hypothesis를 scoring합니다.
모든 beam에 대한 hypothesis 의 확률을 추정하기 위해 beam에 나타나지 않는 각 document 에 대해 추가 forward pass를 수행하고generator score에 를 곱하여 margninal에 대한 beam 사이의 확률을 합합니다. (“Thorough Decoding”)

더 긴 sequence의 경우 효율적인 디코딩을 위해 로 부터 beam search동안 가 생성되지 않은 에 대한 근사값을 더 만들 수 있다. 이것은 candidate set 가 생성된 후 추가적인 forward pass를 수행하지 않아도 됩니다.(“Fast Decoding”)

 


Vector Search + LLM(RAG)

벡터 검색은 이제 모든 검색에서 일반적입니다(Google, Bing, 선호하는 검색 엔진 선택). 전체 검색 데이터베이스에 이 4개의 문서만 있는 경우를 생각해 보십시오. “Tell me something about a big tree.”라고 질문할 수 있습니다.

 

출력은 다음과 같습니다.

During yesterday’s storm, a large tree fell on the road.

 

데이터베이스에서 가장 관련성이 높은 문서입니다. 그러나 LLM에 동일한 질문을 하고 마지막에 4개의 '문서'를 추가하면 다음과 같은 결과를 얻을 수 있습니다(이 예에서는 ChatGPT).

A big tree is typically a large, towering plant with a sturdy trunk, branches, and an extensive network of roots. These trees can reach impressive heights, often extending well above the surrounding vegetation. They serve as essential components of many ecosystems, providing shade, shelter, and food for various organisms.

The incident you mentioned about a large tree falling on the road during a storm indicates the power and impact of severe weather conditions. Storms with strong winds can uproot or break trees, leading to road blockages and potential hazards for vehicles and pedestrians.

In another scenario you mentioned, while driving on the road in Bandipur, you encountered a large elephant crossing the road. Bandipur is a national park and wildlife sanctuary located in India, known for its rich biodiversity and diverse animal population. Elephants are one of the prominent species found in Bandipur and are known to traverse the area, sometimes crossing roads. Encounters like these highlight the importance of wildlife conservation and the need for humans to coexist with animals in their natural habitats.

Switching topics to Bonsai, they are miniature trees that are grown in small pots and meticulously shaped and pruned to maintain their small size. Bonsai cultivation is an ancient art form that originated in East Asia and has gained popularity worldwide. Due to their limited root space, Bonsai trees require regular watering to prevent them from drying out. The small pots can cause the soil to dry quickly, so it’s crucial to monitor the moisture levels and water them accordingly.

Finally, you mentioned observing a bird swooping in on a baby chipmunk through your window. This observation reflects a moment of nature in action, where a bird might have been hunting for food. Birds of prey and certain bird species, such as hawks or owls, are known to swoop down on small mammals like chipmunks as part of their natural hunting behavior. It’s fascinating to witness such interactions, as they provide insights into the dynamics of the animal kingdom.

Overall, these snippets of nature — whether they involve big trees, elephants, Bonsai trees, or bird predation — highlight the diversity and wonder of the natural world that surrounds us.

 

그 대답은 훨씬 더 둥글게 보였습니다. ChatGPT는 주어진 컨텍스트와 함께 수조 개의 문서에 대한 훈련을 통해 얻은 내부 지식을 사용하고 있었습니다.

그러나 ChatGPT 프롬프트에 맞지 않는 문서가 4개 이상(아마도 수천 또는 수백만 개) 있다고 가정해 보겠습니다. 이 경우 벡터 검색을 사용하여 답변을 포함할 가능성이 가장 높은 컨텍스트를 좁혀서 프롬프트에 추가하고 다음과 같이 동일한 질문을 할 수 있습니다.

ChatGPT answer

 

그런 다음 문서와 임베딩을 저장하는 데이터베이스를 가질 수 있습니다. 쿼리를 저장하고 쿼리를 기반으로 가장 관련성이 높은 문서를 찾는 다른 DB를 가질 수 있습니다.

Document DB (Left) and Quey DB (Right)

 

쿼리별로 가장 유사한 문서가 있으면 ChatGPT와 같은 LLM에 피드할 수 있습니다. 이 간단한 트릭으로 문서 검색을 사용하여 LLM을 확장했습니다. 이를 RAG(Retrieval Augmented Generation)라고도 합니다.


Building Industry-Specific Q&A Models Using RAG

RAG Prototype

 

위의 다이어그램은 질문 답변을 위해 사용자 정의 문서에 대해 LLM을 활용하는 기본 RAG를 구축하는 방법을 간략하게 보여줍니다.

첫 번째 부분은 여러 문서를 관리 가능한 청크로 분할하는 것입니다. 관련 매개변수는 최대 청크 길이입니다. 이러한 청크는 일반적인 질문에 대한 답변을 포함하는 텍스트의 일반적인(최소) 크기여야 합니다. 질문에 대한 답변이 문서 내의 여러 위치에 있을 수 있기 때문입니다.

예를 들어 '2015년부터 2020년까지 X 회사의 실적은 어땠습니까?'라는 질문을 할 수 있습니다. 또한 문서의 다른 부분에 수년간 회사 실적에 대한 특정 정보가 포함된 큰 문서(또는 여러 문서)가 있을 수 있습니다. 이상적으로는 이 정보가 포함된 문서의 모든 이질적인 부분을 캡처하고 함께 연결하고 이러한 필터링되고 연결된 문서 청크를 기반으로 응답하기 위해 LLM에 전달하기를 원할 것입니다.

 

최대 컨텍스트 길이(maximum context length)는 기본적으로 다양한 청크를 함께 연결하기 위한 최대 길이입니다. 질문 자체와 출력 답변을 위한 공간을 남겨둡니다(ChatGPT와 같은 LLM에는 질문, 컨텍스트 및 답변과 같은 모든 콘텐츠를 포함하는 엄격한 길이 제한이 있음을 기억하십시오. 

 

유사성 임계값(similarity threshold)은 질문을 문서 청크와 비교하여 답변을 포함할 가능성이 가장 높은 상위 청크를 찾는 방법입니다. 코사인 유사도는 일반적으로 사용되는 메트릭이지만 다른 메트릭에 가중치를 부여할 수 있습니다. 예를 들어 특정 키워드가 있는 문맥에 가중치를 더 주기 위해 키워드 측정항목을 포함합니다. 예를 들어 문서를 요약하기 위해 LLM에 질문을 할 때 '추상(abstract)' 또는 '요약(summary)'이라는 단어가 포함된 컨텍스트에 가중치를 부여할 수 있습니다.

 


결론

RAG는 ​​사용자 지정 문서에서 구동되는 LLM을 사용하는 좋은 방법을 제공합니다. Microsoft, Google 및 Amazon과 같은 회사는 조직에서 플러그 앤 플레이 방식으로 사용할 수 있는 앱을 구축하기 위해 경쟁하고 있습니다. 그러나 이 분야는 아직 초기 단계이며 맞춤형 문서에 대해 벡터 검색 기반 LLM을 사용하는 산업별 앱이 선두주자가 되어 경쟁에서 우위를 점할 수 있습니다.

 

어떤 LLM을 사용할지, 사용자 지정 문서에 대해 모델을 fine-tune하거나 완전히 훈련시킬지 여부를 묻는 사람들이 있었지만 LLM과 벡터 검색 간의 동기화를 엔지니어링하는 역할은 과소평가되었습니다. 다음은 응답의 품질을 크게 향상시키거나 저하시킬 수 있는 몇 가지 고려 사항입니다.

 

Length of document chunks (문서 청크의 길이)

올바른 답변이 텍스트의 다양한 부분에 포함되어 함께 연결해야 하는 경우 문서를 더 작은 청크로 분리하여 여러 컨텍스트를 쿼리에 추가할 수 있어야 합니다.

 

Similarity and retrieval metrics (유사성 및 검색 메트릭)

때로는 일반 코사인 유사성만으로는 충분하지 않습니다. 예를 들어 많은 문서에 동일한 주제에 대한 상충되는 정보가 포함되어 있는 경우 해당 문서 내의 메타데이터를 기반으로 특정 문서로 검색을 제한할 수 있습니다. 이를 위해 유사성 외에도 다른 필터링 메트릭을 사용할 수 있습니다.

 

Model Architecture (모델 아키텍처)

효율성과 확장성을 위해 벡터 임베딩 모델, 문서 데이터베이스, 프롬프트, LLM 모델 선택 등 다양한 측면을 고려해야 합니다.

 

Avoiding Hallucinations (환각 피하기)

증강된(augmented) ChatGPT는 네팔의 GDP에 맞는 금액을 얻었지만 연도는 틀렸습니다. 이러한 경우 프롬프트 선택, ChatGPT 친화적인 형식으로 데이터 추출, 환각이 있는 경우의 비율 및 어떤 솔루션이 잘 작동하는지 평가하는 것 사이에 많은 피드백이 필요합니다.


References

반응형