5 poin oleh GN⁺ 2023-10-25 | 1 komentar | Bagikan ke WhatsApp
  • Embedding mengubah konten seperti teks, gambar, dan kode menjadi array floating-point dengan panjang tetap, sehingga item yang berdekatan secara makna dapat ditemukan lewat perhitungan jarak
  • Dalam ruang vektor yang dibuat oleh model yang sama, meski tidak mengetahui arti tiap angka, kita dapat membandingkan dokumen terkait, gambar serupa, dan potongan kode dengan cosine similarity
  • Dalam contoh yang menyimpan 472 tulisan TIL sebagai vektor 1.536 dimensi menggunakan OpenAI text-embedding-ada-002, kueri pencarian tulisan terkait memakan waktu sekitar 400 ms, dan biaya embedding untuk total 402.500 token sekitar $0,04
  • Dengan kombinasi model lokal dan alat kecil saja, kita bisa mengimplementasikan pencarian README, pencarian kode, pencarian gambar, clustering, dan RAG; LLM, llm-sentence-transformers, Symbex, CLIP, E5-large-v2 digunakan sebagai contoh
  • Pencarian semantik berbasis embedding tidak bergantung pada kecocokan kata persis, sehingga menjadi cara utama untuk memasukkan kutipan relevan ke prompt LLM dalam RAG seperti tanya jawab dokumen internal perusahaan

Konsep dasar embedding

  • Embedding adalah cara mengubah satu potongan konten menjadi array angka floating-point
    • Panjang array selalu sama terlepas dari panjang konten
    • Panjang array ditentukan oleh model embedding yang digunakan; contohnya bisa 300, 1.000, atau 1.536 angka
  • Array ini dapat dilihat seperti koordinat dalam ruang multidimensi
    • Posisi dalam ruang tersebut merepresentasikan makna konten sebagaimana dipahami model embedding
    • Karakteristik konten seperti warna, bentuk, dan konsep dapat tercermin di dalamnya
  • Meski kita tidak sepenuhnya memahami arti tiap angka, relasi posisi dapat dimanfaatkan untuk tugas berguna seperti menemukan item yang berdekatan

Rekomendasi konten terkait: contoh blog TIL

  • Di situs TIL berisi 472 tulisan, vektor embedding 1.536 dimensi untuk tiap tulisan dihitung menggunakan model OpenAI text-embedding-ada-002
    • Vektor disimpan di database SQLite situs tersebut
    • Tulisan terkait ditemukan dengan menghitung cosine similarity antara vektor tulisan target dan semua vektor tulisan lain, lalu mengembalikan 10 yang paling dekat
  • Hasil teratas untuk tulisan contoh “Geospatial SQL queries in SQLite using TG, sqlite-tg and datasette-sqlite-tg” terdiri dari tulisan terkait SQLite, SpatiaLite, GDAL, dan kueri SQL spasial
    • Similarity terhadap dirinya sendiri adalah 1.0
    • sqlite_geopoly.md adalah 0.8817322855676049
    • spatialite_viewing-geopackage-data-with-spatialite-and-datasette.md adalah 0.8813094978399854
  • Kueri perhitungan tulisan terkait memakan waktu sekitar 400 ms, sehingga 10 similarity teratas untuk semua tulisan dihitung terlebih dahulu lalu disimpan di tabel similarities
  • Biaya API embedding OpenAI untuk situs TIL adalah sekitar $0,04, berdasarkan kurang lebih 402.500 token dengan tarif $0.0001/1.000 token
  • Model proprietari perlu diperhatikan dalam operasional
    • OpenAI pernah menghentikan sebagian model embedding lama
    • Jika ada banyak embedding yang disimpan dengan model lama, konten baru mungkin perlu dihitung ulang berdasarkan model yang masih didukung agar dapat di-embed
    • OpenAI berjanji menanggung biaya re-embedding dengan model baru, tetapi risiko ketergantungan pada model proprietari tetap ada
  • Model berlisensi terbuka dapat dijalankan di hardware sendiri, sehingga dapat menghindari risiko penghentian model

