All Products
Search
Document Center

DashVector:Jelajahi pengambilan multimodal dengan DashVector dan ModelScope

Last Updated:Jun 09, 2026

Buat sistem pengambilan teks-ke-gambar menggunakan DashVector dan model Chinese CLIP dari ModelScope. Set data multimodal Muge berfungsi sebagai korpus gambar.

Alur Kerja

image.png

Proses ini terdiri dari dua tahap utama:

  1. Penyematan dan penyimpanan data gambar. Ubah gambar dari set data Muge menjadi vektor menggunakan API penyematan Chinese CLIP, lalu simpan ke DashVector.

  2. Pengambilan berdasarkan kueri teks. Ubah kueri teks menjadi vektor menggunakan model Chinese CLIP yang sama, lalu ambil gambar serupa dari DashVector.

Prasyarat

1. Siapkan kunci API

2. Siapkan lingkungan

Tutorial ini menggunakan model CLIP Enormous (resolusi 224) dari ModelScope, yang dilatih pada sekitar 200 juta pasangan gambar-teks dalam bahasa Tiongkok. Instal dependensi berikut:

Catatan

Instal Python 3.7 atau versi yang lebih baru.

# Instal client DashVector
pip3 install dashvector

# Instal ModelScope
# Diperlukan ModelScope 0.3.7 atau versi yang lebih baru. Versi default biasanya lebih baru dari 0.3.7, tetapi pastikan untuk memeriksa.
# Perbarui image atau gunakan metode berikut.
pip3 install --upgrade modelscope -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
# Instal decord secara terpisah.
# pip3 install decord
# Instalasi ModelScope mungkin memiliki dependensi lain. Dependensi untuk versi saat ini tercantum di bawah ini.
# pip3 install torch torchvision opencv-python timm librosa fairseq transformers unicodedata2 zhconv rapidfuzz

3. Siapkan data

Tutorial ini menggunakan set validasi set data multimodal Muge. Muat melalui API dataset ModelScope.

from modelscope.msdatasets import MsDataset

dataset = MsDataset.load("muge", split="validation")

Langkah-langkah

Catatan

Ganti your-xxx-api-key dan your-xxx-cluster-endpoint dengan kunci API dan titik akhir kluster Anda yang sebenarnya.

1. Sematkan dan simpan data gambar

Set validasi set data multimodal Muge berisi 30.588 gambar. Ekstrak vektor penyematannya menggunakan model CLIP dan simpan di DashVector bersama data gambar yang dikodekan dalam base64 untuk ditampilkan nanti.

import torch
from modelscope.utils.constant import Tasks
from modelscope.pipelines import pipeline
from modelscope.msdatasets import MsDataset
from dashvector import Client, Doc, DashVectorException, DashVectorCode
from PIL import Image
import base64
import io


def image2str(image):
    image_byte_arr = io.BytesIO()
    image.save(image_byte_arr, format='PNG')
    image_bytes = image_byte_arr.getvalue()
    return base64.b64encode(image_bytes).decode()


if __name__ == '__main__':
    # Inisialisasi client DashVector
    client = Client(
      api_key='{your-dashvector-api-key}',
      endpoint='{your-dashvector-cluster-endpoint}'
    )

    # Buat koleksi: Tentukan nama koleksi dan dimensi vektor. Model CLIP Enormous menghasilkan vektor dengan dimensi 1024.
    rsp = client.create('muge_embedding', 1024)
    if not rsp:
        raise DashVectorException(rsp.code, reason=rsp.message)

    # Hasilkan penyematan gambar dalam batch dan simpan vektornya.
    collection = client.get('muge_embedding')
    pipe = pipeline(task=Tasks.multi_modal_embedding,
                    model='damo/multi-modal_clip-vit-huge-patch14_zh', 
                    model_revision='v1.0.0')
    ds = MsDataset.load("muge", split="validation")

    BATCH_COUNT = 10
    TOTAL_DATA_NUM = len(ds)
    print(f"Mulai mengindeks data validasi Muge. Total ukuran data: {TOTAL_DATA_NUM}, Ukuran batch: {BATCH_COUNT}")
    idx = 0
    while idx < TOTAL_DATA_NUM:
        batch_range = range(idx, idx + BATCH_COUNT) if idx + BATCH_COUNT <= TOTAL_DATA_NUM else range(idx, TOTAL_DATA_NUM)
        images = [ds[i]['image'] for i in batch_range]
        # Hasilkan vektor penyematan gambar dengan model Chinese CLIP.
        image_embeddings = pipe.forward({'img': images})['img_embedding']
        image_vectors = image_embeddings.detach().cpu().numpy()
        collection.insert(
            [
                Doc(
                    id=str(img_id),
                    vector=img_vec,
                    fields={'png_img': image2str(img)}
                )
                for img_id, img_vec, img in zip(batch_range, image_vectors, images)
            ]
        )
        idx += BATCH_COUNT
    print("Selesai mengindeks data validasi Muge.")
Catatan

Model berjalan di CPU secara default. Menjalankannya di GPU meningkatkan performa.

2. Ambil data menggunakan kueri teks

Dengan data gambar yang telah disimpan, ubah kueri teks menjadi vektor menggunakan model CLIP yang sama, lalu ambil gambar serupa melalui API DashVector.

import torch
from modelscope.utils.constant import Tasks
from modelscope.pipelines import pipeline
from modelscope.msdatasets import MsDataset
from dashvector import Client, Doc, DashVectorException
from PIL import Image
import base64
import io


def str2image(image_str):
    image_bytes = base64.b64decode(image_str)
    return Image.open(io.BytesIO(image_bytes))


def multimodal_search(input_text):
    # Inisialisasi client DashVector
    client = Client(
      api_key='{your-dashvector-api-key}',
      endpoint='{your-dashvector-cluster-endpoint}'
    )

    # Dapatkan koleksi yang sebelumnya telah disimpan.
    collection = client.get('muge_embedding')

    # Dapatkan vektor penyematan untuk kueri teks.
    pipe = pipeline(task=Tasks.multi_modal_embedding,
                    model='damo/multi-modal_clip-vit-huge-patch14_zh', model_revision='v1.0.0')
    text_embedding = pipe.forward({'text': input_text})['text_embedding']  # Tensor 2D, [jumlah teks, dimensi fitur]
    text_vector = text_embedding.detach().cpu().numpy()[0]

    # Ambil vektor dengan DashVector.
    rsp = collection.query(text_vector, topk=3)
    image_list = list()
    for doc in rsp:
        image_str = doc.fields['png_img']
        image_list.append(str2image(image_str))
    return image_list


if __name__ == '__main__':
    text_query = "a dog wearing glasses"
    
    images = multimodal_search(text_query)
    for img in images:
        # Catatan: Fungsi show() mungkin memerlukan instalasi komponen penampil gambar yang diperlukan agar berfungsi di Server Linux.
        # Jalankan kode ini di server yang mendukung Jupyter Notebook.
        img.show()

Jalankan kode tersebut. Output-nya adalah sebagai berikut:

image.pngimage.png

image.png