RAG에서 Milvus를 활용하고 있는데, 전반적인 파이프라인을 한 글에 정리해보고자 한다.
1) 데이터베이스 / 컬렉션 / 파티션
2) 스키마(Schema)
Int64 또는 VarChar(자동 증가 가능).FloatVector(차원 dim 필수) 또는 BinaryVector 등.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)인덱스는 “빠른 근사 이웃 검색”을 위한 추가 구조(속도↑, 메모리/빌드코스트↑, 리콜은 소폭↓). (Milvus)
nlist(클러스터 수), nprobe(탐색 버킷 수)로 속도·정확도 조절. 시작점으로 무난. (Milvus)GPU_IVF_PQ 같은 GPU 인덱스도 가능) (Milvus)분산 DB에서 “읽기/쓰기 직후 보이는 데이터의 최신성 보장 수준”을 고르는 옵션이다.
Milvus는 Strong, Bounded(기본), Eventually, Session을 제공.
# 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)