PyMilvus 시작하기
Milvus는 오픈 소스 벡터 데이터베이스로, Python SDK인 PyMilvus와 함께 대규모 데이터 세트를 처리하고 고급 연산 및 검색을 수행하기 위한 강력한 도구입니다.
이 튜토리얼에서는 Milvus와 PyMilvus를 사용하기 위한 개발 환경을 설치하고 설정하는 방법을 안내합니다. 그런 다음 오디오 파일을 분석하고, 해당 데이터를 Milvus에 저장한 뒤, 이를 사용해 오디오 샘플 간의 유사성을 비교하는 예제 코드를 살펴보겠습니다. 시작해 보겠습니다.
Milvus란 무엇인가요?
Milvus는 조 단위 규모의 벡터 유사도 검색 및 분석을 처리하는 오픈 소스 벡터 데이터베이스입니다. 임베딩 벡터를 통해 비정형 데이터를 관리하고 검색하기 위한 강력하고 효율적인 플랫폼으로, 이는 머신 러닝, 컴퓨터 비전, 추천 시스템 및 기타 인공 지능(AI) 분야에서 점점 더 중요해지고 있는 기능입니다.
핵심적으로 Milvus는 데이터 포인트가 고차원 벡터로 표현되는 임베딩 개념을 활용합니다. 이러한 벡터는 의미적 또는 시각적 특징을 기반으로 데이터 포인트 간의 유사성을 포착할 수 있습니다. Milvus는 이러한 벡터의 저장, 인덱싱 및 검색을 가능하게 하여 사용자가 방대한 데이터셋에서 빠른 유사도 검색을 수행할 수 있도록 합니다.
분산 아키텍처와 GPU 가속 지원을 통해 Milvus는 대량의 벡터 데이터를 효율적으로 처리하고 실시간 검색 결과를 제공할 수 있습니다. 또한 정확도와 효율성의 균형을 맞추기 위해 근사 최근접 이웃(ANN) 검색 알고리즘을 포함하여 다양한 사용 사례에 최적화된 여러 인덱싱 알고리즘을 제공합니다.
Milvus는 다양한 프로그래밍 언어를 지원하고 사용하기 쉬운 API를 제공하여 개발자와 연구자가 쉽게 접근할 수 있도록 합니다. 또한 널리 사용되는 머신 러닝 프레임워크 및 데이터 처리 도구와 잘 통합되어 기존 워크플로우에 원활하게 통합할 수 있습니다.
PyMilvus란 무엇인가요?
PyMilvus는 Milvus용 Python SDK입니다. Python 개발자가 Milvus와 쉽고 효율적으로 상호 작용할 수 있도록 설계되었으며, 데이터 관리, 벡터 유사도 검색 수행, 인덱스 구축 등과 같은 작업을 지원합니다.
PyMilvus를 사용하면 개발자는 기본 데이터베이스 작업의 복잡한 세부 사항을 걱정할 필요 없이 Python 애플리케이션에서 Milvus의 모든 기능을 활용할 수 있습니다. Milvus 작업과 관련된 많은 복잡성을 추상화하여 기존 Python 워크플로우와 원활하게 통합되는 간단하고 사용하기 쉬운 API를 제공합니다.
튜토리얼 설정
이 글의 명령줄 예제는 Linux 기준이지만, macOS나 Windows Subsystem for Linux(WSL)를 사용하는 Windows에서도 쉽게 적용할 수 있습니다. Docker 또는 Docker Desktop, Python 3.10+ 및 git이 설치된 시스템이 필요합니다.
Milvus bootcamp 리포지토리
이 튜토리얼에서는 Github의 Milvus Bootcamp 리포지토리 코드를 사용할 것입니다. 먼저 리포지토리를 로컬 시스템에 클론하세요.
[egoebelbecker@ares bootcamp]$ git clone https://github.com/milvus-io/bootcamp.git
Cloning into 'bootcamp'...
remote: Enumerating objects: 61861, done.
remote: Counting objects: 100% (4488/4488), done.
remote: Compressing objects: 100% (1628/1628), done.
remote: Total 61861 (delta 2983), reused 4180 (delta 2791), pack-reused 57373
Receiving objects: 100% (61861/61861), 166.78 MiB | 4.91 MiB/s, done.
Resolving deltas: 100% (28214/28214), done.
Python 가상 환경
다음으로, 코드를 실행할 가상 환경을 만드세요. bootcamp 리포지토리를 클론한 디렉터리에 만들 수 있습니다. 생성한 후에는 환경을 활성화하세요.
[egoebelbecker@ares bootcamp]$ cd bootcamp
[egoebelbecker@ares bootcamp]$ git checkout archive20230625
[egoebelbecker@ares bootcamp]$ python3 -m venv ./venv
[egoebelbecker@ares bootcamp]$ source venv/bin/activate
(venv) [egoebelbecker@ares bootcamp]$
Python 종속성 설치
이제 프로젝트를 설정할 차례입니다.
Audio Similarity Search 예제를 사용할 것입니다. 이 예제는 공개적으로 사용 가능한 오디오 파일 세트를 사용하여 Milvus로 서로 다른 샘플 간의 유사성을 감지하는 방법을 보여줍니다.
프로젝트의 하위 디렉터리로 이동하여 코드와 함께 제공된 requirements.txt 파일을 살펴보세요.
(venv) [egoebelbecker@ares bootcamp]$ cd solutions/audio/audio_similarity_search/
(venv) [egoebelbecker@ares audio_similarity_search]$ cat requirements.txt
pymilvus
redis
librosa
numpy
panns_inference
torch
diskcache
gdown
이것들은 프로젝트를 실행하는 데 필요한 Python 라이브러리입니다. pip를 사용하여 설치하세요. 그런 다음 노트북을 실행할 수 있도록 Jupyter를 추가하세요.
(venv) [egoebelbecker@ares audio_similarity_search]$ pip install -r requirements.txt
(Lots of output)
(venv) [egoebelbecker@ares audio_similarity_search]$ pip install jupyter
(More output)
Redis 시작
이제 Redis Docker 컨테이너를 시작하세요.
docker run --name redis -d -p 6379:6379 redis
Milvus Lite 설치 및 시작
마지막으로 Milvus 서버가 필요합니다. Milvus를 가장 쉽게 시작하는 방법은 Python에서 실행되는 Milvus Lite입니다. milvus 패키지를 설치하세요.
(venv) [egoebelbecker@ares audio_similarity_search]$ pip install milvus
(Lots of output)
(venv) [egoebelbecker@ares audio_similarity_search]$ milvus-server
__ _________ _ ____ ______
/ |/ / _/ /| | / / / / / __/
/ /|_/ // // /_| |/ / /_/ /\ \
/_/ /_/___/____/___/\____/___/ {Lite}
Welcome to use Milvus!
Version: v2.2.8-lite
Process: 275118
Started: 2023-05-25 12:41:47
Config: /home/egoebelbecker/.milvus.io/milvus-server/2.2.8/configs/milvus.yaml
Logs: /home/egoebelbecker/.milvus.io/milvus-server/2.2.8/logs
Ctrl+C to exit ...
PyMilvus 프로젝트
이제 환경이 설정되었으므로 튜토리얼을 실행할 수 있습니다.
Jupyter 시작
가상 환경에서 Jupyter를 시작하세요.
(venv) [egoebelbecker@ares audio_similarity_search]$ python -m jupyter notebook --notebook-dir=`pwd`
_ _ _ _
| | | |_ __ __| |__ _| |_ ___
| |_| | '_ \/ _` / _` | _/ -_)
\___/| .__/\__,_\__,_|\__\___|
|_|
Read the migration plan to Notebook 7 to learn about the new features and the actions to take if you are using extensions.
https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html
(More output)
그러면 기본 브라우저에서 Jupyter Files 페이지가 열립니다.
solutions/audio/audio_similarity_search 디렉터리로 이동하세요.
audio_similarity_search 노트북을 여세요.
Redis 및 Milvus에 연결
이미 초기 설정을 완료했으므로 Code Overview 섹션까지 바로 스크롤하세요. 코드는 Redis와 Milvus용 라이브러리를 가져오는 것으로 시작합니다.
두 번째 줄에서 Milvus에 연결하고, Collection을 만들고, 데이터를 추가하고 검색하는 데 필요한 클래스들을 볼 수 있습니다.
import redis
from pymilvus import connections, DataType, FieldSchema, CollectionSchema, Collection, utility
connections.connect(host = '127.0.0.1', port = 19530)
red = redis.Redis(host = '127.0.0.1', port=6379, db=0)
그런 다음 코드는 두 서버에 연결합니다. 이 블록을 실행하세요. 이제 각 오디오 파일에 대한 정보를 저장할 Milvus collection을 만들 차례입니다.
import time
red.flushdb()
time.sleep(.1)
collection_name = "audio_test_collection"
if utility.has_collection(collection_name):
print("Dropping existing collection...")
collection = Collection(name=collection_name)
collection.drop()
#if not utility.has_collection(collection_name):
field1 = FieldSchema(name="id", dtype=DataType.INT64, description="int64", is_primary=True,auto_id=True)
field2 = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, description="float vector", dim=2048, is_primary=False)
schema = CollectionSchema(fields=[ field1,field2], description="collection description")
collection = Collection(name=collection_name, schema=schema)
print("Created new collection with name: " + collection_name)
Milvus Collection 생성
이 단계에서는 두 개의 필드가 있는 audio_test_collection이라는 이름의 collection을 생성합니다:
- id - 정수 식별 필드
- embedding - 오디오 파일에 대한 데이터를 저장하기 위한 2048개의 부동 소수점 숫자 벡터
이 블록을 실행하면 다음 메시지가 표시됩니다:
Dropping existing collection...
Created new collection with name: audio_test_collection
다음으로, 새 collection에 index를 추가합니다:
if utility.has_collection(collection_name):
collection = Collection(name = collection_name)
default_index = {"index_type": "IVF_SQ8", "metric_type": "L2", "params": {"nlist": 16384}}
status = collection.create_index(field_name = "embedding", index_params = default_index)
if not status.code:
print("Successfully create index in collection:{} with param:{}".format(collection_name, default_index))
이 블록을 실행합니다:
Successfully create index in collection:audio_test_collection with param:{'index_type': 'IVF_SQ8', 'metric_type': 'L2', 'params': {'nlist': 16384}}
오디오 데이터 저장
이제 Milvus가 오디오 데이터를 저장할 준비가 되었습니다. 다음 코드 블록을 나누어 자세히 살펴보겠습니다.
import os
import librosa
import gdown
import zipfile
import numpy as np
from panns_inference import SoundEventDetection, labels, AudioTagging
data_dir = './example_audio'
at = AudioTagging(checkpoint_path=None, device='cpu')
def download_audio_data():
url = 'https://drive.google.com/uc?id=1bKu21JWBfcZBuEuzFEvPoAX6PmRrgnUp'
gdown.download(url)
with zipfile.ZipFile('example_audio.zip', 'r') as zip_ref:
zip_ref.extractall(data_dir)
이 섹션은 파일 처리를 위한 라이브러리를 가져옵니다. 그런 다음 Panns Inference library에서 AudioTagging 객체를 생성합니다.
이는 Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition (PANNs)에 대한 Python 인터페이스입니다.
AudioTagging 클래스는 각 오디오 파일에 대해 다음과 유사한 데이터 포인트 집합을 생성합니다:
Speech: 0.893
Telephone bell ringing: 0.754
Inside, small room: 0.235
Telephone: 0.183
Music: 0.092
Ringtone: 0.047
Inside, large room or hall: 0.028
Alarm: 0.014
Animal: 0.009
Vehicle: 0.008
embedding: (2048,)
다음은 파일을 다운로드하고, 분석한 다음, 데이터를 Milvus에 삽입하고 파일 정보를 Redis에 삽입하는 코드입니다:
def embed_and_save(path, at):
audio, _ = librosa.core.load(path, sr=32000, mono=True)
audio = audio[None, :]
try:
_, embedding = at.inference(audio)
embedding = embedding/np.linalg.norm(embedding)
embedding = embedding.tolist()[0]
mr = collection.insert([[embedding]])
ids = mr.primary_keys
collection.load()
red.set(str(ids[0]), path)
except Exception as e:
print("failed: " + path + "; error {}".format(e))
이 코드 블록은 모든 것을 하나로 결합합니다:
print("Starting Insert")
download_audio_data()
for subdir, dirs, files in os.walk(data_dir):
for file in files:
path = os.path.join(subdir, file)
embed_and_save(path, at)
print("Insert Done")
코드를 실행합니다:
Checkpoint path: /home/egoebelbecker/panns_data/Cnn14_mAP=0.431.pth
Using CPU.
Starting Insert
다운로드 중...
From: [https://drive.google.com/uc?id=1bKu21JWBfcZBuEuzFEvPoAX6PmRrgnUp](https://drive.google.com/uc?id=1bKu21JWBfcZBuEuzFEvPoAX6PmRrgnUp)
To: /home/egoebelbecker/src/bootcamp/solutions/audio/audio_similarity_search/example_audio.zip
100%|█████████████████████████████████████████████████████████████████████████████████████████| 474k/474k [00:00<00:00, 8.87MB/s]
삽입 완료
유사성 검색
데이터베이스를 검색하려면 매칭해야 하는 파일들에 동일한 분석을 수행해야 합니다. 다음은 무작위로 선택된 파일 id 집합에 대해 이를 수행하는 코드입니다.
```python
def get_embed(paths, at):
embedding_list = []
for x in paths:
audio, _ = librosa.core.load(x, sr=32000, mono=True)
audio = audio[None, :]
try:
_, embedding = at.inference(audio)
embedding = embedding/np.linalg.norm(embedding)
embedding_list.append(embedding)
except:
print("Embedding Failed: " + x)
return np.array(embedding_list, dtype=np.float32).squeeze()
random_ids = [int(red.randomkey()) for x in range(2)]
search_clips = [x.decode("utf-8") for x in red.mget(random_ids)]
embeddings = get_embed(search_clips, at)
print(embeddings.shape)
이 블록을 실행하여 두 파일을 선택하고 분석을 실행하세요. 이제 Milvus에서 검색을 수행할 차례입니다. 이 코드는 검색 결과를 오디오 플레이어에 표시합니다:
import IPython.display as ipd
def show_results(query, results, distances):
print("Query: ")
ipd.display(ipd.Audio(query))
print("Results: ")
for x in range(len(results)):
print("Distance: " + str(distances[x]))
ipd.display(ipd.Audio(results[x]))
print("-"*50)
다음으로, 프로그램은 위에서 만든 embeddings 배열을 가져와 리스트로 변환합니다. 그런 다음 검색 파라미터를 생성합니다. 우리는 두 개의 유사한 사운드를 검색하고 있으며, 기준으로 nprobe를 사용합니다. 이는 위에서 사용한 인덱스 유형과 일치합니다.
embeddings_list = embeddings.tolist()
search_params = {"metric_type": "L2", "params": {"nprobe": 16}}
마지막으로, 검색은 다음과 같습니다.
try:
start = time.time()
results = collection.search(embeddings_list, anns_field="embedding", param=search_params, limit=3)
end = time.time() - start
print("Search took a total of: ", end)
for x in range(len(results)):
query_file = search_clips[x]
result_files = [red.get(y.id).decode('utf-8') for y in results[x]]
distances = [y.distance for y in results[x]]
show_results(query_file, result_files, distances)
except Exception as e:
print("Failed to search vectors in Milvus: {}".format(e))
실행하면 무작위로 선택된 파일과 두 개의 검색 결과가 원본과의 거리와 함께 표시됩니다.
각 파일을 들어보면 정확히 일치하는 항목과 가장 가까운 이웃을 들을 수 있습니다.
요약
이 글에서는 Milvus로 작업하기 위한 Python 환경을 구축하는 방법을 배웠습니다. 서버와 PyMilvus SDK를 설정한 후, Milvus Bootcamp 저장소의 샘플 튜토리얼을 실행했습니다. 컬렉션을 생성하고, 인덱싱하고, 데이터를 저장하고, 기본 검색을 수행하는 코드를 살펴보았습니다.
이제 Milvus를 시작하는 것이 얼마나 쉬운지 보았으니, 부트캠프 프로젝트를 계속 진행하며 Milvus를 사용해 프로젝트를 어떻게 향상시킬 수 있는지 확인해 보세요.
이 글은 Eric Goebelbecker가 작성했습니다. Eric은 뉴욕시 금융 시장에서 25년 동안 일하며 시장 데이터 및 금융 정보 교환(FIX) 프로토콜 네트워크를 위한 인프라를 개발해 왔습니다. 그는 팀을 효과적으로 만드는 요소(또는 그다지 효과적이지 않게 만드는 요소)에 대해 이야기하는 것을 좋아합니다.
계속 읽기

Context Engineering Strategies for AI Agents: A Developer’s Guide
Learn practical context engineering strategies for AI agents. Explore frameworks, tools, and techniques to improve reliability, efficiency, and cost.

Why I’m Against Claude Code’s Grep-Only Retrieval? It Just Burns Too Many Tokens
Learn how vector-based code retrieval cuts Claude Code token consumption by 40%. Open-source solution with easy MCP integration. Try claude-context today.
Milvus/Zilliz + Surveillance: How Vector Databases Transform Multi-Camera Tracking
See how Milvus vector database enhances multi-camera tracking with similarity-based matching for better surveillance in retail, warehouses and transport hubs.



