Python/Python+Database

파이썬 데이터베이스 프로그래밍 완전 입문: 벡터 데이터베이스 Milvus 연동 방법

코딩 코디네이터 2025. 4. 14. 08:00
반응형

파이썬 데이터베이스 프로그래밍 완전 입문
: 벡터 데이터베이스 Milvus 연동 방법

AI 서비스를 만들려면 대량의 비정형 데이터를 어떻게 저장하고 검색할지부터 고민해야 하죠.
그 해답, 바로 벡터 데이터베이스 Milvus입니다!

 

 

안녕하세요!

요즘 AI, 특히 생성형 AI와 추천 시스템에서 많이 듣게 되는 단어가 있죠.

바로 벡터 데이터베이스(Vector DB)입니다.

그중에서도 Milvus는 오픈소스 벡터 DB 중에서도 가장 많이 쓰이는 툴인데요.

이 글에서는 Milvus가 뭔지, 왜 써야 하는지, 그리고 파이썬으로 어떻게 연동하고 사용하는지까지 차근차근 안내해 드릴게요.

개념 설명은 물론이고, 실습 예제까지 함께 다룰 거니까 초보자 분들도 따라 하기 쉽게 설명드릴게요! 🧑‍💻

그럼 본격적으로 시작해볼까요?

 

1. Milvus란 무엇인가요? 🧠

Milvus는 고차원 벡터 데이터를 효율적으로 저장하고 검색할 수 있도록 설계된 오픈소스 벡터 데이터베이스입니다.

2020년 Zilliz라는 회사에서 처음 개발되었고, 현재는 LF AI & Data 재단의 공식 프로젝트로 운영되고 있어요.

벡터 데이터란 텍스트, 이미지, 영상 등 비정형 데이터를 임베딩(embedding) 기법을 통해 고차원 숫자 배열로 바꾼 것을 말합니다.

예를 들어,

"파이썬"이라는 단어를 벡터화하면 다음과 같은 모양이 될 수 있어요:

[0.132, -0.874, 0.341, ..., 0.290]  # 총 768차원의 벡터라고 가정

 

Milvus는 이런 벡터들을 빠르게 저장하고, 유사도를 계산하여 비슷한 의미의 벡터를 빠르게 검색해 줍니다.

이 기능은 검색엔진, 추천 시스템, AI 챗봇, 얼굴 인식, LLM 기반 RAG 등 다양한 분야에 활용되고 있어요.

Milvus의 주요 특징

  • 수십억 개 벡터 저장 및 검색 가능 (대규모 확장성)
  • CPU 및 GPU 기반 인덱싱 지원 (FAISS, HNSW 등 통합)
  • 다양한 쿼리 기능: 벡터 유사도, 필터 조건 등 복합 검색 가능
  • RESTful API 및 Python SDK 지원으로 쉬운 연동

Milvus는 어떤 상황에 적합할까요?

이런 경우 Milvus가 매우 유용합니다:

  1. AI 응답에 유사 문서를 찾아 붙이는 RAG 구조 만들 때
  2. 이미지 유사도 검색을 통한 추천 시스템 구축 시
  3. 보안 시스템에서 얼굴 인식 기반 출입 제어할 때
  4. 수백만 개의 질문-응답을 저장하고 검색하는 챗봇 구축 시

요즘 ChatGPT처럼 LLM 기반 시스템에서도 Milvus는 핵심 역할을 해요.

LLM은 입력된 질문과 유사한 벡터를 찾고, 그에 대응되는 문서를 검색해서 답변을 생성하죠.

이 때 Milvus가 없으면 검색 속도도 느려지고 정확도도 떨어질 수 있어요.

 

정리하자면, Milvus는 단순한 저장소가 아니라 AI 시대의 핵심 검색 인프라라고 볼 수 있습니다.

 

 

2. 벡터 DB가 필요한 이유는? 🔍

우리는 하루에도 수백 개의 데이터를 보고, 클릭하고, 검색합니다.

그런데 그 데이터들 대부분은 비정형 데이터예요.

예를 들면

텍스트, 이미지, 음성 같은 거죠. 이런 데이터는 기존의 관계형 데이터베이스(RDBMS)로는 검색이나 저장이 비효율적이에요.

이럴 때 필요한 것이 바로 벡터화(Embedding)입니다.

데이터를 벡터로 바꾸면, 수학적으로 유사도를 계산할 수 있고, 그걸 이용해서 비슷한 의미를 찾을 수 있어요.