Ruang vektor dilihat lewat Word2Vec

  • Efficient Estimation of Word Representations in Vector Space dari Google Research adalah makalah Word2Vec yang dipublikasikan pada 16 Januari 2013
  • Word2Vec adalah model embedding awal yang mengubah satu kata menjadi array berisi 300 angka
  • turbomaze.github.io/word2vecjson adalah demo untuk menjelajahi 10.000 kata dan array 300 angka untuk tiap kata
    • Kata yang dekat dengan “france” antara lain french, belgium, paris, germany, italy, spain
  • Relasi juga terlihat lewat operasi vektor
    • Jika vektor “germany” ditambah “paris” lalu dikurangi “france”, vektor hasilnya paling dekat dengan “berlin”
    • Ini menunjukkan bahwa model menangkap relasi kebangsaan dan geografi di dalam ruang vektor
  • Word2Vec dilatih pada konten berisi 1,6 miliar kata, sedangkan model embedding saat ini dilatih pada dataset yang jauh lebih besar sehingga menangkap relasi yang lebih kaya

Menghitung embedding dengan alat LLM

  • LLM adalah alat command-line sekaligus library Python untuk menangani large language model
    • Dapat dipasang dengan pip install llm atau brew install llm
    • Secara default dapat digunakan bersama OpenAI API
  • Dengan memasang plugin, kita dapat menambahkan model bahasa atau model embedding baru
  • Plugin llm-sentence-transformers adalah plugin yang membungkus library SentenceTransformers
    • Model all-MiniLM-L6-v2 dapat diunduh dari Hugging Face dan digunakan secara lokal
    • Perintah llm embed menampilkan satu kalimat sebagai array angka JSON
  • Embedding tidak terlalu bermakna sebagai array angka tunggal; ia menjadi berguna jika disimpan lalu dibandingkan
  • llm embed-multi dapat meng-embed banyak konten sekaligus dan menyimpannya di tabel SQLite bernama collection
    • Contoh perintah mencari semua file README.md di bawah direktori home dan menyimpannya ke collection readmes
    • Opsi --store juga menyimpan teks asli ke tabel SQLite
    • Hasil eksekusi menyimpan 16.796 file README.md dan memakan waktu sekitar 30 menit di komputer lokal

Pencarian semantik dan “vibes-based search”

  • Perintah llm similar mencari item yang mirip dengan kalimat input di collection embedding yang tersimpan
  • Jika collection readmes dicari dengan kalimat sqlite backup tools, README proyek terkait backup SQLite atau proyek terkait seperti sqlite-diffable, sqlite-dump, sqlite-generate, sqlite-history, dan sqlite-utils muncul di posisi atas
  • Tidak ada jaminan bahwa kata “backups” muncul langsung di dokumen hasil
    • Jika konten mirip secara semantik dengan kata kunci, ia dapat muncul sebagai hasil
  • Cara ini adalah pencarian semantik, dan dalam teks asli disebut vibes-based search
  • Karena kecocokan teks persis saja tidak selalu cukup untuk menemukan apa yang dicari pengguna, pendekatan ini berguna untuk berbagai mesin pencari konten

Embedding kode: Symbex dan Datasette

  • Symbex adalah alat untuk menjelajahi simbol dalam codebase Python
    • Dibuat untuk menemukan fungsi dan class Python dengan cepat lalu meneruskannya ke LLM
    • Setelah itu, ia memungkinkan perhitungan embedding semua fungsi dalam codebase untuk membuat mesin pencari kode
  • Symbex dapat menampilkan simbol yang ditemukan sebagai JSON atau CSV, dan format tersebut dapat digunakan sebagai input llm embed-multi
  • Contoh embedding semua fungsi dan method class di proyek Datasette menggunakan model gte-tiny
    • gte-tiny adalah file berukuran 60 MB
    • symbex '*' '*:*' --nl menampilkan fungsi dan method class di direktori saat ini sebagai newline-delimited JSON
    • llm embed-multi ... --format nl langsung menerima output tersebut sebagai input dan meng-embed-nya
  • Setelah itu, Datasette dan plugin datasette-llm-embed dapat digunakan untuk menjalankan pencarian semantik kode dengan SQL
  • SQLite digunakan sebagai titik integrasi yang mengikat beberapa alat bersama
    • Mengekstrak fungsi dari kode
    • Melewatkannya ke model embedding
    • Mencatat hasilnya ke SQLite
    • Mencari dengan SQL

