Milvus Pipeline

wldbs._.·2025년 9월 22일

RAG

목록 보기
20/22
post-thumbnail

RAG에서 Milvus를 활용하고 있는데, 전반적인 파이프라인을 한 글에 정리해보고자 한다.


⭐ Milvus 한눈에 보기

  • Milvus = 벡터 데이터베이스. 문서/이미지/오디오 등을 임베딩으로 바꾼 뒤 “비슷한 것 찾기(유사도 검색)”에 최적화된 DB이다.
  • *컬렉션(collection)은 RDB의 테이블 느낌이고, 스키마(schema)**로 어떤 컬럼(필드)들을 가질지 정의한다. 각 행(row)이 한 개체(entity)이다. (Milvus)
  • Milvus 2.x는 데이터베이스(database) 계층이 있어서 여러 컬렉션을 논리적으로 묶고 멀티테넌시로 관리할 수 있다. (Milvus)

🎯 핵심 구성요소 이해하기

1) 데이터베이스 / 컬렉션 / 파티션

  • 데이터베이스(DB): 프로젝트·팀별 공간(네임스페이스). 그 안에 여러 컬렉션을 둠. (Milvus)
  • 컬렉션(Collection): 같은 구조의 데이터가 모인 “테이블”. 스키마가 반드시 필요하고, 스키마 제약을 만족해야만 삽입 가능. (Milvus)
  • 파티션(Partition): (선택) 큰 컬렉션을 논리적으로 쪼개 빠른 로드/검색, TTL 분리 등 운영 편의에 사용.

2) 스키마(Schema)

  • 필드(Fields):
    • 프라이머리 키: Int64 또는 VarChar(자동 증가 가능).
    • 벡터 필드: FloatVector(차원 dim 필수) 또는 BinaryVector 등.
    • 스칼라 필드: 메타데이터(예: title, ts, tag 등).
    • JSON 필드(옵션): 반정형 키-값 저장(중첩도 가능). 유연한 메타데이터용. (Milvus)

3) 데이터 타입(중요한 것들만)

  • 스칼라: Bool, Int8/16/32/64, Float, Double, VarChar, Array, JSON 등.

  • 벡터: BinaryVector, FloatVector에 더해 Float16Vector, BFloat16Vector, 그리고 희소 벡터 SparseFloatVector도 지원.

4) 메트릭(거리 함수)

임베딩 타입/모델에 맞춰 L2, IP, COSINE가 가장 흔하다.

  • (그 외 JACCARD, HAMMING, BM25도 있음—BM25는 희소 텍스트용) (Milvus)

🎯 인덱스(ANN)와 언제 쓰나

인덱스는 “빠른 근사 이웃 검색”을 위한 추가 구조(속도↑, 메모리/빌드코스트↑, 리콜은 소폭↓). (Milvus)

  • IVF_FLAT: 대용량, 빠른 쿼리.
    - nlist(클러스터 수), nprobe(탐색 버킷 수)로 속도·정확도 조절. 시작점으로 무난. (Milvus)
  • IVF_PQ: 메모리 절약형(양호한 속도, 리콜 약간 희생). 대규모에 적합. (Milvus)
  • HNSW: 그래프 기반, 매우 빠르고 정확도 좋지만 메모리 많이 씀. 지연에 아주 민감할 때. (Milvus)
  • DISKANN: SSD 기반 온디스크 인덱스(메모리 절약, NVMe 권장). 초대규모에 유용. (Milvus)
  • (GPU 환경이면 GPU_IVF_PQ 같은 GPU 인덱스도 가능) (Milvus)

🎯 일관성 레벨(Consistency Levels)

분산 DB에서 “읽기/쓰기 직후 보이는 데이터의 최신성 보장 수준”을 고르는 옵션이다.
Milvus는 Strong, Bounded(기본), Eventually, Session을 제공.

  • Strong: 가장 엄격(항상 최신 보장)
  • Bounded: “일정 시간/버전 이내의 최신성” 보장(기본값—성능/일관성 균형)
  • Eventually: 지연 후 결국 일치(성능↑, 최신성↓)
  • Session: 같은 세션 내에서는 일관되게 보임 업무 특성(검색 직후 삽입 데이터가 바로 보여야 하나?)에 맞춰 선택. (Milvus)

🧑‍💻기본 워크플로우

# pip install pymilvus
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility

connections.connect("default", host="localhost", port="19530")

# 1) 스키마 정의
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    FieldSchema(name="vec", dtype=DataType.FLOAT_VECTOR, dim=768),
]
schema = CollectionSchema(fields, description="demo collection")

# 2) 컬렉션 생성
col = Collection(name="demo", schema=schema)

# 3) 인덱스 생성(예: IVF_FLAT + COSINE)
col.create_index(field_name="vec", index_params={"index_type":"IVF_FLAT","metric_type":"COSINE","params":{"nlist":1024}})

# 4) 컬렉션 로드 후 삽입/검색
col.load()

# col.insert([...])  # id 자동 증가 시 id는 넣지 않음
# res = col.search(vectors=[qvec], anns_field="vec", param={"nprobe":16}, limit=5, output_fields=["title"])
  • ✅ 포인트: 벡터 차원(dim)은 입력 임베딩과 반드시 동일, 메트릭은 모델 권장값(L2/IP/COSINE) 사용. IP 쓰면 보통 정규화를 고려(혹은 COSINE 사용). (Milvus)

🎯 팁

  • 스키마 변경은 신중히: 컬렉션 생성 후 필드 추가/변경은 제약이 큼(처음에 설계를 탄탄히).
  • 인덱스/파라미터 튜닝: nlist, nprobe(IVF 계열)·M/efConstruction/ef(HNSW)로 속도↔정확도 트레이드오프 조정. (Milvus)
  • 온디스크 vs 인메모리: 메모리 압박이 크면 DISKANN 고려(SSD 필수). (Milvus)
  • 일관성 레벨: 검색에 “막 넣은 데이터가 바로 보여야” 하면 Strong/Session, 그렇지 않으면 Bounded(기본)로 시작. (Milvus)
profile
공부 기록용 24.08.05~ #LLM #RAG

0개의 댓글