Vektör Yerleştirmeleri için textembedding-gecko@003 komutunu kullanma

1. Giriş

Last Updated: 2024-04-08

Metin Yerleştirme

Metin yerleştirme, metin verilerini sayısal temsillere dönüştürme işlemidir. Genellikle vektör olan bu sayısal temsiller, metindeki kelimelerin anlamsal anlamını ve kelimeler arasındaki ilişkileri yakalar. Şöyle düşünün:

Metin, nüanslar ve belirsizliklerle dolu karmaşık bir dil gibidir.

Metin yerleştirme, bu dili bilgisayarların anlayıp kullanabileceği daha basit ve matematiksel bir biçime dönüştürür.

Metin yerleştirmenin avantajları

  • Verimli işleme olanağı tanır: Bilgisayarların sayısal ifadeleri işlemesi, ham metne kıyasla çok daha hızlıdır. Bu, arama motorları, öneri sistemleri ve makine çevirisi gibi görevler için çok önemlidir.
  • Anlamsal anlamı yakalar: Gömme, kelimelerin gerçek anlamından daha fazlasını ifade eder. Kelimelerin bağlamını ve aralarındaki ilişkileri yakalayarak daha ayrıntılı analizler yapmanızı sağlar.
  • Makine öğrenimi performansını artırır: Metin yerleştirmeleri, makine öğrenimi modellerinde özellik olarak kullanılabilir. Bu da yaklaşım analizi, metin sınıflandırma ve konu modelleme gibi görevlerde daha iyi performans elde etmenizi sağlar.

Metin gömme kullanım alanları

Metin yerleştirmeler, metni sayısal temsillere dönüştürerek doğal dil işleme (NLP) alanında çeşitli uygulamaların kilidini açar. Bazı önemli kullanım alanları şunlardır:

1. Arama Motorları ve Bilgi Alma:

Metin yerleştirmeler, arama motorlarının tam anahtar kelimeler bulunmasa bile sorguların arkasındaki anlamsal anlamı anlamasına ve bunları alakalı dokümanlarla eşleştirmesine olanak tanır.

Arama motorları, bir arama sorgusunun yerleştirilmelerini doküman yerleştirilmeleriyle karşılaştırarak benzer konuları veya kavramları kapsayan dokümanları tanımlayabilir.

2. Öneri Sistemleri:

Önerici sistemler, yorumlar, puanlar veya tarama geçmişi aracılığıyla ifade edilen kullanıcı davranışlarını ve tercihlerini analiz etmek için metin yerleştirmelerini kullanır.

Sistem daha sonra kullanıcının etkileşim kurduğu ürünlerin, makalelerin veya diğer içeriklerin yerleştirilmelerini karşılaştırarak benzer öğeleri önerebilir.

3. İntihal Algılama:

İki metin parçasının yerleştirmelerini karşılaştırmak, anlamsal yapılarında önemli benzerlikler bularak olası intihalleri tespit etmenize yardımcı olabilir.

Bunlar yalnızca birkaç örnektir. Metin yerleştirme teknikleri geliştikçe olasılıklar da artmaya devam etmektedir. Bilgisayarlar, yerleştirmeler sayesinde dili daha iyi anladıkça gelecekte daha da yenilikçi uygulamalar görebiliriz.

textembedding-gecko@003

Textembedding-gecko@003, Google Cloud Platform (GCP) tarafından Vertex AI ve yapay zeka araç ve hizmetleri paketi aracılığıyla sunulan önceden eğitilmiş bir metin yerleştirme modelinin belirli bir sürümüdür.

Oluşturacağınız uygulama

Bu codelab'de bir Python komut dosyası oluşturacaksınız. Bu komut dosyası:

  • textembedding-gecko@003 adresini çağırmak ve metni metin gömmelerine (vektörler) dönüştürmek için Vertex API'yi kullanın.
  • Metinlerden ve bunların vektörlerinden oluşan bir simülasyon veritabanı oluşturun
  • Vektörleri karşılaştırarak simüle edilmiş vektör veritabanımızda sorgu gerçekleştirin ve en olası yanıtı alın.

Neler öğreneceksiniz?

  • GCP'de metin yerleştirme özelliğini kullanma
  • textembedding-gecko@003 çağrısı nasıl yapılır?
  • Bunu Workbench'te çalıştırma
  • Komut dosyalarını çalıştırmak için Vertex AI - Workbench'i kullanma

Gerekenler

  • Chrome'un son sürümü
  • Python hakkında bilgi
  • Google Cloud projesi
  • Vertex AI - Workbench'e erişim

2. Hazırlanma

