5단 분석법
순서 | 분석 | 단어 | 내용 |
1 | 일반 명사 | Retrieval | (정보의) 검색 |
Augmented | 늘리다, 증가시키다 | ||
Generation | 생성하다 | ||
RAG | 검색을 늘려서 생성? | ||
2 | 고유 명사 | RAG | 대규모 언어 모델의 출력을 최적화하여 응답을 생성하기 전에 학습 데이터 소스 외부의 신뢰할 수 있는 지식 베이스를 참조하도록 하는 프로세스 |
3 | 사용 이유 | RAG | 최신 정보를 제공하며, 비용 효율적으로 신뢰성과 제어성을 높여 생성형 AI의 성능을 강화하기 때문에 |
4 | 사용 방법 | RAG | 질문을 입력받아 관련 정보를 검색한 후 이를 바탕으로 새로운 텍스트를 생성 |
5 | 다른 기술과의 비교 | RAG | - |
정의
일반 명사
Retrieval | (정보의) 검색 |
Augmented | 늘리다, 증가시키다 |
Generation | 생성하다 |
RAG | 검색을 늘려서 생성? |
Retrieval은 검색이라는 뜻을 가지고 있고, Augmented는 늘리다, 증가시키다라는 뜻을 가지고 있습니다.
Generation은 생성하다 입니다.
Retieval Augmented Generation(이하 RAG)의 뜻을 유추해보면, 검색을 늘려서 생성이라고 추측해 볼 수 있습니다.
고유 명사를 한 번 살펴볼까요?
고유 명사
RAG | 대규모 언어 모델의 출력을 최적화하여 응답을 생성하기 전에 학습 데이터 소스 외부의 신뢰할 수 있는 지식 베이스를 참조하도록 하는 프로세스 |
Retrieval Augmented Generation (RAG)은 대규모 언어 모델의 출력을 최적화하여 응답을 생성하기 전에 학습 데이터 소스 외부의 신뢰할 수 있는 지식 베이스를 참조하도록 하는 프로세스입니다.
"Retrieval"은 기존 데이터베이스나 문서에서 관련 정보를 검색하는 것(여기서는 벡터스토어)을 의미하며, "Generation"은 그 정보를 바탕으로 새로운 텍스트를 생성하는 것을 의미합니다.
Retrieval
•
역할
◦
쿼리 입력: 사용자가 입력한 질문이나 쿼리를 받습니다.
◦
문서 검색: 사전 정의된 문서 집합 또는 데이터베이스에서 입력된 쿼리와 관련성이 높은 문서를 검색합니다.
◦
정보 제공: 검색된 문서를 생성 모델(RAG 모델)에 제공하여 답변을 생성하는 데 도움을 줍니다.
Generation
•
역할
◦
입력 (≒ 쿼리) 토큰화: 검색된 문서와 입력된 질문을 토큰화합니다. 토크나이저(tokenizer)는 텍스트 데이터를 모델이 처리할 수 있는 형태로 변환합니다.
◦
모델 입력: 토큰화된 입력 데이터를 생성 모델에 전달합니다. 생성 모델은 사전 학습된 대규모 언어 모델(LLM)로, 입력된 텍스트의 패턴과 의미를 이해합니다.
◦
답변 생성: 생성 모델은 질문과 검색된 문서를 바탕으로 새로운 텍스트를 생성합니다. 이 과정은 모델의 사전 학습된 지식과 검색된 외부 정보를 결합하여 이루어집니다.
RAG는 Facebook AI Research (FAIR)에서 개발한 특정 모델을 지칭하기도 합니다.
이 모델은 OpenAI의 GPT와 같은 대형 언어 모델과 결합하여 보다 효과적인 텍스트 생성 및 정보 검색을 수행합니다.
비용 절감형 RAG 활용
graph LR A[사용자 쿼리] --> B[쿼리 임베딩] B --> C[벡터 스토어 검색] C --> D[관련 문서 검색] D --> E{충분한 정보?} E -->|Yes| F[문서 기반 응답 생성] E -->|No| G[프롬프트 구성] G --> H[LLM API 요청] H --> I[LLM 기반 응답 생성] F --> J[최종 응답] I --> J I --> K[벡터 DB 학습] K --> L[학습 완료] style C fill:#f9f,stroke:#333,stroke-width:2px style D fill:#f9f,stroke:#333,stroke-width:2px style F fill:#f9f,stroke:#333,stroke-width:2px style H fill:#f9f,stroke:#333,stroke-width:2px style I fill:#f9f,stroke:#333,stroke-width:2px style E fill:#ffd9e1,stroke:#333,stroke-width:2px style G fill:#ffd9e1,stroke:#333,stroke-width:2px
Mermaid
복사
사용자 쿼리 | 사용자로부터 입력받은 질문이나 요청 |
쿼리 임베딩 | 사용자 쿼리를 벡터로 변환 |
벡터 스토어 검색 | 변환된 쿼리 벡터와 유사한 문서 벡터를 검색 |
관련 문서 검색 | 유사도가 높은 관련 문서들을 추출 |
충분한 정보? | 검색된 문서만으로 답변 가능한지 판단
• Yes: 문서 기반 응답 생성으로 진행
• No: LLM을 사용한 응답 생성 과정으로 진행 |
문서 기반 응답 생성 | 검색된 문서 정보만을 이용해 응답 생성 |
프롬프트 구성 | 사용자 쿼리와 검색된 관련 문서를 결합하여 LLM용 프롬프트 생성 |
LLM API 요청 | 구성된 프롬프트를 LLM API에 전송 |
LLM 기반 응답 생성 | LLM이 생성한 응답 생성 |
최종 응답 | 문서 기반 또는 LLM 기반 응답을 사용자에게 제공 |
벡터 DB 학습 | 생성된 최종 응답을 벡터화하여 벡터 DB에 추가 |
학습 완료 | 새로운 정보가 벡터 DB에 성공적으로 추가됨 |
최신 정보 제공 RAG 활용
graph LR A[사용자 쿼리] --> B[쿼리 임베딩] B --> C[벡터 스토어 검색] C --> D[관련 문서 검색] D --> E[프롬프트 구성] A --> E E --> F[LLM API 요청] F --> G[LLM 응답 생성] G --> H[최종 응답]
Mermaid
복사
사용자 쿼리 | 사용자로부터 입력받은 질문이나 요청 |
쿼리 임베딩 | 사용자 쿼리를 벡터로 변환 |
벡터 스토어 검색 | 변환된 쿼리 벡터와 유사한 문서 벡터를 검색 |
관련 문서 검색 | 유사도가 높은 관련 문서들을 추출 |
프롬프트 구성 | 사용자 쿼리와 검색된 관련 문서를 결합하여 LLM용 프롬프트 생성 |
LLM API 요청 | 구성된 프롬프트를 LLM API에 전송 |
LLM 응답 생성 | LLM이 프롬프트를 바탕으로 응답 생성 |
최종 응답 | 생성된 응답을 사용자에게 제공 |
사용 이유
RAG | 최신 정보를 제공하며, 비용 효율적으로 신뢰성과 제어성을 높여 생성형 AI의 성능을 강화하기 때문에 |
이유 | 설명 |
비용 효율적인 구현 | 파운데이션 모델(FM)을 사용하는 대신, RAG는 LLM에 새 데이터를 도입하는 비용 효율적인 접근 방식을 제공합니다.
이를 통해 계산 및 재정적 비용을 절감하면서도 생성형 AI 기술을 폭넓게 활용할 수 있습니다. |
정확성 향상 | 기존 데이터베이스에서 관련 정보를 검색하여 보다 정확한 답변을 제공 |
정보의 풍부함 | 검색된 정보를 바탕으로 새로운 정보를 생성하여 응답의 질을 높임 |
최신 정보 제공 | LLM의 훈련 데이터는 정적이지만, RAG는 최신 연구, 통계, 뉴스 등을 제공할 수 있도록 LLM을 자주 업데이트되는 정보 소스에 연결합니다.
이를 통해 사용자는 항상 최신 정보를 받을 수 있습니다. |
RAG 장점
RAG 모델은 Retrieval과 Generation의 조합을 통해, 사전 학습된 언어 모델의 한계를 넘어서는 답변을 생성할 수 있습니다.
장점 | 설명 |
확장된 지식 범위 | 모델이 학습 데이터에만 의존하지 않고, 외부 지식 베이스를 참조하여 더 정확하고 신뢰할 수 있는 정보를 제공합니다. |
최신 정보 활용 | 외부 데이터베이스를 참조함으로써 최신 정보를 반영할 수 있습니다. |
문맥 이해 | 질문과 관련된 문서를 검색하여 문맥에 맞는 답변을 생성할 수 있습니다. |
사용 방법
RAG | 질문을 입력받아 관련 정보를 검색한 후 이를 바탕으로 새로운 텍스트를 생성 |
1. 라이브러리 임포트 및 모델 로드
!pip install transformers
!pip install faiss-cpu
!pip install datasets
Bash
복사
from transformers import RagTokenizer, RagRetriever, RagTokenForGeneration
import torch
Python
복사
•
라이브러리 임포트: Hugging Face의 transformers 라이브러리에서 필요한 클래스를 임포트합니다.
◦
RagTokenizer: RAG 모델을 위한 토크나이저.
▪
RAG 모델을 위한 토크나이저로, 사용자가 입력한 쿼리를 토큰화하여 모델이 처리할 수 있는 형태로 변환합니다.
◦
RagRetriever: RAG 모델의 리트리버.
▪
RAG 모델의 리트리버로, 임베딩 모델을 거쳐 생성된 벡터를 기반으로 벡터 스토어에서 문서를 검색합니다.
◦
RagTokenForGeneration: 텍스트 생성을 위한 RAG 모델.
•
PyTorch 임포트: RAG 모델은 PyTorch를 사용합니다.
토크나이저가 뭔가요?
토크나이저란, 텍스트를 모델이 이해할 수 있는 작은 단위(토큰)로 변환하는 도구로, 단어, 부분 단어, 혹은 문자 단위로 텍스트를 분할하여 수치화합니다.
2. 토크나이저 및 모델 로드
# 토크나이저 및 모델 로드
tokenizer = RagTokenizer.from_pretrained("facebook/rag-token-nq")
# exact: 유사도 계산 시 정확한 검색을 의미, use_dummy_dataset=True: 실제 데이터를 사용하지 않고 더미 데이터셋을 사용하는 옵션
retriever = RagRetriever.from_pretrained("facebook/rag-token-nq", index_name="exact", use_dummy_dataset=True)
model = RagTokenForGeneration.from_pretrained("facebook/rag-token-nq", retriever=retriever)
Python
복사
•
토크나이저 로드: RagTokenizer를 사전 학습된 facebook/rag-token-nq 모델에서 로드합니다.
•
리트리버 로드: RagRetriever를 사전 학습된 동일한 모델에서 로드합니다.
◦
index_name="exact": 정확한 인덱스를 사용합니다.
◦
use_dummy_dataset=True: 더미 데이터셋을 사용하여 리트리버(retriever)를 초기화합니다.
•
모델 로드: RagTokenForGeneration을 로드하고 리트리버를 연결합니다.
Do you wish to run the custom code? [y/N] 이런 질문이 뜨면 y를 입력하고 엔터를 누르시면 됩니다.
•
모델 로딩 과정에서 사용자 정의 코드를 실행할지 묻는 질문이며, y를 눌러야 정상적으로 모델과 리트리버가 로드됩니다.
3. 질문 정의
# 질문 정의
question = "What is the capital of France?"
Python
복사
•
질문 정의: 모델에 입력할 질문을 정의합니다.
4. 입력 텍스트를 토크나이즈
# 입력 텍스트를 토크나이즈
# input_ids: 텍스트가 고유한 토큰 ID로 변환된 배열을 의미
input_ids = tokenizer(question, return_tensors="pt").input_ids
Python
복사
•
토크나이즈: 질문을 토크나이즈하여 입력 아이디(input_ids)로 변환합니다.
◦
return_tensors="pt": PyTorch 텐서 형식으로 반환합니다.
5. 답변 생성
# 답변 생성
with torch.no_grad(): # 피드포워드만 하고 백프로파게이션을 안하겠다는 의도가 있는 코드, 왜냐하면 학습을 하는 것이 아니라 사용만 하겠다는 것이니까 백프로파게이션은 안하는 것.
output_ids = model.generate(input_ids)
Python
복사
•
그래디언트 비활성화: torch.no_grad() 컨텍스트를 사용하여 그래디언트(기울기)를 계산하지 않도록 설정합니다.
•
답변 생성: model.generate 메서드를 사용하여 입력 아이디에 대한 답변을 생성합니다.
◦
input_ids: 토크나이즈된 질문.
그래디언트를 비활성화 하는 이유가 뭐에요?
그래디언트는 모델 학습(training) 시에만 필요하기 때문에, 추론 시에는 이를 계산하지 않음으로써 메모리를 절약하고 연산 속도를 높일 수 있습니다.
이를 통해 더 정확하고 빠른 모델 추론이 가능해집니다.
6. 생성된 텍스트 디코딩
# 생성된 텍스트 디코딩
generated_text = tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0]
Python
복사
•
디코딩: 생성된 출력 아이디(output_ids)를 텍스트로 디코딩합니다.
◦
batch_decode는 토큰 ID 배열을 사람이 읽을 수 있는 텍스트로 변환하는 함수
◦
skip_special_tokens=True: 특수 토큰을 무시하고 디코딩합니다.
▪
특수 토큰(예: [CLS], [SEP], <PAD>)을 제거한 상태로 디코딩합니다. 이 옵션을 활성화하면, 특수 토큰들이 최종 출력에서 생략되어 더 깔끔한 결과가 나옵니다
•
[CLS] (Classification Token): 문장의 시작을 나타내는 특수 토큰입니다. 주로 문장 분류 작업에서 사용됩니다.
•
[SEP] (Separator Token): 두 개의 문장이나 문서를 구분하는 데 사용됩니다. 문장 분리 또는 다중 문장 입력에서 중요한 역할을 합니다.
•
<PAD> (Padding Token): 문장 길이를 맞추기 위해 사용되는 토큰입니다. Transformer 모델은 고정된 길이로 입력을 처리하므로, 문장의 길이가 다를 경우 짧은 문장을 고정 길이에 맞추기 위해 패딩을 추가합니다.
◦
[0]: 첫 번째 결과만 선택합니다.
특수 토큰을 무시하고 디코딩 하는 이유가 뭐에요?
특수 토큰을 무시하고 디코딩하는 이유는 생성된 텍스트의 가독성과 의미를 높이기 위함입니다.
특수 토큰은 모델의 내부 처리와 제어를 위해 사용되며, 최종 출력에는 불필요합니다.
따라서 skip_special_tokens=True 옵션을 사용하여 이러한 토큰을 제거하면, 사용자에게 더 자연스럽고 이해하기 쉬운 텍스트를 제공합니다.
7. 결과 출력
print("Question:", question)
print("Answer:", generated_text)
Python
복사
•
출력: 질문과 생성된 답변을 출력합니다.