[RAG 시스템 구축] 벡터 데이터베이스부터 앙상블 리트리버까지 (1)

2026. 3. 31. 09:11·개념 정리 step2/AI Agent

대형 언어 모델(LLM)의 성능을 극대화하고 최신 정보를 반영하기 위한 RAG(Retrieval-Augmented Generation) 시스템의 핵심 구성 요소인 벡터 데이터베이스, 청킹 전략, 그리고 리트리버 활용법을 정리한다.


1. 벡터 데이터베이스 (Vector Database)

벡터 데이터베이스는 텍스트, 이미지, 오디오와 같은 비정형 데이터를 고차원 벡터(Vector) 형태로 변환하여 저장한다. 일반적인 RDBMS가 정확한 값(Keyword) 기반 검색에 특화되어 있다면, 벡터 DB는 의미적 유사성(Semantic Similarity)을 바탕으로 검색을 수행한다.

  • 핵심 원리: 코사인 유사도(Cosine Similarity), 내적(Dot Product), 유클리드 거리(Euclidean Distance) 등의 수학적 거리 계산을 활용한다.
  • 주요 용도: 추천 시스템, 검색 엔진, RAG 기반 질의응답 시스템.

크로마디비 (ChromaDB)

대표적인 오픈소스 벡터 데이터베이스로, 사용법이 간편하고 LangChain과 같은 프레임워크와의 통합이 뛰어나다. 로컬 환경에서 가볍게 실행 가능하며 벡터 인덱싱과 메타데이터 필터링을 동시에 지원한다.


2. 청크 (Chunk) 및 청킹 전략

긴 문서를 모델이 한 번에 처리할 수 있는 크기로 나누는 작업을 **청킹(Chunking)**이라 하며, 나뉜 조각을 **청크(Chunk)**라고 한다. 청크의 크기와 분할 방식은 검색 품질에 직접적인 영향을 미친다.

RecursiveCharacterTextSplitter

문자 기반으로 분할하되, 문장이나 단락이 가급적 깨지지 않도록 줄바꿈, 공백 등을 기준으로 재귀적으로 작동한다.

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 1000,
    chunk_overlap = 200, # 이전 청크의 끝부분을 포함하여 문맥 유지
    add_start_index = True
)

docs = text_splitter.split_documents(pages)

# 총 62개 만큼의 문서로 청킹되었습니다
# [3, 943, 996, 582, 126, 954, 916, 265, 982, 918]

SemanticChunker

단순히 길이를 기준으로 자르는 것이 아니라, 문장 간의 의미적 유사도를 계산하여 의미가 변화하는 지점에서 청크를 나눈다.

  • 장점: 문맥 유지력이 높고 검색 정확도가 향상됨.
  • 단점: 임베딩 모델 호출로 인해 속도가 느리고 비용이 발생하며, 청크 크기가 불균형할 수 있음.
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai import OpenAIEmbeddings

# 의미 기반 분할기 생성
semantic_splitter = SemanticChunker(OpenAIEmbeddings())
semantic_docs = semantic_splitter.split_documents(pages)

실전 팁: 하이브리드 청킹

1차적으로 SemanticChunker를 사용하여 의미 단위로 나누고, 너무 길어진 청크는 다시 RecursiveCharacterTextSplitter로 길이를 제한하는 방식을 주로 사용한다.


3. 리트리버 (Retriever)

리트리버는 사용자의 질문을 분석하여 벡터 DB에 저장된 가장 관련성 높은 청크를 찾아오는 역할을 수행한다.

벡터 리트리버 (Vector Retriever)