Meng-embed teks dan gambar ke ruang yang sama dengan CLIP

  • CLIP adalah model yang dirilis OpenAI pada Januari 2021, yang dapat meng-embed teks maupun gambar
  • Intinya adalah memasukkan teks dan gambar ke ruang vektor yang sama
    • Posisi embedding string “dog” dan posisi embedding foto anjing menjadi berdekatan dalam ruang yang sama
    • Kita dapat mencari gambar terkait menggunakan teks, atau mencari teks terkait menggunakan gambar
  • Demo CLIP yang berjalan di browser dibuat sebagai Observable notebook dan menjalankan model CLIP di dalam browser
    • Halaman memuat resource 158 MB
    • Model teks CLIP berukuran 64,6 MB, dan model gambar berukuran 87,6 MB
  • Ada contoh perhitungan skor similarity per teks untuk foto pantai
    • beach: 26.946%
    • city: 19.839%
    • sunshine: 24.146%
    • california beach: 27.427%
  • Yang utama bukanlah sekadar menanyakan similarity antara foto acak dan satu kata, melainkan membangun antarmuka pencarian di atasnya

Faucet Finder: pencarian gambar berbasis CLIP

  • Faucet Finder adalah alat pencarian khusus untuk mencari foto keran kamar mandi
  • Drew Breunig mengumpulkan 20.000 foto keran dari pemasok keran dan menghitung embedding CLIP
    • Implementasinya menggunakan LLM dan plugin llm-clip
    • Dideploy dengan Datasette
  • Alat ini memungkinkan pencarian keran lain yang secara visual mirip dengan keran tertentu
    • Jika menyukai keran mahal, kita dapat menemukan opsi lebih murah yang mirip secara visual
  • Demo Drew menggunakan embedding yang sudah dihitung sebelumnya, sehingga dapat menampilkan hasil serupa tanpa menjalankan model CLIP di server
  • Setelah itu, model CLIP sisi server dideploy ke Fly.io, dan dibuat demo Observable notebook yang menggabungkan API embedding string teks dengan API tabel embedding keran
    • Gambar keran dapat dicari secara semantik dengan kata kunci seperti “gold purple”

Clustering dan visualisasi 2D

  • Selain rekomendasi konten terkait dan pencarian semantik, embedding juga dapat digunakan untuk clustering
  • llm-cluster adalah plugin yang mengimplementasikan clustering menggunakan sklearn.cluster dari scikit-learn
  • Dengan GitHub issues API dan paginate-json, kita dapat membuat judul issue dari repository simonw/llm sebagai collection llm-issues, lalu membuat 10 cluster
  • Opsi llm cluster llm-issues 10 --summary meneruskan teks cluster ke LLM untuk membuat nama deskriptif
    • Contoh nama yang muncul adalah “Log Management and Interactive Prompt Tracking” dan “Continuing Conversation Mechanism and Management”
  • Ruang berdimensi tinggi sulit divisualisasikan, sehingga dimensi dapat dikurangi dengan principal component analysis (PCA)
    • Matt Webb membuat embedding OpenAI dari deskripsi episode podcast BBC In Our Time, lalu membuat visualisasi 2D dengan PCA
    • Meski 1.536 dimensi dikurangi menjadi 2 dimensi, episode terkait perang sejarah atau penemuan sains modern tetap muncul saling berdekatan

