[genAI] RAG 프로세스
https://gadeonyy.tistory.com/12
[GenAI] 검색 증강 생성 (RAG)이란 무엇인가요?
RAG에 앞서, Foundation Model이란?Foundation Model은 대규모의 비정형/비지도 데이터를 기반으로 학습된 AI 신경망 모델로, 다양한 작업에 범용적으로 적용될 수 있는 기반 모델을 의미합니다. 기존의 목
gadeonyy.tistory.com
지난 번에, "검색 증강 생성 (RAG)"에 대해서 알아보았는데요,
RAG 프로세스에 대해서 더 자세히 알아보겠습니다.

개괄적인 프로세스는 다음과 같습니다
Document Loader → Text Spliter → Embedding → Vector store → Retriever → Prompt → LLM → Chain
1.Document Loader
- 다양한 소스에서 문서를 불러오고 처리하는 과정을 의미합니다.
- 다양한 형식 지원: 내부 문서, DB, 웹사이트, API 등 다양한 소스에서 문서를 불러올 수 있습니다.
- 데이터 변환 및 정제: 로드한 문서 데이터를 전처리하여, Langchain의 다른 모듈이나 알고리즘이 처리하기 쉬운 형태로 변환합니다. 불필요한 데이터를 제거하거나, 구조를 변경할 수도 있습니다.
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("./file.pdf")
docs = loader.load()
# 메타 정보 확인
show_metadata(docs)
Document Loader 함수 선택 시 고려 사항
1) 문서의 텍스트를 잘 반환하는지 확인합니다.
페이지의 불필요한 부분은 제외하고 로드할 수 있도록 설정할 수 있습니다.
※ 모든 데이터 분석에서 원 데이터를 확인하고, 불러온 데이터가 잘 반환되는지 확인한 후 다음 단계를 진행해야 합니다.
2) 메타데이터가 처리하는 부분을 확인합니다.
[metadata]에서 문서 내용, 페이지 번호, 표, 차트 등의 속성 정보에서 어디까지 처리하는지 확인합니다.
메타 데이터를 통해서 효율적인 검색을 가능하게 하며, 정확한 응답을 생성할 수 있습니다.
3) 문서를 읽는 속도가 얼마나 빠른지 확인합니다.
결국 사용자가 응답을 반환받는 속도가 중요합니다. 문서를 검색하고, 생성하기까지의 정확도와 계산량을 고려하여 함수 및 파라미터를 조정해야 합니다.
2. Text Spliter
- LLM 모델의 입력 토큰의 개수가 정해져있기 때문에, 로드한 문서의 텍스트를 작은 단위로 나눠줍니다.
- 텍스트가 너무 긴 경우 핵심 정보 이외의 불필요한 정보가 포함되어 RAG의 응답이 부정확할 수 있습니다. 문서 내용과 목적에 따라 적절한 크기로 나누는 것이 매우 중요합니다.
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
splitters = text_splitter.split_documents(docs)
3. Embedding
- Text Split 단계에서 생성된 문서 단위를 숫자로 이루어진 벡터로 변환하는 과정을 의미합니다.
- 사용자가 입력한 질문 (Query)에 대하여 DB에 저장된 문서 조각/단락(chunk)을 검색하여 가져올 때 유사도 계산 시 활용됩니다.
- 의미 검색 (semantic Search): 자연 언어를 벡터 표현을 활용하여 사용자가 입력한 쿼리와 의미적으로 유사한 문서의 내용을 더 잘 이해하고 처리할 수 있습니다.
- 문서 분류 (Document Classification): 임베딩된 텍스트 벡터를 사용해 특정 카테고리나 주제에 할당하는 분류 작업에 사용됩니다.
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="모델버전")
※ 쿼리 임베딩도 문서 임베딩과 동일한 모델을 사용해야 한다.
embed_documents: 쿼리 집합을 입력으로 받아, 벡터 공간에 임베딩합니다. 주로 대량의 텍스트 데이터를 배치 단위로 처리할 때 사용됩니다.
embed_query: 단일 텍스트 쿼리를 입력으로 받아, 벡터 공간에 임베딩합니다. 사용자의 검색 쿼리를 임베딩하여 문서 집합 내에서 유사한 내용을 찾아내는 데 사용합니다.
4. Vector store
- 벡터스토어는 임베딩 벡터들을 효율적으로 저장하고 관리하는 시스템이나 데이터베이스를 의미합니다.
- 검색 과정에서 벡터를 빠르게 조회하고, 관련 문서를 신속하게 찾아내는 데 효과적입니다.
from langchain_community.vectorstores import FAISS
vectorstore = FAISS(documents, embedding = embeddings)
5. Retriever
- Retrieval Augmented Generation (RAG)에서 중요한 벡터스토어에서 문서를 검색하는 도구입니다.
- 문서를 로드하고 분할하여 임베딩한 데이터를 벡터스토어에 저장한 뒤, 검색 쿼리를 입력하면 저장된 벡터 DB에 사용자의 질문과 관련된 문서를 검색하는 과정을 수행합니다.
1) Cosine Similarity: 두 벡터 간 코사인 각도를 이용해 구할 수 있는 유사도를 의미합니다.
두 벡터 방향이 동일한 경우에는 1의 값을, 90°의 각을 이루면 0, 180° 반대 방향을 가지면 -1의 값을 갖게 됩니다.
2) MMR (Maximal Marginal Relevance): 이미 선택된 문서들과 새로운 문서 간의 유사성과 다양성을 고려하는 방법입니다.
즉, 사용자 질문에 대한 문서의 관련성은 유지하면서, 중복 없이 다양한 문서를 탐색할 수 있습니다.
※전체적인 맥락을 고려하여 응답을 반환하고자 하면 MMR이 유용할 수 있으나, 100% 정확한 응답을 요구할 경우에는 다른 방법을 사용해야 한다.
6. Prompt
7. LLM
8. Chain