Lihat Kemiripannya: Mempersonalisasi Penelusuran Visual dengan Multimodal Embeddings

DES 23, 2024
Anthony Tripaldi Senior Creative Technologist Creative Lab

Apa yang dimaksud dengan Sematan Vektor?

Sematan vektor adalah cara untuk merepresentasikan data dunia nyata – seperti teks, gambar, atau audio – secara matematis, sebagai titik-titik dalam peta multidimensi. Ini terdengar sangat membosankan, tetapi dengan dimensi yang cukup, mereka memungkinkan komputer (dan dengan demikian, kita) untuk mengungkap dan memahami hubungan dalam data tersebut.

Sebagai contoh, Anda mungkin ingat "word2vec." Ini adalah teknik revolusioner yang dikembangkan oleh Google pada tahun 2013 yang mentransformasi kata menjadi vektor numerik, membuka kemampuan pemahaman semantik oleh mesin. Terobosan ini membuka jalan bagi kemajuan tak terhingga jumlahnya dalam natural language processing, mulai dari penerjemahan mesin hingga analisis sentimen.

Kami kemudian membangun fondasi ini dengan merilis model sematan teks kuat yang disebut text-gecko, yang memungkinkan developer mengeksplorasi hubungan semantis yang beragam di dalam teks.

Vertex Multimodal Embeddings API membawanya selangkah lebih jauh, dengan memampukan Anda merepresentasikan teks, gambar, dan video ke dalam ruang vektor bersama yang sama, mempertahankan makna kontekstual dan semantis pada berbagai modalitas.

Dalam postingan ini, kami akan menjelajahi dua aplikasi praktis dari teknologi ini: menelusuri semua slide dan deck yang telah dibuat oleh tim kami dalam 10 tahun terakhir, dan alat penelusuran visual intuitif yang dirancang untuk artis. Kita akan mendalami kodenya dan membagikan tips praktis tentang cara membuka potensi maksimal sematan multimodal.

Bagian 1: Memberdayakan Artis dengan Penelusuran Visual

Bagaimana semuanya dimulai

Baru-baru ini, tim kami sedang menjajaki bagaimana kami dapat mengeksplorasi Multimodal Embeddings API yang baru saja dirilis. Kami menyadari potensinya untuk set data perusahaan berukuran besar, dan kami juga ingin menjelajahi aplikasi yang lebih personal dan kreatif.

Khyati, seorang desainer dalam tim kami yang juga seorang ilustrator produktif, sangat tertarik dengan cara teknologi ini bisa membantunya mengelola dan memahami pekerjaannya dengan lebih baik. Seperti yang dikatakannya:

"Artis sering kali kesulitan menemukan karya terdahulu berdasarkan kemiripan visual atau kata kunci konseptual. Metode organisasi file tradisional tidak mampu menangani masalah ini, terutama ketika menelusuri dengan istilah yang tidak umum atau konsep abstrak."

Karena itu, lahirlah demo sematan multimodal open source kami!

Repo demo adalah aplikasi Svelte, yang dibuat selama keriuhan hackathon. Mungkin sedikit kasar di beberapa bagian, tetapi README akan mengarahkan Anda ke jalur yang benar.

Ringkasan Teknis Singkat

Meskipun set data Khyati jauh lebih kecil daripada skala jutaan dokumen yang dirujuk dalam dokumentasi Multimodal Embeddings API, set data ini memberikan kasus uji coba yang ideal untuk Penelusuran Vektor Cloud Firestore baru, yang diumumkan di Google Cloud Next pada bulan April.

Jadi kami menyiapkan project Firebase dan mengirimkan sekitar 250 ilustrasi Khyati ke Multimodal Embeddings API. Proses ini menghasilkan sematan array float 1408 dimensi (memberikan konteks maksimum), yang kemudian kami simpan dalam database Firestore kami:

mm_embedding_model = MultiModalEmbeddingModel.from_pretrained("multimodalembedding")
 