질문을 임베딩 벡터로 변환한 뒤 DB 내 벡터들과 유사도를 비교하여 결과를 반환한다.

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model='text-embedding-3-large')
vectorstore = Chroma.from_documents(
    documents=docs,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# 표준 리트리버 인터페이스 활용
vector_retriever = vectorstore.as_retriever(search_kwargs={'k': 3})

BM25 리트리버

전통적인 키워드 기반 검색 방식이다. 단어의 빈도(TF)와 역문서 빈도(IDF)를 고려하여 점수를 매긴다. 고유 명사나 특정 키워드 매칭이 중요한 경우 유리하다.

from langchain_community.retrievers import BM25Retriever

bm25_retriever = BM25Retriever.from_documents(docs)
bm25_retriever.k = 3

앙상블 리트리버 (Ensemble Retriever)

의미 기반 검색(Vector)과 키워드 기반 검색(BM25)의 장점을 결합한 방식이다. 가중치를 조절하여 검색의 상호 보완을 이룬다.

from langchain_classic.retrievers import EnsembleRetriever

ensemble_retriever = EnsembleRetriever(
    retrievers = [bm25_retriever, vector_retriever],
    weights = [0.6, 0.4] # BM25에 0.6, 벡터에 0.4 가중치 부여
)

query = 'AI 안전 등급(AI Safety Level)'
ensemble_result = ensemble_retriever.invoke(query)

요약

구성 요소 특징
Vector DB 고차원 벡터 저장 및 유사도 검색 수행
Recursive Chunking 속도가 빠르고 안정적인 길이 기반 분할
Semantic Chunking 문맥 중심의 고품질 분할 (임베딩 비용 발생)
Vector Retriever 의미 기반 검색 (Semantic Search)
BM25 Retriever 키워드 기반 검색 (Lexical Search)
Ensemble Retriever 두 방식의 가중 합산을 통한 검색 정확도 극대화

'개념 정리 step2 > AI Agent' 카테고리의 다른 글

[SQL RAG] LangChain과 LangGraph를 활용한 지능형 데이터베이스 질의 에이전트 구축(쿼리문 RAG)  (0) 2026.04.02
[RAG 시스템 구축] 벡터 데이터베이스, 환경 여부 평가, 코드 설정 (2)  (0) 2026.04.01
[LangGraph] LLM 도구 사용법 (Tool Calling & Agents) (5)  (0) 2026.03.23
[AI Agent] "Tool Calling Agent의 개념"과 "Tavily"를 활용한 웹 검색 챗봇 구현 (4)  (0) 2026.03.20
[LangGraph] 상태 업데이트 및 워크플로우 제어 (3)  (0) 2026.03.19
'개념 정리 step2/AI Agent' 카테고리의 다른 글
  • [SQL RAG] LangChain과 LangGraph를 활용한 지능형 데이터베이스 질의 에이전트 구축(쿼리문 RAG)
  • [RAG 시스템 구축] 벡터 데이터베이스, 환경 여부 평가, 코드 설정 (2)
  • [LangGraph] LLM 도구 사용법 (Tool Calling & Agents) (5)
  • [AI Agent] "Tool Calling Agent의 개념"과 "Tavily"를 활용한 웹 검색 챗봇 구현 (4)
고니3000원
고니3000원
공부 내용 정리, 자기발전 블로그 입니다. 기존 네이버 블로그에서 티스토리로 이전했습니다. https://blog.naver.com/pak1010pak
  • 고니3000원
    곤이의 공부 블로그
    고니3000원
  • 전체
    오늘
    어제
    • 분류 전체보기 (178) N
      • 1. AI 논문 + 모델 분석 (20)
        • AI 논문 분석 (13)
        • AI 모델 분석 (7)
      • 2. 자료구조와 알고리즘 (16)
        • 2-1 자료구조와 알고리즘 (13)
        • 2-2 강화학습 알고리즘 (3)
      • 3. 자습 & 메모(실전, 실습, 프로젝트) (25)
        • 3-1 문제 해석 (4)
        • 3-2 메모(실전, 프로젝트) (14)
        • 3-3 배포 실전 공부 (7)
      • 4. [팀] 프로젝트 및 공모전 (14)
        • 4-1 팀 프로젝트(메모, 공부) (1)
        • 4-2 Meat-A-Eye (6)
        • 4-3 RL-Tycoon-Agent (3)
        • 4-4 구조물 안정성 물리 추론 AI 경진대회(D.. (4)
      • 5. [개인] 프로젝트 및 공모전 (0)
        • 4-1 귀멸의칼날디펜스(자바스크립트 활용) (5)
        • 4-2 바탕화면 AI 펫 프로그램 (4)
        • 4-3 개인 프로젝트(기타) (3)
      • 개념 정리 step1 (32)
        • Python 기초 (7)
        • DBMS (1)
        • HTML | CSS (3)
        • Git | GitHub (1)
        • JavaScript (5)
        • Node.js (5)
        • React (1)
        • 데이터 분석 (6)
        • Python Engineering (3)
      • 개념 정리 step2 (57) N
        • Machine | Deep Learning (15)
        • 멀티모달(Multi-modal) (23)
        • 강화 학습 (10)
        • AI Agent (9) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 네이버 곤이의 블로그(Naver->Tistory)
    • Github
  • 공지사항

  • 인기 글

  • 태그

    EfficientNet
    자바스크립트
    논문 리뷰
    프로젝트
    알고리즘
    공모전
    OCR
    귀칼
    transformer
    파이썬
    javascript
    github
    paddleocr
    html
    bottleneck
    ViT
    Grad-CAM
    데이터분석
    Ai
    Python
    Attention Is All You Need
    강화 학습
    pandas
    강화학습
    구현
    Vision
    학습
    OCR학습
    파인튜닝
    자료구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고니3000원
[RAG 시스템 구축] 벡터 데이터베이스부터 앙상블 리트리버까지 (1)
상단으로

티스토리툴바