Vertex AI ile Metin Yerleştirmelerini Anlama ve Uygulama
Deeplearning.ai’ın “Understanding and Applying Text Embeddings with Vertex AI” kursunun Türkçe özetidir.
Metin Yerleştirmeye Başlarken
Lokal olarak çalıştırmak için önce Vertex AI’yi yüklemeniz gerekir:
!pip install google-cloud-aiplatform
Vertex AI’yı başlatmak için:
from utils import authenticate
credentials, PROJECT_ID = authenticate() # Get credentials and project ID
print(PROJECT_ID)
REGION = 'us-central1'
# Import and initialize the Vertex AI Python SDK
import vertexai
vertexai.init(project = PROJECT_ID,
location = REGION,
credentials = credentials)
Bir yerleştirme modelini içe aktarıp yüklemek için:
from vertexai.language_models import TextEmbeddingModel
embedding_model = TextEmbeddingModel.from_pretrained(
"textembedding-gecko@001")
Bir cümleden vektör oluşturma işlemi örneği:
embedding = embedding_model.get_embeddings(
["What is the meaning of life?"])
vector = embedding[0].values
print(f"Length = {len(vector)}")
print(vector[:10])
Bu bölümdeki diğer kod örnekleri:
Metin Yerleştirmeleyi Anlamak
Vektörler kelimelerin anlamlarını temsil eden virgüllü sayılardır. Bu sayede yapay zeka, kelimelerin birbirileri ile anlamsal ilişkisini öğrenebilmektedir.
Bir cümlenin vektör değerini bulmanın basit yolu kelimeleri vektörlere ayrı ayrı dönüştürmek ve sonrasında ortalamasını almaktır. Bu yöntemde kelimelerin sırasının bir öneminin olmadığı varsayılır.
Modern yerleştirmeler transformatör tabanlı yapay sinir ağları kullanılarak cümleler ile eğitilirler. Sonrasında bu modeller bir cümle aldıklarında buradaki kelimelerin daha önceki eğitim aşamalarından öğrendikleri anlamını temel alarak vektörler oluştururlar.
Daha modern yöntemler ise her token (kelime parçası) için vektör oluşturmaktır. Bu sayede yeni veya hatalı yazılmış kelimeler için de anlam bulunabilmektedir.
Karşılaştırmalı öğrenme
Bu yöntemde ise benzer cümle eşlerinden oluşan bir veriseti ile eğitilen yapay sinir ağı anlamsal olarak benzer cümlelere yakın vektörler atarken uzak cümlelere farklı vektörler atar.
Yerleştirmeleri Görselleştirme
Yerleştirmeleri görselleştirmek onları anlamak ve anlatmak için önemlidir. Bu bölümün kod örneğinde görselleştirme yapabilmek için yerleştirmeleri 768'den 2 boyuta düşüreceğiz. Bu boyut düşürme işleminde bir takım bilgilerin ortadan kalktığını ve yalnızca genel yapının anlaşılabilirliği uğruna bu işlemi yaptığımızı unutmayın. Bu işlem için PCA (temel bileşen analizini) kullanacağız.
from sklearn.decomposition import PCA
# Perform PCA for 2D visualization
PCA_model = PCA(n_components = 2)
PCA_model.fit(embeddings_array)
new_values = PCA_model.transform(embeddings_array)
print("Shape: " + str(new_values.shape))
print(new_values)
Şimdi grafiğini çizdirebiliriz:
import matplotlib.pyplot as plt
import mplcursors
%matplotlib ipympl
from utils import plot_2D
plot_2D(new_values[:,0], new_values[:,1], input_text_lst_news)
Benzer cümleleri ve farklı cümlelerin yerleşimlerini karşılaştırmak için bir ısı haritası çizelim:
in_1 = """He couldn’t desert
his post at the power plant."""
in_2 = """The power plant needed
him at the time."""
in_3 = """Cacti are able to
withstand dry environments."""
in_4 = """Desert plants can
survive droughts."""
input_text_lst_sim = [in_1, in_2, in_3, in_4]
embeddings = []
for input_text in input_text_lst_sim:
emb = embedding_model.get_embeddings([input_text])[0].values
embeddings.append(emb)
embeddings_array = np.array(embeddings)
from utils import plot_heatmap
y_labels = input_text_lst_sim
# Plot the heatmap
plot_heatmap(embeddings_array, y_labels = y_labels, title = "Embeddings Heatmap")
Bu ısı haritasına baktığımızda her tokenin bir sütun ve her satırın bir cümleyi gösterdiğini görebiliriz. Böylece cümlelerin hangi kısımlarının birbirilerine anlamsal olarak benzediğini farkedebiliriz. Burada anlamsal benzerliği vektörler arasındaki kosinüs benzerliği ile ölçeriz.
Yerleştirmeleri görselleştirme bölümü örneği:
Yerleştirme Uygulamaları
BigQuery’den StackOverflow soruları ve yanıtları nasıl yüklenir?
BigQuery, Google Cloud’un sunucusuz veri ambarıdır. Python, HTML, R ve CSS dilleri için ilk 500 mesajı (soru ve cevapları) alacağız:
from google.cloud import bigquery
import pandas as pd
def run_bq_query(sql):
# Create BQ client
bq_client = bigquery.Client(project = PROJECT_ID,
credentials = credentials)
# Try dry run before executing query to catch any errors
job_config = bigquery.QueryJobConfig(dry_run=True,
use_query_cache=False)
bq_client.query(sql, job_config=job_config)
# If dry run succeeds without errors, proceed to run query
job_config = bigquery.QueryJobConfig()
client_result = bq_client.query(sql,
job_config=job_config)
job_id = client_result.job_id
# Wait for query/job to finish running. then get & return data frame
df = client_result.result().to_arrow().to_pandas()
print(f"Finished job_id: {job_id}")
return df
# define list of programming language tags we want to query
language_list = ["python", "html", "r", "css"]
so_df = pd.DataFrame()
for language in language_list:
print(f"generating {language} dataframe")
query = f"""
SELECT
CONCAT(q.title, q.body) as input_text,
a.body AS output_text
FROM
`bigquery-public-data.stackoverflow.posts_questions` q
JOIN
`bigquery-public-data.stackoverflow.posts_answers` a
ON
q.accepted_answer_id = a.id
WHERE
q.accepted_answer_id IS NOT NULL AND
REGEXP_CONTAINS(q.tags, "{language}") AND
a.creation_date >= "2020-01-01"
LIMIT
500
"""
language_df = run_bq_query(query)
language_df["category"] = language
so_df = pd.concat([so_df, language_df],
ignore_index = True)
Sklearn kütüphanesini kullanarak:
- Stack Overflow sorularının yerleştirmelerini kümeleyebiliriz. Kümeleme, kategori etiketleri (HTML veya Python) verilmeden, HTML veya Python ile ilgili soruları iki farklı kümeye ayırabilir.
- StackOverflow sorusunun kategorisini (Python, R, HTML veya CSS olarak) sınıflandırmak için rastgele bir orman modeli eğitebilirsiniz .
- Anormal bir metin parçası arayabilir ve aykırı değer (anormallik) tespit algoritmasının (İzolasyon Ormanı),verinin yerleştirmesine bağlı olarak bunu aykırı değer (anormallik) olarak tanımlayıp tanımlayamayacağını kontrol edebilirsiniz. IsolationForest (izolasyon oramnı) sınıflandırıcısı potansiyel aykırı değerler için -1 ve aykırı olmayanlar için 1 tahmininde bulunacaktır. Potansiyel aykırı değerler olduğu tahmin edilen satırları inceleyebilir ve sonucu doğrulayabilirsiniz.
Yerleştirme uygulamaları kod örneği:
Vertex AI ile Metin Oluşturma
Modele İstem Yollamak
Çeşitli doğal dil görevlerini yerine getirmek üzere eğitilmiş bir dil modeli olan “text-bison@001"i içe aktaracağız. Dil modeliyle çok yönlü diyaloglar kurmak için “chat-bison@001” modelini kullanabilirsiniz.
Vertex AI Kullanarak Dil Modeli ile:
- Dil modeline açık uçlu soru sorabilirsiniz:
prompt = "I'm a high school student. \
Recommend me a programming activity to improve my skills."
print(generation_model.predict(prompt=prompt).text)
- Dil modelinin yanıtının daha fazla öngörülebilirliği için, dil modelinden bir yanıt listesi arasından seçim yapmasını ve ardından yanıtını detaylandırmasını da isteyebilirsiniz:
prompt = """I'm a high school student. \
Which of these activities do you suggest and why:
a) learn Python
b) learn Javascript
c) learn Fortran
"""
print(generation_model.predict(prompt=prompt).text)
- Bilgileri çıkarıp tablo olarak biçimlendirebilirsiniz:
prompt = """ A bright and promising wildlife biologist \
named Jesse Plank (Amara Patel) is determined to make her \
mark on the world.
Jesse moves to Texas for what she believes is her dream job,
only to discover a dark secret that will make \
her question everything.
In the new lab she quickly befriends the outgoing \
lab tech named Maya Jones (Chloe Nguyen),
and the lab director Sam Porter (Fredrik Johansson).
Together the trio work long hours on their research \
in a hope to change the world for good.
Along the way they meet the comical \
Brenna Ode (Eleanor Garcia) who is a marketing lead \
at the research institute,
and marine biologist Siri Teller (Freya Johansson).
Extract the characters, their jobs \
and the actors who played them from the above message as a table
"""
response = generation_model.predict(prompt=prompt)
print(response.text) #This is a table in markdown format
Yaratıcılığı/Rastgeleliği Ayarlama
- Temperature, top-k ve top-n parametrelerini ayarlayarak dil modelinin kod çözme stratejisinin davranışını kontrol edebilirsiniz.
- Temperature değeri 0'a yaklaştıkça en alakalı tokeni seçme ihtimali artar. Temperature değeri 1'e yaklaştıkça farklı cevapların olasılıkları birbirine daha yakınlaşır, bu da diğerlerinin seçilme olasılığının ortalamada daha yüksek olmasını sağlar. Yüksek temperature değeri ile oluşturulmuş cevaplar bazen yaratıcı bulunup beğenilse de bazen anlamsız olarak yorumlanabilmektedir.
- Modelin aynı girdi için sürekli olarak aynı sonucu vermesini istediğimiz görevlerde (sınıflandırma veya bilgi çıkarma gibi), temperature değerini sıfıra ayarlamalıyız.
- Beyin fırtınası, özetleme gibi daha fazla yaratıcılık istediğiniz görevler için daha yüksek bir temperature değeri seçmeliyiz (maksimum 1).
Temperature değişkeni nasıl çalışır?
Top P
Top P yöntemi, kümülatif olasılığı p olan minimum miktarda tokenin getirilmesi şeklinde çalışır.
Olasılıkları toplamı p veya daha büyük olasılığa eşit olan minimum jeton kümesi örneklenir. top_p için varsayılan değer 0,95'tir. Top_p ve top_k’yi ayarlamak ve farklı sonuçlar görmek istiyorsanız temperature değerini sıfırdan büyük olacak şekilde ayarlamayı unutmayın, aksi takdirde model her zaman en yüksek olasılığa sahip jetonu seçecektir.
Top K
En yüksek olasılıklı k token getirilir. Top K değeri yükseltildiğinde eğer birçok farklı cevabı olabilecek bir cümleyse güzel sonuçlar alınabilirken kısıtlı cevabın olabileceği sorularda anlamsız sonuçlar vermektedir.
“top_k” için varsayılan değer 40'tır. top_k’yi 1 ile 40 arasındaki değerlere ayarlayabilirsiniz. Genel strateji top_k, ardından top_p ve en son temperature’un uyarlanmasıdır.
Vertex AI ile Metin Oluşturma Bölümü Kodu:
Anlamsal Aramayı Kullanarak Soru Cevaplama Sistemleri Oluşturma
Özel Kapalı Verilerimiz ile Modelleri Eğitme
Hazır LLM’ler güncel verilerle eğitilmiş değillerdir ve halka açık olmayan bilgileri bilmezler. Örneğin:
prompt = "How to concat dataframes in pandas?"
response = generation_model.predict(prompt=prompt)
print(response.text) # Cevap verinin güncelliğine göre değişir
LLM’leri topraklayarak (grounding):
- Eğitim verisi dışındaki verilerle eğitebilirsiniz.
- Halisünasyon ihtimalini azaltabilirsiniz.
- Halihazırda var olan IT sistemleri, veritabanları ve iş verileri ile entegre edebilirsiniz.
Semantik Arama
Bir kullanıcı bir soru sorduğunda, sorgusunu anında yerleştirebilir ve en benzer veriyi bulmak için tüm StackOverflow soru yerleştirmeleri üzerinde arama yapabiliriz.
Sorgu yerleştirmemiz ile veritabanı yerleştirmelerinin her biri arasında benzerlik değerine sahip olduğumuzda, en yüksek değere sahip dizini çıkartabiliriz. Bu yerleştirme, “Dataframe’ler pandas’ta nasıl birleştirilir?” sorusuna en çok benzeyen StackOverflow gönderisine karşılık gelir.
İlgili bağlamla soru yanıtlama
Artık en benzer StackOverflow sorusunu bulduğumuza göre, karşılık gelen yanıtı alabilir ve daha fazla konuşmaya dayalı bir yanıt üretmek için Büyük Dil Modellerini (LLM) kullanabiliriz.
Belgeler yararlı bilgiler sağlamadığında
Mevcut iş akışımız, yerleştirme veritabanımızdaki en benzer soruyu döndürüyor. Ancak bu soru, kullanıcı sorgusunu yanıtlarken gerçekten alakalı olmadığında, başka bir deyişle veri tabanımızda iyi bir eşleşme olmadığında, ne yapacağız?
Büyük Dil Modelleri, daha konuşmaya dayalı bir yanıt sağlamanın yanı sıra, en benzer dokümanın aslında kullanıcının sorgusuna makul bir yanıt olmadığı bu durumları ele almamıza yardımcı olabilir.
Yaklaşık olarak en yakın komşu aramasıyla ölçeklendirme
Büyük bir veri kümeleriyle uğraşırken, sorgu ile veritabanındaki her orijinal yerleştirilmiş belge arasındaki benzerliği hesaplamak çok pahalı olabilir. Aşağıdaki temel vektör farkı yöntemleri büyük veri kümelerinde uzun sürmektedir.
Bunu yapmak yerine, en benzer belgeleri daha verimli bir şekilde bulan yaklaşık en yakın komşu algoritmalarını kullanabilirsiniz. Bu algoritmalar genellikle verileriniz için bir dizin oluşturarak ve bu dizini sorgularınıza en benzer belgeleri bulmak için kullanarak çalışır. Bu bölümün kod örneğinde, etkili vektör benzerlik araştırmasının faydalarını göstermek için ScaNN’i kullandık.
Anlamsal Arama Kullanarak Soru Cevaplama Sistemleri Oluşturmak:
Google Bulut Kurulumu (İsteğe bağlı)
Bu bölümün kod kısmında Google Bulut’un nasıl kurulacağını öğrendik: