Akankah Penyematan Gemini 2 Membunuh Pencarian Multi-Vektor dalam Basis Data Vektor?

  • Engineering
March 13, 2026
Jack Li

Google merilis Gemini Embedding 2 - model penyematan multimodal pertama yang memetakan teks, gambar, video, audio, dan dokumen ke dalam satu ruang vektor.

Anda dapat menyematkan klip video, foto produk, dan paragraf teks dengan satu panggilan API, dan semuanya akan mendarat di lingkungan semantik yang sama.

Sebelum model seperti ini, Anda harus menjalankan setiap modalitas melalui model spesialisnya sendiri, dan kemudian menyimpan setiap output dalam kolom vektor yang terpisah. Kolom multi-vektor dalam basis data vektor seperti Milvus dibangun dengan tepat untuk skenario seperti itu.

Dengan Gemini Embedding 2 yang memetakan beberapa modalitas pada saat yang sama, sebuah pertanyaan muncul: berapa banyak kolom multi-vektor yang dapat digantikan oleh Gemini Embedding 2, dan di mana kekurangannya? Artikel ini akan menjelaskan di mana setiap pendekatan cocok dan bagaimana mereka bekerja bersama.

Apa yang Berbeda dari Gemini Embedding 2 Jika Dibandingkan dengan CLIP/CLAP

Model embedding mengubah data yang tidak terstruktur menjadi vektor padat sehingga item yang secara semantik mirip akan mengelompok dalam ruang vektor. Apa yang membuat Gemini Embedding 2 berbeda adalah bahwa ia melakukan hal ini secara native di seluruh modalitas, tanpa model terpisah dan tidak ada pipa jahitan.

Hingga saat ini, penyematan multimodal berarti model penyandi ganda yang dilatih dengan pembelajaran kontras: CLIP untuk gambar-teks, CLAP untuk audio-teks, masing-masing menangani dua modalitas. Jika Anda membutuhkan ketiganya, Anda menjalankan beberapa model dan mengoordinasikan ruang penyematannya sendiri.

Sebagai contoh, mengindeks podcast dengan seni sampul berarti menjalankan CLIP untuk gambar, CLAP untuk audio, dan penyandi teks untuk transkrip - tiga model, tiga ruang vektor, dan logika perpaduan khusus untuk membuat nilainya sebanding pada waktu kueri.

Sebaliknya, menurut pengumuman resmi Google, inilah yang didukung oleh Gemini Embedding 2:

  • Teks hingga 8.192 token per permintaan
  • Gambar hingga 6 per permintaan (PNG, JPEG)
  • Video hingga 120 detik (MP4, MOV)
  • Audio hingga 80 detik, disematkan secara native tanpa transkripsi ASR
  • Dokumen masukan PDF, hingga 6 halaman

Menggabungkan gambarinput + teks bersama-sama dalam satu panggilan penyematan

Penyematan Gemini 2 vs CLIP / CLAP Satu Model vs Banyak Model untuk Penyematan Multimodal

Pembuat enkode ganda (CLIP, CLAP)Penyematan Gemini 2
Modalitas per model2 (misalnya, gambar + teks)5 (teks, gambar, video, audio, PDF)
Menambahkan modalitas baruAnda membawa model lain dan menyelaraskan spasi secara manualSudah termasuk - satu panggilan API
Masukan lintas-modalPenyandi terpisah, panggilan terpisahMasukan yang disisipkan (misalnya, gambar + teks dalam satu permintaan)
ArsitekturPenyandi penglihatan dan teks yang terpisah diselaraskan melalui kehilangan kontrasModel tunggal yang mewarisi pemahaman multimodal dari Gemini

Keunggulan Gemini Embedding 2: Penyederhanaan Pipeline

Ambil contoh skenario umum: membangun mesin pencari semantik di atas perpustakaan video pendek. Setiap klip memiliki bingkai visual, audio yang diucapkan, dan teks subtitle - semuanya menggambarkan konten yang sama.

Sebelum Gemini Embedding 2, Anda memerlukan tiga model penyematan terpisah (gambar, audio, teks), tiga kolom vektor, dan pipeline pengambilan yang melakukan pemanggilan kembali multi arah, fusi hasil, dan deduplikasi. Itu adalah banyak bagian yang bergerak untuk dibangun dan dipelihara.

Sekarang, Anda dapat memasukkan frame, audio, dan subtitle video ke dalam satu panggilan API dan mendapatkan satu vektor terpadu yang menangkap gambaran semantik secara penuh.

Tentu saja, Anda tergoda untuk menyimpulkan bahwa kolom multi-vektor sudah mati. Tetapi kesimpulan itu membingungkan "representasi terpadu multimodal" dengan "pengambilan vektor multi-dimensi." Keduanya memecahkan masalah yang berbeda, dan memahami perbedaannya penting untuk memilih pendekatan yang tepat.

Apa yang dimaksud dengan Pencarian Multi-Vektor di Milvus?