# create embeddings for each image:
embedding = mm_embedding_model.get_embeddings(
    image=image,
    dimension=1408,
)
 
# create a Firestore doc to store  and add to a collection
doc = {
    "name": "Illustration 1",
    "imageEmbedding": Vector(embedding.image_embedding),
    ... # other metadata
}
khyati_collection.add(doc)

Pastikan mengindeks kolom imageEmbedding dengan Firestore CLI.

Blok kode ini dipersingkat agar ringkas, lihat notebook ini untuk contoh selengkapnya. Ambil model sematan dari paket vertexai.vision_models


Menelusuri dengan penelusuran vektor K-nearest neighbors (KNN) Firestore sangatlah praktis. Sematkan kueri Anda (sama seperti Anda menyematkan gambar) dan kirimkan ke API:

// Our frontend is typescript but we have access to the same embedding API:
const myQuery = 'fuzzy'; // could also be an image
const myQueryVector = await getEmbeddingsForQuery(myQuery); // MM API call
const vectorQuery: VectorQuery = await khyati_collection.findNearest({
  vectorField: 'imageEmbedding', // name of your indexed field
  queryVector: myQueryVector,
  limit: 10, // how many documents to retrieve
  distanceMeasure: 'DOT_PRODUCT' // one of three algorithms for distance
});

Selesai! Metode findNearest menampilkan dokumen yang paling dekat dengan sematan kueri Anda, beserta semua metadata terkait, seperti kueri Firestore standar.

Anda bisa menemukan demo implementasi /search kami di sini. Perhatikan bagaimana kami menggunakan library NPM @google-cloud/firestore , yang merupakan rumah dari teknologi ini, alih-alih menggunakan paket NPM firebase normal.


Bonus Pengurangan Dimensi

Jika Anda sudah sampai sejauh ini dan masih belum benar-benar memahami seperti apa vektor sematan ini, itu bisa dimaklumi – kami juga tidak mengerti, pada awal project ini.. Kita hidup di dunia tiga dimensi, jadi ruang 1408 dimensi terasa fiksi ilmiah.

Untungnya, ada banyak alat yang tersedia untuk mengurangi dimensionalitas vektor ini, termasuk implementasi yang luar biasa oleh orang-orang di Google PAIR yang disebut UMAP. Mirip dengan t-SNE, Anda bisa mengambil vektor sematan multimodal dan memvisualisasikannya dalam tiga dimensi secara mudah menggunakan UMAP. Kami telah menyertakan kode untuk menanganinya di GitHub, termasuk set data open source dari gambar cuaca dan sematannya yang seharusnya bisa langsung digunakan.

Bagian 2: Penelusuran Dokumen Skala Perusahaan

Saat membuat demo Khyati, kami juga menjelajahi cara memanfaatkan kekuatan Multimodal Embeddings API pada skala yang diinginkan. Masuk akal jika Google sangat unggul dalam urusan sematan – lagi pula, teknologi serupa mendukung banyak produk penelusuran inti kami.

“Kami memiliki berapa dek?”

Namun, bagaimana kami bisa mengujinya dalam skala besar? Ternyata, kreasi dek yang sama produktifnya dari tim kami menawarkan ajang pembuktian yang luar biasa. Kami berbicara tentang ribuan presentasi Google Slide yang terkumpul selama satu dekade terakhir. Anggap saja ini sebagai penggalian arkeologi digital ke dalam histori ide-ide tim kami.

Pertanyaannya adalah: dapatkah Multimodal Embeddings API menemukan harta karun tersembunyi di dalam arsip yang sangat besar ini? Dapatkah pemimpin tim kami akhirnya menemukan “ide yang sudah lama hilang, dari obrolan singkat tentang sesuatu, seseorang menuliskannya di catatan tempel?”? Dapatkah desainer kami secara mudah menemukan kembali Poster Menakjubkan yang dibicarakan semua orang? Peringatan spoiler: ya!

Ringkasan Teknis yang (Lebih) Singkat

