본문 바로가기

인공지능(AI) 이론과 코드/6. 자연어처리(NLP)

[생성형 AI] RAG 뜻 의미(검색 증강 생성, Retrieval-Augmented Generation)

 

 

RAG(Retrieval-Augmented Generation)

 

[한 줄 정의]

RAG는 검색 결과를 활용하여 텍스트 생성 모델의 성능을 향상시키는 기술

 

[ 설명 ]

 

 RAG는 텍스트를 생성하는 모델에 검색 결과를 포함하여 더 나은 결과물을 만들어내는 기술입니다. 이는 우리가 검색 엔진을 사용하여 정보를 찾을 때와 비슷한 방식으로 동작합니다. 예를 들어, 주어진 주제에 대한 정보를 검색하고 해당 정보를 기반으로 텍스트를 생성함으로써 더욱 정확하고 다양한 내용을 생성할 수 있습니다.

 

좀 더 구체적으로는 대규모 언어 모델 (Large language model, LLM) *의 출력을 최적화하여 , 답변을 생성하기 전에 학습 데이터 소스 외부의 도메인 지식(이를 테면 산업군이나 기업 고유의 DB)를 참조하도록 하는 프로세스입니다.

 

대규모 언어 모델 (Large language model, LLM)   : 방대한 양의 데이터를 기반으로 사전 학습된 초대형 딥 러닝 모델

 

대규모 언어 모델(LLM)은 방대한 양의 데이터를 기반으로 학습되며, 수십억 개의 매개 변수를 사용하여 질문에 대한 답변, 언어 번역, 문장 완성과 같은 작업에 대한 독창적인 결과를 생성합니다. RAG는 이미 강력한 LLM의 기능을 특정 도메인이나 조직의 내부 지식 기반으로 확장하므로 모델을 다시 교육할 필요가 없습니다. 이는 LLM 결과를 개선하여 다양한 상황에서 관련성, 정확성 및 유용성을 유지하기 위한 비용 효율적인 접근 방식입니다. - AWS -

 

[ 연구논문 ]

  1. Sean MacAvaney 등, "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks" - 해당 논문은 RAG의 기본 원리와 사용 사례에 대해 상세히 다루고 있습니다.
  2. Patrick Lewis 등, "Retrieval-Augmented Generation (RAG)" - 이 논문은 RAG 모델의 구현과 성능을 분석하고 있습니다.