Mengklasifikasikan kalimat dengan posisi rata-rata

  • Embedding juga dapat digunakan untuk klasifikasi
    • Pertama, hitung posisi rata-rata dari grup embedding yang diklasifikasikan dengan cara tertentu
    • Lalu bandingkan embedding konten baru lebih dekat ke posisi mana untuk menetapkan kategori
  • Getting creative with embeddings dari Amelia Wattenberger adalah contoh pemberian skor apakah sebuah kalimat konkret atau abstrak
  • Sampel kalimat konkret dan kalimat abstrak dibuat, lalu posisi rata-rata masing-masing grup dihitung
  • Kalimat baru mendapat skor berdasarkan posisinya di antara dua posisi rata-rata tersebut
  • Skor ini juga dapat diubah menjadi warna yang secara longgar menunjukkan seberapa abstrak atau konkret sebuah kalimat

RAG: tanya jawab dokumen pribadi dan dokumen internal perusahaan

  • Orang yang pernah menggunakan ChatGPT sering bertanya-tanya bagaimana cara membuatnya menjawab pertanyaan berdasarkan catatan pribadi atau dokumen internal perusahaan
  • Jawabannya mungkin bukan pelatihan model kustom yang mahal, melainkan kombinasi LLM siap pakai dan retrieval-augmented generation (RAG)
  • Prosedur dasar RAG sederhana
    • Pengguna mengajukan pertanyaan
    • Cari konten yang terlihat relevan dengan pertanyaan di dokumen pribadi
    • Masukkan kutipan relevan dan pertanyaan asli ke prompt dengan tetap mematuhi batas ukuran LLM
    • LLM menjawab berdasarkan konten tambahan yang diberikan
  • Batas ukuran umum berada di kisaran 3.000–6.000 kata
  • Bagian sulit dalam RAG adalah menemukan kutipan terbaik untuk dimasukkan ke prompt
    • Pencarian semantik berbasis embedding cocok untuk mengumpulkan konten yang kemungkinan besar relevan

Membangun Q&A offline berbasis blog dengan E5-large-v2

  • Contoh RAG berbasis konten blog menggunakan E5-large-v2
  • Kalimat pertanyaan dan jawaban memiliki tata bahasa berbeda, sehingga pertanyaan tidak selalu tertangkap dekat secara semantik dengan dokumen yang memuat jawabannya
  • E5-large-v2 mendukung dua jenis konten
    • factual sentence di-embed sebagai phrase
    • question di-embed sebagai query
    • Ini mirip dengan cara CLIP menempatkan gambar dan teks ke ruang yang sama
  • 19.000 paragraf blog di-embed sebagai phrase, dan pertanyaan di-embed sebagai query untuk menemukan paragraf yang dekat dengan jawaban
  • Contoh mengimplementasikan RAG dengan skrip Bash satu baris
    • Mencari paragraf terkait dengan llm similar
    • Mengekstrak konten dengan jq
    • Meneruskan pertanyaan dan paragraf ke model Llama 2 Chat 7B yang berjalan di laptop lokal
  • Untuk pertanyaan What is shot-scraper?, model menghasilkan jawaban bahwa shot-scraper adalah utilitas Python yang membungkus Playwright dan mengotomatiskan screenshot halaman web serta scraping berbasis JavaScript melalui antarmuka command-line dan alur konfigurasi berbasis YAML
  • Jawaban yang dihasilkan bukanlah kecocokan kalimat persis dari konten blog yang ada

Pilihan yang dapat disesuaikan dalam praktik

  • LangChain adalah framework untuk mengimplementasikan fitur di atas LLM, dan RAG adalah salah satu fitur inti LangChain
    • Fitur yang sama dapat dibuat di atas LangChain, tetapi memahami LangChain membutuhkan investasi yang cukup besar
    • Di sini, kumpulan alat kecil yang dapat dikombinasikan lebih disukai daripada satu framework tunggal yang menyelesaikan semuanya
  • Fungsi jarak yang digunakan secara default adalah cosine similarity
    • Fungsi jarak lain belum dicoba
    • RAG memiliki banyak elemen yang dapat disesuaikan, seperti fungsi jarak, model embedding, strategi prompt, dan LLM
  • Contoh-contohnya berskala hingga sekitar 20.000 embedding, dan pada ukuran ini perhitungan cosine similarity brute force untuk seluruh data masih dapat memberikan hasil dalam waktu wajar
  • Untuk data yang lebih besar seperti 1 miliar objek, vector database atau ekstensi database yang ada menjadi pilihan
  • Tren yang diharapkan ke depan adalah model multimodal dan model yang lebih kecil
    • Facebook ImageBind mempelajari embedding bersama untuk 6 modalitas: gambar, teks, audio, depth, thermal, dan data IMU
    • Model yang semakin kecil seperti gte-tiny berukuran 60 MB meningkatkan kemungkinan dijalankan di perangkat terbatas atau browser

