Spanner Vektör Arama'yı kullanmaya başlama

1. Giriş

Spanner, hem ilişkisel hem de ilişkisel olmayan operasyonel iş yükleri için ideal olan, tümüyle yönetilen, yatay olarak ölçeklenebilir, küresel olarak dağıtılmış bir veritabanı hizmetidir.

En yakın K-en yakın komşu işlevlerinin kullanıma sunulmasıyla birlikte Spanner artık aynı zamanda yüksek düzeyde ölçeklenebilir bir vektör veritabanıdır. Böylece, benzerlik veya semantik arama yapabilir ve üretken yapay zeka uygulamalarında, almayla ilgili artırılmış nesil (RAG) uygulamalarını geniş ölçekte uygulayabilirsiniz. Spanner'ın vektör arama sorguları, işlemler gerçekleşir gerçekleşmez, operasyonel verilerinizdeki diğer tüm sorgular gibi yeni gerçek zamanlı veriler döndürür.

Bu laboratuvarda, vektör araması yapmak üzere Spanner'dan yararlanmak ve SQL kullanarak VertexAI'ın model bahçesinden yerleştirme ve LLM modellerine erişmek için gereken temel özellikleri nasıl ayarlayabileceğinizi açıklayacaksınız.

Mimari şu şekilde görünür:

d179a760add7adc0.png

Neler oluşturacaksınız?

Bu laboratuvar kapsamında:

  • Spanner örneği oluşturma
  • VertexAI'daki yerleştirme ve LLM modelleriyle entegre olacak şekilde Spanner'ın veritabanı şemasını ayarlama
  • Perakende veri kümesini yükleme
  • Veri kümesiyle ilgili benzerlik arama sorguları sorun
  • Ürüne özel öneriler oluşturmak için LLM modeline bağlam bilgisi sağlayın.

Neler öğreneceksiniz?

  • Spanner örneği ayarlama
  • VertexAI ile entegrasyon
  • Perakende veri kümesindeki benzer öğeleri bulmak üzere vektör araması yapmak için Spanner'ı kullanma

Gerekenler

  • Faturalandırma hesabına bağlı bir Google Cloud projesi.
  • Chrome veya Firefox gibi bir web tarayıcısı.

2. Kurulum ve şartlar

Proje oluşturma

Google Hesabınız (Gmail veya Google Apps) yoksa bir hesap oluşturmanız gerekir. Google Cloud Platform konsolunda ( console.cloud.google.com) oturum açın ve yeni bir proje oluşturun.

Zaten bir projeniz varsa konsolun sol üst köşesindeki proje seçimi açılan menüsünü tıklayın:

6c9406d9b014760.png

ve açılan iletişim kutusunda "YENİ PROJE" düğmesini tıklayarak yeni proje oluşturun:

949d83c8a4ee17d9.png

Henüz projeniz yoksa ilk projenizi oluşturmak için şuna benzer bir iletişim kutusu görmeniz gerekir:

870a3cbd6541ee86.png

Sonraki proje oluşturma iletişim kutusu yeni projenizin ayrıntılarını girmenize olanak tanır:

6a92c57d3250a4b3.png

Tüm Google Cloud projeleri için benzersiz bir ad olan proje kimliğini unutmayın (yukarıdaki ad daha önce alınmış ve size uygun olmayacaktır!). Bu kod, bu codelab'in ilerleyen bölümlerinde PROJECT_ID olarak adlandırılacaktır.

Ardından, henüz yapmadıysanız Developers Console'da faturalandırmayı etkinleştirmeniz ve Google Cloud kaynaklarını kullanmanız ve Spanner API'sini etkinleştirmeniz gerekir.

15d0ef27a8fbab27.png

Bu codelab'i çalıştırmanın maliyeti birkaç dolardan fazla değildir. Ancak daha fazla kaynak kullanmaya karar verirseniz veya bu kaynakları çalışır durumda bırakırsanız daha yüksek ücret ödemeniz gerekebilir (bu belgenin sonundaki "temizlik" bölümüne bakın). Google Cloud Spanner fiyatlandırması burada açıklanmıştır.