예를 들어,

"고양이"와 "강아지"는 다른 단어지만 의미상 비슷하죠?

이걸 일반 DB는 이해 못 하지만, 벡터 DB는 이해할 수 있습니다.

비교: 관계형 DB vs 벡터 DB

항목 관계형 DB 벡터 DB
데이터 형태 정형 데이터 (테이블 구조) 비정형 데이터를 벡터로 표현
검색 방식 정확한 값 매칭 유사도 기반 검색 (Nearest Neighbor)
활용 분야 재고관리, 회계, 회원정보 추천, 검색, AI 서비스
확장성 세로 확장 위주 수평 확장에 최적화

그렇다면 왜 지금 벡터 DB가 주목받을까요?

  • 생성형 AI(Generative AI)의 급속한 성장 때문이에요.
  • LLM은 입력된 문장을 벡터로 바꾼 후, 비슷한 문서 벡터를 찾아 답변을 생성합니다.
  • 기존 DB는 이런 검색을 빠르고 효율적으로 처리하기 어렵습니다.

결국, 벡터 DB는 AI가 제대로 작동하기 위한 필수 인프라가 된 거죠.

특히 챗봇, 추천 서비스, 개인화 콘텐츠 제공, 문서 요약, 자동 분류 등 다양한 AI 서비스에서 없어서는 안 되는 존재가 되었습니다.

 

이제는 데이터를 저장하는 것보다, "어떻게 검색하고 연결할 것인가?"가 더 중요한 시대예요.

벡터 DB는 바로 그 질문에 대한 답입니다.

 

 

3. Milvus 설치 및 기본 설정 ⚙️

Milvus는 다양한 환경에서 실행할 수 있지만, 대부분의 경우 Docker를 이용한 설치가 가장 간단하고 안정적입니다.

특히 학습 및 실습용으로는 Docker Compose를 활용하는 것이 편리하죠.

🧰 Milvus 설치 방법 (Docker 기반)

  1. Docker와 Docker Compose를 설치합니다.
  2. Milvus 공식 Github 저장소에서 docker-compose 파일을 다운로드합니다.
  3. 터미널에서 docker-compose up -d 명령어로 Milvus를 실행합니다.
git clone https://github.com/milvus-io/milvus.git
cd milvus/deployments/docker-compose
docker-compose up -d

 

위 명령어를 실행하면 Milvus와 필수 서비스(Meta Store, Message Queue 등)가 함께 실행됩니다.

약 2~3분이면 모든 컨테이너가 정상적으로 뜨고,

Milvus 서버가 로컬에서 포트 19530번으로 열려요.

Milvus 실행 확인

Milvus가 잘 실행됐는지 확인하려면 아래 명령어를 이용해 로그를 확인해 보세요.

docker-compose logs -f milvus-standalone

 

"Milvus is ready to serve" 라는 메시지가 뜬다면 설치 성공!

이제 Python에서 연동할 준비가 된 거예요 😎

📦 Milvus 구성요소 요약

구성 요소 설명
Milvus 벡터 저장 및 검색 엔진
Etcd 분산 구성 저장소 (메타데이터 관리)
MinIO 객체 스토리지 시스템 (파일 저장소)
Pulsar/Kafka 메시지 큐 시스템 (비동기 처리)

Milvus 버전 확인

docker exec -it milvus-standalone milvus --version

 

여기까지 설치가 완료되었다면, 이제 Milvus와 Python을 연결해서 실제 데이터를 넣고 검색해 볼 수 있습니다.

바로 다음 단계에서 Milvus의 Python SDK를 활용해보겠습니다!

 

 

4. 파이썬에서 Milvus 연동하기 🐍

Milvus가 잘 설치되었다면, 이제 Python 코드에서 Milvus에 연결하고 데이터를 주고받을 수 있어야겠죠?

이를 위해 Milvus 팀이 공식적으로 제공하는 pymilvus 라이브러리를 사용합니다.

이 모듈은 Milvus 서버와의 통신을 쉽게 만들어주는 Python SDK입니다.

🛠️ pymilvus 설치 및 환경 설정

pip install pymilvus

 

이제 Python에서 Milvus 서버와 연결을 시도해볼 수 있습니다.

기본 포트는 19530이고, Docker로 실행했다면 localhost로 접근할 수 있어요.

from pymilvus import connections

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

📌 연결 확인

from pymilvus import utility

print(utility.get_server_version())  # 버전 출력
print(utility.has_collection("my_collection"))  # 컬렉션 존재 확인

 