Bacaan lebih lanjut

1 komentar

 
GN⁺ 2023-10-25
Pendapat Hacker News
  • Setelah mengunggah tulisan ini, saya menemukan beberapa materi tambahan yang berguna untuk memahami embedding pada level yang lebih rendah
    Tulisan saya sengaja dibuat pada level yang sangat tinggi, terutama berfokus pada penerapan
    Text Embeddings Visually Explained dari Cohere: https://txt.cohere.com/text-embeddings/
    Alat Tensorflow Embedding Projector: https://projector.tensorflow.org/
    What are embeddings? dari Vicki Boykis juga layak dibaca: https://vickiboykis.com/what_are_embeddings/
    Akan saya tambahkan ke “further reading” di bagian bawah halaman

    • Dulu saya pernah mencoba ide yang hampir sama: https://blog.scottlogic.com/2022/02/23/word-embedding-recomm...
      Dengan embedding, saya meningkatkan engagement pada artikel terkait, dan secara pribadi saya menganggap embedding sebagai alat yang kuat tetapi kurang dihargai
      Ini bisa dipakai untuk menelusuri dokumen atau kutipan berdasarkan kemiripan, atau sebaliknya menemukan konten yang unik, dan cukup “aman” karena tidak perlu khawatir soal halusinasi
    • Saya suka cara penulisannya yang mudah diakses bahkan bagi orang dengan sedikit pengalaman AI, machine learning, atau LLM
      Bagaimana embedding dibuat juga bisa menarik. Misalnya ada cara seperti memotong layer klasifikasi setelah pelatihan, atau pendekatan seperti EfficientNet
    • Saya penasaran apakah ada materi yang membahas sejarah embedding dan penggunaannya dalam ilmu komputer serta LLM
      Ini sedang menjadi fondasi inti machine learning
  • Dalam computer vision dan algoritma visual SLAM, embedding telah menjadi metode de facto untuk pengenalan tempat, dan sangat mirip dengan isi tulisan ini
    Ini disebut “bag-of-word place recognition”, dan kini dipakai di hampir semua library open source
    Intinya adalah melewatkan setiap gambar melalui pipeline ekstraksi fitur dan descriptor, lalu “meng-embedding”-kannya menjadi vektor yang berisi N fitur teratas
    Saat kamera bergerak, dibuat database gambar yang disebut keyframe, dan gambar disimpan sebagai vektor berdimensi jauh lebih rendah
    Setelah itu, database dikueri dengan semua gambar, lalu pencocokan terbaik dicari di database vektor menggunakan metode seperti cosine similarity
    Jika ada kecocokan, batasan stereo antara gambar kueri dan gambar yang cocok dapat dihitung untuk memperbarui peta
    Paper aslinya adalah [1], dan implementasi paling terkenal adalah https://github.com/dorian3d/DBoW2
    [1]: https://www.google.com/search?client=firefox-b-d&q=Bags+of+B...

  • Ini referensi pengantar yang sangat bagus
    Dulu saya pernah membuat sendiri aplikasi catatan iOS, dan menambahkan embedding ke full-text search yang sudah ada ternyata 1) sangat mudah dan 2) jauh lebih kuat daripada perkiraan awal
    Saya tahu bahwa mencari “dog” juga akan memunculkan catatan yang berisi “canine”, tetapi baru benar-benar sadar setelah mencoba sendiri bahwa pencarian seperti “hewan peliharaan yang mungkin saya sukai” bisa menangkap berbagai catatan tentang hewan dengan sentimen positif
    Itu adalah momen “aha” besar pertama saya
    Saat itu PR DocsGPT dari Supabase berguna sebagai contoh kode: https://github.com/supabase/supabase/pull/12056

    • Ungkapan “menambahkan ke full-text search yang sudah ada” sebenarnya cukup penting. Embedding menyediakan semantic search yang melengkapi algoritma pencarian tradisional
      Banyak aplikasi sangat bergantung pada nama atau proper noun, dan sering kali konteksnya kurang
      Jika seekor anjing peliharaan hanya disebut dengan namanya tanpa penjelasan, model embedding tertentu mungkin tidak menangkapnya
      Proper noun seperti orang, tempat, dan nama jalan bisa sangat penting untuk mengaitkan pencarian yang dipersonalisasi atau spesifik domain, tetapi model bahasa umum tidak mengetahuinya
      Saya penasaran apakah ada cara khusus untuk menangani masalah ini
    • Saya juga sedang mengerjakan hal serupa untuk catatan Logseq
      Pertanyaan terbesar saat ini adalah seberapa banyak teks yang dijadikan satu embedding
      Apakah per kalimat, atau seluruh blok kalimat dalam satu halaman aplikasi catatan dijadikan satu, masih saya pertimbangkan
    • Saya penasaran apakah pembuatan embedding memakai API di luar perangkat, dan apakah pencariannya dilakukan di dalam perangkat
  • Contoh paling umum dari embedding kata adalah King - Man + Woman = Queen yang terkenal
    Ini bekerja dengan baik di ruang vektor, tetapi saat diproyeksikan ke 2D, secara visual tidak terlalu terasa intuitif
    Dari pengalaman saya, PCA, MDS, dan t-SNE semuanya sama saja: https://bhugueney.gitlab.io/test-notebooks-org-publish/jupyt...
    Ini adalah JupyterLite Notebook yang menjalankan embedding kata di browser, dan sebaiknya tidak dijalankan di smartphone
    Saya penasaran apakah ada yang tahu cara memvisualisasikan contoh klasik embedding kata dengan bagus

    • Kalau saya memahaminya dengan benar, di ruang 2D kita bisa menaruh “king” di titik asal, lalu menjadikan sumbu X sebagai “king”-“man” dan sumbu Y sebagai “king”-“woman”
      Jika benar-benar menginginkan ortogonalitas, bisa memakai Gram-Schmidt
      Di 3D, kita bisa menambahkan satu sumbu lagi, sumbu Z sebagai “king”-“queen”, dan versi yang diortogonalisasi lebih mendekati konsep jarak yang dilihat model
      Di 2D, kita tidak bisa menunjukkan seberapa jauh “king”-“man”+“woman” meleset dari “queen”, tetapi jarak sisanya bisa diperoleh dengan akurat
      Di 3D, seharusnya bisa memberikan jarak yang akurat
      “queen” biasanya dipilih karena merupakan kata dengan embedding yang paling dekat dengan X="king"-"man"+"woman"
      Di grafik 2D, kita juga bisa menampilkan beberapa kata terdekat berikutnya, lalu menambahkan jarak ortogonal tiap kata dari bidang 2D
      Dengan begitu, “queen” seharusnya menjadi kata dengan jumlah terkecil dari jarak kuadrat dari X dan jarak ortogonal kuadrat dari bidang, sehingga juga bisa cukup diverifikasi secara visual
    • Sebaiknya coba UMAP
    • Saat mencari lelucon matematikawan tentang memvisualisasikan dimensi tinggi, saya bertanya ke ChatGPT, dan ia membuat lelucon ala Richard Feynman yang tidak bisa ditemukan di Google
      Kira-kira bunyinya, “Kita tidak bisa memvisualisasikan 4 dimensi… setidaknya saya tidak bisa. Karena saya hanya punya tiga brane,” semacam permainan kata antara branes dan brains
      Belakangan ChatGPT mengakui itu karangannya dan meminta maaf
      Lalu ia juga mengeluarkan kutipan dari John von Neumann, H. G. Wells, dan Ian Stewart, dan akhirnya memberi jawaban seperti “Untuk memvisualisasikan 4 dimensi, visualisasikan 3 dimensi lalu katakan ‘n+1’,” yang paling mirip dengan lelucon dalam ingatan saya, tetapi kurang lucu
      Jadi saya memintanya membuat kutipan halusinatif tentang memvisualisasikan ruang berdimensi tinggi dengan gaya Deepak Chopra, dan ia menumpahkan kutipan-kutipan palsu yang terdengar meyakinkan dengan mencampur istilah seperti septillion-dimensional embeddings, Hilbert space, Poincaré conjecture, Heisenberg uncertainty principle, dan Shannon entropy
  • Kesalahan umum dalam trigonometri praktis adalah melakukan perhitungan akar kuadrat yang tidak diperlukan
    Pada kode contoh magnitude_a = sum(x * x for x in a) * 0.5 dan magnitude_b = sum(x * x for x in b) * 0.5, *0.5 tidak diperlukan
    Jika yang akan dibandingkan adalah kosinus, kita bisa membandingkan nilai kuadratnya saja, sehingga menghindari perhitungan akar yang mahal
    Mirip dengan itu, dalam kriptografi kurva eliptik, operasi mahal seperti perhitungan invers sebisa mungkin ditunda, atau saat hanya membandingkan dua titik, perhitungan nilai kanonisnya sendiri kadang dihindari

    • Kode ini ditulis agar mudah dipahami
      Kalau tidak, saya akan menggantinya dengan kode SIMD tingkat rendah
  • dot_product = sum(x * y for x, y in zip(a, b)), kok begitu? Saya heran kenapa tidak memakai operasi numpy yang terv vectorisasi
    Saya jadi paham setelah melihat bagian “meminta ChatGPT menulis beberapa versi kode cosine similarity”

    • Alasannya ada dua
      Pertama, saat menjelaskan kepada orang, saya merasa sintaks numpy justru mengganggu
      Kedua, numpy bukan dependensi yang paling ringan
      Saya memakainya saat butuh performa, tetapi tidak ingin menjadikannya pilihan default
  • Jika ingin melihat tulisan Show HN, startup ProductHunt, perusahaan YC, atau repositori Github yang terkait dengan embedding LLM, Anda bisa menemukannya dengan cepat di MVP LLM-Embeddings-Based Search Engine yang baru saja diluncurkan
    https://payperrun.com/%3E/search?displayParams={%22q%22:%22L...

    • Lumayan
      Saya mengira hasil pencarian akan langsung diperbarui saat menekan berbagai tombol filter, dan tidak menyangka harus melakukan pencarian ulang
      Saya mengerti kenapa dibuat begitu
    • Tulisan Show HN saya ada di sini: https://news.ycombinator.com/item?id=38011802
  • Ini yang paling menarik dari semua hal terkait “AI” yang saya baca dalam beberapa bulan terakhir
    Setiap kali melihat model embedding dalam daftar, saya penasaran itu apa, dan juga penasaran kenapa semua orang membicarakan vector DB
    Saya langsung terpikir cara menerapkannya pada side project yang sudah lama berjalan
    Jika semua dokumen punya embedding, mungkin pengelompokan data pengguna yang berguna bisa benar-benar menjadi realistis

  • Saya penasaran apakah ada orang yang benar-benar pernah memakai embedding untuk hal lain selain approximate nearest neighbor dan clustering
    Kemungkinan yang terpikir adalah proyeksi, pengindeksan, dan pengurutan terhadap sumbu arbitrer. Misalnya sumbu seperti “panas-dingin”, “bahagia-sedih”, “fiksi ilmiah-realisme”, “nilai sastra-nilai komersial”
    Selain melakukan klasifikasi ala SVM di ruang embedding, melakukan inferensi ala word2vec seperti woman-man+king=queen, atau mengambil satu layer dari LLM, seharusnya ada juga cara untuk melatih embedding secara langsung
    Saya tahu contrastive learning digunakan, tetapi tampaknya metode lain juga layak dieksplorasi, misalnya melatih embedding bersama jaringan saraf fungsi lalu menghasilkan persamaan fungsi untuk menghitung loss mean squared error
    Mengejutkan karena tampaknya terlalu terfokus pada pencarian semantik, dan pasti ada aplikasi menarik lain

    • Saya agak bingung karena semua contoh yang disebutkan tampak seperti tugas yang relatif umum
      Yang pertama dan ketiga pada dasarnya sama
      Dalam computer vision, kita mungkin ingin mengubah gambar secara semantik, misalnya menambahkan kacamata pada foto, dan pekerjaan yang terlihat di iklan Google adalah contoh semacam itu
      Pekerjaan seperti ini dilakukan di latent space
      Pada normalizing flow, ini sangat jelas karena ruangnya diubah menjadi Gaussian
      Model difusi juga melakukan hal serupa dengan metode aproksimasi, tetapi tidak invertible, meski masih bisa dikembalikan
      Kita memproyeksikan gambar, kalimat, atau data yang ingin dimanipulasi, memanipulasinya di ruang Gaussian, lalu mengembalikannya ke ruang target
      Namun mungkin saja kita saling bingung karena kata embedding adalah istilah yang overloaded dan memiliki terlalu banyak arti
      Mungkin yang dimaksud hanya blok pertama yang mengubah token bilangan bulat diskret menjadi floating point kontinu
      Namun embedding itu juga dipelajari, jadi meskipun akhirnya tampak seperti lookup table, tetap saja itu proses jaringan saraf
      Ada juga penggunaan SVM di ruang ini
      Saya melihatnya mirip latent space, tetapi sedikit lebih abstrak
      Setidaknya embedding harus injektif. Secara matematis begitu, tetapi…
    • Klasifikasi ala SVM di ruang embedding adalah teknik yang sangat mendasar dalam NLP dan machine learning industri
      Melatih embedding secara langsung itu secara harfiah adalah model embedding awal, yaitu Word2Vec
    • Saya juga pernah membuat ruang embedding word2vec berdasarkan abstrak PubMed
      Saya menemukan banyak variasi dan singkatan nama kimia/biokimia, seperti penulisan dengan tanda hubung, tanpa tanda hubung, dan dengan spasi
      Mungkin bisa saja digunakan untuk membuat kamus istilah teknis
      Saya tidak tahu seberapa jauh bisa sampai ke definisi, tetapi meski vektor saja punya keterbatasan, itu bisa menjadi titik awal
      Kemungkinan besar orang lain juga sudah membangun kamus dengan cara seperti ini
    • Cross-lingual embedding, yaitu membuat ruang embedding untuk masing-masing dari dua bahasa lalu menyelaraskan ruang tersebut dengan seed dictionary, punya aplikasi nyata atau potensial dalam pencarian multibahasa dan terjemahan mesin
    • Bisa juga digunakan untuk deduplikasi data
  • Saya pernah bereksperimen dengan embedding dan juga membuat beberapa use case produksi, dan ini adalah alat hebat yang memungkinkan banyak aplikasi keren
    Namun saat membuatnya untuk domain tertentu, kita akan menemui batasan model embedding siap pakai
    Model siap pakai memiliki banyak dimensi, tetapi sebagian dimensi mungkin penting untuk klasifikasi, kemiripan konten, clustering, dan sebagainya dalam aplikasi saya, sementara dimensi lain mungkin tidak penting
    Dengan kata lain, dua vektor bisa terlihat dekat karena kedekatan pada dimensi yang tidak kita pedulikan
    Saya berharap akan ada tool dan literatur yang lebih baik untuk fine-tuning model embedding

    • Melakukan fine-tuning seluruh language model untuk memecahkan masalah ini seperti memakai palu godam untuk memukul paku
      Tool seperti ini sudah ada sejak lama; misalnya, labeli sedikit data lalu latih SVM untuk klasifikasi di atas ruang embedding
    • sentence-transformers memiliki tool yang cukup baik terkait hal ini