Quick start

https://milvus.io/ko

https://milvus.io/docs/ko/quickstart.md

uv add langchain openai pymilvus sentence-transformers

pymilvus 는 milvus lite라고도 불리는 파이썬SDK으로 데모프로젝트나 프로토타입을 빠르게 만들때 사용함.

💡 milvus의 searchquery 는 뭐가 다른걸까?

https://milvus.io/docs/ko/get-and-scalar-query.md

Search: A vector similarity search in Milvus calculates the distance between query vector(s) and vectors in a collection and returns the most similar results.

Hybrid Search: A hybrid search in Milvus is essentially a vector search with attribute filtering.

Query : A vector query in Milvus retrieves vectors via scalar filtering based on boolean expression.

from pymilvus import MilvusClient
import numpy as np

# Milvus lite 연결
client = MilvusClient("./milvus_lite.db")
client.create_collection(
    collection_name="test_collection",
    dimension=128
)

# 샘플데이터
docs = [
    "Artificial intelligence was founded as an academic discipline in 1956.",
    "Alan Turing was the first person to conduct substantial research in AI.",
    "Born in Maida Vale, London, Turing was raised in southern England.",
]

# 128차원 균등분포 벡터 생성(실제 임베딩 값이 아니라 예시 벡터 생성)
vectors = [[np.random.uniform(-1, 1) for _ in range(128)] for _ in range(len(docs))]
# print(vectors)

data = [
    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"} for i in range(len(vectors))
]
# 데이터 삽입
res = client.insert(
    collection_name="test_collection",
    data=data
)

# 
result = client.search(
    collection_name="test_collection",
    data=[vectors[0]], # 검색할 벡터
    filter="subject == 'history'", # 필터링 조건
    limit=2, # 검색 결과 개수
    ouput_fields=["text", "subject"], # 검색 결과 필드
)

print(result)

result = client.query(
    collection_name="test_collection",
    filter="subject == 'history'",
    output_fields=["text", "subject"],
)

print(result)

search 사용시 자기 자신이 가장 유사한 문장(99.99%)확률로 검색되었고, 그나마 세번째문장이 2%확률로 도출되었습니다.

image.png

query 사용시 filter 조건과 일치하는 모든 문장이 검색되었습니다.

image.png

Standalone

ES vs Milvus