Explorando Embeddings Multimodais com FiftyOne e Milvus
Qual é o primeiro passo para criar uma aplicação multimodal de geração aumentada por recuperação (RAG)? Obter embeddings vetoriais multimodais. De certa forma, dizer que um embedding é multimodal é um equívoco. Há muitas maneiras de trabalhar com múltiplas modalidades dentro de vetores, mas neste tutorial nos concentramos em embeddings vetoriais produzidos por modelos multimodais.
Neste artigo, abordamos:
- O que significa “multimodal”?
- Como o Milvus lida com embeddings multimodais?
- Exemplos de modelos multimodais
- Usando FiftyOne e Milvus para exploração de embeddings multimodais
- Exploração de embeddings multimodais para CIFAR 10 via FiftyOne e CLIP
- Como podemos personalizar ainda mais o FiftyOne para exploração de dados com Milvus?
- Resumo da exploração de embeddings multimodais com FiftyOne e Milvus
O que significa “multimodal”?
Ao discutir "multimodal", nos referimos às capacidades dos modelos. Tanto o modelo de linguagem grande/modelo fundacional quanto o modelo de embedding em uma stack RAG podem ser multimodais. Exploramos embeddings multimodais de um modelo de código aberto neste exemplo. Como obtemos um embedding vetorial? Embeddings vetoriais vêm da penúltima camada de um modelo de embedding.
Isso ocorre porque cada camada do modelo aprende alguma informação sobre a entrada, e a última camada faz uma previsão. Como não queremos uma previsão, mas sim poder trabalhar com uma representação numérica dos dados, cortamos a última camada e pegamos a saída da penúltima camada, que contém todas as informações que o modelo aprendeu. Usamos FiftyOne para facilitar a exploração e Milvus para armazenar os vetores.
Como o Milvus lida com embeddings multimodais?
O interessante sobre embeddings multimodais, ou embeddings vetoriais em geral, é que eles não precisam de tratamento especial. Embeddings vetoriais são apenas representações numéricas de um tipo específico de dado de entrada. Quanto ao tipo de dado real, embeddings vetoriais são apenas vetores, uma lista de números. O Milvus lida com todos esses vetores da mesma maneira.
Vetores podem ser densos ou esparsos. Vetores densos são normalmente compostos por floats e produzidos por modelos de deep learning, um exemplo do qual veremos hoje. Vetores esparsos às vezes são chamados de vetores binários e são compostos por 0s e 1s. Algo importante a ter em mente ao trabalhar com vetores é que somente vetores do mesmo tamanho ou dimensionalidade podem ser comparados. Além disso, mesmo quando têm o mesmo tamanho, embeddings gerados por modelos diferentes não podem necessariamente ser comparados de forma direta.
Embeddings multimodais são especialmente complicados. A maioria dos modelos de deep learning é projetada para lidar com um tipo, ou modalidade, de dado. Isso pode ser imagens, texto, vídeo ou algo mais específico. No entanto, como esses modelos são otimizados apenas para um tipo de dado, eles não conseguem processar ou representar outras modalidades — um modelo treinado para aceitar entrada de texto normalmente não conseguirá aceitar imagens.
Modelos multimodais são treinados para interagir com múltiplos tipos de dados. Para nossos propósitos, estamos interessados em modelos multimodais que produzem embeddings vetoriais para múltiplas modalidades de dados. Em particular, estamos interessados em modelos que incorporem dados textuais e visuais no mesmo espaço, de modo que as dimensões dos vetores gerados sejam as mesmas e possamos tratá-los de forma semelhante com sensatez.
O modelo multimodal mais comum para gerar embeddings de texto e imagem é o CLIP, da OpenAI, que usa técnicas contrastivas para alinhar os embeddings de imagem de fotografias com os embeddings de texto de suas legendas.
Usando FiftyOne e Milvus para exploração de embeddings multimodais
FiftyOne é a principal biblioteca de código aberto para curadoria e visualização de dados não estruturados. O FiftyOne integra-se a vários backends de armazenamento vetorial, com o Milvus sendo particularmente adequado para trabalhar de forma flexível com conjuntos de dados grandes e em crescimento. Neste exemplo, usamos o Milvus Lite, uma versão incorporada do Milvus que você pode iniciar diretamente no seu notebook. Para uma análise aprofundada, confira este guia de ponta a ponta do Milvus Lite.
Antes de mergulhar no código, certifique-se de que todos os pré-requisitos adequados estejam instalados. Você deve executar pip install milvus pymilvus fiftyone torch torchvision. O primeiro passo é iniciar nossa instância do Milvus Lite. Podemos fazer isso importando default_server do Milvus e chamando a função start().
from milvus import default_server
default_server.start()
Agora que temos uma instância do Milvus pronta para uso, podemos vinculá-la ao FiftyOne para comparações de embeddings vetoriais. Importamos o FiftyOne, o FiftyOne Brain, e o FiftyOne Zoo e carregamos a divisão de teste do conjunto de dados 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")
Usaremos o modelo CLIP para incorporar nossas imagens neste exemplo. Em seguida, usaremos a função compute_similarity do FiftyOne Brain. Essa função primeiro gera embeddings para nossas amostras usando um modelo especificado, depois cria uma coleção do Milvus a partir desses embeddings e a anexa à coleção de amostras do FiftyOne. Com o FiftyOne e backends de busca vetorial, você pode gerar um índice de similaridade sobre imagens, recortes de objetos e até mesmo quadros de vídeo!
A função compute_similarity recebe o conjunto de dados do FiftyOne e vários parâmetros nomeados. O brain_key é uma chave única que o FiftyOne usa para acompanhar as execuções. A chave backend informa ao FiftyOne qual backend de banco de dados vetorial usar, e o model recebe o nome do modelo que o FiftyOne aproveitará para criar embeddings.
fob.compute_similarity(
dataset,
brain_key="clip_sim",
backend="milvus",
model="clip-vit-base32-torch",
)
A última etapa que analisamos aqui antes de explorar é usar o FiftyOne para iniciar o FiftyOne App. Passamos o conjunto de dados e definimos auto=False para que a janela não seja aberta no notebook, mas possa ser acessada por meio de uma aba do Chrome em localhost:5151.
session = fo.launch_app(dataset, auto=False)
Exploração de Embeddings Multimodais para CIFAR 10 via FiftyOne e CLIP
É hora de explorar! Vamos ver como usar texto para encontrar imagens semanticamente semelhantes. Vamos analisar três palavras: Ferrari, Mustang e Pony.
Nossa primeira busca por uma Ferrari é um carro.
A próxima busca, “pony”, claramente nos dá imagens de cavalos.
Mas, se procurarmos por “mustang”, obtemos uma mistura.
Esta etapa mostra que é essencial avaliar seu conjunto de dados e entender o contexto dos seus dados!
Como Podemos Personalizar Ainda Mais o FiftyOne para Exploração de Dados com o Milvus?
Para definir o Milvus como o “backend” padrão para busca vetorial no FiftyOne, podemos carregar a seguinte variável de ambiente:
export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
Para qualquer índice específico, também podemos especificar o nome da coleção, qual nível de consistência usar e qual métrica usar para avaliar a similaridade. Aqui está um segundo índice de similaridade que usa uma métrica Euclidiana e consistência Bounded:
fob.compute_similarity(
dataset,
brain_key="clip_euclid",
model="clip-vit-base32-torch",
metric="euclidean",
consistency_level="Bounded"
)
Se tivermos vários índices de similaridade em um dataset, podemos selecionar qual deles queremos usar no aplicativo clicando no ícone de engrenagem ao lado da barra de pesquisa sob a lupa e escolhendo o índice por sua brain key:
Também podemos usar um modelo multimodal diferente para gerar nossos embeddings de imagem e texto. Na verdade, podemos fazer isso com qualquer modelo OpenCLIP (teremos um link melhor aqui em alguns dias), ou qualquer modelo de previsão zero-shot da biblioteca Transformers da Hugging Face. Como exemplo, aqui está um índice construído com AltCLIP:
!pip install transformers
fob.compute_similarity(
dataset,
brain_key="altclip",
model="zero-shot-classification-transformer-torch",
name_or_path="BAAI/AltCLIP",
)
Resumo de Explorando Embeddings Multimodais com FiftyOne e Milvus
Este post explorou como embeddings multimodais funcionam com FiftyOne e Milvus. Mostramos como você pode explorar um modelo multimodal popular - CLIP - em um dataset popular - CIFAR 10. Você usa CLIP para criar os embeddings dos dados de entrada, Milvus para armazenar os embeddings dos dados multimodais (às vezes chamados de “embeddings multimodais”) e FiftyOne para explorar os embeddings.
Usar CLIP assim permite que você pesquise imagens com texto. Com isso, exploramos o espaço usando linguagem natural para comparar imagens de palavras que podem ter significados diferentes em contextos diferentes. Vimos como “pony” é claramente um cavalo, “Ferrari” é claramente um carro, mas “mustang” poderia ser qualquer um dos dois.
Continue lendo

The AWS Outage Was a Wake-Up Call for Vector Database Cross-Region Disaster Recovery
Zilliz Cloud Had the Answer Before the Crisis. Zilliz Cloud is the world's first vector database with native cross-region disaster recovery.

AI Agents Are Quietly Transforming E-Commerce — Here’s How
Discover how AI agents transform e-commerce with autonomous decision-making, enhanced product discovery, and vector search capabilities for today's retailers.

Vector Databases vs. Hierarchical Databases
Use a vector database for AI-powered similarity search; use a hierarchical database for organizing data in parent-child relationships with efficient top-down access patterns.