둘 중, 첫번째 논문인 " Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks" 에 대해 아래와 같이 알아보겠습니다. 이 논문은 2020년 발표된 논문으로 1,440회 인용되었습니다.('24.2.16 기준)


 

[ 논문요약 ]

 

해당 논문은 "지식 집약형 자연어 처리(NLP) 작업을 위한 검색 보강 생성(Retrieval-Augmented Generation)"에 대한 연구를 다루고 있습니다. 기존의 NLP/LLM 작업에서 발생하는 문제* 에 대응하기 위해 제안된 방법으로써 검색 보강 생성을 소개하고 있습니다. 이러한 방법은 지식 베이스로부터 정보를 검색하여 생성 모델의 성능을 향상시킵니다.

 

* LLM의 알려진 문제점은 다음과 같습니다.

- (환각현상) 답변이 없을 때 허위 정보를 제공합니다.
- (일반화) 사용자가 구체적이고 최신의 응답을 기대할 때 오래되었거나 일반적인 정보를 제공합니다.
- (출처) 신뢰할 수 없는 출처로부터 응답을 생성합니다.
- (용어혼동) 용어 혼동으로 인해 응답이 정확하지 않습니다.

- (내용오류) 다양한 훈련 소스가 동일한 용어를 사용하여 서로 다른 내용을 설명합니다.

 

이 논문에서는 먼저 지식 집약형 NLP 작업의 중요성과 도전 과제에 대해 논의됩니다. 특히, 문서 생성, 요약 및 질문 답변과 같은 작업에서의 성능 향상을 위해 검색 기능이 필요한 경우가 많다는 점이 강조됩니다. 이에 대한 대안으로, RAG(Retrieval-Augmented Generation)이라는 모델이 제안되며, 이 모델은 생성 모델과 검색 모델을 통합하여 더욱 강력한 성능을 제공합니다.

 

RAG 모델은 두 가지 주요 구성 요소로 구성됩니다. 첫째, 검색을 위한 ① 검색기가 있고, 둘째, 생성을 위한 ② 생성기가 있습니다. 검색기는 주어진 쿼리에 대해 관련된 정보를 검색하고, 생성기는 해당 정보를 기반으로 텍스트를 생성합니다. 이러한 두 가지 요소는 함께 작동하여 NLP 작업에 대한 효과적인 해결책을 제공합니다.

 

본 논문은 또한 RAG 모델을 구축하기 위한 세부 사항과 모델의 특징을 소개합니다. 특히, 검색기는 학습된 질의-문서 유사도를 기반으로 쿼리와 관련된 문서를 검색하는데 사용됩니다. 생성기는 검색된 정보를 바탕으로 텍스트를 동적으로 생성하며, 검색된 정보를 참조하여 보다 정확하고 다양한 결과를 제공할 수 있습니다.

 

실험 결과는 RAG 모델이 다양한 NLP 작업에서 우수한 성능을 보인다는 것을 보여줍니다. 특히, 요약 및 질문 답변 작업에서 기존 모델보다 뛰어난 성능을 보이며, 이는 검색된 정보를 활용하여 생성된 결과의 품질이 높다는 것을 시사합니다. 따라서 RAG 모델은 지식 집약형 NLP 작업에 대한 새로운 효과적인 접근 방식을 제시하며, 이를 통해 보다 정확하고 유용한 결과를 얻을 수 있습니다.

 

해당 논문은 아래 아카이브에서 직접 확인이 가능합니다.

 

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

 


 

[ 수학적인 개념 ]

 

RAG에서 사용되는 핵심 개념 중 하나는 쿼리와 관련된 문서의 유사도를 계산하는 것입니다. 이는 보통 코사인 유사도와 같은 유사도 척도를 사용하여 계산됩니다. 코사인 유사도는 두 벡터 간의 각도를 기반으로 벡터의 유사성을 측정합니다.

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks

 


 

[ RAG 개념도 ]

 

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
https://www.anyscale.com/blog/a-comprehensive-guide-for-building-rag-based-llm-applications-part-1

 

① 질의를 임베딩 모델에 전달하여 해당하는 벡터로 의미론적으로 표현합니다.

② 임베딩된 질의 벡터를 벡터 데이터베이스에 전달합니다.

③ 질의 임베딩과 지식 베이스 내 모든 임베딩된 청크 사이의 거리에 의해 측정된 상위 k개의 관련 컨텍스트를 검색합니다.

④ 질의 텍스트와 검색된 컨텍스트 텍스트를 언어 생성 모델에 전달합니다.

⑤ 언어 생성 모델은 제공된 내용을 사용하여 응답을 생성합니다.


 

[ 파이썬 코드 구현 샘플 ] 

 

아래 코드는 주어진 쿼리에 대해 RAG 모델을 활용하여 텍스트를 생성하는 간단한 예제입니다.

from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration
from transformers import pipeline

# RAG 토크나이저 불러오기
tokenizer = RagTokenizer.from_pretrained("facebook/rag-token-base")

# RAG 리트리버 불러오기
retriever = RagRetriever.from_pretrained("facebook/rag-token-base")

# RAG 생성기 불러오기
generator = RagSequenceForGeneration.from_pretrained("facebook/rag-token-base")

# 텍스트 생성 함수 정의
def generate_text(query):
    input_dict = tokenizer.prepare_query_input(query, return_tensors="pt")
    retriever_output = retriever(input_dict["input_ids"], return_tensors="pt")
    generator_output = generator.generate(
        input_ids=retriever_output["retrieved_input_ids"],
        attention_mask=retriever_output["retrieved_attention_mask"],
    )
    generated_text = tokenizer.batch_decode(generator_output, skip_special_tokens=True)
    return generated_text

# 예시 사용법
query = "Albert Einstein"
generated_text = generate_text(query)
print(generated_text)

 

다음은 PAPERS WITH CODE 에서 연결된 스타가 가장 많은 Pytorch 코드입니다.

https://github.com/huggingface/transformers

 

GitHub - huggingface/transformers: 🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX.

🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX. - huggingface/transformers

github.com

 

논문 원문은 아래에서 pdf로 다운로드 받으실 수 있습니다.

https://arxiv.org/pdf/2005.11401v4.pdf

 

반응형
LIST