41 puan yazan xguru 2023-10-30 | 5 yorum | WhatsApp'ta paylaş

Embedding nedir?

  • "Embedding", içeriği "kayan noktalı sayılar dizisine" dönüştürmektir
  • Bu dizinin kilit özelliği, "içeriğin uzunluğundan" bağımsız olarak "dizi boyutunun" her zaman aynı kalmasıdır
  • Dizi boyutu, kullanılan embedding modeli tarafından belirlenir: 300, 1000, 1536 vb.
  • Bu sayı dizisini düşünmenin en iyi yolu, onu "çok tuhaf çok boyutlu bir uzaydaki koordinatlar" olarak hayal etmektir
  • İçeriği neden çok boyutlu uzaya yerleştiriyoruz? Çünkü içeriğin konumuna, özellikle de yakınındaki diğer içeriklere bakarak o içerik hakkında ilginç bilgiler öğrenebiliriz
  • Uzaydaki konum, embedding modelinin "tuhaf, çoğu zaman anlayamadığımız dünya kavrayışına" göre içeriğin "anlamsal anlamını (semantic meaning)" temsil eder
  • Gömülü içerik; renk, şekil, kavram veya başka her tür özelliği yakalayabilir
  • Bu tek tek sayıların ne anlama geldiğini tamamen anlayan kimse yok, ama bu konumun içerik hakkında yararlı bilgi bulmak için kullanılabildiğini biliyoruz

Embedding kullanarak ilgili içerik bulmak

  • Embedding ile çözdüğüm ilk problem, TIL blogumda "Related Content" özelliğini oluşturmaktı
  • OpenAI’nin text-embedding-ada-002 modelini kullandım. API üzerinden kullanılabiliyor
  • Şu anda sitemde 472 yazı var ve her yazı için 1536 boyutlu bir embedding vektörü (kayan noktalı sayılar dizisi) hesaplayıp bu vektörü sitemin SQLite veritabanında sakladım
  • Artık belirli bir yazı için ilgili yazıları bulmak istediğimde, o yazının embedding vektörü ile veritabanındaki diğer yazılar arasındaki cosine similarity’yi hesaplayıp mesafeye göre en yakın 10 eşleşmeyi döndürmem yeterli
  • Cosine similarity için kullandığım Python kodu şöyle
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)  
  • OpenAI’nin embedding API’si çok ucuz ve kullanımı kolay
    • TIL web sitem için yaklaşık 400 bin token embed ettim; 1000 token başına $0.0001 ile toplam maliyet yalnızca $0.04 oldu
    • Metni API anahtarıyla birlikte POST etmeniz yeterli; karşılığında kayan noktalı sayılardan oluşan bir JSON array döndürüyor
  • Ancak bu özel mülkiyetli bir model ve OpenAI birkaç ay önce embedding modellerinden bazılarını sonlandırdı
  • Yani bu modelle çok sayıda embedding sakladıysanız, yeni bir model için embedding’leri yeniden hesaplamanız gerekir
  • OpenAI, yeni modele yeniden embed etmenin maliyetini karşılayacağını söyledi ama özel mülkiyetli modellere dikkat etmek gerekir
  • Bundan, güçlü açık lisanslı modeller kullanarak kaçınılabilir

Bunların Word2Vec modelinde nasıl çalıştığını anlamak

  • Google Research, 10 yıl önce Word2Vec adlı erken dönem bir embedding modelini açıklayan etkili bir makale yayımladı
    • 2013’te yayımlanan "Efficient Estimation of Word Representations in Vector Space", embedding’lere olan ilgiyi tetikledi
  • Word2Vec, tek bir kelimeyi alıp onu 300 sayıdan oluşan bir listeye dönüştüren bir modeldir. Bu sayı listesi, ilişkili kelimelerin anlamı hakkında bilgi yakalar
  • Bir kelime arandığında, o kelimenin Word2Vec gösterimine olan cosine distance’a göre benzer kelimeler bulunabilir
  • "france" aratıldığında "french: 0.70007~", "belgium: 0.69331~", "paris: 0.63349~", "germany: 0.62707~" gibi değerler elde edilebilir
  • Bu, Fransızlığa ve Avrupa coğrafyasına dair şeylerin bir karışımıdır
  • Burada yapılabilecek gerçekten ilginç şey, bu vektörler üzerinde aritmetik işlemler yapmaktır
  • "germany" vektörüne "paris" ekleyip "france" çıkardığınızda, ortaya çıkan vektör "berlin"e en yakın olur
  • Bu model, milliyet ve coğrafya hakkındaki fikirleri yakalayarak bazı durumlarda aritmetik kullanıp dünya hakkında ek gerçekleri keşfetmeyi mümkün kıldı
  • Word2Vec, 1.6 milyar kelimelik içerik üzerinde eğitildi; bugün kullandığımız embedding modelleri ise çok daha büyük veri kümeleri üzerinde eğitiliyor ve temel ilişkiler hakkında çok daha zengin bir anlayış yakalıyor

