Será que o Gemini Embedding 2 vai acabar com a pesquisa multi-vetorial em bases de dados vectoriais?
A Google lançou o Gemini Embedding 2 - o primeiro modelo de incorporação multimodal que mapeia texto, imagens, vídeo, áudio e documentos num único espaço vetorial.
Pode incorporar um clip de vídeo, uma fotografia de um produto e um parágrafo de texto com uma chamada à API, e todos eles irão parar à mesma vizinhança semântica.
Antes de modelos como este, era necessário executar cada modalidade através do seu próprio modelo especializado e, em seguida, armazenar cada saída numa coluna vetorial separada. As colunas multi-vectoriais em bases de dados vectoriais como o Milvus foram criadas precisamente para estes cenários.
Com o Gemini Embedding 2 a mapear várias modalidades ao mesmo tempo, surge uma questão: em que medida pode o Gemini Embedding 2 substituir as colunas multi-vectoriais e em que aspectos fica aquém das expectativas? Este post mostra onde cada abordagem se encaixa e como elas funcionam juntas.
O que há de diferente no Gemini Embedding 2 em relação ao CLIP/CLAP
Os modelos de incorporação convertem dados não estruturados em vectores densos, de modo a que os itens semanticamente semelhantes se agrupem no espaço vetorial. O que diferencia o Gemini Embedding 2 é que ele faz isso nativamente em todas as modalidades, sem modelos separados e sem pipelines de costura.
Até agora, os embeddings multimodais implicavam modelos de codificação dupla treinados com aprendizagem contrastiva: CLIP para texto-imagem, CLAP para texto-áudio, cada um tratando exatamente duas modalidades. Se necessitasse das três, executava vários modelos e coordenava os seus espaços de incorporação.
Por exemplo, indexar um podcast com a arte da capa significava executar o CLIP para a imagem, o CLAP para o áudio e um codificador de texto para a transcrição - três modelos, três espaços vectoriais e lógica de fusão personalizada para tornar as suas pontuações comparáveis no momento da consulta.
Em contrapartida, de acordo com o anúncio oficial da Google, eis o que o Gemini Embedding 2 suporta:
- Texto até 8.192 tokens por pedido
- Imagens até 6 por pedido (PNG, JPEG)
- Vídeo até 120 segundos (MP4, MOV)
- Áudio até 80 segundos, incorporado nativamente sem transcrição ASR
- Entrada dedocumentos em PDF, até 6 páginas
Imagemde entrada mista + texto juntos numa única chamada de incorporação
Gemini Embedding 2 vs. CLIP/CLAP Um modelo vs. muitos para embeddings multimodais
| Codificador duplo (CLIP, CLAP) | Incorporação Gemini 2 | |
|---|---|---|
| Modalidades por modelo | 2 (por exemplo, imagem + texto) | 5 (texto, imagem, vídeo, áudio, PDF) |
| Adicionar uma nova modalidade | Introduz outro modelo e alinha os espaços manualmente | Já está incluído - uma chamada à API |
| Entrada intermodal | Codificadores separados, chamadas separadas | Entrada intercalada (por exemplo, imagem + texto num só pedido) |
| Arquitetura | Visão separada e codificadores de texto alinhados através de perda contrastiva | Modelo único que herda a compreensão multimodal do Gemini |
Vantagem do Gemini Embedding 2: Simplificação do pipeline
Tomemos um cenário comum: construir um motor de busca semântico sobre uma biblioteca de vídeos curtos. Cada clipe tem quadros visuais, áudio falado e texto de legenda - todos descrevendo o mesmo conteúdo.
Antes do Gemini Embedding 2, eram necessários três modelos de incorporação separados (imagem, áudio, texto), três colunas de vectores e um pipeline de recuperação que faz a recuperação multidirecional, a fusão de resultados e a deduplicação. São muitas peças móveis para construir e manter.
Agora, pode alimentar os fotogramas, o áudio e as legendas do vídeo numa única chamada à API e obter um vetor unificado que capta toda a imagem semântica.
Naturalmente, é tentador concluir que as colunas multi-vectoriais estão mortas. Mas essa conclusão confunde "representação unificada multimodal" com "recuperação vetorial multidimensional". Resolvem problemas diferentes, e é importante compreender a diferença para escolher a abordagem correta.
O que é a pesquisa multi-vetorial em Milvus?
Em Milvus, a pesquisa multi-vetorial significa pesquisar o mesmo item através de vários campos vectoriais de uma só vez e depois combinar esses resultados com o reranking.
A ideia central: um único objeto tem muitas vezes mais do que um tipo de significado. Um produto tem um título e uma descrição. Uma publicação nas redes sociais tem uma legenda e uma imagem. Cada ângulo diz-nos algo diferente, pelo que cada um deles tem o seu próprio campo vetorial.
O Milvus pesquisa cada campo vetorial de forma independente e, em seguida, funde os conjuntos de candidatos utilizando um reranker. Na API, cada pedido é mapeado para um campo e uma configuração de pesquisa diferentes, e hybrid_search() devolve o resultado combinado.
Dois padrões comuns dependem disso:
- Pesquisa de vetor esparso + denso. Você tem um catálogo de produtos em que os usuários digitam consultas como "Nike Air Max vermelho tamanho 10". Os vectores densos captam a intenção semântica ("ténis de corrida, vermelho, Nike"), mas não o tamanho exato. Os vectores esparsos através do BM25 ou de modelos como o BGE-M3 conseguem a correspondência de palavras-chave. É necessário que ambos sejam executados em paralelo e, em seguida, reavaliados - porque nenhum deles, por si só, apresenta bons resultados para consultas que misturam linguagem natural com identificadores específicos, como SKUs, nomes de ficheiros ou códigos de erro.
- Pesquisa Vetorial Multimodal. Um utilizador carrega uma fotografia de um vestido e escreve "algo parecido com isto mas em azul". O utilizador pesquisa simultaneamente na coluna de incorporação de imagem a semelhança visual e na coluna de incorporação de texto a restrição de cor. Cada coluna tem o seu próprio índice e modelo - CLIP para a imagem, um codificador de texto para a descrição - e os resultados são combinados.
Milvus executa ambos os padrões como pesquisas ANN paralelas com reranking nativo via RRFRanker. A definição de esquemas, a configuração de múltiplos índices e o BM25 incorporado são tratados num único sistema.
Por exemplo, considere um catálogo de produtos em que cada item inclui uma descrição de texto e uma imagem. É possível executar três pesquisas em paralelo com esses dados:
- Pesquisa de texto semântico. Consultar a descrição do texto com vectores densos gerados por modelos como o BERT, Transformers ou a API de incorporação OpenAI.
- Pesquisa de texto completo. Consulta da descrição do texto com vectores esparsos utilizando BM25 ou modelos de incorporação esparsos como BGE-M3 ou SPLADE.
- Pesquisa de imagens intermodais. Consulta de imagens de produtos utilizando uma consulta de texto, com vectores densos de um modelo como o CLIP.
Com o Gemini Embedding 2, a pesquisa multi-vetorial continuará a ser importante?
O Gemini Embedding 2 lida com mais modalidades em uma chamada, o que simplifica consideravelmente os pipelines. Mas um embedding multimodal unificado não é a mesma coisa que a recuperação multi-vetorial. Por outras palavras, sim, a pesquisa multi-vetorial continuará a ser importante.
O Gemini Embedding 2 mapeia texto, imagens, vídeo, áudio e documentos num espaço vetorial partilhado. A Google posiciona-o para a pesquisa semântica multimodal, a recuperação de documentos e a recomendação - cenários em que todas as modalidades descrevem o mesmo conteúdo e a elevada sobreposição entre modalidades torna viável um único vetor.
A pesquisa multi-vetorialMilvus resolve um problema diferente. É uma forma de pesquisar o mesmo objeto através de vários campos vectoriais -por exemplo, um título e uma descrição, ou um texto e uma imagem - e depois combinar esses sinais durante a recuperação. Por outras palavras, trata-se de preservar e consultar várias perspectivas semânticas do mesmo item, e não apenas de comprimir tudo numa única representação.
Mas os dados do mundo real raramente se encaixam numa única incorporação. Os sistemas biométricos, a recuperação de ferramentas agênticas e o comércio eletrónico de intenções mistas dependem todos de vectores que vivem em espaços semânticos completamente diferentes. É exatamente aí que uma incorporação unificada deixa de funcionar.
Porque é que uma incorporação não é suficiente: Recuperação multi-vetorial na prática
O Gemini Embedding 2 trata do caso em que todas as modalidades descrevem a mesma coisa. A pesquisa multi-vetorial trata de tudo o resto - e "tudo o resto" abrange a maioria dos sistemas de recuperação de produção.
Biometria. Um único utilizador tem vectores de rosto, impressão vocal, impressão digital e íris. Estes descrevem caraterísticas biológicas completamente independentes com sobreposição semântica zero. Não é possível colapsá-los num único vetor - cada um precisa da sua própria coluna, índice e métrica de semelhança.
Ferramentas agênticas. Um assistente de codificação como o OpenClaw armazena vectores semânticos densos para o histórico de conversação ("aquele problema de implementação da semana passada") juntamente com vectores BM25 esparsos para correspondência exacta em nomes de ficheiros, comandos CLI e parâmetros de configuração. Diferentes objectivos de recuperação, diferentes tipos de vectores, caminhos de pesquisa independentes e, em seguida, reavaliados.
Comércio eletrónico com intenções mistas. O vídeo promocional de um produto e as imagens detalhadas funcionam bem como uma incorporação Gemini unificada. Mas quando um utilizador pretende "vestidos parecidos com este" e "mesmo tecido, tamanho M", é necessária uma coluna de semelhança visual e uma coluna de atributos estruturados com índices separados e uma camada de recuperação híbrida.
Quando usar a incorporação Gemini 2 vs. colunas de vários vetores
| Cenário | O que usar | Porquê? |
|---|---|---|
| Todas as modalidades descrevem o mesmo conteúdo (fotogramas de vídeo + áudio + legendas) | Vetor unificado Gemini Embedding 2 | A elevada sobreposição semântica significa que um vetor capta a imagem completa - não é necessária fusão |
| É necessária a precisão das palavras-chave e a recuperação semântica (BM25 + densa) | Colunas multi-vectoriais com hybrid_search() | Os vectores esparsos e densos servem objectivos de recuperação diferentes que não podem ser colapsados numa única incorporação |
| A pesquisa intermodal é o principal caso de utilização (consulta de texto → resultados de imagem) | Vetor unificado Gemini Embedding 2 | Um único espaço partilhado torna nativa a semelhança intermodal |
| Os vectores vivem em espaços semânticos fundamentalmente diferentes (biometria, atributos estruturados) | Colunas multi-vectoriais com índices por campo | Métricas de semelhança e tipos de índices independentes por campo vetorial |
| Pretende simplicidade de pipeline e recuperação com granularidade fina | Ambos - vetor Gemini unificado + colunas adicionais esparsas ou de atributos na mesma coleção | O Gemini trata da coluna multimodal; o Milvus trata da camada de recuperação híbrida à sua volta |
Estas duas abordagens não são mutuamente exclusivas. É possível usar o Gemini Embedding 2 para a coluna multimodal unificada e ainda armazenar vetores adicionais esparsos ou específicos de atributos em colunas separadas dentro da mesma coleção do Milvus.
Início rápido: Configurar o Gemini Embedding 2 + Milvus
Aqui está uma demonstração funcional. É necessário ter uma instância do Milvus ou do Zilliz Cloud em execução e uma GOOGLE_API_KEY.
Configuração
pip install google-genai pymilvus
export GOOGLE_API_KEY="your-api-key"
Exemplo completo
"""
Prerequisites:
pip install google-genai pymilvus
Set environment variable:
export GOOGLE_API_KEY="your-api-key"
“"”
import os
import struct
import numpy as np
from google import genai
from google.genai import types
from pymilvus import MilvusClient, DataType
# ── Config ───────────────────────────────────────────────────────────────
COLLECTION_NAME = “gemini_multimodal_demo”
MILVUS_URI = “http://localhost:19530” # Change to your Milvus address
DIM = 3072 # gemini-embedding-2-preview output dimension
GEMINI_MODEL = “gemini-embedding-2-preview”
# ── Initialize clients ──────────────────────────────────────────────────
gemini_client = genai.Client() # Uses GOOGLE_API_KEY env var
milvus_client = MilvusClient(MILVUS_URI)
# ── Helper: generate embedding ──────────────────────────────────────────
def embed_texts(texts: list[str], task_type: str = “SEMANTIC_SIMILARITY”) -> list[list[float]]:
“""Embed a list of text strings.""”
result = gemini_client.models.embed_content(
model=GEMINI_MODEL,
contents=texts,
config=types.EmbedContentConfig(task_type=task_type),
)
return [e.values for e in result.embeddings]
def embed_image(image_path: str) -> list[float]:
“""Embed an image file.""”
with open(image_path, “rb”) as f:
image_bytes = f.read()
mime = “image/png” if image_path.endswith(“.png”) else “image/jpeg”
result = gemini_client.models.embed_content(
model=GEMINI_MODEL,
contents=types.Part.from_bytes(data=image_bytes, mime_type=mime),
)
return result.embeddings[0].values
def embed_audio(audio_path: str) -> list[float]:
“""Embed an audio file.""”
with open(audio_path, “rb”) as f:
audio_bytes = f.read()
mime_map = {“.mp3”: “audio/mpeg”, “.wav”: “audio/wav”, “.flac”: “audio/flac”}
ext = os.path.splitext(audio_path)[1].lower()
mime = mime_map.get(ext, “audio/mpeg”)
result = gemini_client.models.embed_content(
model=GEMINI_MODEL,
contents=types.Part.from_bytes(data=audio_bytes, mime_type=mime),
)
return result.embeddings[0].values
# ── 1. Create Milvus collection ─────────────────────────────────────────
print(“=== Creating collection ===”)
if milvus_client.has_collection(COLLECTION_NAME):
milvus_client.drop_collection(COLLECTION_NAME)
schema = milvus_client.create_schema()
schema.add_field(“id”, DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(“content”, DataType.VARCHAR, max_length=2000) # description of the content
schema.add_field(“modality”, DataType.VARCHAR, max_length=20) # "text", "image", “audio”
schema.add_field(“vector”, DataType.FLOAT_VECTOR, dim=DIM)
index_params = milvus_client.prepare_index_params()
index_params.add_index(
field_name=“vector”,
index_type=“AUTOINDEX”,
metric_type=“COSINE”,
)
milvus_client.create_collection(
COLLECTION_NAME,
schema=schema,
index_params=index_params,
consistency_level=“Strong”,
)
print(f"Collection '{COLLECTION_NAME}' created (dim={DIM}, metric=COSINE)")
# ── 2. Insert text embeddings ───────────────────────────────────────────
print(“\n=== Inserting text embeddings ===”)
documents = [
“Artificial intelligence was founded as an academic discipline in 1956.”,
“The Mona Lisa is a half-length portrait painting by Leonardo da Vinci.”,
“Beethoven’s Symphony No. 9 premiered in Vienna on May 7, 1824.”,
“The Great Wall of China stretches over 13,000 miles across northern China.”,
“Jazz music originated in the African-American communities of New Orleans.”,
“The Hubble Space Telescope was launched into orbit on April 24, 1990.”,
“Vincent van Gogh painted The Starry Night while in an asylum in Saint-Rémy.”,
“Machine learning is a subset of AI focused on learning from data.”,
]
text_vectors = embed_texts(documents)
text_rows = [
{“content”: doc, “modality”: “text”, “vector”: vec}
for doc, vec in zip(documents, text_vectors)
]
milvus_client.insert(COLLECTION_NAME, text_rows)
print(f"Inserted {len(text_rows)} text documents")
# ── 3. (Optional) Insert image embeddings ───────────────────────────────
# Uncomment and provide real image paths to test multimodal search
#
# image_files = [
# ("photo of the Mona Lisa painting", “mona_lisa.jpg”),
# ("satellite photo of the Great Wall of China", “great_wall.png”),
# ]
# for desc, path in image_files:
# if os.path.exists(path):
# vec = embed_image(path)
# milvus_client.insert(COLLECTION_NAME, [
# {"content": desc, "modality": "image", “vector": vec}
# ])
# print(f"Inserted image: {desc}”)
# ── 4. (Optional) Insert audio embeddings ───────────────────────────────
# Uncomment and provide real audio paths to test multimodal search
#
# audio_files = [
# ("Beethoven Symphony No.9 excerpt", “beethoven_9.mp3”),
# ("jazz piano improvisation", “jazz_piano.mp3”),
# ]
# for desc, path in audio_files:
# if os.path.exists(path):
# vec = embed_audio(path)
# milvus_client.insert(COLLECTION_NAME, [
# {"content": desc, "modality": "audio", “vector": vec}
# ])
# print(f"Inserted audio: {desc}”)
# ── 5. Search ────────────────────────────────────────────────────────────
print(“\n=== Searching ===”)
queries = [
“history of artificial intelligence”,
“famous Renaissance paintings”,
“classical music concerts”,
]
query_vectors = embed_texts(queries, task_type=“SEMANTIC_SIMILARITY”)
for query_text, query_vec in zip(queries, query_vectors):
results = milvus_client.search(
COLLECTION_NAME,
data=[query_vec],
limit=3,
output_fields=[“content”, “modality”],
search_params={“metric_type”: “COSINE”},
)
print(f"\nQuery: '{query_text}'")
for hits in results:
for rank, hit in enumerate(hits, 1):
print(f" [{rank}] (score={hit[‘distance’]:.4f}, modality={hit[‘entity’][‘modality’]}) "
f"{hit[‘entity’][‘content’][:80]}")
# ── 6. Cross-modal search example (image query -> text results) ─────────
# Uncomment to search text collection using an image as query
#
# print(“\n=== Cross-modal search: image -> text ===”)
# query_image_vec = embed_image(“query_image.jpg”)
# results = milvus_client.search(
# COLLECTION_NAME,
# data=[query_image_vec],
# limit=3,
# output_fields=[“content", “modality”],
# search_params={"metric_type": “COSINE"},
# )
# for hits in results:
# for rank, hit in enumerate(hits, 1):
# print(f” [{rank}] (score={hit[‘distance’]:.4f}) {hit[‘entity’][‘content’][:80]}”)
# ── Cleanup ──────────────────────────────────────────────────────────────
# milvus_client.drop_collection(COLLECTION_NAME)
# print(f"\nCollection ‘{COLLECTION_NAME}’ dropped")
print(“\nDone!”)
Para embeddings de imagem e áudio, use embed_image() e embed_audio() da mesma forma - os vetores caem na mesma coleção e no mesmo espaço vetorial, permitindo uma verdadeira busca cross-modal.
Gemini Embedding 2 estará disponível em breve no Milvus/Zilliz Cloud
O Milvus está a enviar uma integração profunda com o Gemini Embedding 2 através da sua funcionalidade Embedding Function. Uma vez disponível, não será necessário chamar manualmente as APIs de incorporação. O Milvus invocará automaticamente o modelo (suportando OpenAI, AWS Bedrock, Google Vertex AI, entre outros) para vetorizar dados em bruto na inserção e consultas na pesquisa.
Isso significa que você obtém incorporação multimodal unificada do Gemini onde ele se encaixa e o kit de ferramentas multivetoriais completo do Milvus - pesquisa híbrida esparso-densa, esquemas de vários índices, reranking - onde você precisa de controle refinado.
Quer experimentar? Comece com o quickstart do Milvus e execute a demonstração acima, ou consulte o guia de pesquisa híbrida para a configuração completa de multi-vetor com BGE-M3. Traga suas perguntas para o Discord ou para o Milvus Office Hours.
Continue lendo
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word