Vertex AI Workbench örneği oluşturma

  1. Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
  1. Proje seçiciye gidin
  2. Google Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun.
  3. Notebooks API'yi etkinleştirin.

Google Cloud Console, gcloud İTŞ veya Terraform'u kullanarak Vertex AI Workbench örneği oluşturabilirsiniz. Bu eğitim için Google Cloud Console'u kullanarak bir proje oluşturacağız. Diğer yöntemler hakkında daha fazla bilgiyi burada bulabilirsiniz.

  1. Google Cloud Console'da, Vertex AI menüsündeki Not Defterleri bölümünden erişilebilen Örnekler sayfasına gidin ve Workbench'i tıklayın. 56c087d619c464dd.png
  2. Örnekler'e gidin.
  3. Yeni oluştur'u tıklayın. 381ff9b895e77641.png
  4. Örnek oluştur iletişim kutusunun Ayrıntılar bölümünde, yeni örneğiniz için aşağıdaki bilgileri sağlayın:

Ad: Yeni örneğiniz için bir ad girin. Ad, bir harfle başlamalı, ardından en fazla 62 küçük harf, rakam veya kısa çizgi (-) gelmelidir ve kısa çizgiyle bitmemelidir.

Bölge ve Alt Bölge: Yeni örnek için bir bölge ve alt bölge seçin. En iyi ağ performansı için coğrafi olarak size en yakın bölgeyi seçin.

GPU yüklemeniz gerekmez

Ağ oluşturma bölümünde aşağıdaki bilgileri sağlayın:

: Ağ seçeneklerini, mevcut projenizdeki bir ağı veya yapılandırılmışsa bir ana makine projesindeki Paylaşılan VPC ağını kullanacak şekilde ayarlayın. Ana makine projesinde Paylaşılan VPC kullanıyorsanız hizmet projesindeki Not Defteri Hizmet Aracısı'na da Compute Ağ Kullanıcısı rolünü (roles/compute.networkUser) vermeniz gerekir.

Ağ alanında: İstediğiniz ağı seçin. Ağda Özel Google Erişimi etkinleştirilmiş veya internete erişebiliyorsa VPC ağı seçebilirsiniz.

Alt ağ alanında: İstediğiniz alt ağı seçin. Varsayılan olanı seçebilirsiniz.

Birim özelliklerinde varsayılan değeri (e2-standard-4) bırakabilirsiniz.

d47bdc2d7f516c46.png

  1. Oluştur'u tıklayın.

Vertex AI Workbench bir örnek oluşturur ve otomatik olarak başlatır. Örnek kullanıma hazır olduğunda Vertex AI Workbench, JupyterLab'i açma bağlantısını etkinleştirir. Bu öğeyi tıklayın.

Python 3 not defteri oluşturma

  1. Jupyterlab'da, Başlatıcı'dan Not Defteri bölümünde Python logosunun bulunduğu ve Python3 yazan simgeyi tıklayın. e16bb118cd28256f.png
  2. Adsız ve ipynb uzantılı bir Jupyter not defteri oluşturulur. da9bd34cf307156c.png
  3. Sol taraftaki dosya tarayıcısı bölümünü kullanarak yeniden adlandırabilir veya olduğu gibi bırakabilirsiniz.

Artık kodumuzu not defterine yerleştirmeye başlayabiliriz.

3. Gerekli kitaplıkları içe aktarma

Örnek oluşturulduktan ve JupyterLab açıldıktan sonra, kod laboratuvarımız için gerekli tüm kitaplıkları yüklememiz gerekir.

Şunlara ihtiyacımız var:

  1. numpy
  2. pandalar
  3. vertexai.language_models kaynağından TextEmbeddingInput, TextEmbeddingModel

Aşağıdaki kodu kopyalayıp bir hücreye yapıştırın:

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

import numpy as np
import pandas as pd

URL şuna benzer olacaktır:

6852d323eedcac93.png

4. Simüle edilmiş bir vektör veritabanı oluşturma

Kodumuzu test etmek için gecko@003 metin yerleştirme modeli kullanılarak çevrilen metinlerden ve ilgili vektörlerden oluşan bir veritabanı oluşturacağız.

Amaç, kullanıcıların bir metni aramasıdır. Ardından, metni bir vektöre çevirir, veritabanımızda arar ve en yakın sonucu döndürür.

Vektör veritabanımız 3 kayıt içerecek. Veri tabanımızı şu şekilde oluşturacağız:

Aşağıdaki kodu kopyalayıp yeni bir hücreye yapıştırın.