Sebagian besar waktu pengembangan kami dihabiskan untuk menangani ribuan presentasi dan mengekstrak thumbnail untuk setiap slide menggunakan Drive dan Slide API. Proses sematan itu sendiri hampir sama dengan demo artis dan bisa diringkas sebagai berikut:

for preso in all_decks:
  for slide in preso.slides:
    thumbnail = slides_api.getThumbnail(slide.id, preso.id)
    slide_embedding = mm_embedding_model.get_embeddings(
      image=thumbnail,
      dimension=1408,
    )
    # store slide_embedding.image_embedding in a document

Proses ini menghasilkan sematan untuk lebih dari 775.000 slide di lebih dari 16.000 presentasi. Untuk menyimpan dan menelusuri set data yang sangat besar ini secara efisien, kami beralih ke Penelusuran Vektor Vertex AI, yang dirancang khusus untuk aplikasi berskala besar.

Penelusuran Vektor Vertex AI, yang didukung oleh teknologi yang sama dengan Google Penelusuran, YouTube, dan Play, bisa menelusuri miliaran dokumen dalam hitungan milidetik. Ia beroperasi dengan prinsip yang serupa dengan pendekatan Firestore yang kami gunakan dalam demo artis, tetapi dengan skala dan performa yang jauh lebih besar.

Untuk memanfaatkan teknologi canggih yang luar biasa ini, Anda harus menyelesaikan beberapa langkah tambahan sebelum melakukan penelusuran:

# Vector Search relies on Indexes, created via code or UI, so first make sure your embeddings from the previous step are stored in a Cloud bucket, then:
my_index = aiplatform.MatchingEngineIndex.create_tree_ah_index(
    display_name = 'my_index_name',
    contents_delta_uri = BUCKET_URI,
    dimensions = 1408, # use same number as when you created them
    approximate_neighbors_count = 10, # 
)
 
# Create and Deploy this Index to an Endpoint
my_index_endpoint = aiplatform.MatchingEngineIndexEndpoint.create(
    display_name = "my_endpoint_name",
    public_endpoint_enabled = True
)
my_index_endpoint.deploy_index(
    index = my_index, deployed_index_id = "my_deployed_index_id"
)
 
# Once that's online and ready, you can query like before from your app!
response = my_index_endpoint.find_neighbors(
    deployed_index_id = "my_deployed_index_id",
    queries = [some_query_embedding],
    num_neighbors = 10
)

Prosesnya mirip dengan demo Khyati, tetapi dengan satu perbedaan utama: kami membuat Indeks Penelusuran Vektor khusus untuk memaksimalkan kekuatan ScaNN, algoritme penelusuran kemiripan vektor yang sangat efisien dari Google.


Bagian 3: Membandingkan Vertex AI dan Penelusuran Vektor Firebase

Setelah Anda melihat kedua opsi tersebut, mari kita bahas perbedaannya.

KNN vs ScaNN

Anda mungkin memerhatikan bahwa ada dua tipe algoritme yang terkait dengan setiap layanan penelusuran vektor: K-nearest neighbor untuk Firestore dan ScaNN untuk implementasi Vertex AI. Kami memulai kedua demo ini dengan Firestore karena kami biasanya tidak bekerja dengan solusi berskala perusahaan dalam keseharian tim kami.

Namun penelusuran KNN Firestore adalah algoritme brute force O(n), yang berarti ia meningkat secara linear sesuai dengan jumlah dokumen yang Anda tambahkan ke indeks. Jadi, begitu kami mulai menembus 10, 15, 20 ribu sematan dokumen, segalanya mulai melambat secara dramatis.

Perlambatan ini bisa dikurangi dengan predikat kueri standar Firestore yang digunakan dalam langkah “pra-filtering”. Jadi, alih-alih menelusuri setiap sematan yang telah diindeks, Anda dapat melakukan kueri where untuk membatasi kumpulan Anda hanya pada dokumen yang relevan. Hal ini memerlukan indeks gabungan lain pada kolom yang ingin Anda gunakan untuk memfilter.

