FiftyOne과 Milvus로 멀티모달 임베딩 탐색하기
멀티모달 검색 증강 생성 (RAG) 앱을 구축하기 위한 첫 번째 단계는 무엇일까요? 멀티모달 벡터 임베딩을 얻는 것입니다. 어떤 면에서는 임베딩이 멀티모달이라고 말하는 것은 잘못된 표현입니다. 벡터 내에서 여러 모달리티를 다루는 방법은 많지만, 이 튜토리얼에서는 멀티모달 모델이 생성한 벡터 임베딩에 초점을 맞춥니다.
이 글에서는 다음을 다룹니다:
- “멀티모달”이란 무엇을 의미하나요?
- Milvus는 멀티모달 임베딩을 어떻게 처리하나요?
- 멀티모달 모델의 예
- 멀티모달 임베딩 탐색을 위한 FiftyOne 및 Milvus 사용
- FiftyOne과 CLIP을 통한 CIFAR 10의 멀티모달 임베딩 탐색
- Milvus를 사용한 데이터 탐색을 위해 FiftyOne을 어떻게 더 맞춤 설정할 수 있나요?
- FiftyOne 및 Milvus를 통한 멀티모달 임베딩 탐색 요약
“멀티모달”이란 무엇을 의미하나요?
"멀티모달"에 대해 논의할 때, 우리는 모델의 능력을 의미합니다. RAG 스택의 대규모 언어 모델/기반 모델과 임베딩 모델 모두 멀티모달일 수 있습니다. 이 예제에서는 오픈 소스 모델의 멀티모달 임베딩을 살펴봅니다. 벡터 임베딩은 어떻게 얻을까요? 벡터 임베딩은 임베딩 모델의 끝에서 두 번째 레이어에서 나옵니다.
이는 모델의 각 레이어가 입력에 대한 일부 정보를 학습하고, 마지막 레이어가 예측을 수행하기 때문입니다. 우리는 예측을 원하는 것이 아니라 데이터의 수치적 표현을 다룰 수 있기를 원하므로, 마지막 레이어를 잘라내고 모델이 학습한 모든 정보를 포함하는 끝에서 두 번째 레이어의 출력을 가져옵니다. 탐색을 용이하게 하기 위해 FiftyOne을 사용하고, 벡터를 저장하기 위해 Milvus를 사용합니다.
Milvus는 멀티모달 임베딩을 어떻게 처리하나요?
멀티모달 임베딩, 또는 일반적으로 벡터 임베딩의 멋진 점은 특별한 처리가 필요하지 않다는 것입니다. 벡터 임베딩은 특정 유형의 입력 데이터에 대한 수치적 표현일 뿐입니다. 실제 데이터 유형과 관련해, 벡터 임베딩은 숫자 목록인 벡터일 뿐입니다. Milvus는 이러한 모든 벡터를 동일한 방식으로 처리합니다.
벡터는 밀집형 또는 희소형일 수 있습니다. 밀집형 벡터는 일반적으로 부동소수점 수로 구성되며 딥러닝 모델에 의해 생성되는데, 오늘 그 예를 살펴볼 것입니다. 희소형 벡터는 때때로 이진 벡터라고 불리며 0과 1로 구성됩니다. 벡터를 다룰 때 명심해야 할 중요한 점은 같은 크기 또는 차원의 벡터만 비교할 수 있다는 것입니다. 더욱이 크기가 같더라도, 서로 다른 모델이 생성한 임베딩을 반드시 동일한 기준으로 비교할 수는 없습니다.
멀티모달 임베딩은 특히 까다롭습니다. 대부분의 딥러닝 모델은 하나의 유형, 즉 데이터의 모달리티를 처리하도록 설계되어 있습니다. 이는 이미지, 텍스트, 비디오 또는 더 맞춤화된 무언가일 수 있습니다. 그러나 이러한 모델은 한 가지 유형의 데이터에만 최적화되어 있기 때문에 다른 모달리티를 처리하거나 표현할 수 없습니다 — 텍스트 입력을 받도록 훈련된 모델은 일반적으로 이미지를 받을 수 없습니다.
멀티모달 모델은 여러 유형의 데이터와 상호작용하도록 훈련됩니다. 우리의 목적상, 여러 데이터 모달리티에 대한 벡터 임베딩을 생성하는 멀티모달 모델에 관심이 있습니다. 특히, 생성된 벡터의 차원이 동일하고 이를 유사하게 합리적으로 다룰 수 있도록 텍스트 및 시각 데이터를 같은 공간에 임베딩하는 모델에 관심이 있습니다.
텍스트 및 이미지 임베딩을 생성하는 가장 일반적인 멀티모달 모델은 OpenAI의 CLIP으로, 대조 기법을 사용하여 사진의 이미지 임베딩을 해당 캡션의 텍스트 임베딩과 정렬합니다.
멀티모달 임베딩 탐색을 위한 FiftyOne 및 Milvus 사용
FiftyOne은 비정형 데이터의 큐레이션 및 시각화를 위한 선도적인 오픈 소스 라이브러리입니다. FiftyOne은 여러 벡터 저장소 백엔드와 통합되며, Milvus는 특히 대규모로 계속 증가하는 데이터셋을 유연하게 다루는 데 매우 적합합니다. 이 예제에서는 노트북에서 바로 시작할 수 있는 Milvus의 임베디드 버전인 Milvus Lite를 사용합니다. 자세히 살펴보려면 이 Milvus Lite에 대한 엔드투엔드 가이드를 확인하세요.
코드로 들어가기 전에, 모든 적절한 사전 요구 사항이 설치되어 있는지 확인하세요. pip install milvus pymilvus fiftyone torch torchvision을 실행해야 합니다. 첫 번째 단계는 Milvus Lite 인스턴스를 띄우는 것입니다. Milvus에서 default_server를 가져오고 start() 함수를 호출하면 됩니다.
from milvus import default_server
default_server.start()
이제 Milvus 인스턴스가 준비되었으므로, 벡터 임베딩 비교를 위해 이를 FiftyOne에 연결할 수 있습니다. FiftyOne, FiftyOne Brain, 그리고 FiftyOne Zoo를 가져오고 CIFAR 10 데이터셋의 테스트 분할을 로드합니다.
import fiftyone as fo
import fiftyone.brain as fob
import fiftyone.zoo as foz
# Step 1: Load your data into FiftyOne
dataset = foz.load_zoo_dataset("cifar10", split="test")
이 예제에서는 CLIP 모델을 사용하여 이미지를 임베딩합니다. 그런 다음 FiftyOne Brain의 compute_similarity 함수를 사용합니다. 이 함수는 먼저 지정된 모델을 사용해 샘플의 임베딩을 생성한 다음, 이러한 임베딩으로 Milvus 컬렉션을 만들고 이를 FiftyOne 샘플 컬렉션에 연결합니다. FiftyOne과 벡터 검색 백엔드를 사용하면 이미지, 객체 패치, 심지어 비디오 프레임에 대해서도 유사도 인덱스를 생성할 수 있습니다!
compute_similarity 함수는 FiftyOne 데이터셋과 다양한 명명된 매개변수를 받습니다. brain_key는 FiftyOne이 실행을 추적하는 데 사용하는 고유 키입니다. backend 키는 어떤 벡터 데이터베이스 백엔드를 사용할지 FiftyOne에 알려주며, model은 FiftyOne이 임베딩을 생성하는 데 활용할 모델의 이름을 받습니다.
fob.compute_similarity(
dataset,
brain_key="clip_sim",
backend="milvus",
model="clip-vit-base32-torch",
)
탐색하기 전에 여기서 살펴볼 마지막 단계는 FiftyOne을 사용해 FiftyOne App을 실행하는 것입니다. 데이터셋을 전달하고 auto=False로 설정하여 창이 노트북에서 열리지 않도록 하되, localhost:5151의 Chrome 탭을 통해 접근할 수 있게 합니다.
session = fo.launch_app(dataset, auto=False)
FiftyOne과 CLIP을 통한 CIFAR 10의 멀티모달 임베딩 탐색
이제 탐색할 시간입니다! 텍스트를 사용해 의미적으로 유사한 이미지를 찾는 방법을 살펴보겠습니다. Ferrari, Mustang, Pony라는 세 단어를 살펴보겠습니다.
Ferrari에 대한 첫 번째 검색 결과는 자동차입니다.
다음 검색어인 “pony”는 분명히 말 사진을 보여줍니다.
하지만 “mustang”을 검색하면 혼합된 결과가 나옵니다.
이 단계는 데이터셋을 평가하고 데이터의 맥락을 이해하는 것이 필수적임을 보여줍니다!
Milvus를 활용한 데이터 탐색을 위해 FiftyOne을 어떻게 더 맞춤화할 수 있을까요?
FiftyOne에서 벡터 검색을 위한 기본 “backend”로 Milvus를 설정하려면 다음 환경 변수를 source할 수 있습니다.
export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
주어진 어떤 인덱스에 대해서도 컬렉션 이름, 사용할 일관성 수준, 그리고 유사성을 평가하는 데 사용할 메트릭을 지정할 수 있습니다. 다음은 유클리드 메트릭과 Bounded 일관성을 사용하는 두 번째 유사도 인덱스입니다.
fob.compute_similarity(
dataset,
brain_key="clip_euclid",
model="clip-vit-base32-torch",
metric="euclidean",
consistency_level="Bounded"
)
데이터셋에 여러 유사도 인덱스가 있는 경우, 돋보기 아래 검색창 옆의 톱니바퀴 아이콘을 클릭하고 brain key로 인덱스를 선택하여 앱에서 사용할 인덱스를 선택할 수 있습니다.
이미지와 텍스트 임베딩을 생성하기 위해 다른 멀티모달 모델을 사용할 수도 있습니다. 실제로 어떤 OpenCLIP 모델이든(며칠 안에 여기에 더 나은 링크가 제공될 예정입니다), 또는 Hugging Face의 Transformers 라이브러리의 어떤 제로샷 예측 모델이든 사용할 수 있습니다. 예를 들어, 다음은 AltCLIP으로 구성된 인덱스입니다.
!pip install transformers
fob.compute_similarity(
dataset,
brain_key="altclip",
model="zero-shot-classification-transformer-torch",
name_or_path="BAAI/AltCLIP",
)
FiftyOne과 Milvus로 멀티모달 임베딩 탐색 요약
이 글에서는 멀티모달 임베딩이 FiftyOne 및 Milvus와 어떻게 작동하는지 살펴보았습니다. 인기 있는 데이터셋인 CIFAR 10에서 인기 있는 멀티모달 모델인 CLIP을 탐색하는 방법을 보여주었습니다. CLIP을 사용해 입력 데이터의 임베딩을 생성하고, Milvus를 사용해 멀티모달 데이터의 임베딩(때로는 “multimodal embeddings”라고도 함)을 저장하며, FiftyOne을 사용해 임베딩을 탐색합니다.
이와 같이 CLIP을 사용하면 텍스트로 이미지를 검색할 수 있습니다. 이를 통해 자연어를 사용하여 서로 다른 맥락에서 다른 의미를 가질 수 있는 단어들의 이미지를 비교하며 공간을 탐색했습니다. “pony”는 명확히 말이고, “Ferrari”는 명확히 자동차이지만, “mustang”은 둘 중 어느 쪽일 수도 있음을 살펴보았습니다.
계속 읽기

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.

Introducing Business Critical Plan: Enterprise-Grade Security and Compliance for Mission-Critical AI Applications
Discover Zilliz Cloud’s Business Critical Plan—offering advanced security, compliance, and uptime for mission-critical AI and vector database workloads.

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.