Araçlarımı kullanarak embedding hesaplama ve arama

  • LLM adında hem bir CLI hem de bir Python kütüphanesi geliştiriyorum
  • Bunu LLM’lerle etkileşim kurmak için bir CLI olarak kullanabiliyor, ayrıca OpenAPI entegrasyonu da sağlayabiliyorsunuz
  • Birkaç ay önce bu araca eklentiler aracılığıyla embedding modellerini çalıştırma özelliğini de ekledim (SentenceTransformers kütüphanesi kullanılabiliyor)
  • Bir embedding koleksiyonu seçip benzer öğeleri bulmak için vibes-based arama yapabiliyorsunuz
  • Ayrıca Python kod tabanında symbol bulmak için Symbex adında bir araç da geliştiriyorum. Bununla koddaki fonksiyonlar için embedding hesaplayıp bir kod arama motoru kurmak mümkün
  • (Ayrıntılı uygulama kısmı atlanmıştır)

CLIP kullanarak metin ve görselleri birlikte embed etmek

  • Şu anda en çok tercih ettiğim embedding modeli CLIP
  • OpenAI’nin 2021 Ocak ayında çıkardığı bu model, hem "metni" hem de "görselleri" embed edebilir ve ikisini de aynı vektör uzayına yerleştirir
  • "dog" eklerseniz 512 boyutlu uzayda bir konum elde edersiniz (CLIP yapılandırmasına göre değişebilir)
  • Bir köpek fotoğrafını embed ettiğinizde, aynı uzayda bir konum alır ve bu konum "dog" metninin konumuna mesafe olarak yakın olur
  • Yani metin kullanarak ilgili görselleri arayabilir veya görselleri kullanarak ilgili metinleri arayabilirsiniz
  • Bir plaj fotoğrafı verirseniz "beach: 26.946%", "city: 19.839%", "sunshine: 24.146%" gibi benzerlik skorları elde edebilirsiniz

CLIP ile musluk bulmak

  • Drew Breunig, llm-clip eklentisiyle bir musluk arama motoru oluşturdu
  • 20 bin musluk fotoğrafı alıp CLIP çalıştırdı
  • Böylece diğer musluklara benzeyen muslukları bulup, bunlar arasından hem benzer hem de daha ucuz seçenekleri tespit edebildi

RAG ile soruları yanıtlamak

  • ChatGPT’yi deneyen insanların en son sorduğu soru hep aynı
    "Bunu notlarım veya şirketimizin belgeleri hakkında da yanıt verecek hale nasıl getiririm?"
  • İnsanlar bunun, büyük maliyetle o içeriğe dayalı özel bir model eğitmek anlamına geldiğini varsayıyor
  • Ama aslında buna gerek yok. Bu, LLM ve RAG (Retrieval Augmented Generation) ile mümkün hale geliyor
  • Temel fikir şu: "kullanıcı bir soru sorar"
    • Kişisel belgeleriniz arasında bu soruyla ilgili olanları bulursunuz
    • Sonra o içerikten alınan alıntıları asıl soruyla birlikte LLM’e verirsiniz
    • Böylece LLM, sizin ek olarak sağladığınız içeriğe dayanarak soruyu yanıtlayabilir
  • Bu ucuz numara şaşırtıcı derecede etkili
    • Ama bunun çalışabilir temel sürümünü kurmak kolay değil
    • Kullanıcının sorabileceği sonsuz soru kümesini düşündüğünüzde, bunun olabildiğince iyi çalışmasını sağlamak gerekir
  • RAG’in temel sorunu, LLM’e gönderilecek prompt’a eklenecek en iyi içerik alıntılarını belirlemektir
  • Embedding destekli 'vibes-based' anlamsal arama, kullanıcının sorusunu yanıtlamaya yardımcı olabilecek yüksek ilgili içerikleri toplamak için gereken yetenektir
  • Bunun "blog içeriğim" için olan bir sürümünü oluşturup yayımladım
    • Sonuç olarak, RAG tek satırlık bir Bash script ile mümkün hale geldi

5 yorum

 
edunga1 2023-11-06

Bu yazıyı görüp hafta sonu denedim. Korece modeli denemeye çalıştım ama ortam kurulumu pek kolay olmadığı için ada v2 kullandım ve toplamda 0,03 dolar harcadım. ChatGPT’yi daha önce hiç kullanmamış yeni bir kullanıcıysa, 5 dolarlık ücretsiz krediyle rahatça deneyebilir sanırım

Kosinüs benzerliğini de hesaplayıp karşılaştırdım; sonuçlar gayet mantıklıydı. Yazıyı paylaştığınız için teşekkürler.

 
laeyoung 2023-11-01

Hafta sonu bir kez deneyip takip etmem gerekecek gibi görünüyor.

 
donghemul11 2023-10-31

Teşekkürler~

 
seatbelts 2023-10-30

Sanırım az da olsa anlamaya başladım.
Teşekkür ederim.

 
charo 2023-10-30

Normalde merak ettiğim ama çok da iyi bilmediğim kısımlar hakkında çok şey öğrenmiş oldum. Her zaman sunduğunuz kaliteli içerik için teşekkür ederim.