DOCUMENT1 = {
    "title": "Operating the Climate Control System",
    "content": "Your Googlecar has a climate control system that allows you to adjust the temperature and airflow in the car. To operate the climate control system, use the buttons and knobs located on the center console.  Temperature: The temperature knob controls the temperature inside the car. Turn the knob clockwise to increase the temperature or counterclockwise to decrease the temperature. Airflow: The airflow knob controls the amount of airflow inside the car. Turn the knob clockwise to increase the airflow or counterclockwise to decrease the airflow. Fan speed: The fan speed knob controls the speed of the fan. Turn the knob clockwise to increase the fan speed or counterclockwise to decrease the fan speed. Mode: The mode button allows you to select the desired mode. The available modes are: Auto: The car will automatically adjust the temperature and airflow to maintain a comfortable level. Cool: The car will blow cool air into the car. Heat: The car will blow warm air into the car. Defrost: The car will blow warm air onto the windshield to defrost it."}

DOCUMENT2 = {
    "title": "Touchscreen",
    "content": "Your Googlecar has a large touchscreen display that provides access to a variety of features, including navigation, entertainment, and climate control. To use the touchscreen display, simply touch the desired icon.  For example, you can touch the \"Navigation\" icon to get directions to your destination or touch the \"Music\" icon to play your favorite songs."}

DOCUMENT3 = {
    "title": "Shifting Gears",
    "content": "Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position.  Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions."}

documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db

Bu, aşağıdaki gibi görünür:

26baa3b876c0605d.png

Kodu analiz edelim

DOCUMENT1, DOCUMENT2 ve DOCUMENT3 değişkenlerinde, dokümanları başlıkları ve içerikleriyle taklit edecek bir sözlük saklıyoruz. Bu "belgeler", Google tarafından üretilen bir aracın simüle edilmiş bir kılavuzuna referans veriyor.

Sonraki satırda, bu 3 doküman (sözlük) için bir liste oluştururuz.

documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

Son olarak, pandas'dan yararlanarak bu listeden df_initial_db adlı bir veri kümesi çerçevesi oluştururuz.

df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db

5. Metin gömmeleri oluşturma

Şimdi, simüle edilmiş belge veritabanımızdaki her kayıt için gecko@003 modelini kullanarak bir metin yerleştirme işlemi yapacağız.

Aşağıdaki kodu kopyalayıp yeni bir hücreye yapıştırın:

def embed_fn(df_input):
    list_embedded_values = []
    for index, row in df_input.iterrows():        
        model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
        embeddings = model.get_embeddings([(row['Text'])])        
        list_embedded_values.append(embeddings[0].values)
    df_input['Embedded text'] = list_embedded_values
    return df_input        
                                           
df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db      

Bu, aşağıdaki gibi görünür:

4c4af091c7a82861.png

Kodu analiz edelim

Girme işlemini gerçekleştirecek metni içeren bir pandas veri kümesi girdisi alacak olan embed_fn adlı bir işlev tanımladık. Ardından işlev, metni vektör olarak kodlanmış şekilde döndürür.

def embed_fn(df_input):
    list_embedded_values = []
    for index, row in df_input.iterrows():        
        model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
        embeddings = model.get_embeddings([(row['Text'])])        
        list_embedded_values.append(embeddings[0].values)
    df_input['Embedded text'] = list_embedded_values
    return df_input             

Her satırın kodlanmış metnini saklayıp ekleyecek olduğumuz liste, list_embedded_values adlı listede yer alır.

Pandas'daki iterrows yöntemini kullanarak, veri kümesindeki her satırı iteratif olarak inceleyebilir ve metin sütunundaki değerleri (simulasyonlu veritabanımızdaki manuel bilgileri içeren) elde edebiliriz.

Normal metin göndermek ve gecko@003 modelini kullanarak vektörünü döndürmek için model değişkenini başlatırız. Burada, TextEmbeddingModel.from_pretrained işlevini çağırarak modeli kullanılacak şekilde ayarlarız.

model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])                     

Ardından, embeddings değişkeninde model.get_embeddings işlevi aracılığıyla gönderdiğimiz metnin vektörünü yakalarız.

İşlevin sonunda, veri kümesindeki gecko@003 modeline göre oluşturulan vektörlerin listesini içeren Embedded text (Yerleşik metin) adlı yeni bir sütun oluştururuz.

df_input['Embedded text'] = list_embedded_values
return df_input             

Son olarak, df_embedded_values_db değişkeninde, simüle edilmiş veritabanındaki orijinal verileri içeren veri kümesini ve her satırın vektör listesini içeren yeni bir sütunu yakalarız.

df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db      

6. Vektör veritabanına soru sorma

Veritabanı metinleri ve vektörlerini içerdiğine göre, soru sormaya ve yanıt bulmak için veritabanımızı sorgulamaya geçebiliriz.

