Milvus 메타데이터 필터링: Milvus의 JSON 및 메타데이터 필터링
JSON(JavaScript Object Notation)은 저장 및 전송을 위한 유연한 데이터 형식입니다. 키-값 쌍을 적응적으로 사용하므로 NoSQL 데이터베이스와 API 결과에 완벽합니다. 이러한 유연성 덕분에 인기 있는 데이터 형식입니다. 검색 매개변수는 사용되는 벡터 필드, 쿼리 벡터, 반환되는 결과 수 제한 등 각 검색 요청의 세부 사항을 정의하는 데 중요합니다.
많은 Milvus 데모는 .txt, .pdf, .csv 파일 형식과 같은 원시 텍스트 데이터로 시작합니다. 하지만 Milvus로 원시 JSON을 업로드하고 작업할 수 있다는 것을 알고 계셨나요? 자세한 내용은 이 JSON 문서 페이지를 참조하세요.
Milvus Client는 유연한 JSON “key”:value 형식을 사용하여 스키마 없는 데이터 정의를 가능하게 하는 Milvus 컬렉션 객체의 래퍼입니다. 자세한 내용은 Milvus Client 문서를 참조하세요.
스키마 없는 Milvus Client와 Zilliz의 무료 티어 클라우드는 Milvus를 빠르게 사용하는 좋은 방법입니다! Milvus Client는 사전에 전체 스키마를 정의하는 것과 거의 비슷하게 빠르지만, 오류가 덜 발생하는 코딩이 가능합니다. “enable_dynamic_field”와 비교하면 Milvus Client는 훨씬 더 빠르며, 초기에 더 적은 스키마 정의를 사용하는 더 매끄러운 접근 방식을 제공합니다. 스키마 없는 스키마는 다음과 같습니다.
- id (str): 기본 키 필드의 이름.
- vector (str): 벡터 필드의 이름.
이게 전부입니다! 나머지 필드는 데이터가 Milvus에 삽입될 때 유연하게 결정될 수 있습니다.
이를 더 구체적으로 설명하기 위해 Milvus Client 사용 방법에 대한 몇 가지 코드 예제로 바로 들어가 보겠습니다. 전체 코드는 제 Bootcamp github repo에 있습니다.
코드 예제 - 원시 JSON 데이터를 Milvus에 직접 업로드하기
원시 데이터 자체가 JSON 형식일 수 있습니다. 예를 들어 데이터가 MongoDB와 같은 NoSQL 데이터베이스에서 오는 경우 유용합니다. 아래에서 사용된 JSON 데이터는 Kaggle의 IMDB 영화 장르 분류입니다.
# !pip install numpy pandas json pprint pymilvus torch sentence-transformers
# Import common libraries.
import pandas as pd
import json
# Read JSON data.
df = pd.read_json('data/tiny_parsed_data.json')
# Concatenate Title and Description into 'text' column.
df['text'] = df['title'] + ' ' + df['description']
display(df.head(2))
Zilliz 클라우드 무료 체험 서버를 시작하세요. 무료 체험에서는 한 번에 최대 2개의 컬렉션을 사용할 수 있으며, 각 컬렉션은 최대 100만 개의 벡터를 가질 수 있습니다. 이 노트북의 코드는 fully-man을 사용합니다
- 프로비저닝할 때 기본 "Starter" 옵션을 선택하세요 > Create collection > 이름을 지정하세요 > Create cluster and collection.
- Cluster 메인 페이지에서
API Key를 복사하여 .env 변수 ‘ZILLIZ_API_KEY’에 로컬로 저장하세요. - 또한 Cluster 메인 페이지에서
Public Endpoint URI를 복사하세요.
import os
from pymilvus import connections, utility
TOKEN = os.getenv("ZILLIZ_API_KEY")
# Connect to Zilliz cloud using endpoint URI and API key TOKEN.
CLUSTER_ENDPOINT="https://in03-xxxx.api.gcp-us-west1.zillizcloud.com:443"
connections.connect(
alias='default',
token=TOKEN,
uri=CLUSTER_ENDPOINT,)
# Check if the server is ready and get collection name.
print(f"Type of server: {utility.get_server_version()}")
임베딩 모델을 선택하세요. 아래에서는 HuggingFace의 모델 중 하나를 선택했습니다. 이를 제 노트북에서 실행하고 있으므로 DEVICE=cpu인지 확인해야 합니다.
import torch
from sentence_transformers import SentenceTransformer
# Initialize torch settings
torch.backends.cudnn.deterministic = True
DEVICE = torch.device('cuda:3' if torch.cuda.is_available() else 'cpu')
# Load the model from huggingface model hub.
model_name = "WhereIsAI/UAE-Large-V1"
encoder = SentenceTransformer(model_name, device=DEVICE)
# Get the model parameters and save for later.
EMBEDDING_DIM = encoder.get_sentence_embedding_dimension()
MAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()
# View model parameters.
print(f"model_name: {model_name}")
print(f"EMBEDDING_DIM: {EMBEDDING_DIM}")
print(f"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}")
MilvusClient를 가져오고 컬렉션을 생성합니다. 스키마를 지정할 필요가 없다는 점에 주목하세요! 또한 AUTOINDEX라고 하는 시스템 기본 인덱스를 그대로 사용할 수 있습니다. 오픈 소스 및 무료 티어에서는 기본값이 HNSW입니다. 유료 Zilliz cloud에서는 AUTOINDEX가 독점 인덱스를 사용해 추가로 최적화됩니다.
from pymilvus import MilvusClient
import pprint
# Set the Milvus collection name.
COLLECTION_NAME = "imdb_metadata"
# Use no-schema Milvus client.
mc = MilvusClient(
uri=CLUSTER_ENDPOINT,
token=TOKEN)
# Check if the collection already exists, if so drop it.
has = utility.has_collection(COLLECTION_NAME)
if has:
drop_result = utility.drop_collection(COLLECTION_NAME)
print(f"Successfully dropped collection: `{COLLECTION_NAME}`")
# Create the collection.
mc.create_collection(COLLECTION_NAME,
EMBEDDING_DIM,
consistency_level="Eventually",
auto_id=True,
overwrite=True,
# skip setting params, if using AUTOINDEX
)
print(f"Successfully created collection: `{COLLECTION_NAME}`")
pprint.pprint(mc.describe_collection(COLLECTION_NAME))
간단한 청킹 전략은 ‘text’ 필드의 길이가 512자를 초과하지 않는 한 단일 청크로 유지하는 것입니다. 아래에서 JSON 데이터의 text 필드가 꽤 짧았음을 볼 수 있습니다. 어떤 행도 더 작은 청크로 분할할 필요가 없었습니다.
# Use the embedding model parameters.
chunk_size = 512
chunk_overlap = np.round(chunk_size * 0.10, 0)
# Chunk a batch of data from pandas DataFrame and inspect it.
BATCH_SIZE = 100
batch = imdb_chunk_text(BATCH_SIZE, df, chunk_size)
display(batch.head(2))
이제 텍스트 청크, 각 텍스트 청크의 벡터 임베딩, 그리고 모든 원본 메타데이터가 있으므로 해당 데이터를 Milvus 벡터 데이터베이스에 삽입해 보겠습니다.
# Convert the DataFrame to a list of dictionaries
chunk_list = batch.to_dict(orient='records')
# Insert data into the Milvus collection.
start_time = time.time()
insert_result = mc.insert( COLLECTION_NAME, data=chunk_list, progress_bar=True )
end_time = time.time()
print(f"Milvus Client insert time for {batch.shape[0]} vectors: {end_time - start_time} seconds")
질문을 하고 영화 데이터에서 답변을 검색해 보겠습니다.
SAMPLE_QUESTION = "Dystopia science fiction with a robot."
# Embed the question using the same encoder.
query_embeddings = _utils.embed_query(encoder, [SAMPLE_QUESTION])
TOP_K = 2
# Run semantic vector search using your query and the vector database.
start_time = time.time()
results = mc.search(
COLLECTION_NAME,
data=query_embeddings,
output_fields=OUTPUT_FIELDS,
limit=TOP_K,
consistency_level="Eventually",
filter='film_year >= 2019', )
elapsed_time = time.time() - start_time
print(f"Milvus Client search time for {len(chunk_list)} vectors: {elapsed_time} seconds")
검색 시간
상위 2개 결과를 반복해 보면 다음과 같습니다.
꽤 좋아 보입니다. 하지만 JSON 배열 ‘Genres’에 대해 메타데이터 필터링을 하고 싶다면 어떻게 해야 할까요?
JSON 필드 및 JSON 배열 전반의 메타데이터 필터링
Milvus 2.3의 새로운 기능은 원시 JSON 메타데이터를 필터링할 수 있는 기능입니다. 아래에서는 필드와 배열을 사용한 메타데이터 필터링 예시를 보여드리겠습니다.
더 오래되고 레트로한 영화 중에서 엄격하게 Sci-Fi 장르만 보고 싶다고 가정해 보겠습니다.
SAMPLE_QUESTION = "Dystopia science fiction with a robot."
# Embed the question using the same encoder.
query_embeddings = _utils.embed_query(encoder, [SAMPLE_QUESTION])
TOP_K = 2
# Run semantic vector search using your query and the vector database.
start_time = time.time()
results = mc.search(
COLLECTION_NAME,
data=query_embeddings,
output_fields=OUTPUT_FIELDS,
limit=TOP_K,
consistency_level="Eventually",
filter='json_contains(Genres, "Sci-Fi") and film_year < 2019',
)
elapsed_time = time.time() - start_time
print(f"Milvus Client search time for {len(chunk_list)} vectors: {elapsed_time} seconds")
상위 2개 결과를 반복해서 살펴보면, 이제 영화 추천이 필터와 일치하도록 변경된 것을 볼 수 있습니다.
많은 Milvus 데모는 .txt, .pdf 또는 .csv 파일 유형과 같은 원시 텍스트 데이터로 시작합니다. 이번에는 JSON 데이터를 Milvus 벡터 데이터베이스 컬렉션에 직접 로드하는 방법을 살펴보았습니다. 또한 JSON 필드에 대한 유용한 메타데이터 필터링과 JSON 배열 데이터 유형에 대한 json_contains() 필터링을 사용하는 방법도 살펴보았습니다. 이 블로그 글의 전체 코드는 제 Bootcamp GitHub repo에 있습니다.
Hybrid Search 소개
Hybrid search는 사용자가 여러 벡터 필드를 하나의 검색으로 결합할 수 있게 해주는 Milvus의 강력한 기능입니다. 이 기능은 엔터티가 여러 다양한 벡터로 표현될 수 있는 복잡한 검색 시나리오에서 특히 유용합니다. 재랭킹 전략을 사용하여 여러 벡터 검색의 결과를 통합함으로써, hybrid search는 사용자가 더 높은 정확도와 더 관련성 높은 결과를 얻을 수 있도록 합니다.
Milvus에서 hybrid search는 텍스트, 이미지, 오디오와 같은 서로 다른 유형의 데이터를 하나의 검색 쿼리로 결합하는 데 사용할 수 있습니다. 이를 통해 사용자는 더 포괄적인 검색을 수행하고 더 관련성 높은 결과를 가져올 수 있습니다. 예를 들어, hybrid search는 텍스트 임베딩과 image embeddings를 결합하여 텍스트 설명과 시각적 예시 모두에 일치하는 제품을 찾을 수 있습니다.
Milvus에서 hybrid search를 효과적으로 사용하려면 다양한 벡터 필드와 이를 결합하는 방법을 이해하는 것이 중요합니다. 벡터 필드를 신중하게 선택하고 결합함으로써 사용자는 검색 결과의 정확도와 관련성을 개선할 수 있습니다. 또한 재랭킹 전략을 사용하면 검색 결과를 더욱 세밀하게 다듬고 가장 관련성 높은 결과가 반환되도록 할 수 있습니다.
메타데이터로 데이터 관리하기
메타데이터는 Milvus에서 데이터를 관리하는 데 중요한 역할을 합니다. 메타데이터는 데이터의 구조와 구성을 설명하는 데 사용되어 검색, 필터링, 분석을 더 쉽게 만듭니다. Milvus에서 메타데이터는 컬렉션 이름, 벡터 필드, 인덱스 유형과 같은 데이터에 대한 정보를 포함하여 데이터 파일을 관리하는 데 사용됩니다.
메타데이터를 효과적으로 사용함으로써 사용자는 검색의 성능과 정확도를 향상시킬 수 있습니다. 메타데이터를 사용하면 데이터를 쉽게 검색하고 분석할 수 있는 방식으로 구성할 수 있습니다. 예를 들어, 메타데이터를 사용해 관련 키워드로 데이터에 태그를 지정하면 사용자는 특정 데이터 포인트를 빠르게 필터링하고 검색할 수 있습니다.
검색 성능을 개선하는 것 외에도, 메타데이터는 데이터 무결성과 일관성을 보장하는 데도 도움이 될 수 있습니다. 메타데이터를 사용해 데이터의 변경 사항과 업데이트를 추적함으로써 사용자는 데이터가 정확하고 최신 상태로 유지되도록 할 수 있습니다. 이는 데이터가 지속적으로 업데이트되고 수정되는 대규모 데이터 환경에서 특히 중요합니다.
JSON 및 메타데이터 필터링
JSON(JavaScript Object Notation)은 NoSQL 데이터베이스와 API 결과에서 널리 사용되는 유연한 데이터 형식입니다. Milvus는 원시 JSON 데이터를 업로드하고 작업하는 것을 지원하여 다른 시스템과 쉽게 통합할 수 있게 합니다. 메타데이터 필터링은 사용자가 특정 조건에 따라 원시 JSON 메타데이터를 필터링할 수 있도록 하는 Milvus의 강력한 기능입니다.
메타데이터 필터링을 사용하면 사용자는 검색 정확도를 높이고 관련 없는 데이터의 양을 줄일 수 있습니다. 예를 들어, 사용자는 장르나 개봉 연도별로 영화를 필터링하는 것처럼 특정 필드나 값을 기준으로 JSON 데이터를 필터링할 수 있습니다. 이를 통해 사용자는 더 타깃팅된 검색을 수행하고 더 관련성 높은 결과를 검색할 수 있습니다.
Milvus에서는 메타데이터 필터링을 벡터 검색과 함께 사용하여 검색 결과를 더욱 정교하게 다듬을 수 있습니다. 벡터 검색 쿼리에 메타데이터 필터를 적용함으로써 사용자는 가장 관련성 높은 데이터만 반환되도록 할 수 있습니다. 이는 검색 정확도를 향상시키고 처리해야 하는 관련 없는 데이터의 양을 줄이는 데 도움이 될 수 있습니다.
벡터 검색을 위한 인덱스 구축 및 관리
인덱스 구축은 Milvus에서 벡터 검색 성능을 최적화하는 데 중요한 단계입니다. 인덱스는 데이터베이스가 특정 데이터를 빠르게 찾을 수 있도록 하여 데이터 검색 속도를 향상시키는 데이터 구조입니다. Milvus에서는 벡터 검색 성능을 향상시키기 위해 벡터 필드에 인덱스를 구축할 수 있습니다.
Milvus에는 다양한 유형의 인덱스가 있으며, 각각 고유한 장점과 사용 사례가 있습니다. 예를 들어, HNSW(Hierarchical Navigable Small World) 인덱스는 효율성과 정확성 때문에 고차원 벡터 검색에 일반적으로 사용됩니다. IVF(Inverted File) 및 PQ(Product Quantization)와 같은 다른 인덱스 유형은 검색 속도와 정확성 간에 서로 다른 절충점을 제공합니다.
인덱스를 효과적으로 구축하고 관리하려면 데이터의 특성과 특정 검색 요구 사항을 이해하는 것이 중요합니다. 적절한 인덱스 유형을 선택하고 인덱스 매개변수를 튜닝함으로써 사용자는 검색 성능을 크게 향상시킬 수 있습니다. 또한 인덱스를 정기적으로 업데이트하고 유지 관리하면 데이터가 변화함에 따라 검색 성능이 최적으로 유지되도록 하는 데 도움이 될 수 있습니다.
하이브리드 검색 성능 최적화
하이브리드 검색 성능은 인덱스 구축, 메타데이터 필터링, 쿼리 최적화를 포함한 다양한 기법을 사용하여 최적화할 수 있습니다. 벡터에 인덱스 필드를 구축함으로써 사용자는 벡터 검색 성능을 향상시킬 수 있습니다. 인덱스를 사용하면 데이터베이스가 관련 데이터를 빠르게 찾을 수 있어 검색을 수행하는 데 필요한 시간이 줄어듭니다.
메타데이터 필터링은 하이브리드 검색 성능을 최적화하는 또 다른 중요한 기법입니다. 메타데이터 필터를 사용함으로써 사용자는 처리해야 하는 관련 없는 데이터의 양을 줄여 검색 정확도와 속도를 향상시킬 수 있습니다. 예를 들어, 특정 필드나 값을 기준으로 데이터를 필터링하면 검색 결과를 좁히고 가장 관련성 높은 데이터만 반환되도록 하는 데 도움이 될 수 있습니다.
쿼리 최적화도 하이브리드 검색 성능을 향상시키는 데 매우 중요합니다. 검색 쿼리의 구조와 매개변수를 최적화함으로써 사용자는 검색에 필요한 계산 리소스를 줄이고 성능을 향상시킬 수 있습니다. 여기에는 쿼리 배치 처리, 효율적인 데이터 구조 사용, 쿼리 매개변수 튜닝과 같은 기법이 포함될 수 있습니다.
이 섹션에서는 Milvus에서 하이브리드 검색 성능을 최적화하기 위한 모범 사례를 논의했습니다. 인덱스 구축, 메타데이터 필터링, 쿼리 최적화와 같은 기법을 사용함으로써 사용자는 검색의 정확도와 속도를 향상시켜 가장 관련성 높은 결과를 검색할 수 있습니다.
계속 읽기

How Zilliz Saw the Future of Vector Databases—and Built for Production
An inside look at how Zilliz built vector databases for real-world use, focusing on scalability, stability, and running them reliably at scale.

How to Build an Enterprise-Ready RAG Pipeline on AWS with Bedrock, Zilliz Cloud, and LangChain
Build production-ready enterprise RAG with AWS Bedrock, Nova models, Zilliz Cloud, and LangChain. Complete tutorial with deployable code.

Zilliz Cloud Enterprise Vector Search Powers High-Performance AI on AWS
Zilliz Cloud on AWS powers secure, scalable, ultra-fast vector search for enterprise AI apps, with BYOC, sub-10ms latency, and zero-DevOps simplicity.