# creating additional indexes is easy, but still needs to be considered
gcloud alpha firestore indexes composite create
--collection-group=all_slides
--query-scope=COLLECTION
--field-config=order=ASCENDING,field-path="project" # additional fields
--field-config field-path=slide_embedding,vector-config='{"dimension":"1408", "flat": "{}"}'

ScaNN

Mirip dengan KNN, tetapi mengandalkan pengindeksan cerdas berdasarkan “perkiraan” lokasi (seperti dalam “Scalable Approximate Nearest Neighbor”), ScaNN merupakan terobosan Tim Riset Google yang dirilis secara publik pada tahun 2020.

Miliaran dokumen bisa dikueri dalam hitungan milidetik, tetapi kekuatan tersebut ada konsekuensinya, terutama jika dibandingkan dengan baca/tulis Firestore. Ditambah lagi, indeksnya ramping secara default — key-value pair simpel — membutuhkan pencarian sekunder ke koleksi atau tabel Anda yang lain setelah nearest neighbor ditampilkan. Namun, untuk 775.000 slide kami, pencarian ~100ms + pembacaan Firestore ~50ms untuk metadata masih jauh lebih cepat daripada yang dapat disediakan oleh Penelusuran Vektor Cloud Firestore secara native.

Ada juga beberapa dokumentasi yang bagus tentang cara menggabungkan penelusuran vektor dengan penelusuran kata kunci tradisional dalam sebuah pendekatan yang disebut Penelusuran Hybrid. Baca selengkapnya tentang hal tersebut di sini.

Mengesampingkan pemformatan cepat
Membuat indeks untuk Vertex AI juga membutuhkan format file kunci/nilai
jsonl terpisah, yang memerlukan usaha untuk mengonversinya dari implementasi Firestore asli kami. Jika Anda tidak yakin dengan yang akan digunakan, mungkin ada baiknya menulis sematan ke dalam format agnostik yang bisa dengan mudah diserap oleh kedua sistem, agar tidak perlu berurusan dengan kengerian ekspor LevelDB Firestore.


Alternatif Open Source / Lokal

Jika solusi yang sepenuhnya dihosting di Cloud tidak cocok untuk Anda, Anda masih bisa memanfaatkan kekuatan Multimodal Embeddings API dengan solusi lokal.

Kami juga menguji library baru yang disebut sqlite-vec, implementasi sqlite yang sangat cepat dan tanpa dependensi yang bisa berjalan di mana pun, serta menangani vektor 1408 dimensi yang ditunjukkan oleh Multimodal Embeddings API dengan mudah. Porting lebih dari 20.000 slide kami untuk pengujian menunjukkan pencarian dalam kisaran ~200ms. Anda tetap membuat sematan dokumen dan kueri secara online, tetapi dapat menangani penelusuran di mana pun Anda memerlukannya setelah mereka dibuat dan disimpan.


Beberapa pemikiran akhir

Dari fondasi word2vec hingga Multimodal Embeddings API saat ini, ada kemungkinan baru yang menarik untuk membangun sistem AI multimodal Anda sendiri untuk menelusuri informasi.

Memilih solusi penelusuran vektor yang tepat tergantung pada kebutuhan Anda. Firebase menyediakan opsi yang mudah digunakan dan hemat biaya untuk project yang lebih kecil, sementara Vertex AI menawarkan skalabilitas dan performa yang dibutuhkan untuk set data besar dan waktu penelusuran dalam hitungan milidetik. Untuk pengembangan lokal, alat seperti sqlite-vec memungkinkan Anda memanfaatkan kekuatan sematan yang sebagian besar dilakukan secara offline.

Siap menjelajahi masa depan penelusuran multimodal? Pelajari demo sematan multimodal open source kami di GitHub, lakukan eksperimen dengan kodenya, dan bagikan kreasi Anda. Kami sangat antusias menantikan kreasi yang Anda buat.