Yeni Google Cloud Platform kullanıcıları, bu codelab'i tamamen ücretsiz hale getirecek 300 ABD doları değerinde ücretsiz denemeden yararlanabilir.

Google Cloud Shell Kurulumu

Google Cloud ve Spanner, dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.

Bu Debian tabanlı sanal makine, ihtiyacınız olan tüm geliştirme araçlarıyla yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Yani bu codelab'de ihtiyacınız olan tek şey bir tarayıcıdır (Evet, Chromebook'ta çalışır).

  1. Cloud Console'dan Cloud Shell'i etkinleştirmek için Cloud Shell'i Etkinleştir'i gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A tıklamanız yeterlidir (sağlanması ve ortama bağlanması birkaç dakika sürer).

JjEuRXGg0AYYIY6QZ8d-66gx_Mtc-_jDE9ijmbXLJSAXFvJt-qUpNtsBsYjNpv2W6BQSrDc1D-ARINNQ-1EkwUhz-iUK-FUCZhJ-NtjvIEx9pIkE-246DomWuCfiGHK78DgoeWkHRw

Screen Shot 2017-06-14 at 10.13.43 PM.png

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulanmış olduğunu ve projenin PROJECT_ID'nize ayarlanmış olduğunu göreceksiniz.

gcloud auth list

Komut çıkışı

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Herhangi bir nedenle proje ayarlanmamışsa şu komutu vermeniz yeterlidir:

gcloud config set project <PROJECT_ID>

PROJECT_ID cihazınızı mı arıyorsunuz? Kurulum adımlarında kullandığınız kimliği kontrol edin veya Cloud Console kontrol panelinden arayın:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvO351c5iBv506B3ZwghZoiRg6cz23Qw

Cloud Shell bazı ortam değişkenlerini de varsayılan olarak ayarlar. Bu değişkenler, gelecekte komut çalıştırdığınızda işinize yarayabilir.

echo $GOOGLE_CLOUD_PROJECT

Komut çıkışı

<PROJECT_ID>

Spanner API'yi etkinleştirme

gcloud services enable spanner.googleapis.com

Özet

Bu adımda, henüz oluşturmadıysanız projenizi oluşturdunuz, Cloud Shell'i etkinleştirdiniz ve gerekli API'leri etkinleştirdiniz.

Sıradaki

Şimdi, Spanner örneğini ve veritabanını kuracaksınız.

3. Spanner örneği ve veritabanı oluşturma

Spanner örneğini oluşturma

Bu adımda codelab için Spanner örneğimizi oluşturduk. Bunun için Cloud Shell'i açıp şu komutu çalıştırın:

export SPANNER_INSTANCE_ID=retail-demo
gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1

Komut çıkışı:

$ gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1
Creating instance...done.  

Veritabanını oluşturma

Örneğiniz çalışmaya başladıktan sonra veritabanını oluşturabilirsiniz. Spanner, tek bir örnek üzerinde birden çok veritabanı kullanılmasına olanak sağlar.

Veritabanı, şemanızı tanımladığınız yerdir. Ayrıca, veritabanına kimlerin erişebileceğini kontrol edebilir, özel şifreleme ayarlayabilir, optimize ediciyi yapılandırabilir ve saklama süresini belirleyebilirsiniz.

Veritabanını oluşturmak için gcloud komut satırı aracını tekrar kullanın:

export SPANNER_DATABASE=cymbal-bikes
gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID

Komut çıkışı:

$ gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID
Creating database...done.

Özet

Bu adımda Spanner örneğini ve veritabanını oluşturdunuz.

Sıradaki

Ardından, Spanner şemasını ve verilerini ayarlayacaksınız.

4. Cymbal şemasını ve verilerini yükle

Cymbal şemasını oluşturma

Şemayı ayarlamak için Spanner Studio'ya gidin:

3e1a0fed928b33cf.png

Şemanın iki bölümü vardır. İlk olarak, products tablosunu eklemek istiyorsunuz. Bu ifadeyi kopyalayıp boş sekmeye yapıştırın.

Şema için bu DDL'yi kopyalayıp kutuya yapıştırın:

CREATE TABLE products (
categoryId INT64 NOT NULL,
productId INT64 NOT NULL,
productName STRING(MAX) NOT NULL,
productDescription STRING(MAX) NOT NULL,
productDescriptionEmbedding ARRAY<FLOAT64>,
createTime TIMESTAMP NOT NULL OPTIONS (
allow_commit_timestamp = true
),
inventoryCount INT64 NOT NULL,
priceInCents INT64,
) PRIMARY KEY(categoryId, productId);

Ardından run düğmesini tıklayın ve şemanızın oluşturulması için birkaç saniye bekleyin.

Ardından, iki model oluşturup bunları VertexAI model uç noktalarına göre yapılandıracaksınız.

İlk model, metinden yerleştirmeler oluşturmak için kullanılan bir Yerleştirme modeli, ikincisi ise Spanner'daki verilere dayalı yanıtlar oluşturmak için kullanılan bir LLM modelidir.

Aşağıdaki şemayı Spanner Studio'daki yeni bir sekmeye yapıştırın:

CREATE MODEL EmbeddingsModel INPUT(
content STRING(MAX),
) OUTPUT(
embeddings STRUCT<statistics STRUCT<truncated BOOL, token_count FLOAT64>, values ARRAY<FLOAT64>>,
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/textembedding-gecko@003'
);

CREATE MODEL LLMModel INPUT(
prompt STRING(MAX),
) OUTPUT(
content STRING(MAX),
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/text-bison@001',
default_batch_size = 1
);

Ardından, run düğmesini tıklayın ve modellerinizin oluşturulması için birkaç saniye bekleyin.

Spanner Studio'nun sol bölmesinde aşağıdaki tabloları ve modelleri göreceksiniz:

62455aa4b0e839d9.png

Verileri yükleme

Şimdi, veritabanınıza bazı ürünler eklemeniz gerekiyor. Spanner Studio'da yeni bir sekme açın, ardından aşağıdaki ekleme ifadelerini kopyalayıp yapıştırın:

