Исследование мультимодальных эмбеддингов с FiftyOne и Milvus
Каков первый шаг к созданию мультимодального приложения retrieval augmented generation (RAG)? Получение мультимодальных vector embeddings. В некотором смысле называть embedding мультимодальным — это неправильное употребление термина. Существует множество способов работать с несколькими модальностями внутри vectors, но в этом руководстве мы сосредоточимся на vector embeddings, создаваемых мультимодальными моделями.
В этой статье мы рассмотрим:
- Что означает «мультимодальный»?
- Как Milvus обрабатывает мультимодальные embeddings?
- Примеры мультимодальных моделей
- Использование FiftyOne и Milvus для исследования мультимодальных embeddings
- Исследование мультимодальных embeddings для CIFAR 10 с помощью FiftyOne и CLIP
- Как мы можем дополнительно настроить FiftyOne для исследования данных с Milvus?
- Краткое изложение исследования мультимодальных embeddings с FiftyOne и Milvus
Что означает «мультимодальный»?
Когда мы говорим о «мультимодальности», мы имеем в виду возможности моделей. Как большая языковая модель/фундаментальная модель, так и embedding model в стеке RAG могут быть мультимодальными. В этом примере мы исследуем мультимодальные embeddings из open-source модели. Как получить vector embedding? Vector embeddings берутся из предпоследнего слоя embedding model.
Это потому, что каждый слой модели изучает некоторую информацию о входных данных, а последний слой делает предсказание. Поскольку нам нужно не предсказание, а возможность работать с числовым представлением данных, мы отсекаем последний слой и берём выход предпоследнего слоя, который содержит всю информацию, изученную моделью. Мы используем FiftyOne для упрощения исследования и Milvus для хранения vectors.
Как Milvus обрабатывает мультимодальные embeddings?
Особенность мультимодальных embeddings, или vector embeddings в целом, заключается в том, что они не требуют специальной обработки. Vector embeddings — это просто числовые представления определённого типа входных данных. Что касается фактического типа данных, vector embeddings — это просто vectors, список чисел. Milvus обрабатывает все эти vectors одинаковым образом.
Vectors могут быть dense или sparse. Dense vectors обычно состоят из чисел с плавающей точкой и создаются deep learning моделями, пример чего мы увидим сегодня. Sparse vectors иногда называют binary vectors, и они состоят из 0 и 1. Важно помнить при работе с vectors, что сравнивать можно только vectors одного размера или размерности. Более того, даже когда они одного размера, embeddings, сгенерированные разными моделями, не обязательно можно сравнивать напрямую.
Мультимодальные embeddings особенно сложны. Большинство deep learning моделей предназначены для работы с одним типом, или модальностью, данных. Это могут быть изображения, текст, видео или что-то более специализированное. Однако, поскольку эти модели оптимизированы только для одного типа данных, они не могут обрабатывать или представлять другие модальности — модель, обученная принимать текстовый ввод, обычно не сможет принимать изображения.
Мультимодальные модели обучаются взаимодействовать с несколькими типами данных. Для наших целей нас интересуют мультимодальные модели, которые создают vector embeddings для нескольких модальностей данных. В частности, нас интересуют модели, которые встраивают текстовые и визуальные данные в одно и то же пространство, чтобы размерности сгенерированных vectors совпадали и мы могли осмысленно рассматривать их сходным образом.
Самая распространённая мультимодальная модель для генерации текстовых и image embeddings — это CLIP от OpenAI, которая использует contrastive techniques, чтобы согласовывать image embeddings фотографий с text embeddings их подписей.
Использование FiftyOne и Milvus для исследования мультимодальных embeddings
FiftyOne — ведущая библиотека с открытым исходным кодом для курирования и визуализации неструктурированных данных. FiftyOne интегрируется с несколькими бэкендами векторных хранилищ, при этом Milvus особенно хорошо подходит для гибкой работы с большими, растущими наборами данных. В этом примере мы используем Milvus Lite, встроенную версию Milvus, которую можно запустить прямо в вашем notebook. Для подробного обзора ознакомьтесь с этим сквозным руководством по Milvus Lite.
Прежде чем переходить к коду, убедитесь, что установлены все необходимые предварительные компоненты. Необходимо выполнить pip install milvus pymilvus fiftyone torch torchvision. Первый шаг — запустить наш экземпляр Milvus Lite. Мы можем сделать это, импортировав default_server из Milvus и вызвав функцию 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 для создания эмбеддингов наших изображений. Затем мы воспользуемся функцией compute_similarity из FiftyOne Brain. Эта функция сначала генерирует эмбеддинги для наших образцов с использованием указанной модели, затем создает коллекцию 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, чтобы окно не открывалось в notebook, но было доступно через вкладку Chrome по адресу localhost:5151.
session = fo.launch_app(dataset, auto=False)
Мультимодальное исследование эмбеддингов для CIFAR 10 с помощью FiftyOne и CLIP
Пора исследовать! Давайте посмотрим, как использовать текст для поиска семантически похожих изображений. Рассмотрим три слова: Ferrari, Mustang и Pony.
Наш первый поиск Ferrari — это автомобиль.
Следующий поиск, “pony”, явно дает нам изображения лошадей.
Но если мы ищем “mustang”, мы получаем смесь.
Этот шаг показывает, что важно оценивать ваш набор данных и понимать контекст ваших данных!
Как можно дополнительно настроить FiftyOne для исследования данных с Milvus?
Чтобы установить Milvus в качестве “backend” по умолчанию для векторного поиска в FiftyOne, мы можем подключить следующую переменную окружения:
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 (через несколько дней у нас будет более подходящая ссылка здесь) или любой моделью zero-shot-предсказания из библиотеки Transformers от Hugging Face. В качестве примера вот индекс, созданный с помощью 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. Мы показали, как можно исследовать популярную мультимодальную модель — CLIP — на популярном наборе данных — CIFAR 10. Вы используете CLIP для создания эмбеддингов входных данных, Milvus — для хранения эмбеддингов мультимодальных данных (иногда называемых “мультимодальными эмбеддингами”), а FiftyOne — для исследования эмбеддингов.
Использование CLIP таким образом позволяет искать изображения с помощью текста. С этим мы исследовали пространство, используя естественный язык для сравнения изображений слов, которые могут иметь разные значения в разных контекстах. Мы рассмотрели, как “pony” — это явно лошадь, “Ferrari” — явно автомобиль, но “mustang” может быть и тем, и другим.
Читать далее

A Few Notes from Databricks Data + AI Summit 2026: Why the Data Layer Matters Again
James Luan shares notes from Databricks Data + AI Summit 2026 on why production AI is pushing the data layer back to the center of infrastructure.

What Is a Vector Lakebase?
A Vector Lakebase is a unified, lake-native data architecture for AI that combines vector-database-grade serving with open lake storage, reusable lake-level indexes, and a shared semantic layer.

Building RAG Pipelines for Real-Time Data with Cloudera and Milvus
explore how Cloudera can be integrated with Milvus to effectively implement some of the key functionalities of RAG pipelines.



