본문 바로가기
project

RAG 시스템 구축을 위한 Vector DB 비교 (FAISS vs Chroma)

by alphaca202 2025. 3. 14.

1. VectorDB란 무엇인가? 
  • 데이터를 임베딩 벡터로 저장하고 검색하는 db
  • 관계형 db는 정보를 scalar data를 행, 열에 테이블 형태로 저장 - 정형 데이터 
    • 이런 형태로 저장하면 비정형 데이터를 저장하고 검색하기 어려움 - 이미지, 음성, 큰 자연어 텍스트 

 

  • AI에 들어가는 데이터들은 비정형 데이터가 많음
  • AI에게 넣어줄 정보를 빠르게 검색하기 위해서 빠른 임베딩 벡터 검색 시스템이 필요했음. 
  • 이런 니즈를 만족시켜준 것이 벡터 디비임. 
    • - Document 단위로 저장, ID 부여 
    • - 해시를 활용해 유사도가 높은 벡터들 추려서 비교 
    • - Embeddings - attributes, features 포함

 

 

2. Vector db를 쓰는 이유는? 
  • long-term 메모리 - ai의 컨텍스트 길이 문제를 해결하기 위해서 ai 와의 대화를 저장해놓고 상기시켜줌
  • semantic search - 효율적인 의미 기반 검색, Similarity search - 유사성 기반 검
  • 비정형 데이터의 효율적 관리
  • 유연한 확장성과 빠른 검색 속도

 

3. Vector db의 원리는? 

 

  • 임베딩 벡터
  • 해시 함수: 벡터를 해시값으로 변환하는 핵심 요소. 이 함수는 유사한 벡터가 같은 해시값으로 매핑될 가능성을 높인다
    • 해시값 생성 방법 : 유사성 보존 해시
    • LSH(Locality-Sensitive Hashing): 유사한 벡터들이 동일한 해시값을 가질 확률이 높도록 설계됩니다. 유사도 검색에 필수적입니다.
  • 인덱싱
    • IVF 인덱스
      • 벡터를 여러 개의 클러스터로 나누고, 각 클러스터에 인덱스를 생성합니다.
      • 클러스터를 찾는 과정에서 해시를 사용해 가장 유사한 클러스터를 빠르게 찾을 수 있습니다.
    • HNSW( Hierarchical Navigable Small World ):
      • 그래프 기반 인덱싱 방법
      • ANN 검색을 위한 고급 인덱싱 방법
  • 해시 테이블: 각 해시값(H1, H2 등)이 관련 벡터 ID를 가리키는 버킷을 형성합니다.
  • 검색 과정:
    • 쿼리가 입력됩니다
    • 쿼리가 해시 함수를 통해 해시값으로 변환됩니다
    • 해당 해시값의 버킷에서 후보 벡터들을 검색합니다
    • 후보군 중에서 가장 유사한 벡터를 최종 결과로 선택합니다

 

 

4. 사용할 수 있는 DB의 종류와 특성

 

  Chroma Faiss Milvus
유형 오픈소스 벡터 데이터베이스 고성능 벡터 검색 라이브러리 오픈소스 벡터 데이터베이스
인덱싱 방식 HNSW 기반 Flat, IVF, HNSW 등 다양한 인덱싱 제공 HNSW, IVF, PQ 등 다양한 인덱싱 지원
메타데이터 관리 벡터와 함께 저장 및 관리 가능 별도의 데이터베이스에서 관리 필요 (예: PostgreSQL) 메타데이터 관리 용이
영속성 영속성 보장 faiss.write_index()로 인덱스 파일 저장 가능 영속성 보장
실시간 검색 가능 가능 가능
분산형 아키텍처 미지원 미지원 지원
로컬 환경 사용 가능 여부 가능 가능 가능
주요 특징 Python 환경과의 연동 용이, 사용이 간편하지만 복잡한 커스텀 인덱싱 제한 GPU를 활용한 초고속 검색 가능 대규모 데이터셋에 적합한 분산형 아키텍처 제공, 고급 쿼리 지원

 

 

5. DB 성능 평가 지표
  • 검색 속도: 주어진 쿼리에 대해 얼마나 빠르게 결과를 반환할 수 있는가.
  • 정확도 (Precision): 검색된 결과 중 얼마나 관련성이 높은가.
  • 재현율 (Recall): 전체 관련 데이터 중 얼마나 많이 검색되었는가.
  • F1-Score: 정밀도와 재현율의 조화 평균을 통해 종합적인 성능을 평가할 수 있음.
  • 메모리 사용량: 인덱싱 및 검색 과정에서 소모되는 메모리의 효율성.
  • 확장성: 데이터가 많아질 때도 성능이 유지되는가.

 

6. 실제 내 데이터로 테스트

1) HTML 데이터 정리

2) 데이터 DB에 저장 - 청킹 단위 지정

3) 사용한 임베딩 모델

4) 쿼리 넣어보고 성능 테스트