Apa itu embedding?
- "Embedding" adalah mengubah konten menjadi "array angka floating-point"
- Inti dari array ini adalah bahwa "ukuran array" selalu sama, terlepas dari "panjang isi konten"
- Ukuran array ditentukan oleh model embedding yang digunakan: 300, 1000, 1536, dan seterusnya
- Cara terbaik untuk memikirkan array angka ini adalah membayangkannya sebagai "koordinat dalam ruang multidimensi yang sangat aneh"
- Mengapa menempatkan konten dalam ruang multidimensi? Karena kita bisa mempelajari hal-hal menarik tentang konten tersebut berdasarkan posisinya, terutama konten lain yang berada di dekatnya
- Posisi dalam ruang merepresentasikan "makna semantik (semantic meaning)" dari konten tersebut menurut "pemahaman model embedding tentang dunia yang aneh dan sebagian besar tidak dapat kita pahami"
- Konten yang di-embed dapat menangkap warna, bentuk, konsep, atau berbagai jenis karakteristik lainnya
- Tidak ada yang benar-benar memahami arti dari setiap angka individual ini, tetapi kita tahu bahwa posisinya dapat digunakan untuk menemukan informasi yang berguna tentang konten tersebut
Menemukan konten terkait menggunakan embedding
- Masalah pertama yang saya selesaikan dengan embedding adalah membuat fitur "Related Content" untuk blog TIL saya
- Saya menggunakan model
text-embedding-ada-002 dari OpenAI. Model ini bisa digunakan lewat API
- Saat ini situs saya memiliki 472 tulisan, dan untuk setiap tulisan saya menghitung vektor embedding berdimensi 1536 (array angka floating-point), lalu menyimpan vektor tersebut di database SQLite situs saya
- Sekarang, untuk menemukan tulisan terkait bagi suatu tulisan tertentu, saya cukup menghitung cosine similarity antara vektor embedding tulisan itu dan tulisan lain di DB, lalu mengembalikan 10 kecocokan terdekat berdasarkan jarak
- Kode Python yang saya gunakan untuk cosine similarity adalah sebagai berikut
def cosine_similarity(a, b):
dot_product = sum(x * y for x, y in zip(a, b))
magnitude_a = sum(x * x for x in a) ** 0.5
magnitude_b = sum(x * x for x in b) ** 0.5
return dot_product / (magnitude_a * magnitude_b)
- API embedding dari OpenAI sangat murah dan mudah
- Saya meng-embed sekitar 400 ribu token untuk situs TIL saya, dan dengan biaya $0.0001 per 1.000 token, totalnya hanya $0.04
- Anda cukup melakukan
POST bersama API key dan mengirimkan teks, lalu API akan mengembalikan JSON array berisi angka floating-point
- Tetapi ini adalah model proprietari, dan beberapa bulan sebelumnya OpenAI juga menghentikan sebagian model embedding mereka
- Artinya, jika Anda telah menyimpan banyak embedding dari model tersebut, Anda harus menghitung ulang embedding untuk model yang baru
- OpenAI mengatakan akan mengganti biaya re-embedding ke model baru, tetapi model proprietari tetap perlu diwaspadai
- Ini bisa dihindari dengan model berlisensi terbuka yang kuat
Memahami bagaimana ini bekerja pada model Word2Vec
- Google Research menerbitkan makalah berpengaruh sekitar 10 tahun lalu yang menjelaskan model embedding awal bernama Word2Vec
- Makalah tahun 2013 berjudul "Efficient Estimation of Word Representations in Vector Space" memicu minat besar terhadap embedding
- Word2Vec adalah model yang mengambil satu kata dan mengubahnya menjadi daftar 300 angka. Daftar angka tersebut menangkap informasi tentang makna kata-kata yang terkait
- Jika Anda mencari sebuah kata, Anda bisa menemukan kata yang mirip berdasarkan cosine distance terhadap representasi Word2Vec dari kata itu
- Jika Anda mencari "france", Anda bisa mendapatkan nilai seperti "french: 0.70007~", "belgium: 0.69331~", "paris: 0.63349~", "germany: 0.62707~"
- Ini merupakan campuran antara hal-hal yang bersifat Prancis (
french) dan geografi Eropa
- Hal yang sangat menarik di sini adalah kita bisa melakukan operasi aritmetika pada vektor-vektor ini
- Jika Anda menambahkan "paris" ke vektor untuk "germany" lalu mengurangi "france", vektor hasilnya akan paling dekat ke "berlin"
- Model ini menangkap gagasan tentang kebangsaan dan geografi sehingga, dengan menggunakan aritmetika pada beberapa hal, kita bisa mengeksplorasi fakta tambahan tentang dunia
- Word2Vec dilatih pada konten sebanyak 1,6 miliar kata, dan model embedding yang kita gunakan saat ini dilatih pada dataset yang jauh lebih besar sehingga menangkap pemahaman yang jauh lebih kaya tentang relasi-relasi dasar
Menghitung dan mencari embedding menggunakan alat saya
- Saya sedang membuat CLI dan library Python bernama LLM
- Alat ini bisa digunakan sebagai CLI untuk berinteraksi dengan LLM, dan juga dapat terhubung dengan OpenAPI
- Beberapa bulan lalu saya juga menambahkan fitur untuk menjalankan model embedding ke alat ini melalui plugin (bisa menggunakan library SentenceTransformers)
- Ini memungkinkan pencarian bergaya vibes dengan memilih koleksi embedding dan menemukan hal-hal yang mirip
- Saya juga sedang membuat alat Symbex untuk menemukan symbol dalam codebase Python. Dengan ini, kita bisa menghitung embedding untuk fungsi-fungsi dalam kode dan membangun mesin pencari kode
- (Bagian implementasi detail dihilangkan)
Meng-embed teks dan gambar bersama-sama menggunakan CLIP
- Model embedding yang paling saya sukai saat ini adalah CLIP
- Ini adalah model yang dirilis OpenAI pada Januari 2021, yang dapat meng-embed "teks dan gambar" sekaligus dan menempatkannya dalam ruang vektor yang sama
- Jika Anda memasukkan "dog", Anda akan mendapatkan sebuah posisi dalam ruang 512 dimensi (tergantung konfigurasi CLIP)
- Jika Anda meng-embed foto anjing, Anda juga akan mendapatkan posisinya dalam ruang yang sama, dan jaraknya akan dekat dengan posisi string "dog"
- Artinya, Anda bisa mencari gambar terkait menggunakan teks, atau mencari teks terkait menggunakan gambar
- Jika Anda memasukkan foto pantai, Anda bisa mendapatkan skor kemiripan seperti "beach: 26.946%", "city: 19.839%", "sunshine: 24.146%"
Mencari keran dengan CLIP
- Drew Breunig membangun mesin pencari keran dengan plugin
llm-clip
- Ia mengambil 20 ribu foto keran lalu menjalankan CLIP
- Setelah itu, ia bisa menemukan keran yang mirip dengan keran lain, lalu memilih opsi yang serupa tetapi lebih murah
Menjawab pertanyaan dengan RAG
- Pertanyaan terakhir dari semua orang yang pernah mencoba ChatGPT selalu sama
"Bagaimana caranya agar ini bisa menjawab pertanyaan tentang catatan saya atau dokumen perusahaan kami?"
- Orang-orang biasanya berasumsi bahwa solusinya adalah melatih model kustom yang mahal berdasarkan konten tersebut
- Namun sebenarnya itu tidak perlu. Hal ini bisa dilakukan dengan LLM dan RAG (Retrieval Augmented Generation)
- Ide intinya adalah "pengguna mengajukan pertanyaan"
- Lalu Anda mencari hal-hal yang relevan dengan pertanyaan itu dalam dokumen pribadi Anda
- Setelah itu, Anda memasukkan kutipan dari konten tersebut bersama pertanyaan aslinya ke dalam LLM
- Dengan begitu, LLM dapat menjawab pertanyaan berdasarkan konten tambahan yang Anda berikan
- Trik murah ini ternyata bekerja dengan sangat baik
- Tetapi tidak mudah membuat versi dasar yang memungkinkan pendekatan ini benar-benar berjalan
- Anda harus membuatnya bekerja sebaik mungkin untuk himpunan pertanyaan tak terbatas yang mungkin diajukan pengguna
- Masalah utama dalam RAG adalah menentukan kutipan konten terbaik untuk dimasukkan ke prompt yang akan dikirim ke LLM
- Pencarian semantik bergaya 'Vibes-based' yang digerakkan oleh embedding adalah kemampuan penting untuk mengumpulkan konten yang sangat relevan yang dapat membantu menjawab pertanyaan pengguna
- Saya membuat dan merilis versi untuk "isi blog" saya sendiri
- Hasilnya, RAG bisa dilakukan dengan Bash script satu baris
5 komentar
Saya melihat tulisan ini lalu mencobanya akhir pekan ini. Saya sempat mencoba model bahasa Korea, tetapi penyiapan lingkungannya tidak mudah, jadi saya memakai ada v2 dan total biayanya sekitar $0.03. Kalau Anda pengguna baru yang belum pernah memakai ChatGPT, sepertinya kredit gratis $5 sudah cukup untuk mencobanya haha.
Saya juga menghitung dan membandingkan hingga cosine similarity, dan hasilnya masuk akal. Terima kasih sudah membagikan tulisannya.
Sepertinya saya harus coba mengikuti ini akhir pekan nanti.
Terima kasih~
Sepertinya saya mulai sedikit memahaminya.
Terima kasih.
Saya jadi belajar banyak tentang bagian-bagian yang selama ini saya penasaran tetapi belum benar-benar memahaminya. Terima kasih selalu atas konten yang bagus.