로봇&AI/기술 소개

[LLM] RAG (Retrieval-Augmented Generation): GPT가 검색하는 법

해보좌 2024. 11. 21. 14:36

1. 기술의 원리

RAG(Retrieval-Augmented Generation)는 자연어 처리(NLP)에서 검색(Retrieval)생성(Generation) 모델을 결합한 기술입니다. 이 기술은 OpenAI GPT와 같은 생성 모델과, 검색 엔진 또는 정보 검색 시스템을 통합해, 더 사실적이고 신뢰할 수 있는 응답을 생성하는 것을 목표로 합니다.

RAG는 다음의 두 단계로 작동합니다:

  1. 검색 단계: 외부 데이터베이스나 문서 집합에서 질문과 관련된 정보를 검색.
  2. 생성 단계: 검색된 정보를 컨텍스트로 활용해 사용자 질문에 대한 텍스트 생성.

이 방식은 대규모 언어 모델(LLM)의 언어 생성 능력을 유지하면서도, 검색된 외부 데이터를 기반으로 답변을 생성하기 때문에 정보의 정확성과 신뢰성을 높이는 데 도움을 줍니다.


2. 기술의 장점

  1. 사실적 응답
    검색된 문서를 기반으로 응답을 생성하기 때문에 순수 생성 모델보다 사실적인 답변을 제공할 가능성이 높습니다.
  2. 동적인 정보 활용
    모델 훈련 시점 이후의 새로운 정보를 검색하여 활용 가능하므로 실시간 정보 제공에 적합합니다.
  3. 모듈식 구조
    검색과 생성 모듈이 독립적으로 동작하므로, 검색 엔진과 생성 모델을 각각 최적화하거나 교체할 수 있습니다.
  4. 다양한 데이터 소스 통합
    데이터베이스, 웹 크롤링 데이터, 또는 기업의 내부 문서를 쉽게 통합하여 질문 응답 시스템 구축 가능.

3. 기술에 필요한 사전 지식

  • Transformer 아키텍처: BERT, GPT와 같은 언어 모델의 구조 이해.
  • 정보 검색: 문서 검색 시스템, TF-IDF, BM25와 같은 검색 알고리즘.
  • 언어 생성 모델: 시퀀스-투-시퀀스(Seq2Seq) 모델 및 언어 생성 방법.
  • PyTorch 또는 Hugging Face: NLP 모델 구축 및 활용을 위한 필수 라이브러리.

4. 설치 방법

RAG를 구현하기 위해 Hugging Face 라이브러리와 필요한 검색 라이브러리를 설치합니다.

pip install transformers datasets faiss-gpu​

5. 기술의 여러 기능 및 사용 방법

1) RAG 기본 구조

RAG는 일반적으로 다음 두 가지 모델을 결합합니다:

  • 검색기(Retriever): Dense Passage Retrieval(DPR)이나 BM25 기반 검색 엔진.
  • 생성기(Generator): GPT, BART, 또는 T5 같은 언어 생성 모델.

2) 검색기 정의

from transformers import DPRQuestionEncoder, DPRContextEncoder, DPRQuestionEncoderTokenizer, DPRContextEncoderTokenizer
from transformers import AutoTokenizer

# 질문 인코더와 컨텍스트 인코더 초기화
question_encoder = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
context_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")

question_tokenizer = DPRQuestionEncoderTokenizer.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
context_tokenizer = DPRContextEncoderTokenizer.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")

3) 문서 검색 엔진 구축

FAISS를 사용해 검색 인덱스를 구축합니다.

import faiss
import numpy as np

# 문서 임베딩 생성
documents = ["문서 1 텍스트", "문서 2 텍스트", "문서 3 텍스트"]
context_embeddings = [context_encoder(context_tokenizer(doc, return_tensors="pt")["input_ids"]).pooler_output.detach().numpy() for doc in documents]

# FAISS 인덱스 생성
dimension = context_embeddings[0].shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(np.array(context_embeddings))

# 검색 예제
query = "질문 텍스트"
query_embedding = question_encoder(question_tokenizer(query, return_tensors="pt")["input_ids"]).pooler_output.detach().numpy()
distances, indices = index.search(query_embedding, k=2)

# 관련 문서 확인
retrieved_docs = [documents[i] for i in indices[0]]
print(retrieved_docs)

4) 생성 모델 연결

검색된 문서를 바탕으로 생성 모델이 답변을 생성합니다.

from transformers import BartForConditionalGeneration, BartTokenizer

# 생성 모델 초기화
generator = BartForConditionalGeneration.from_pretrained("facebook/bart-large")
generator_tokenizer = BartTokenizer.from_pretrained("facebook/bart-large")

# 검색된 문서를 입력으로 생성
retrieved_context = " ".join(retrieved_docs)
input_text = f"질문: {query} 컨텍스트: {retrieved_context}"
inputs = generator_tokenizer(input_text, return_tensors="pt", max_length=1024, truncation=True)

# 응답 생성
outputs = generator.generate(**inputs, max_length=200)
print(generator_tokenizer.decode(outputs[0], skip_special_tokens=True))​

6. 응용 방법

1) 대화형 AI

  • 고객 서비스에서 고객 질문에 신뢰할 수 있는 답변을 제공.
  • 예: 챗봇, 헬프데스크 응용 프로그램.

2) 문서 요약 및 질문 응답

  • 방대한 문서 집합에서 질문에 해당하는 정보를 검색하고 요약 제공.

3) 기업 데이터 활용

  • 내부 데이터베이스, 매뉴얼, 또는 정책 문서를 기반으로 한 지식 기반 AI 구축.

4) 학술 및 법률 검색

  • 학술 논문이나 법률 문서에서 관련 정보를 추출하여 간결하게 응답.

7. 응용 사례

  1. Google Bard 및 ChatGPT Plugin
    웹에서 실시간으로 정보를 검색하고 사용자 질문에 답변.
  2. OpenAI Retrieval Plugin
    회사 내부 데이터베이스에 연결하여 질문 응답 및 생성.
  3. Facebook Atlas
    대규모 문서 집합에서 사실 기반의 답변 생성.
  4. E-commerce 추천 시스템
    고객의 질문에 제품 정보와 리뷰를 검색 및 요약.

RAG는 검색과 생성의 장점을 결합하여 고품질의 사실 기반 응답을 생성할 수 있는 강력한 기술입니다. 특히, 대규모 언어 모델의 한계를 보완하면서도 새로운 응용 가능성을 열어줍니다.

'로봇&AI > 기술 소개' 카테고리의 다른 글

[LLM] spaCy: Python으로 자연어 처리하기  (3) 2024.11.19