Bu codelab hakkında
1. Giriş
Son güncelleme tarihi: 08.04.2024
Metin Yerleştirme
Metin yerleştirme, metin verilerini sayısal temsillere dönüştürme işlemidir. Çoğunlukla vektörler olan bu sayısal gösterimler, anlamsal anlamı ve metindeki kelimeler arasındaki ilişkileri yakalar. Şöyle hayal edin:
Metin, nüanslar ve belirsizliklerle dolu karmaşık bir dil gibidir.
Metin yerleştirme, bu dili bilgisayarların anlayıp yönetebileceği daha basit, 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. Arama motorları, öneri sistemleri ve makine çevirisi gibi görevler için bu şarttır.
- Anlamsal anlamı yakalar: Yerleştirmeler, kelimelerin gerçek anlamından ibaret değildir. Kelimelerin bağlamını ve aralarındaki ilişkileri yakalayarak daha ayrıntılı analizler yapmanızı sağlar.
- Makine öğrenimi performansını iyileştirir: Metin yerleştirmeler, makine öğrenimi modellerinde özellik olarak kullanılabilir ve yaklaşım analizi, metin sınıflandırma ve konu modelleme gibi görevlerde daha iyi performans sağlar.
Metin gömme kullanım alanları
Metni sayısal gösterimlere dönüştürerek doğal dil işlemede (NLP) çeşitli uygulamalara metin yerleştirme işlevinden yararlanır. Bazı önemli kullanım alanları şunlardır:
1. Arama Motorları ve Bilgi Alma:
Metin yerleştirilmiş öğeler, anahtar kelimeler tam olarak bulunmasa bile arama motorlarının sorguların ardındaki anlamları 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.
Daha sonra sistem, kullanıcının etkileşime girdiği ürün, makale veya diğer içeriklerin yerleştirmelerini karşılaştırarak benzer öğeler önerebilir.
3. İntihal Tespiti:
İki metnin embeddings'ini karşılaştırmak, anlamsal yapılarında önemli benzerlikler bularak olası intihalleri tespit etmenize yardımcı olabilir.
Bunlar sadece birkaç örnek. Metin yerleştirme teknikleri geliştikçe olasılıklar da artmaya devam ediyor. Bilgisayarlar, yerleştirmeler aracılığıyla 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 hizmet paketi üzerinden sunulan önceden eğitilmiş 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ıyla:
- textembedding-gecko@003'ü çağırmak ve metni metin yerleştirmelerine (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 nasıl çağrı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 Bilgisi
- Bir Google Cloud projesi
- Vertex AI'a erişim - Workbench
2. Kurulum
Vertex AI Workbench örneği oluşturma
- Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
- Proje seçiciye git
- Google Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun.
- Notebooks API'yi etkinleştirin.
Google Cloud konsolunu, gcloud KSA'yı veya Terraform'u kullanarak Vertex AI Workbench örneği oluşturabilirsiniz. Bu eğitimin amacı doğrultusunda, Google Cloud Console'u kullanarak dosya oluşturacağız. Diğer yöntemler hakkında daha fazla bilgiyi burada bulabilirsiniz.
- Google Cloud Console'da Vertex AI menüsü, Notebooks bölümünden erişilebilen Örnekler sayfasına gidip Workbench'i tıklayın.
- Örnekler'e gidin.
- Yeni oluştur'u tıklayın.
- Örnek oluşturun iletişim kutusundaki Ayrıntılar bölümüne yeni örneğiniz için aşağıdaki bilgileri girin:
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üklemeye gerek yok
Ağ iletişimi bölümünde aşağıdakileri sağlayın:
Ağ: 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ş olduğu veya internete erişebildiği sürece VPC ağı seçebilirsiniz
Alt ağ alanında: İstediğiniz alt ağı seçin. Varsayılan olanı seçebilirsiniz.
Örnek özelliklerinde, varsayılan değer olan e2-standard-4 değerini bırakabilirsiniz.
- 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
- JupyterLab'da, Başlatıcı'dan Not Defteri bölümünde Python logosunun bulunduğu ve Python3 yazan simgeyi tıklayın.
- Adsız adı ve ipynb uzantısıyla bir Jupyter not defteri oluşturulur.
- 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 aktarılıyor
Örnek oluşturulduktan ve Jupyterlab açıldıktan sonra codelab'imiz için gerekli tüm kitaplıkları yüklememiz gerekir.
Şunlara ihtiyacımız var:
- Numpy
- pandalar
- TextEmbeddingInput, TextEmbeddingModel from vertexai.language_models
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:
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, metin bir vektöre dönüştürülür, veritabanımızda aranıp en yakın sonuç döndürülür.
Vektör veritabanımız 3 kayıt tutacaktır. Kaydı ş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:
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, panda'lardan yararlanarak bu listeden df_initial_db adında bir veri çerçevesi oluşturuyoruz.
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ş doküman veritabanımızdaki her kayıt için gecko@003 modelini kullanarak bir metin yerleştireceğiz.
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:
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
list_embedded_values adlı listede, her satırdaki kodlanmış metni depolayıp ekleyeceğiz.
Pandas'daki iterrows yöntemini kullanarak, veri kümesindeki her satırı iteratif olarak inceleyebilir ve Text 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, 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ımız metin ve vektörlerini içerdiğinden, soru sormaya devam edebilir ve yanıtı bulmak için veritabanımızı sorgulayabiliriz.
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ç şuna benzer olacaktır:
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 (bu örnekte gecko@003 modeli) işleviyle kullanmak istediğimiz modeli ayarlarız.
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings değişkeninde model.get_embeddings işlevini çağırır ve 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 bir vektöre dönüştürülmüş soru var. Böylece, artık sorunun vektörünü veritabanımızdaki tüm vektörlerle karşılaştırarak, sorumuza en doğru yanıtı veren vektöre en yakın olanı bulabiliriz.
Bunu yapmak için sorunun vektörü ile veritabanının her bir vektörü arasındaki mesafeyi ölçeriz. Vektörler arasındaki mesafeyi ölçmek için çeşitli teknikler mevcuttur. Bu özel codelab'de Öklid mesafesi veya L2 normu kullanılacaktır.
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:
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üncellemeye devam etmek 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 değerden küçükse, hesaplanan mesafe bu değişkene ayarlanır.
Ardından, en kısa mesafeyi ve bu alanın listede bulunduğu konumu kaydederiz. En kısa_distance ve kısa_konum 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 içeren vektör listesindeki konuma bakarak 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:
9. Tebrikler
Tebrikler, gerçek bir kullanım alanında textembedding-gecko@003 modelini kullanarak ilk uygulamanızı başarıyla oluşturdunuz!
Metin yerleştirmeyle ilgili temel bilgileri ve GCP Workbench'te gecko003 modelini kullanmayı öğ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...