Milvus와 연결이 성공하면 서버 버전이 출력되고, 컬렉션 여부를 확인할 수 있습니다.

이제 데이터를 저장할 공간인 컬렉션(collection)을 생성해 봅시다!

📁 컬렉션 생성: 벡터 저장 공간 만들기

from pymilvus import Collection, FieldSchema, CollectionSchema, DataType

fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)
]

schema = CollectionSchema(fields=fields, description="Test vector collection")

collection = Collection(name="my_collection", schema=schema)
  • id 필드는 primary key로 지정되어 있어야 합니다.
  • embedding 필드는 벡터 값을 저장하며, 차원(dim)을 꼭 지정해야 합니다.

✅ 요약: Milvus 연동 핵심 단계

  1. pymilvus 설치
  2. Milvus 서버 연결 (host, port 확인)
  3. 컬렉션 스키마 정의
  4. 컬렉션 생성 및 존재 여부 확인

이제 Milvus에 연결해서 데이터를 저장할 준비가 완료되었습니다!

다음 단계에서는 실제 벡터 데이터를 삽입하고 유사한 벡터를 검색해보는 실전 예제를 다뤄보겠습니다 🚀

 

 

5. Milvus 실전 예제: 벡터 삽입과 검색 🔢

Milvus에 컬렉션을 만들고 연결을 완료했다면, 이제 진짜 벡터 데이터를 넣어보고, 그 중에서 가장 유사한 벡터를 검색해보는 실습을 해봐야겠죠?

이 파트에서는 벡터 데이터 삽입 → 인덱스 생성 → 유사도 검색까지의 전 과정을 차례대로 설명드릴게요.

📌 Step 1: 임의의 벡터 데이터 생성 및 삽입

import random
import numpy as np
from pymilvus import Collection

# 128차원 임의 벡터 생성
def generate_vectors(num, dim):
    return [[random.random() for _ in range(dim)] for _ in range(num)]

vectors = generate_vectors(5, 128)
ids = [i for i in range(5)]

collection = Collection("my_collection")
collection.insert([ids, vectors])
  • 총 5개의 벡터를 생성해서 ID와 함께 삽입합니다.

삽입이 완료되면 내부적으로 Milvus는 데이터를 segment로 나눠서 디스크에 저장합니다.

그다음으로 해야 할 작업은 빠른 검색을 위한 인덱스 생성입니다.

📌 Step 2: 인덱스 생성

index_params = {
    "metric_type": "L2",
    "index_type": "IVF_FLAT",
    "params": {"nlist": 64}
}

collection.create_index(
    field_name="embedding",
    index_params=index_params
)

collection.load()  # 컬렉션 로딩

 

Milvus는 다양한 인덱스 타입을 지원하는데, 여기서는 가장 기본적인 IVF_FLAT을 사용했어요.

검색을 하기 위해선 반드시 컬렉션을 load() 해줘야 합니다!

📌 Step 3: 유사도 검색 (Similarity Search)

search_params = {"metric_type": "L2", "params": {"nprobe": 10}}

query_vector = [vectors[0]]  # 첫 번째 벡터를 검색 기준으로 사용

results = collection.search(
    data=query_vector,
    anns_field="embedding",
    param=search_params,
    limit=3,
    output_fields=["id"]
)

for result in results[0]:
    print(f"ID: {result.id}, Distance: {result.distance}")

 

위 코드는 첫 번째 벡터와 가장 유사한 3개의 벡터를 찾아내는 예제입니다.

유사도 측정에는 L2 거리(Euclidean Distance)가 사용되고, nprobe는 검색 정확도와 속도에 영향을 주는 매개변수입니다.

🧾 전체 프로세스 요약

  1. 벡터 데이터 생성
  2. Milvus 컬렉션에 삽입
  3. 인덱스 생성
  4. 컬렉션 로드
  5. 검색 수행

여기까지 따라오셨다면, 이제 Milvus를 이용해 벡터 데이터를 완전히 다룰 수 있게 된 거예요!

그렇다면 이런 기능을 실제 서비스에서는 어떻게 쓸 수 있을까요?

 

다음 마지막 섹션에서 Milvus를 활용한 AI 서비스 시나리오를 함께 살펴봅시다 😊

 

6. Milvus를 활용한 AI 서비스 시나리오 🚀

이제 Milvus의 기본적인 사용법과 구조는 익혔습니다.

그럼 도대체 Milvus를 실제 서비스에서는 어떻게 활용할 수 있을까요?