Di Milvus, pencarian multi-vektor berarti mencari objek yang sama melalui beberapa bidang vektor sekaligus dan kemudian menggabungkan hasil pencarian tersebut dengan pengurutan ulang.

Ide intinya: satu objek sering kali memiliki lebih dari satu makna. Sebuah produk memiliki judul dan deskripsi. Sebuah postingan media sosial memiliki judul dan gambar. Setiap sudut memberi tahu Anda sesuatu yang berbeda, sehingga masing-masing memiliki bidang vektornya sendiri.

Milvus mencari setiap bidang vektor secara independen, lalu menggabungkan set kandidat menggunakan perangking ulang. Dalam API, setiap permintaan memetakan ke bidang dan konfigurasi pencarian yang berbeda, dan hybrid_search() mengembalikan hasil gabungan.

Ada dua pola umum yang bergantung pada hal ini:

  • Pencarian Vektor Jarang+Padat. Anda memiliki katalog produk di mana pengguna mengetikkan kueri seperti "Nike Air Max merah ukuran 10." Vektor padat menangkap maksud semantik ("sepatu lari, merah, Nike"), tetapi melewatkan ukuran yang tepat. Vektor yang jarang melalui BM25 atau model seperti BGE-M3 akan menangkap kata kunci yang cocok. Anda perlu menjalankan keduanya secara paralel, kemudian diurutkan ulang - karena tidak ada yang memberikan hasil yang baik untuk kueri yang menggabungkan bahasa alami dengan pengidentifikasi spesifik seperti SKU, nama file, atau kode kesalahan.
  • Pencarian Vektor Multimodal. Seorang pengguna mengunggah foto gaun dan mengetik "sesuatu seperti ini tetapi berwarna biru." Anda mencari kolom penyematan gambar untuk kemiripan visual dan kolom penyematan teks untuk batasan warna secara bersamaan. Setiap kolom memiliki indeks dan modelnya sendiri - CLIP untuk gambar, penyandi teks untuk deskripsi - dan hasilnya digabungkan.

Milvus menjalankan kedua pola tersebut sebagai pencarian ANN paralel dengan pemeringkatan ulang melalui RRFRanker. Definisi skema, konfigurasi multi-indeks, dan BM25 bawaan semuanya ditangani dalam satu sistem.

Sebagai contoh, pertimbangkan katalog produk di mana setiap item menyertakan deskripsi teks dan gambar. Anda dapat menjalankan tiga pencarian terhadap data tersebut secara paralel:

  • Pencarian teks semantik. Menanyakan deskripsi teks dengan vektor padat yang dihasilkan oleh model seperti BERT, Transformers, atau OpenAI embeddings API.
  • Pencarian teks lengkap. Menanyakan deskripsi teks dengan vektor yang jarang menggunakan BM25 atau model penyematan yang jarang seperti BGE-M3 atau SPLADE.
  • Pencarian gambar lintas-modal. Menanyakan gambar produk menggunakan kueri teks, dengan vektor padat dari model seperti CLIP.

Dengan Gemini Embedding 2, Akankah Pencarian Multi-Vektor Masih Penting?

Gemini Embedding 2 menangani lebih banyak modalitas dalam satu panggilan, yang sangat menyederhanakan pipeline. Tetapi penyematan multimodal terpadu bukanlah hal yang sama dengan pencarian multi-vektor. Dengan kata lain, ya, pencarian multi-vektor akan tetap penting.

Gemini Embedding 2 memetakan teks, gambar, video, audio, dan dokumen ke dalam satu ruang vektor bersama. Google memposisikannya untuk pencarian semantik multimodal, pencarian dokumen, dan rekomendasi - skenario di mana semua modalitas mendeskripsikan konten yang sama dan tumpang tindih antar modalitas yang tinggi membuat satu vektor menjadi layak.

Pencarian multi-vektorMilvus memecahkan masalah yang berbeda. Ini adalah cara untuk mencari objek yang sama melalui beberapa bidang vektor -misalnya, judul ditambah deskripsi, atau teks ditambah gambar - dan kemudian menggabungkan sinyal-sinyal tersebut selama pencarian. Dengan kata lain, ini adalah tentang mempertahankan dan menanyakan beberapa tampilan semantik dari item yang sama, bukan hanya memadatkan semuanya ke dalam satu representasi.

Tetapi data dunia nyata jarang sekali cocok dengan satu penyematan. Sistem biometrik, pengambilan alat agen, dan e-commerce dengan tujuan campuran, semuanya bergantung pada vektor yang berada di ruang semantik yang sangat berbeda. Di situlah tepatnya di mana penyematan terpadu berhenti bekerja.

Mengapa Satu Penyematan Saja Tidak Cukup: Pengambilan Multi-Vektor dalam Praktik

Gemini Embedding 2 menangani kasus di mana semua modalitas Anda menggambarkan hal yang sama. Pencarian multi-vektor menangani segala sesuatu yang lain - dan "segala sesuatu yang lain" mencakup sebagian besar sistem pengambilan produksi.

