Pencarian Video Tingkat Lanjut: Memanfaatkan Twelve Labs dan Milvus untuk Pencarian Semantik
Pengantar
Selamat datang di tutorial komprehensif tentang cara mengimplementasikan pencarian video semantik menggunakan Twelve Labs Embed API dan Milvus. Dalam panduan ini, kita akan mengeksplorasi cara memanfaatkan kekuatan penyematan multimodal Twelve Labs yang canggih dan basis data vektor Milvus yang efisien untuk membuat solusi pencarian video yang kuat. Dengan mengintegrasikan teknologi ini, pengembang dapat membuka kemungkinan baru dalam analisis konten video, memungkinkan aplikasi seperti pengambilan video berbasis konten, sistem rekomendasi, dan mesin pencari canggih yang memahami nuansa data video.
Tutorial ini akan memandu Anda melalui seluruh proses, mulai dari menyiapkan lingkungan pengembangan hingga mengimplementasikan aplikasi pencarian video semantik yang fungsional. Kita akan membahas konsep-konsep utama seperti menghasilkan sematan multimodal dari video, menyimpannya secara efisien di Milvus, dan melakukan pencarian kemiripan untuk mengambil konten yang relevan. Baik Anda sedang membangun platform analitik video, alat penemuan konten, atau meningkatkan aplikasi yang sudah ada dengan kemampuan pencarian video, panduan ini akan memberi Anda pengetahuan dan langkah-langkah praktis untuk memanfaatkan kekuatan gabungan Twelve Labs dan Milvus dalam proyek Anda.
Prasyarat
Sebelum memulai, pastikan Anda memiliki yang berikut ini:
Kunci API Twelve Labs (daftar di https://api.twelvelabs.io jika Anda belum memilikinya) Python 3.7 atau yang lebih baru yang terinstal di sistem Anda
Menyiapkan Lingkungan Pengembangan
Buat direktori baru untuk proyek Anda dan arahkan ke sana:
mkdir video-search-tutorial
cd video-search-tutorial
Siapkan lingkungan virtual (opsional, tetapi disarankan):
python -m venv venv
source venv/bin/activate # On Windows, use `venv\Scripts\activate`
Instal pustaka Python yang diperlukan:
pip install twelvelabs pymilvus
Buat berkas Python baru untuk proyek Anda:
touch video_search.py
File video_search.py ini akan menjadi skrip utama yang akan kita gunakan untuk tutorial ini. Selanjutnya, siapkan kunci API Twelve Labs Anda sebagai variabel lingkungan untuk keamanan:
export TWELVE_LABS_API_KEY='your_api_key_here'
Menghubungkan ke Milvus
Untuk membuat koneksi dengan Milvus, kita akan menggunakan kelas MilvusClient. Pendekatan ini menyederhanakan proses koneksi dan memungkinkan kita untuk bekerja dengan instans Milvus berbasis berkas lokal, yang sangat cocok untuk tutorial kita.
from pymilvus import MilvusClient
# Initialize the Milvus client
milvus_client = MilvusClient("milvus_twelvelabs_demo.db")
print("Successfully connected to Milvus")
Kode ini membuat instance Milvus client baru yang akan menyimpan semua data dalam sebuah berkas bernama milvus_twelvelabs_demo.db. Pendekatan berbasis file ini sangat ideal untuk tujuan pengembangan dan pengujian.
Membuat Koleksi Milvus untuk Penyematan Video
Setelah terhubung ke Milvus, mari kita buat koleksi untuk menyimpan embedding video dan metadata terkait. Kita akan mendefinisikan skema koleksi dan membuat koleksi jika belum ada.
# Initialize the collection name
collection_name = "twelvelabs_demo_collection"
# Check if the collection already exists and drop it if it does
if milvus_client.has_collection(collection_name=collection_name):
milvus_client.drop_collection(collection_name=collection_name)
# Create the collection
milvus_client.create_collection(
collection_name=collection_name,
dimension=1024 # The dimension of the Twelve Labs embeddings
)
print(f"Collection '{collection_name}' created successfully")
Dalam kode ini, pertama-tama kita akan memeriksa apakah koleksi tersebut sudah ada dan membuangnya jika sudah ada. Hal ini memastikan kita memulai dengan awal yang bersih. Kami membuat koleksi dengan dimensi 1024, yang sesuai dengan dimensi keluaran dari embedding Twelve Labs.
Menghasilkan Embedding dengan API Embedding Twelve Labs
Untuk menghasilkan embedding untuk video kita menggunakan Twelve Labs Embed API, kita akan menggunakan Twelve Labs Python SDK. Proses ini melibatkan pembuatan tugas penyematan, menunggu penyelesaiannya, dan mengambil hasilnya. Berikut ini cara mengimplementasikannya:
Pertama, pastikan Anda telah menginstal Twelve Labs SDK dan mengimpor modul-modul yang diperlukan:
from twelvelabs import TwelveLabs
from twelvelabs.models.embed import EmbeddingsTask
import os
# Retrieve the API key from environment variables
TWELVE_LABS_API_KEY = os.getenv('TWELVE_LABS_API_KEY')
Inisialisasi klien Twelve Labs:
twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)
Buat fungsi untuk menghasilkan sematan untuk URL video tertentu:
def generate_embedding(video_url):
"""
Generate embeddings for a given video URL using the Twelve Labs API.
This function creates an embedding task for the specified video URL using
the Marengo-retrieval-2.6 engine. It monitors the task progress and waits
for completion. Once done, it retrieves the task result and extracts the
embeddings along with their associated metadata.
Args:
video_url (str): The URL of the video to generate embeddings for.
Returns:
tuple: A tuple containing two elements:
1. list: A list of dictionaries, where each dictionary contains:
- 'embedding': The embedding vector as a list of floats.
- 'start_offset_sec': The start time of the segment in seconds.
- 'end_offset_sec': The end time of the segment in seconds.
- 'embedding_scope': The scope of the embedding (e.g., 'shot', 'scene').
2. EmbeddingsTaskResult: The complete task result object from Twelve Labs API.
Raises:
Any exceptions raised by the Twelve Labs API during task creation,
execution, or retrieval.
"""
# Create an embedding task
task = twelvelabs_client.embed.task.create(
engine_name="Marengo-retrieval-2.6",
video_url=video_url
)
print(f"Created task: id={task.id} engine_name={task.engine_name} status={task.status}")
# Define a callback function to monitor task progress
def on_task_update(task: EmbeddingsTask):
print(f" Status={task.status}")
# Wait for the task to complete
status = task.wait_for_done(
sleep_interval=2,
callback=on_task_update
)
print(f"Embedding done: {status}")
# Retrieve the task result
task_result = twelvelabs_client.embed.task.retrieve(task.id)
# Extract and return the embeddings
embeddings = []
for v in task_result.video_embeddings:
embeddings.append({
'embedding': v.embedding.float,
'start_offset_sec': v.start_offset_sec,
'end_offset_sec': v.end_offset_sec,
'embedding_scope': v.embedding_scope
})
return embeddings, task_result
Gunakan fungsi ini untuk menghasilkan sematan untuk video Anda:
# Example usage
video_url = "https://example.com/your-video.mp4"
# Generate embeddings for the video
embeddings, task_result = generate_embedding(video_url)
print(f"Generated {len(embeddings)} embeddings for the video")
for i, emb in enumerate(embeddings):
print(f"Embedding {i+1}:")
print(f" Scope: {emb['embedding_scope']}")
print(f" Time range: {emb['start_offset_sec']} - {emb['end_offset_sec']} seconds")
print(f" Embedding vector (first 5 values): {emb['embedding'][:5]}")
print()
Implementasi ini memungkinkan Anda menghasilkan sematan untuk URL video apa pun menggunakan API Sematan Twelve Labs. Fungsi generate_embedding menangani seluruh proses, mulai dari membuat tugas hingga mengambil hasilnya. Fungsi ini mengembalikan daftar kamus, masing-masing berisi vektor penyematan beserta metadata (rentang waktu dan cakupannya), dan ingatlah untuk menangani potensi kesalahan, seperti masalah jaringan atau batasan API, di lingkungan produksi. Anda mungkin juga ingin mengimplementasikan percobaan ulang atau penanganan kesalahan yang lebih kuat tergantung pada kasus penggunaan spesifik Anda.
Memasukkan Embedding ke dalam Milvus
Setelah membuat embedding menggunakan Twelve Labs Embed API, langkah selanjutnya adalah memasukkan embedding ini beserta metadatanya ke dalam koleksi Milvus kita. Proses ini memungkinkan kita untuk menyimpan dan mengindeks embedding video kita untuk pencarian kemiripan yang efisien nantinya.
Berikut ini cara memasukkan embedding ke dalam Milvus:
def insert_embeddings(milvus_client, collection_name, task_result, video_url):
"""
Insert embeddings into the Milvus collection.
Args:
milvus_client: The Milvus client instance.
collection_name (str): The name of the Milvus collection to insert into.
task_result (EmbeddingsTaskResult): The task result containing video embeddings.
video_url (str): The URL of the video associated with the embeddings.
Returns:
MutationResult: The result of the insert operation.
This function takes the video embeddings from the task result and inserts them
into the specified Milvus collection. Each embedding is stored with additional
metadata including its scope, start and end times, and the associated video URL.
"""
data = []
for i, v in enumerate(task_result.video_embeddings):
data.append({
"id": i,
"vector": v.embedding.float,
"embedding_scope": v.embedding_scope,
"start_offset_sec": v.start_offset_sec,
"end_offset_sec": v.end_offset_sec,
"video_url": video_url
})
insert_result = milvus_client.insert(collection_name=collection_name, data=data)
print(f"Inserted {len(data)} embeddings into Milvus")
return insert_result
# Usage example
video_url = "https://example.com/your-video.mp4"
# Assuming this function exists from previous step
embeddings, task_result = generate_embedding(video_url)
# Insert embeddings into the Milvus collection
insert_result = insert_embeddings(milvus_client, collection_name, task_result, video_url)
print(insert_result)
Fungsi ini menyiapkan data untuk disisipkan, termasuk semua metadata yang relevan seperti vektor penyematan, rentang waktu, dan URL video sumber. Kemudian menggunakan klien Milvus untuk menyisipkan data ini ke dalam koleksi yang ditentukan.
Melakukan Pencarian Kemiripan
Setelah penyematan disimpan di Milvus, kita dapat melakukan pencarian kemiripan untuk menemukan segmen video yang paling relevan berdasarkan vektor kueri. Berikut ini adalah cara mengimplementasikan fungsi ini:
def perform_similarity_search(milvus_client, collection_name, query_vector, limit=5):
"""
Perform a similarity search on the Milvus collection.
Args:
milvus_client: The Milvus client instance.
collection_name (str): The name of the Milvus collection to search in.
query_vector (list): The query vector to search for similar embeddings.
limit (int, optional): The maximum number of results to return. Defaults to 5.
Returns:
list: A list of search results, where each result is a dictionary containing
the matched entity's metadata and similarity score.
This function searches the specified Milvus collection for embeddings similar to
the given query vector. It returns the top matching results, including metadata
such as the embedding scope, time range, and associated video URL for each match.
"""
search_results = milvus_client.search(
collection_name=collection_name,
data=[query_vector],
limit=limit,
output_fields=["embedding_scope", "start_offset_sec", "end_offset_sec", "video_url"]
)
return search_results
# define the query vector
# We use the embedding inserted previously as an example. In practice, you can replace it with any video embedding you want to query.
query_vector = task_result.video_embeddings[0].embedding.float
# Perform a similarity search on the Milvus collection
search_results = perform_similarity_search(milvus_client, collection_name, query_vector)
print("Search Results:")
for i, result in enumerate(search_results[0]):
print(f"Result {i+1}:")
print(f" Video URL: {result['entity']['video_url']}")
print(f" Time Range: {result['entity']['start_offset_sec']} - {result['entity']['end_offset_sec']} seconds")
print(f" Similarity Score: {result['distance']}")
print()
Implementasi ini melakukan hal berikut:
- Mendefinisikan fungsi perform_similarity_search yang mengambil vektor kueri dan mencari sematan yang serupa dalam koleksi Milvus.
- Menggunakan metode pencarian klien Milvus untuk menemukan vektor yang paling mirip.
- Menentukan bidang keluaran yang ingin kita ambil, termasuk metadata tentang segmen video yang cocok.
- Memberikan contoh cara menggunakan fungsi ini dengan video kueri, pertama-tama membuat penyematannya dan kemudian menggunakannya untuk mencari.
- Mencetak hasil pencarian, termasuk metadata yang relevan dan skor kemiripan.
Dengan mengimplementasikan fungsi-fungsi ini, Anda telah membuat alur kerja yang lengkap untuk menyimpan penyematan video di Milvus dan melakukan pencarian kemiripan. Penyiapan ini memungkinkan pengambilan konten video serupa secara efisien berdasarkan penyematan multimodal yang dihasilkan oleh API Embed Twelve Labs.
Mengoptimalkan Kinerja
Baiklah, mari kita bawa aplikasi ini ke tingkat berikutnya! Ketika berurusan dengan koleksi video berskala besar, performa adalah kuncinya. Untuk mengoptimalkan, kita harus mengimplementasikan pemrosesan batch untuk pembuatan dan penyisipan embedding ke dalam Milvus. Dengan cara ini, kita dapat menangani banyak video secara bersamaan, sehingga secara signifikan mengurangi waktu pemrosesan secara keseluruhan. Selain itu, kami dapat memanfaatkan fitur partisi Milvus untuk mengatur data kami secara lebih efisien, mungkin berdasarkan kategori video atau periode waktu. Hal ini akan mempercepat pencarian dengan memungkinkan kami untuk mencari hanya partisi yang relevan.
Trik pengoptimalan lainnya adalah dengan menggunakan mekanisme caching untuk embedding atau hasil pencarian yang sering diakses. Hal ini dapat secara dramatis meningkatkan waktu respons untuk kueri yang populer. Jangan lupa untuk menyempurnakan parameter indeks Milvus berdasarkan kumpulan data dan pola kueri spesifik Anda - sedikit penyesuaian di sini bisa sangat membantu dalam meningkatkan kinerja pencarian.
Fitur Lanjutan
Sekarang, mari kita tambahkan beberapa fitur keren untuk membuat aplikasi kita menonjol! Kita dapat menerapkan pencarian hybrid yang menggabungkan kueri teks dan video. Faktanya, Twelve Labs Embed API juga dapat menghasilkan penyematan teks untuk kueri teks Anda. Bayangkan jika pengguna dapat memasukkan deskripsi teks dan contoh klip video - kami akan membuat sematan untuk keduanya dan melakukan pencarian berbobot di Milvus. Ini akan memberikan hasil yang sangat tepat.
Tambahan lain yang mengagumkan adalah pencarian temporal di dalam video. Kami dapat memecah video panjang menjadi beberapa segmen yang lebih kecil, masing-masing dengan penyematannya sendiri. Dengan cara ini, pengguna dapat menemukan momen-momen tertentu di dalam video, bukan hanya seluruh klip. Dan hei, mengapa tidak memasukkan beberapa analisis video dasar? Kita dapat menggunakan penyematan untuk mengelompokkan segmen video yang serupa, mendeteksi tren, atau bahkan mengidentifikasi pencilan dalam koleksi video yang besar.
Penanganan dan Pencatatan Kesalahan
Mari kita akui saja, banyak hal yang bisa saja salah, dan saat itu terjadi, kita harus siap. Menerapkan penanganan kesalahan yang kuat sangatlah penting. Kita harus membungkus panggilan API dan operasi basis data kita dalam blok try-except, memberikan pesan kesalahan yang informatif kepada pengguna ketika terjadi kegagalan. Untuk masalah yang berhubungan dengan jaringan, mengimplementasikan percobaan ulang dengan backoff eksponensial dapat membantu menangani gangguan sementara dengan baik.
Sedangkan untuk logging, ini adalah teman terbaik kita untuk melakukan debugging dan pemantauan. Kita harus menggunakan modul pencatatan Python untuk melacak peristiwa penting, kesalahan, dan metrik kinerja di seluruh aplikasi kita. Mari kita siapkan level log yang berbeda - DEBUG untuk pengembangan, INFO untuk operasi umum, dan ERROR untuk masalah kritis. Dan jangan lupa untuk menerapkan rotasi log untuk mengelola ukuran file. Dengan pencatatan yang tepat, kita akan dapat dengan cepat mengidentifikasi dan menyelesaikan masalah, memastikan aplikasi pencarian video kita berjalan dengan lancar meskipun aplikasi ini terus berkembang.
Kesimpulan
Selamat! Anda sekarang telah membuat aplikasi pencarian video semantik yang kuat menggunakan API Embed Twelve Labs dan Milvus. Integrasi ini memungkinkan Anda untuk memproses, menyimpan, dan mengambil konten video dengan akurasi dan efisiensi yang belum pernah ada sebelumnya. Dengan memanfaatkan penyematan multimodal, Anda telah menciptakan sistem yang memahami nuansa data video, membuka kemungkinan menarik untuk penemuan konten, sistem rekomendasi, dan analisis video tingkat lanjut.
Ketika Anda terus mengembangkan dan menyempurnakan aplikasi Anda, ingatlah bahwa kombinasi generasi penyematan canggih Twelve Labs dan penyimpanan vektor yang dapat diskalakan dari Milvus memberikan fondasi yang kuat untuk mengatasi tantangan pemahaman video yang lebih kompleks. Kami mendorong Anda untuk bereksperimen dengan fitur-fitur canggih yang telah dibahas dan mendorong batas-batas dari apa yang mungkin dilakukan dalam pencarian dan analisis video.