Character embeddings: primer teknis
Bagaimana sistem character lock benar-benar bekerja di pipeline video AI modern: arsitektur, keputusan desain, mode kegagalan, dan masalah terbuka.
Artikel ini ditujukan untuk para insinyur — peneliti, praktisi ML, dan pengembang yang membangun atau mengevaluasi tooling video AI. Jika Anda ingin gambaran non-teknis tentang mengapa konsistensi karakter penting, mulai dengan panduan lengkap.
Di sini kita akan membahas cara kerja sistem character embedding di stack video AI modern: arsitektur, keputusan desain, mode kegagalan, dan masalah terbuka yang belum terpecahkan.
Pernyataan masalah
Diberikan model video generatif M dan karakter C, kita ingin sebuah prosedur sehingga untuk setiap prompt p_i dalam urutan p_1, p_2, …, p_n yang merujuk pada C, semua keluaran yang dihasilkan mempertahankan identitas C.
Pendekatan naif — memasukkan deskripsi karakter di setiap prompt — gagal karena diffusion sampling bersifat stokastik dan prompt mendeskripsikan kategori, bukan identitas. Setiap generasi adalah pengundian dari distribusi karakter valid yang cocok dengan deskripsi tersebut; identitas akan drift di antara pengundian.
Kita butuh cara untuk mengkondisikan keluaran model pada identitas spesifik yang sudah dipelajari, bukan sekadar pada deskripsi.
Arsitektur
Sistem konsistensi karakter modern terdiri dari enam komponen:
1. Feature extraction — menghasilkan identity embedding dari referensi
2. Storage — menyimpan embedding terikat ke character_id
3. Negative prompt synthesis — membangun negative_prompts otomatis dari katalog drift
4. Conditioning injection — menyuntikkan embedding ke conditioning model
5. Generation — diffusion sampling dengan model terkondisi
6. Consistency verification — pengecekan similarity post-hoc, regenerasi jika perluMari bahas satu per satu.
1. Feature extraction
Saat unggah karakter, beberapa model khusus dijalankan terhadap gambar referensi:
- Face encoder: ArcFace, FaceNet, atau sejenis. Menghasilkan identity embedding 512 dimensi yang dioptimalkan untuk pengenalan wajah. Menangkap fitur yang invarian terhadap identitas.
- Body parser: PIFu atau Sapiens, untuk proporsi tubuh dan postur. Vektor berdimensi rendah yang mengkodekan tinggi, perawakan, postur.
- Appearance encoder: image encoder CLIP, untuk warna rambut, warna kulit, gaya pakaian. Embedding semantik 768 dimensi.
- Style classifier: secara terpisah mengkodekan apakah referensi realistis, terstilasi, beranimasi, dst. Vektor kategorikal kecil.
Semua ini di-concat (atau digabung lewat attention) menjadi character embedding e_C berdimensi tinggi. Total dimensionalitas biasanya 1500-3000.
Mengapa beberapa model alih-alih satu? Karena identitas memiliki banyak sumbu yang tidak bisa ditangkap secara penuh oleh satu encoder. Face encoder hebat untuk “apakah ini wajah yang sama?” tapi buta soal proporsi tubuh. Body parser buta soal detail wajah. CLIP bagus untuk penampilan semantik tapi kehilangan identitas halus. Concat memberi cakupan ortogonal.
Trade-off: pipeline ekstraksi yang lebih kompleks berarti compute lebih besar saat upload karakter (~30-90 detik di sebagian sistem). Untuk tooling konsumen masih oke. Untuk pipeline throughput tinggi, embedding bisa di-pre-compute sekali saat upload dan dirujuk saat generasi.
2. Storage
Setiap karakter disimpan sebagai (character_id, embedding_vector, metadata). Metadata mencakup:
- Gambar referensi sumber (untuk debugging dan re-extraction)
- Asosiasi pemilik / proyek
- Pointer sub-varian (lihat bagian form variants)
- Style anchor (untuk pekerjaan cross-style)
- Daftar override drift mode (kustomisasi per karakter)
Storage biasanya berupa basis data vektor (Pinecone, Qdrant, Weaviate) atau struktur terindeks kustom. Lookup harus cepat — di bawah 100ms — karena terjadi setiap generasi.
Untuk deployment yang sensitif privasi, embedding dapat disimpan terenkripsi dengan kunci per-tenant. Ekstraksi adalah fungsi one-way (Anda tidak bisa merekonstruksi gambar referensi dari embedding), tetapi memperlakukan embedding sebagai PII adalah default yang tepat untuk sistem yang menangani orang nyata.
3. Negative prompt synthesis
Inilah bagian sistem yang kurang kentara, dan tempat sebagian besar kerja engineering berada.
Praktiknya adalah memelihara katalog mode drift umum — jenis kegagalan kategorikal yang teramati pada ribuan generasi. Untuk tiap mode ada fragmen negative_prompt yang menekan kegagalan tersebut.
Contoh dari katalog:
| Drift mode | Fragmen negative prompt |
|---|---|
| Pergeseran warna mata (cokelat → hijau) | “green eyes, hazel eyes” (ketika referensi cokelat) |
| Penyempitan rahang | “narrow jaw, weak chin, soft jawline” |
| Garis rambut mundur | “high hairline, thinning hair, receding hairline” |
| Warna kulit menghangat | “warm skin tone, golden complexion” (ketika referensi dingin) |
| Asimetri merambat | “asymmetric face, uneven features” |
| Pergeseran jarak mata | “wide-set eyes, close-set eyes” |
Membangun katalog ini memerlukan data berlabel. Di industri, ~10.000 generasi dari tooling video AI publik (Runway, Pika, Sora, dll.) dilabeli dengan mode drift spesifik yang muncul. Clustering biasanya menghasilkan ~30 mode berbeda yang mencakup ~85% drift teramati.
Untuk setiap generasi, sistem:
- Mengambil atribut referensi karakter
- Menghitung “lawan” dari setiap atribut (mis., jika referensi bermata gelap, lawannya mata terang)
- Menyusun negative prompt per karakter dengan menggabungkan suppressor drift yang relevan
Hasilnya adalah sinyal conditioning yang jauh lebih kuat dibanding generasi prompt-only.
4. Conditioning injection
Model video berbeda menerima conditioning dengan cara berbeda:
- Model berbasis gambar referensi (kebanyakan API publik): Anda bisa mengirim gambar referensi; embedding dikodekan kembali ke “gambar referensi sintetis” via projection yang dipelajari, lalu dikirim.
- Conditioning teks-saja: kirim projection soft-prompt yang dipelajari dari embedding.
- Akses model tingkat API (jika tersedia): suntikkan embedding langsung ke layer cross-attention, mirip conditioning IP-Adapter.
Berdasarkan pengalaman, injection tingkat API jauh lebih efektif daripada berbasis gambar referensi, tetapi sebagian besar API publik tidak membuka akses sedalam itu. Bekerja pada permukaan API yang ada, mengkombinasikan negative prompt yang kuat dengan embedding yang dikodekan sebagai gambar referensi memberi sekitar 80-90% efek injection tingkat API.
Itulah salah satu alasan membangun lapisan konsistensi karakter tetap berarti meski Anda tidak mengontrol model dasarnya — ada ruang signifikan pada permukaan conditioning yang sudah dibuka oleh API publik.
5. Generation
Diffusion sampling standar, dengan catatan conditioning kini merupakan kombinasi dari:
- Prompt awal (adegan, aksi, framing)
- Character embedding (disuntikkan via mekanisme di atas)
- Negative prompt (auto-disintesis)
- Style anchor (jika berlaku untuk segmen)
Biaya generasi biasanya 1.0-1.2× dari generasi vanilla. Biaya marjinal kecil.
6. Consistency verification
Setelah generasi, kita jalankan model identitas terpisah (biasanya face encoder yang sama seperti pada langkah 1) terhadap keluaran. Kita hitung cosine similarity antara identity embedding keluaran dan embedding referensi awal.
Ambang batas: biasanya 0,85 cosine similarity. Di atas ambang, keluaran diterima. Di bawah ambang, regenerasi diaktifkan dengan conditioning yang lebih ketat (bobot negative prompt lebih tinggi, injection embedding lebih kuat).
Ini menambah ~5-10% biaya generasi rata-rata (kebanyakan shot lolos sekali jalan) dan mencegah kasus drift terburuk sampai ke pengguna.
Apa yang berjalan baik, apa yang tidak
Yang berjalan:
- 30+ shot karakter tunggal dengan konsistensi tinggi, pada variasi adegan standar
- Reuse pustaka karakter lintas proyek (satu ekstraksi, reuse tak terbatas)
- Konsistensi lintas platform (character_id sama, identitas sama di adegan / gaya berbeda dalam batas wajar)
- Adegan multi-karakter dengan fitur berbeda yang tegas (usia, gender, etnis berbeda)
Yang lebih sulit:
- Form variants: karakter sama tapi terluka, menua, berganti pakaian. Praktiknya pakai sub-embedding yang ditambatkan ke master, di mana master mengkodekan identitas invarian dan sub mengkodekan delta. Berhasil untuk variasi sedang; gagal pada transformasi besar (mis. versi 8 tahun dari karakter yang sama).
- Identity bleed di adegan multi-karakter: ketika dua karakter terkunci berbagi frame dan punya fitur mirip (misal sama-sama wanita Asia 30 tahun), sekitar 10% generasi memperlihatkan bleed fitur parsial.
- Koherensi cross-style: karakter realistis terkunci ditempatkan di segmen “cat air” terstilasi. Sebagian dipecahkan via style anchor per segmen, tapi degradasi terlihat.
- Karakter hewan / non-manusia: arsitektur sama berlaku, tapi kualitas face encoder anjlok di luar wajah manusia.
- Koherensi long-form di atas ~3 menit: drift suppression bekerja per shot, tetapi perbedaan halus terakumulasi pada 50+ shot tetap bisa terbaca sebagai inkonsistensi ringan oleh penonton yang teliti.
Masalah riset terbuka
Jika Anda bekerja di area ini, berikut masalah yang ingin kami lihat terpecahkan:
- Invarian untuk form variants. Apa representasi terpelajar yang tepat untuk menangkap struktur wajah yang invarian terhadap identitas sembari memungkinkan transformasi state arbitrer?
- Deteksi drift aktif selama sampling. Pengecekan konsistensi saat ini bersifat post-hoc. Bisakah kita mendeteksi drift selama proses diffusion dan mengoreksi di tengah sampling?
- Trade-off identitas implisit vs eksplisit. Kapan melatih LoRA kecil per-karakter mengalahkan conditioning berbasis embedding? Di mana batasnya?
- Pemodelan interaksi multi-karakter. Bagaimana menangkap bukan hanya dua identitas terkunci, tetapi juga dinamika hubungan mereka sehingga konsisten lintas shot?
- Kuantifikasi ketidakpastian identitas. Saat model tak yakin soal identitas, bisakah ia memunculkan ketidakpastian itu alih-alih menghasilkan drift yang percaya diri?
Jika Anda mengerjakan salah satunya dan ingin bertukar pikiran, tim di balik Juying betul-betul tertarik. Hubungi kami.
Saran praktis untuk builder
Jika Anda mempertimbangkan membangun lapisan konsistensi karakter untuk produk Anda sendiri, tiga saran:
1. Mulai dari katalog negative prompt. Ini langkah dengan dampak tertinggi dan biaya terendah. Tidak butuh akses model tingkat API; negative prompt dibuka oleh setiap API publik. Habiskan seminggu melabeli 1000 generasi dan Anda akan punya katalog yang menutupi sebagian besar drift.
2. Jangan remehkan verifikasi post-hoc. Menambahkan loop sederhana “regenerate jika similarity < 0,85” menangkap 10% kegagalan terburuk dan secara dramatis menaikkan kualitas yang dirasakan. Ini lompatan kualitas 90/100 → 95/100 termurah yang ada.
3. Investasikan storage sejak awal. Embedding karakter sebagai aset persisten adalah wawasan arsitektural yang menumpuk bunga. Bangun primitif yang tepat sekali, dan setiap fitur berikutnya (style locks, library adegan, reuse aset) akan meluas secara natural.
Bacaan terkait
- Konsistensi karakter di video AI: panduan lengkap 2026
- Apa itu character drift di video AI?
- Runway vs Pika vs Sora vs Juying: perbandingan tool
Jika Anda membangun di area ini dan ingin ngobrol — info@juying.art