Milvus와 Streamlit을 사용한 멀티모달 제품 추천 데모 구축하기
Milvus Composed Image Retrieval demo는 역이미지 검색을 선보이며, Milvus Multimodal RAG demo는 이 기술을 제품 추천에 사용합니다. 이미지를 업로드하고 텍스트 지시사항을 입력하기만 하면, Google의 MagicLens 멀티모달 임베딩 모델이 이미지와 텍스트를 모두 하나의 멀티모달 벡터로 인코딩합니다. 그런 다음 이 벡터는 Milvus 벡터 데이터베이스에서 가장 잘 일치하는 Amazon 제품을 찾는 데 사용됩니다.
🎨🔍 Milvus Magic 소개: 이미지 검색 & 스마트 쇼핑!
사진을 보여주고 원하는 것을 설명하는 것만으로 제품을 찾을 수 있으면 좋겠다고 생각한 적 있나요? 이제 가능합니다! 🛍️✨
멋진 데모가 작동하는 방식은 다음과 같습니다:
📸 사진을 찍고 찾고 있는 것을 입력하세요
🧙♂️ Milvus Magic이 입력을 특별한 "멀티모달 벡터"로 변환합니다(멋지죠?)
🕵️♀️ 이 벡터는 Milvus 벡터 데이터베이스를 검색하는 슈퍼 탐정이 됩니다
🎉 짜잔! 이미지와 설명에 맞는 Amazon 제품을 찾아냅니다
이 블로그에서는 Milvus Multimodal RAG demo를 실행하는 방법을 보여드리겠습니다.
멀티모달 제품 추천기에 사용된 기술
Google DeepMind의 MagicLens는 CLIP (OpenAI 2021) 또는 CoCa (Google Research 2022)를 기반으로 텍스트와 이미지를 처리하는 듀얼 인코더 아키텍처를 사용하는 멀티모달 임베딩 모델입니다. MagicLens는 학습된 가중치를 공통 벡터 공간에 융합하여 이미지-이미지 및 텍스트-이미지를 포함한 다양한 검색 작업을 지원합니다. 36.7M개의 트리플릿으로 학습되어 이미지-이미지, 텍스트-이미지, 멀티모달 텍스트-이미지 조합 검색 작업을 수행할 수 있으며, 훨씬 더 작은 모델 크기로 이전 모델보다 뛰어난 성능을 보입니다.
OpenAI의 GPT-4o는 텍스트, 이미지 및 기타 데이터 유형을 단일 모델에 통합하여 기존 언어 모델을 향상시키는 OpenAI의 생성형 멀티모달 대규모 언어 모델입니다. 이 고급 AI는 복잡한 정보에 대한 더 깊은 이해와 처리를 제공하여 정확성과 문맥 인식 능력을 향상시킵니다. 자연어 처리부터 컴퓨터 비전까지 다양한 애플리케이션을 지원합니다.
Milvus는 Generative AI 워크로드를 위해 벡터를 저장, 인덱싱 및 검색하는 오픈소스 분산 벡터 데이터베이스입니다. 하이브리드 검색, 메타데이터 필터링, 리랭킹을 수행하고 수조 개의 벡터를 효율적으로 처리하는 능력 덕분에 Milvus는 AI 및 머신 러닝 워크로드에서 선호되는 선택지입니다. Milvus는 로컬, 클러스터 또는 Zilliz Cloud에 호스팅하여 실행할 수 있습니다.
Streamlit은 웹 애플리케이션 생성 및 실행을 단순화하는 오픈소스 Python 라이브러리입니다. 개발자는 CSS나 Node.js와 같은 JavaScript 프레임워크 등 웹 기술에 대한 광범위한 지식 없이도 간단한 Python 스크립트를 사용하여 대시보드, 데이터 보고서 및 간단한 머신 러닝 인터페이스를 구축하고 배포할 수 있습니다.
데이터 준비하기
이 데모의 데이터는 Amazon Reviews 2023 dataset에서 가져왔습니다. 원본 데이터 소스에는 가전제품, 뷰티, 의류, 스포츠, 아웃도어 및 추가 “Unknown” 카테고리와 같은 33개 카테고리의 4,800만 개 아이템에 대한 5,400만 개의 사용자 리뷰가 포함되어 있습니다.
카테고리별로 균등하게 샘플링하여 사용 가능한 데이터 중 5K 아이템 하위 집합만 사용하겠습니다. download_images.py를 실행하여 이미지를 다운로드하세요.
$ python download_images.py
각 제품 데이터 행은 아이템 메타데이터(예: 카테고리 이름 및 평균 사용자 리뷰 평점)와 제품의 썸네일 및 큰 이미지에 대한 이미지 URL로 구성됩니다.
벡터 데이터의 경우, 이 데모는 제품당 하나의 큰 이미지 임베딩 벡터를 사용합니다.
MagicLens 설정 지침
이 가이드는 Google DeepMind가 개발한 강력한 이미지 검색 시스템인 MagicLens의 환경을 설정하고 모델 가중치를 다운로드하는 과정을 안내합니다. 더 자세한 정보는 MagicLens GitHub repository를 방문하세요.
환경 설정
- conda 환경을 생성합니다:
$ conda create --name magic_lens python=3.9
- 환경을 활성화합니다:
$ conda activate magic_lens
- Scenic 저장소를 클론합니다:
$ git clone https://github.com/google-research/scenic.git
- Scenic 디렉터리로 이동합니다:
$ cd scenic
- Scenic을 설치합니다:
$ pip install
- CLIP 종속성을 설치합니다:
$ pip install -r scenic/projects/baselines/clip/requirements.txt
- Jax를 설치합니다:
처리에 GPU를 사용하는 경우, 해당 GPU 버전의 Jax를 설치해야 할 수 있습니다. 자세한 단계는 JAX documentation 페이지의 지침을 따르세요.
다음은 특정 CUDA 버전에 대한 예시입니다(Linux 전용):
CUDA 12 설치:
$ pip install --upgrade "jax[cuda12_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
CUDA 11 설치:
$ pip install --upgrade "jax[cuda11_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
모델 가중치를 로컬에 다운로드
- 기본 폴더로 돌아갑니다:
$ cd .. # This will take you back to the main directory where you cloned the demo.
- 모델을 다운로드합니다(인증이 필요할 수 있음):
$ gsutil cp -R gs://gresearch/magiclens/models ./
Milvus 컬렉션 생성 및 벡터 저장
이 데모의 Milvus 서버는 schema-less Milvus Client를 사용하는 Milvus Lite입니다.
index.py를 실행하여 컬렉션을 생성하고, 각 이미지를 벡터로 인코딩한 다음, 벡터 데이터를 Milvus에 로드합니다.
$ python index.py
이 단계에서는 각 이미지를 768차원 벡터로 인코딩합니다. 샘플의 각 제품에 대해 이미지 벡터는 관련 제품 메타데이터와 함께 AUTOINDEX(HNSW)가 적용된 “cir_demo_large”라는 Milvus 컬렉션에 저장됩니다.
Milvus 인덱싱 및 검색
런타임에 이미지와 텍스트로 역검색을 수행하면, Milvus는 COSINE vector distance를 사용하여 가장 가까운 상위 top_k = 100개의 이미지 벡터를 검색합니다.
Milvus는 top_k를 자동으로 내림차순으로 정렬합니다(COSINE 거리 값이 클수록 더 가깝다는 의미이기 때문입니다).
Streamlit 서버 프런트엔드 실행
로컬 파일
cfg.py를 업데이트하여 경로 이름을 이미지 및 모델 가중치에 대한 로컬 경로로 교체합니다.터미널에서 다음을 실행하여 앱을 시작합니다:
$ streamlit run ui.py
- 앱 사용:
제품 검색을 안내할 이미지를 업로드합니다.
검색을 안내할 텍스트 지시문을 입력합니다.
Milvus 벡터 데이터베이스에서 유사한 제품을 찾으려면 "Search"를 클릭하세요.
AI 기반 추천을 받으려면 "Ask GPT"를 클릭하세요.
그림 1- 데모 앱의 인터페이스
그림 1: 데모 앱의 인터페이스
이 앱의 작동 방식:
Search 기능은 Multimodal Embedding 모델인 MagicLens를 사용하여 이미지와 텍스트를 벡터로 임베딩합니다. 이는 Milvus 벡터 데이터베이스에 저장된 제품 이미지를 임베딩하는 데 사용된 것과 동일한 모델입니다. 그런 다음 Milvus는 Approximate Nearest Neighbor(ANN) 벡터 검색을 수행하여 입력 벡터와 가장 가까운 top_k 제품 이미지를 찾습니다.
Ask GPT 기능은 OpenAI의 GPT-4o mini 멀티모달 생성 모델을 호출합니다. 검색 결과에서 상위 25개의 이미지를 가져와 프롬프트에 넣고 모델로 보냅니다. 그러면 GPT-4o mini가 가장 적합한 이미지를 선택하고 선택 이유를 설명합니다.
그림 2- GPT-4o mini가 제공한 답변
그림 2: GPT-4o mini가 제공한 답변
참고 자료
bootcamp의 멀티모달 이미지 검색: https://github.com/milvus-io/bootcamp/tree/master/bootcamp/tutorials/quickstart/apps/cir_with_milvus
bootcamp의 재순위 추천을 활용한 멀티모달 RAG: https://github.com/milvus-io/bootcamp/tree/master/bootcamp/tutorials/quickstart/apps/multimodal_rag_with_milvus
Google MagicLens 모델: https://github.com/google-deepmind/magiclens
이 데모의 이론 배경에 관한 동영상: https://youtu.be/uaqlXRCvjG4?si=e83DnUsLZvVnWt-0&t=51
계속 읽기

Introducing Functions and Model Inference on Zilliz Cloud: Automatic Embedding and Reranking with Hosted Models
Zilliz Cloud Functions auto-generate embeddings via OpenAI, Voyage AI, Cohere, or Zilliz Hosted Models. Built-in reranking — just insert text and search.

Data Deduplication at Trillion Scale: How to Solve the Biggest Bottleneck of LLM Training
Explore how MinHash LSH and Milvus handle data deduplication at the trillion-scale level, solving key bottlenecks in LLM training for improved AI model performance.

Legal Document Analysis: Harnessing Zilliz Cloud's Semantic Search and RAG for Legal Insights
Enhance legal document analysis with Zilliz Cloud’s Semantic Search and RAG. Improve accuracy, efficiency, and scalability for contracts, case law, and compliance.