INSERT INTO products (categoryId, productId, productName, productDescription, createTime, inventoryCount, priceInCents)
VALUES (1, 1, "Cymbal Helios Helmet", "Safety meets style with the Cymbal children's bike helmet. Its lightweight design, superior ventilation, and adjustable fit ensure comfort and protection on every ride. Stay bright and keep your child safe under the sun with Cymbal Helios!", PENDING_COMMIT_TIMESTAMP(), 100, 10999),
(1, 2, "Cymbal Sprout", "Let their cycling journey begin with the Cymbal Sprout, the ideal balance bike for beginning riders ages 2-4 years. Its lightweight frame, low seat height, and puncture-proof tires promote stability and confidence as little ones learn to balance and steer. Watch them sprout into cycling enthusiasts with Cymbal Sprout!", PENDING_COMMIT_TIMESTAMP(), 10, 13999),
(1, 3, "Cymbal Spark Jr.", "Light, vibrant, and ready for adventure, the Spark Jr. is the perfect first bike for young riders (ages 5-8). Its sturdy frame, easy-to-use brakes, and puncture-resistant tires inspire confidence and endless playtime. Let the spark of cycling ignite with Cymbal!", PENDING_COMMIT_TIMESTAMP(), 34, 13900),
(1, 4, "Cymbal Summit", "Conquering trails is a breeze with the Summit mountain bike. Its lightweight aluminum frame, responsive suspension, and powerful disc brakes provide exceptional control and comfort for experienced bikers navigating rocky climbs or shredding downhill. Reach new heights with Cymbal Summit!", PENDING_COMMIT_TIMESTAMP(), 0, 79999),
(1, 5, "Cymbal Breeze", "Cruise in style and embrace effortless pedaling with the Breeze electric bike. Its whisper-quiet motor and long-lasting battery let you conquer hills and distances with ease. Enjoy scenic rides, commutes, or errands with a boost of confidence from Cymbal Breeze!", PENDING_COMMIT_TIMESTAMP(), 72, 129999),
(1, 6, "Cymbal Trailblazer Backpack", "Carry all your essentials in style with the Trailblazer backpack. Its water-resistant material, multiple compartments, and comfortable straps keep your gear organized and accessible, allowing you to focus on the adventure. Blaze new trails with Cymbal Trailblazer!", PENDING_COMMIT_TIMESTAMP(), 24, 7999),
(1, 7, "Cymbal Phoenix Lights", "See and be seen with the Phoenix bike lights. Powerful LEDs and multiple light modes ensure superior visibility, enhancing your safety and enjoyment during day or night rides. Light up your journey with Cymbal Phoenix!", PENDING_COMMIT_TIMESTAMP(), 87, 3999),
(1, 8, "Cymbal Windstar Pump", "Flat tires are no match for the Windstar pump. Its compact design, lightweight construction, and high-pressure capacity make inflating tires quick and effortless. Get back on the road in no time with Cymbal Windstar!", PENDING_COMMIT_TIMESTAMP(), 36, 24999),
(1, 9,"Cymbal Odyssey Multi-Tool","Be prepared for anything with the Odyssey multi-tool. This handy gadget features essential tools like screwdrivers, hex wrenches, and tire levers, keeping you ready for minor repairs and adjustments on the go. Conquer your journey with Cymbal Odyssey!", PENDING_COMMIT_TIMESTAMP(), 52, 999),
(1, 10,"Cymbal Nomad Water Bottle","Stay hydrated on every ride with the Nomad water bottle. Its sleek design, BPA-free construction, and secure lock lid make it the perfect companion for staying refreshed and motivated throughout your adventures. Hydrate and explore with Cymbal Nomad!", PENDING_COMMIT_TIMESTAMP(), 42, 1299);

Verileri eklemek için run düğmesini tıklayın.

Özet

Bu adımda şemayı oluşturdunuz ve cymbal-bikes veritabanına bazı temel verileri yüklediniz.

Sıradaki

Daha sonra, ürün açıklamaları için yerleştirmeler oluşturmak üzere Yerleştirme modeliyle entegre edecek ve alakalı ürünleri aramak için metin şeklindeki bir arama isteğini bir yerleştirme öğesine dönüştüreceksiniz.

5. Yerleştirmelerle çalışma

Ürün açıklamaları için vektör yerleştirmeleri oluşturma

Benzerlik aramasının ürünlerde çalışması için ürün açıklamalarına ilişkin yerleştirmeler oluşturmanız gerekir.

Şemada oluşturulan EmbeddingsModel ile bu, basit bir UPDATE DML ifadesidir.

UPDATE products p1
SET productDescriptionEmbedding =
(SELECT embeddings.values from ML.PREDICT(MODEL EmbeddingsModel,
(SELECT productDescription as content FROM products p2 where p2.productId=p1.productId)))
WHERE categoryId=1;

Ürün açıklamalarını güncellemek için run düğmesini tıklayın.

Bu örnekte, bir SQL sorgusu aracılığıyla doğal dilde arama isteği sağlayacaksınız. Bu sorgu, arama isteğini bir yerleştirme isteğine dönüştürür ve ardından önceki adımda oluşturulan ürün açıklamalarının depolanan yerleştirmelerine göre benzer sonuçları arar.

-- Use Spanner's vector search, and integration with embedding and LLM models to
-- return items that are semantically relevant and available in inventory based on
-- real-time data.


