가던 2025. 4. 28. 22:13

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