Bunun için aşağıdaki kodu kopyalayıp yeni bir hücreye yapıştırın:

question='How do you shift gears in the Google car?'
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(question)])        
text_to_search=embeddings[0].values
len(text_to_search)

Sonuç şöyle görünür:

6b7cf9b08e3b4573.png

Kodu analiz edelim

Önceki adımdaki işleve benzer şekilde, soru değişkenini ilk olarak veritabanımıza sormayı planladığımız soruyla başlatırız.

question='How do you shift gears in the Google car?'

Ardından model değişkeninde, TextEmbeddingModel.from_pretrained işlevi aracılığıyla kullanmak istediğimiz modeli ayarlarız. Bu durumda, gecko@003 modeli kullanılır.

model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")

embeddings değişkeninde model.get_embeddings işlevini çağırıp vektöre dönüştürülecek metni (bu durumda soruyu) iletiriz.

embeddings = model.get_embeddings([(question)])        

Son olarak, text_to_search değişkeni, sorudan çevrilen vektörlerin listesini tutar.

Vektörün uzunluğunu yalnızca referans olarak yazdırırız.

text_to_search=embeddings[0].values
len(text_to_search)

7. Vektörleri karşılaştırma

Artık simüle edilmiş veritabanımızda bir vektör listesi ve vektöre dönüştürülmüş bir soru var. Yani artık sorunun vektörünü veritabanımızdaki tüm vektörlerle karşılaştırarak sorunumuzu daha doğru yanıtlamaya en yakın olanı bulabilir.

Bunu yapmak için sorunun vektörü ile veritabanının her bir vektörü arasındaki mesafeyi ölçeriz. Vektörler arasındaki mesafeleri ölçmek için birden fazla teknik vardır. Bu kod laboratuvarında, Öklid mesafesini veya L2 normunu kullanacağız.

73ea8635c4570bea.png

Python'da bunu yapmak için numpy işlevinden yararlanabiliriz.

Aşağıdaki kodu kopyalayıp yeni bir hücreye yapıştırın:

list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1
for position, embedded_value in enumerate(list_embedded_text_from_db):
    distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
    print(distance)
    if distance<shortest_distance:
        shortest_distance=distance
        shortest_position=position
        
print(f'The shortest distance is {shortest_distance} and the position of that value is {shortest_position}')

Sonuç şu şekilde görünmelidir:

b70563b50ea86668.png

Kodu analiz edelim

Yerleşik metni veya veritabanımızın vektörlerini içeren sütunu bir listeye dönüştürüp list_embedded_text_from_db içinde depolayarak başlarız.

Ayrıca, gerçek en kısa mesafeyi bulana kadar güncellemeyi sürdürmek için shortest_distance değişkenini 1 olarak başlattık.

list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1

Ardından, bir for döngüsü kullanarak iterasyon yapar ve sorudaki vektör ile veritabanındaki her vektör arasındaki mesafeyi alırız.

Numpy linalg.norm işlevini kullanarak bu noktaların arasındaki mesafeyi hesaplayabiliriz.

Hesaplanan mesafe, shortest_distance değişkenindeki mesafeden azsa hesaplanan mesafe bu değişkene ayarlanır.

Ardından, en kısa mesafeyi ve öğenin bulunduğu listedeki konumu yakalarız. shortest_distance ve shortest_position değişkenlerinde.

for position, embedded_value in enumerate(list_embedded_text_from_db):
    distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
    print(distance)
    if distance<shortest_distance:
        shortest_distance=distance
        shortest_position=position

8. Sonuçlar

Soru ile veritabanı arasındaki en kısa mesafeyi tutan vektörün listedeki konumunu bilerek sonuçları yazdırabiliriz.

Aşağıdaki kodu kopyalayıp yeni bir hücreye yapıştırın:

print("Your question was:\n "+question+ " \nAnd our answer is:\n "+
      df_embedded_values_db.at[shortest_position, 'Title']+": "+
      df_embedded_values_db.at[shortest_position, 'Text'])

Komutu çalıştırdıktan sonra aşağıdaki gibi bir sonuç alırsınız:

7a0e429171a19afe.png

9. Tebrikler

Tebrikler, gerçek bir kullanım alanında textembedding-gecko@003 modelini kullanarak ilk uygulamanızı başarıyla oluşturdunuz.

Metin gömmelerinin temellerini ve GCP Workbench'te gecko003 modelini nasıl kullanacağınızı öğrendiniz.

Artık bilgilerinizi daha fazla kullanım alanına uygulamak için gereken temel adımları biliyorsunuz.

Sırada ne var?

Bu codelab'lerden bazılarına göz atın...

Referans dokümanları