이 글은 <Prompt Engineering Guide>를 참고해 작성하였습니다.
[Prompt Engineering Guide] 2. Techniques - (9) Retrieval Augmented Generation (RAG)
복잡하고 지식이 많이 필요한 작업에는, 외부 지식 출처를 참조하는 언어 모델 기반 시스템을 시도해볼 수 있습니다.
이 부가적인 시스템을 통해,
1) 사실의 일관성을 높이고
2) 생성된 응답의 신뢰성을 개선하며
3) 환각 문제를 완화하는 데 도움이 됩니다.
What is RAG(Retrieval Augmented Genaration)
RAG는 정보 검색 구성 요소와 텍스트 생성 모델을 결합한 방식입니다.
이를 통해 모델은 필요한 외부 지식을 동적으로 검색하고 이를 바탕으로 응답을 생성할 수 있습니다.
이 접근법은 재학습 없이 최신 정보를 사용할 수 있게 하여 신뢰성 있는 출력을 생성합니다.
RAG의 동작 원리
RAG은 입력을 받아 관련 있는 문서들을 검색하고,
검색된 문서들을 문맥으로 사용하여 기존 입력을 더욱 풍부하게 만드는 기법입니다.
RAG의 가장 큰 장점은 모델의 파라메트릭 지식이 고정되어 있어도, 최신 정보에 접근하여 응답을 생성할 수 있다는 점입니다. 이를 통해 RAG는 시간이 지나면서 진화하는 사실들을 반영할 수 있어 매우 유용합니다.
RAG 예시
from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration
from datasets import load_dataset
# RAG 모델과 토크나이저 로드
model_name = "facebook/rag-token-nq"
tokenizer = RagTokenizer.from_pretrained(model_name)
retriever = RagRetriever.from_pretrained(model_name, index_name="exact", passages_path=None)
model = RagSequenceForGeneration.from_pretrained(model_name, retriever=retriever)
# Wikipedia 데이터셋 로드 (간단한 예시로 NQ 데이터셋 사용)
dataset = load_dataset("natural_questions", split="test[:1%]")
# 첫 번째 질문을 선택
question = dataset[0]['question']
# 질문을 토큰화
input_dict = tokenizer.prepare_seq2seq_batch(src_texts=[question], return_tensors="pt")
# 검색기 사용하여 관련 문서 검색
retrieved_docs = retriever(input_dict["input_ids"], return_tensors="pt")
# RAG 모델을 통해 생성된 응답 얻기
generated_ids = model.generate(input_dict["input_ids"], retrieved_documents=retrieved_docs["retrieved_doc_ids"])
# 생성된 텍스트를 디코딩하여 출력
generated_text = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)
print(f"Question: {question}")
print(f"Answer: {generated_text[0]}")