SELECT productName, productDescription, inventoryCount, COSINE_DISTANCE(
productDescriptionEmbedding,
(   SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) as distance
FROM products
WHERE inventoryCount > 0
ORDER BY distance
LIMIT 5;

Benzer ürünleri bulmak için run düğmesini tıklayın. Sonuçlar aşağıdaki gibi görünecektir:

672e111753077fcf.png

Sorguda, yalnızca stokta olan ürünlerle (inventoryCount > 0) ilgilenme gibi ek filtrelerin kullanıldığına dikkat edin.

Özet

Bu adımda, SQL kullanarak ürün açıklaması yerleştirmeleri ve arama isteği yerleştirmesi oluşturdunuz ve böylece Spanner'ın VertexAI'daki modellerle entegrasyonundan yararlandınız. Arama isteğiyle eşleşen benzer ürünleri bulmak için vektör araması da yaptınız.

Sonraki adımlar

Şimdi de arama sonuçlarını kullanarak her bir ürün için özel bir yanıt oluşturmak üzere bir LLM'ye aktaralım.

6. Bir LLM ile çalışın

Spanner, VertexAI'dan sunulan LLM modelleriyle entegrasyonu kolaylaştırır. Bu sayede geliştiriciler, uygulamanın mantığı yürütmesine gerek kalmadan doğrudan LLM'lerle arayüz oluşturmak için SQL kullanabilir.

Örneğin, "I'd like to buy a starter bike for my 3 year old child". kullanıcısının önceki SQL sorgusunun sonuçlarını aldık.

Geliştirici, ürünün kullanıcı için uygun olup olmadığıyla ilgili her sonuç için aşağıdaki istemi kullanarak yanıt vermek istiyor:

"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me? I'd like to buy a starter bike for my 3 year old child"

Kullanabileceğiniz sorguyu burada bulabilirsiniz:

-- Use an LLM to analyze this list and provide a recommendation on whether each
-- product is a good fit for the user. We use the vector search and real time
-- inventory data to first filter the products to reduce the size of the prompt to
-- the LLM.
SELECT productName, productDescription, inventoryCount, content AS LLMResponse
FROM ML.PREDICT(
MODEL LLMModel,
(   SELECT
inventoryCount,
productName,
productDescription,
CONCAT(
"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me?",
"I'd like to buy a starter bike for my 3 year old child \n",
"Product Name: ", productName, "\n",
"Product Description:", productDescription) AS prompt,
FROM products
WHERE inventoryCount > 0
ORDER by COSINE_DISTANCE(
productDescriptionEmbedding,
(   SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
( SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) LIMIT 5
),
STRUCT(256 AS maxOutputTokens)
);

Sorguyu göndermek için run düğmesini tıklayın. Sonuçlar aşağıdaki gibi görünecektir:

35878cd0f88f1470.png

İlk ürün, ürün açıklamasındaki yaş grubu (2-4 yaş) nedeniyle 3 yaş için uygun. Diğer ürünler uygun değil.

Özet

Sonraki adımlar

Şimdi de sıra temizlik yapmaya geldi.

7. Temizleniyor (isteğe bağlı)

Temizlemek için Cloud Console'un Cloud Spanner bölümüne giderek codelab'de oluşturduğumuz 'retail-demo' örneğini silmeniz yeterlidir.

41cbc1a84b3588d5.png

8. Tebrikler!

Tebrikler, Spanner'ın yerleşik vektör aramasını kullanarak bir benzerlik aramasını başarıyla gerçekleştirdiniz. Ayrıca, doğrudan SQL kullanarak üretken yapay zeka işlevi sağlamak için yerleştirme ve geniş kapsamlı dil modeli modelleriyle çalışmanın ne kadar kolay olduğunu gördünüz.

Sonraki adım

Spanner'ın en yakın komşusu (KNN vektör arama) özelliği hakkında daha fazla bilgiyi buradan edinebilirsiniz: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

Ayrıca, Spanner'ın VertexAI entegrasyonunu kullanarak SQL ile online tahminler gerçekleştirme hakkında daha fazla bilgi edinmek için şu adresi ziyaret edebilirsiniz: https://cloud.google.com/spanner/docs/ml