RAG(Retrieval-Augmented Generation) 시스템에서는 사용자의 질의(Query)에 대한 관련 문서를 검색하는 데 주로 두 가지 방식이 사용됩니다. Sparse Retrieval(희소 검색)과 Dense Retrieval(밀집 검색)이 그것입니다. 이 두 검색 방식은 텍스트를 벡터로 표현하고 유사도를 계산하는 방식에서 차이를 보입니다.
RAG의 핵심은 검색기입니다. 사용자의 질문에 대해 정확한 정보 제공을 하기위해서는 검색기가 사용자 질문과 가장 관련성 높은 정보를 검색해 LLM이 정확하고 유용한 답변을 생성할 수 있도록 해야합니다. 검색이 효과적으로 이루어지지 않으면, 결과적으로 제공되는 답변의 품질이 떨어질 수 있습니다. 또한 검색 시간도 중요합니다. 효율적인 검색 알고리즘은 데이터베이스에서 정보를 빠르게 검색하여 전체적인 시스템 응답 시간을 단축시킵니다.
RAG 뿐만아니라 정보 검색 시스템에서 사용하는 대표적인 검색기법인 Sparse Retreival과 Dense Retrieval 중심으로 각각의 특징과 차이점을 설명해보겠습니다.
Sparse Retriever vs. Dense Retriever 차이점
Sparse Retriever | Dense Retriever | |
기본 개념 | 단어 기반의 희소 벡터 표현(TF-IDF, BM25) | 신경망을 통한 밀집 벡터 표현(Embedding) |
검색 방식 | 키워드 일치 기반 | 의미적 유사도 기반 |
모델 예시 | BM25, TF-IDF | BERT, SBERT, DPR, OpenAI Embeddings |
장점 | 해석 가능성 높음, 빠른 검색 속도 | 의미 기반 검색, 유사한 개념 탐색 가능 |
단점 | 문장 의미를 완전히 이해하지 못함 | 학습된 임베딩 필요, 계산 비용이 높음 |
대표 사용 사례 | 전통적인 검색 엔진, 법률, 뉴스 검색 | FAQ 검색, 챗봇, 문서 요약 및 RAG |
Sparse Retriever (희소 검색) 설명
Sparse Retriever는 단어의 출현 빈도 및 중요도를 기반으로 문서를 검색하는 방식입니다. 대표적인 알고리즘으로는 BM25와 TF-IDF가 있으며, 사용자가 입력한 쿼리와 정확히 일치하는 키워드를 찾는 데 초점을 둡니다.
BM25의 작동 원리
- 문서에서 특정 단어의 빈도를 계산하고, 해당 단어가 전체 문서에서 얼마나 희귀한지 고려.
- 짧은 문장보다 긴 문장을 검색할 때 강력한 성능 제공.
TF-IDF 작동 원리
- 문서에서 단어가 많이 나올수록 점수(TF)가 높아짐.
- 단어가 여러 문서에서 자주 등장할수록 점수(IDF)가 낮아짐.
- 특정 문서에서 중요한 단어일 경우 높은 TF-IDF 점수를 갖게 됨.
LangChain을 통한 Sparse Retriever 예제 (BM25 사용)
from langchain.vectorstores import FAISS
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
# 문서 로딩 및 전처리
loader = TextLoader("example.txt")
documents = loader.load()
# 문서 분할
text_splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=50)
docs = text_splitter.split_documents(documents)
# Sparse retriever (BM25 사용)
retriever = FAISS.from_texts([doc.page_content for doc in docs], OpenAIEmbeddings())
query = "절세 방법에 대해 설명해줘"
retrieved_docs = retriever.similarity_search(query)
for doc in retrieved_docs:
print(doc.page_content)
Dense Retriever (밀집 검색) 설명
Dense Retriever는 문서의 의미적 유사도를 평가하기 위해 신경망을 활용하여 벡터 임베딩을 생성합니다. 이 방식은 단순한 키워드 매칭을 넘어, 쿼리와 문서 간의 의미적 유사도를 고려하는 것이 특징입니다.
대표적인 Dense 모델
- DPR (Dense Passage Retriever): 질문과 문서 간 의미적 일치도를 학습.
- SBERT (Sentence-BERT): 문장 간 의미 비교에 사용.
- OpenAI Embeddings: GPT 기반 임베딩 활용.
LangChain을 통한 Dense Retriever 예제 (OpenAI Embeddings 사용)
from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.document_loaders import TextLoader
# 문서 로드 및 임베딩 생성
loader = TextLoader("example.txt")
documents = loader.load()
# OpenAI Embeddings 사용
embeddings = OpenAIEmbeddings()
# Dense Retriever 생성
db = FAISS.from_documents(documents, embeddings)
# 쿼리 검색
query = "절세를 위한 최고의 방법은?"
retrieved_docs = db.similarity_search(query)
for doc in retrieved_docs:
print(doc.page_content)
Sparse vs. Dense Retriever 비교 분석 요약
항목 | Sparse Retriever | Dense Retriever |
검색 원리 | 키워드 매칭 기반 | 의미적 유사도 기반 |
장점 | 빠른 검색 속도, 해석 용이 | 의미적 일치 탐색 가능, 정확도 높음 |
단점 | 문맥을 반영하지 못함 | 계산 비용이 높음, 훈련 데이터 필요 |
사용 추천 상황 | 법률 문서, 전통적인 검색 | 챗봇, FAQ, 문서 추천 시스템 |
대표 알고리즘 | BM25, TF-IDF | SBERT, DPR, OpenAI Embeddings |
하이브리드 접근법 (Sparse + Dense 통합)
Sparse와 Dense 검색 방법을 결합하여 더 우수한 성능을 달성할 수 있습니다. 예를 들어, BM25로 1차 필터링을 수행한 후 Dense Retriever로 재정렬하는 방식이 효과적입니다.
from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.document_loaders import TextLoader
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 문서 로드 및 임베딩 생성
loader = TextLoader("example.txt")
documents = loader.load()
# Sparse Retriever (BM25)
sparse_retriever = FAISS.from_documents(documents, OpenAIEmbeddings())
# Dense Retriever (OpenAI Embeddings)
dense_retriever = FAISS.from_documents(documents, OpenAIEmbeddings())
# 하이브리드 검색
retrieved_sparse = sparse_retriever.similarity_search("절세 방법")
retrieved_dense = dense_retriever.similarity_search("절세 방법")
final_results = retrieved_sparse + retrieved_dense
for doc in final_results:
print(doc.page_content)
Sparse vs Dense Retriever 어떤걸 써야할까요?
Sparse Retriever 사용 추천
- 키워드 기반 검색이 필요한 경우 (법률, 뉴스 아카이브)
- 빠른 검색이 필요한 경우
- 연산 비용이 중요한 경우
Dense Retriever 사용 추천
- 의미적 일치가 중요한 경우 (질문 답변, 챗봇)
- 문장의 숨겨진 의미를 찾아야 하는 경우
- 최신 AI 기술 활용이 가능한 환경
하이브리드 접근법 추천
- 정확성과 효율성을 동시에 고려해야 하는 프로젝트
- 검색 결과의 신뢰성과 다각적 분석이 필요한 경우
맺음말
Sparse Retriever와 Dense Retriever는 각각의 장점과 단점이 뚜렷하며, 사용 사례에 따라 적합한 방법이 달라질 수 있습니다. Sparse Retriever는 키워드 기반의 빠르고 해석 가능한 검색을 제공하지만, 문맥을 충분히 반영하지 못하는 한계가 있습니다. 반면, Dense Retriever는 의미 기반의 정교한 검색이 가능하지만 높은 계산 비용과 학습된 임베딩이 필요합니다.
따라서 프로젝트의 특성과 요구사항에 따라 적합한 검색 방식을 선택하거나, 하이브리드 접근법을 통해 두 방식의 장점을 결합하여 활용하는 것이 가장 이상적입니다. RAG 시스템에서 검색기의 역할은 매우 중요하며, 적절한 검색 방법의 선택은 전반적인 시스템 성능과 사용자 경험을 크게 향상시킬 수 있습니다.