이 파트에서는 Milvus의 기능을 살려 구현할 수 있는 대표적인 AI 서비스 시나리오 4가지를 소개하겠습니다.

🧠 1. RAG 기반 챗봇: LLM과 Milvus의 완벽 콤보

최근 가장 핫한 AI 아키텍처 중 하나인 RAG(Retrieval-Augmented Generation)는 LLM에 벡터 검색을 결합해 보다 정확하고 실제 데이터 기반의 답변을 생성하는 방식입니다.

  • 질문을 임베딩(embedding) 벡터로 변환
  • Milvus에서 관련 문서를 벡터 유사도로 검색
  • 검색된 문서를 기반으로 LLM이 응답 생성

이 방식은 ChatGPT 플러그인, 사내 지식 챗봇, 검색 기반 문서 요약 등에 널리 쓰이고 있으며 Milvus는 벡터 검색을 빠르게 처리하는 핵심 엔진 역할을 합니다.

🖼️ 2. 이미지 검색 및 추천 시스템

유저가 업로드한 이미지와 유사한 사진이나 상품을 추천하고 싶을 때, Milvus는 딱 맞는 도구입니다.

이미지를 벡터로 변환해 저장하고, 유사한 벡터를 찾아주는 것이 핵심이죠.

# 예시) 이미지 feature vector 추출 후 Milvus에 저장 및 검색
image_vector = model.encode(image)
collection.insert([image_id, image_vector])
collection.search(data=[image_vector], anns_field="embedding", ...)

 

AI 모델은 이미지 간 유사도를 판단하고, Milvus는 가장 유사한 이미지를 뽑아냅니다.

이런 구조는 이커머스 추천, 디자인 검색, 패션 코디 추천 등 다양한 곳에 활용돼요.

📚 3. 학습 콘텐츠 큐레이션 시스템

사용자가 공부하고 있는 개념이나 질문 내용을 바탕으로, 가장 관련성 높은 학습 자료를 추천해주는 시스템입니다.

  • "파이썬 리스트 슬라이싱이 뭐야?" → 관련 블로그, 문서, 영상 추천

텍스트 벡터 임베딩 + Milvus 검색 + 추천 알고리즘을 조합하면 개인화된 학습 경험을 제공할 수 있어요.

온라인 교육 플랫폼에서 특히 많이 활용됩니다.

🔐 4. 얼굴 인식 보안 시스템

CCTV 영상에서 추출한 얼굴 특징 벡터를 기반으로, Milvus에 저장된 사용자 벡터와 비교하여 신원을 판별합니다.

이는 금융 보안, 사무실 출입, 비대면 신원 인증 등 보안이 중요한 환경에서 빠르고 정확한 인증 수단으로 각광받고 있어요.

🚀 Milvus는 단순한 DB가 아닙니다

Milvus는 AI 기능을 실시간으로 가능하게 만들어주는 검색 엔진이자 추론 인프라입니다.

단순한 저장소가 아니라, 데이터를 "이해하고 연결하는" 기능을 제공하는 차세대 도구죠.

 

 

마무리  🧩

지금까지 벡터 데이터베이스 Milvus의 개념부터 설치, 파이썬 연동, 실전 예제까지 한 걸음씩 알아봤습니다.

처음엔 생소할 수 있지만, AI 서비스를 만들다 보면 Milvus와 같은 벡터 DB의 필요성을 절실히 느끼게 됩니다.

특히 검색 기능이나 추천 시스템, RAG 구조 기반의 LLM 챗봇을 구현할 때 Milvus는 단순한 저장소가 아니라 핵심 인프라로서의 역할을 하죠.

기존 RDB나 NoSQL과는 전혀 다른 방식으로 데이터를 처리하고 검색하는 이 새로운 패러다임은, 앞으로 AI 시대에서 더욱 널리 활용될 것으로 보입니다.

처음 배우는 분들을 위해 최대한 쉽게 설명드리려고 했지만, 실습하면서 막히는 부분이 있다면 공식 문서와 커뮤니티도 적극 참고해보세요.

Milvus는 전 세계적으로 활발하게 사용되는 프로젝트이기 때문에, 다양한 예제와 가이드도 잘 정리되어 있답니다 😊

이번 글을 통해 벡터 DB의 기초를 다지고, 여러분만의 AI 서비스로 확장해보세요!

늘 그렇듯, 코딩은 직접 손으로 해봐야 진짜 내 것이 된답니다 💪

반응형