Biometrik. Seorang pengguna memiliki vektor wajah, rekaman suara, sidik jari, dan iris mata. Semua ini menggambarkan fitur biologis yang sepenuhnya independen tanpa tumpang tindih semantik. Anda tidak dapat menggabungkannya menjadi satu vektor - masing-masing membutuhkan kolom, indeks, dan metrik kemiripannya sendiri.

Alat bantu agen. Asisten pengkodean seperti OpenClaw menyimpan vektor semantik yang padat untuk riwayat percakapan ("masalah penerapan dari minggu lalu") bersama vektor BM25 yang jarang untuk pencocokan yang tepat pada nama file, perintah CLI, dan parameter konfigurasi. Tujuan pengambilan yang berbeda, jenis vektor yang berbeda, jalur pencarian yang independen, kemudian diurutkan ulang.

E-commerce dengan tujuan yang beragam. Video promo produk dan gambar detail bekerja dengan baik sebagai penyematan Gemini terpadu. Namun saat pengguna menginginkan "gaun yang terlihat seperti ini" dan "kain yang sama, ukuran M", Anda memerlukan kolom kemiripan visual dan kolom atribut terstruktur dengan indeks terpisah serta lapisan pengambilan hibrida.

Kapan Menggunakan Penyematan Gemini 2 vs Kolom Multi-vektor

SkenarioApa yang harus digunakanMengapa
Semua modalitas mendeskripsikan konten yang sama (bingkai video + audio + subtitle)Gemini Embedding 2 vektor terpaduTumpang tindih semantik yang tinggi berarti satu vektor menangkap gambaran lengkap - tidak perlu penggabungan
Anda membutuhkan ketepatan kata kunci bersama dengan semantic recall (BM25 + padat)Kolom multi-vektor dengan hybrid_search()Vektor yang jarang dan padat memiliki tujuan pencarian yang berbeda yang tidak dapat digabungkan menjadi satu penyematan
Pencarian lintas-modal adalah kasus penggunaan utama (kueri teks → hasil gambar)Gemini Menanamkan 2 vektor terpaduRuang bersama tunggal membuat kemiripan lintas-modal menjadi asli
Vektor berada dalam ruang semantik yang berbeda secara fundamental (biometrik, atribut terstruktur)Kolom multi-vektor dengan indeks per bidangMetrik kemiripan independen dan jenis indeks per bidang vektor
Anda menginginkan kesederhanaan pipeline dan pengambilan berbutir halusKeduanya - vektor Gemini terpadu + kolom jarang atau atribut tambahan dalam koleksi yang samaGemini menangani kolom multimodal; Milvus menangani lapisan pengambilan hibrida di sekitarnya

Kedua pendekatan ini tidak saling eksklusif. Anda dapat menggunakan Gemini Embedding 2 untuk kolom multimodal terpadu dan masih menyimpan vektor jarang atau atribut tambahan dalam kolom terpisah dalam koleksi Milvus yang sama.

Mulai Cepat: Menyiapkan Gemini Embedding 2 + Milvus

Berikut ini adalah sebuah demo kerja. Anda memerlukan instance Milvus atau Zilliz Cloud yang sedang berjalan dan GOOGLE_API_KEY.

Penyiapan

pip install google-genai pymilvus
export GOOGLE_API_KEY="your-api-key"

Contoh Lengkap

"""
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!”)

Untuk penyematan gambar dan audio, gunakan embed_image () dan embed_audio () dengan cara yang sama - vektor mendarat di koleksi yang sama dan ruang vektor yang sama, sehingga memungkinkan pencarian cross-modal yang sebenarnya.

Gemini Embedding 2 Akan Segera Tersedia di Milvus/Zilliz Cloud

Milvus menghadirkan integrasi mendalam dengan Gemini Embedding 2 melalui fitur Embedding Function. Setelah aktif, Anda tidak perlu memanggil API penyematan secara manual. Milvus akan memanggil model secara otomatis (mendukung OpenAI, AWS Bedrock, Google Vertex AI, dan banyak lagi) untuk memvektorisasi data mentah saat menyisipkan dan melakukan kueri pada pencarian.

Itu berarti Anda mendapatkan penyematan multimodal terpadu dari Gemini yang sesuai, dan toolkit multi-vektor lengkap Milvus - pencarian hibrida yang jarang-padat, skema multi-indeks, pemeringkatan ulang - di mana Anda membutuhkan kontrol yang lebih baik.

Ingin mencobanya? Mulai dengan quickstart Milvus dan jalankan demo di atas, atau lihat panduan pencarian hibrida untuk pengaturan multi-vektor lengkap dengan BGE-M3. Sampaikan pertanyaan Anda ke Discord atau Jam Kerja Milvus.

Teruslah Membaca

    Try Managed Milvus for Free

    Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

    Get Started

    Like the article? Spread the word

    Terus Baca