1. Giriş
Spanner, hem ilişkisel hem de ilişkisel olmayan operasyonel iş yükleri için mükemmel olan, tümüyle yönetilen, yatay olarak ölçeklenebilir, küresel olarak dağıtılmış bir veritabanı hizmetidir.
Spanner, tam K en yakın komşu (KNN) veya yaklaşık en yakın komşu (ANN) özelliklerinden yararlanarak GenAI uygulamalarında benzerlik veya anlamsal arama yapmanıza ve geniş ölçekte aramayla desteklenen üretme (RAG) özelliğini uygulamanıza olanak tanıyan yerleşik vektör arama desteğine sahiptir.
Spanner'ın vektör arama sorguları, operasyonel verilerinizle ilgili diğer tüm sorgular gibi işlemler taahhüt edilir edilmez yeni gerçek zamanlı veriler döndürür.
Bu laboratuvarda, vektör araması yapmak için Spanner'dan yararlanmak ve SQL kullanarak VertexAI'ın model bahçesindeki yerleştirme ve LLM modellerine erişmek için gereken temel özellikleri ayarlama adımlarını uygulayacaksınız.
Mimari şu şekilde görünür:
Bu temel bilgilerle, ScaNN algoritması tarafından desteklenen bir vektör dizini oluşturmayı ve anlamsal iş yüklerinizin ölçeklendirilmesi gerektiğinde APPROX mesafe işlevlerini kullanmayı öğreneceksiniz.
Ne oluşturacaksınız?
Bu laboratuvarda şunları yapacaksınız:
- Spanner örneği oluşturma
- Spanner'ın veritabanı şemasını, VertexAI'daki yerleştirme ve LLM modelleriyle entegre olacak şekilde ayarlama
- Perakende veri kümesi yükleme
- Veri kümesine benzerlik arama sorguları gönderme
- Ürüne özel öneriler oluşturmak için LLM modeline bağlam bilgisi sağlayın.
- Şemayı değiştirin ve bir vektör dizini oluşturun.
- Yeni oluşturulan vektör dizininden yararlanmak için sorguları değiştirin.
Neler öğreneceksiniz?
- Spanner örneği oluşturma
- VertexAI ile entegrasyon
- Perakende veri kümesinde benzer öğeleri bulmak için vektör araması yapmak üzere Spanner'ı kullanma
- ANN araması kullanarak vektör arama iş yüklerini ölçeklendirmek için veritabanınızı hazırlama.
İhtiyacınız olanlar
2. Kurulum ve şartlar
Proje oluşturma
Google Hesabınız (Gmail veya Google Apps) yoksa hesap oluşturmanız gerekir. Google Cloud Platform Console'da ( console.cloud.google.com) oturum açın ve yeni bir proje oluşturun.
Önceden oluşturduğunuz bir projeniz varsa konsolun sol üst kısmındaki proje seçim açılır menüsünü tıklayın:
ve yeni bir proje oluşturmak için açılan iletişim kutusundaki "YENİ PROJE" düğmesini tıklayın:
Henüz projeniz yoksa ilk projenizi oluşturmak için aşağıdaki gibi bir iletişim kutusu görürsünüz:
Ardından açılan proje oluşturma iletişim kutusunda yeni projenizin ayrıntılarını girebilirsiniz:
Tüm Google Cloud projeleri genelinde benzersiz bir ad olan proje kimliğini not edin (Yukarıdaki ad zaten alınmış olduğundan kullanılamaz.) Bu codelab'de daha sonra PROJECT_ID olarak anılacaktır.
Ardından, Google Cloud kaynaklarını kullanmak ve Spanner API'yi etkinleştirmek için Developers Console'da faturalandırmayı etkinleştirmeniz gerekir.
Bu kod laboratuvarını çalıştırmak birkaç dolardan fazlaya mal olmaz ancak daha fazla kaynak kullanmaya karar verirseniz veya kaynakları çalışır durumda bırakırsanız maliyet daha yüksek olabilir (bu dokümanın sonundaki "temizlik" bölümüne bakın). Google Cloud Spanner fiyatlandırması burada açıklanmıştır.
Google Cloud Platform'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme sürümü için uygundur. Bu sayede bu kod laboratuvarını tamamen ücretsiz kullanabilirsiniz.
Google Cloud Shell Kurulumu
Google Cloud ve Spanner, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak bu kod laboratuvarında, bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.
Debian tabanlı bu sanal makinede ihtiyaç duyacağınız tüm geliştirme araçları yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışır. Bu sayede ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Yani bu codelab için tek ihtiyacınız bir tarayıcıdır (evet, Chromebook'ta çalışır).
- Cloud Shell'i Cloud Console'dan etkinleştirmek için Cloud Shell'i etkinleştir'i
tıklamanız yeterlidir (ortam sağlanıp bağlantı kurulabilmesi için birkaç dakika beklemeniz gerekir).
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin PROJECT_ID'nize göre ayarlandığını görürsünüz.
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 aşağıdaki komutu vermeniz yeterlidir:
gcloud config set project <PROJECT_ID>
PROJECT_ID
cihazınızı mı arıyorsunuz? Kurulum adımlarında hangi kimliği kullandığınızı kontrol edin veya Cloud Console kontrol panelinde arayın:
Cloud Shell, bazı ortam değişkenlerini varsayılan olarak da ayarlar. Bu değişkenler, gelecekte komut çalıştırırken faydalı olabilir.
echo $GOOGLE_CLOUD_PROJECT
Komut çıkışı
<PROJECT_ID>
Spanner API'yi etkinleştirme
gcloud services enable spanner.googleapis.com
Özet
Bu adımda, projeniz yoksa projenizi oluşturdunuz, Cloud Shell'i etkinleştirdiniz ve gerekli API'leri etkinleştirdiniz.
Sıradaki
Ardından Spanner örneğini ve veritabanını oluşturursunuz.
3. Spanner örneği ve veritabanı oluşturma
Spanner örneğini oluşturma
Bu adımda, kod laboratuvarının Spanner örneğini oluşturuyoruz. 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ıştıktan sonra veritabanını oluşturabilirsiniz. Spanner, tek bir örnekte birden fazla veritabanı kullanılmasına olanak tanır.
Şemanızı tanımladığınız yer veritabanıdır. Ayrıca, veritabanına kimin erişebileceğini kontrol edebilir, özel şifreleme ayarlayabilir, optimize ediciyi yapılandırabilir ve saklama süresini ayarlayabilirsiniz.
Veritabanını oluşturmak için yine gcloud komut satırı aracını 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. Zil şemasını ve verilerini yükleme
Zil şemasını oluşturma
Şemayı ayarlamak için Spanner Studio'ya gidin:
Şemanın iki bölümü vardır. Öncelikle products
tablosunu eklemeniz gerekir. Bu ifadeyi kopyalayıp boş sekmeye yapıştırın.
Şema için şu 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<FLOAT32>,
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 modeli oluşturup VertexAI model uç noktalarına 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 göre 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 FLOAT32>, values ARRAY<FLOAT32>>,
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/text-embedding-004'
);
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/gemini-pro',
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örürsünüz:
Verileri yükleme
Artık veritabanınıza bazı ürünler eklemeniz gerekir. Spanner Studio'da yeni bir sekme açın ve 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 veriler yüklediniz.
Sıradaki
Ardından, ürün açıklamaları için gömme oluşturmak ve alakalı ürünleri aramak üzere metin arama isteğini gömmeye dönüştürmek amacıyla Gömme modeliyle entegrasyon gerçekleştireceksiniz.
5. Yerleştirilmiş öğelerle çalışma
Ürün açıklamaları için vektör yerleştirmeleri oluşturma
Benzerlik arama özelliğinin ürünlerde çalışması için ürün açıklamaları için yerleşimler 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.
Vektör aramayı kullanma
Bu örnekte, SQL sorgusu aracılığıyla doğal dil arama isteği göndereceksiniz. Bu sorgu, arama isteğini bir yerleştirmeye 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 şu şekilde görünmelidir:
Sorguda yalnızca stoktaki ürünlerle ilgilenme (inventoryCount > 0
) gibi ek filtreler kullanıldığını unutmayın.
Özet
Bu adımda, Spanner'ın VertexAI'daki modellerle entegrasyonundan yararlanarak SQL kullanarak ürün açıklaması gömmelerini ve arama isteği gömmesini oluşturdunuz. Ayrıca, arama isteğiyle eşleşen benzer ürünleri bulmak için bir vektör araması da yaptınız.
Sonraki Adımlar
Ardından, her ürün için özel bir yanıt oluşturmak üzere arama sonuçlarını bir LLM'ye beslemek için kullanalım.
6. LLM ile çalışma
Spanner, VertexAI'dan sunulan LLM modelleriyle entegrasyonu kolaylaştırır. Bu sayede geliştiriciler, mantığı uygulamanın yerine getirmesi yerine doğrudan LLM'lerle arayüz oluşturmak için SQL'i 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ına sahibiz.
Geliştirici, aşağıdaki istemi kullanarak ürünün kullanıcı için uygun olup olmadığıyla ilgili her sonuç için bir yanıt vermek ister:
"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 sorgu:
-- 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 şu şekilde görünmelidir:
İlk ürün, ürün açıklamasındaki yaş aralığı (2-4 yaş) nedeniyle 3 yaşındaki bir çocuğa uygundur. Diğer ürünler çok uygun değil.
Özet
Bu adımda, kullanıcıdan gelen istemlere temel yanıtlar oluşturmak için bir LLM ile çalıştınız.
Sonraki Adımlar
Ardından, vektör aramayı ölçeklendirmek için yapay sinir ağlarını nasıl kullanacağınızı öğrenelim.
7. Vektör aramasını ölçeklendirme
Önceki vektör arama örnekleri tam KNN vektör aramasından yararlanıyordu. Bu, Spanner verilerinizin çok özel alt kümelerini sorgulayabildiğinizde çok kullanışlıdır. Bu tür sorguların yüksek oranda bölümlenebilir olduğu söylenir.
Çok fazla bölümlenebilen iş yükleriniz yoksa ve çok fazla veriniz varsa arama performansını artırmak için ScaNN algoritmasından yararlanan ANN vektör aramasını kullanmak istersiniz.
Spanner'da bunu yapmak için iki şey yapmanız gerekir:
- Vektör dizini oluşturma
- Sorgunuzu, APPROX mesafe işlevlerini kullanacak şekilde değiştirin.
Vektör dizini oluşturma
Bu veri kümesinde bir vektör dizini oluşturmak için öncelikle her bir vektörün uzunluğunu tanımlamak üzere productDescriptionEmbeddings
sütununu değiştirmemiz gerekir. Bir sütuna vektör uzunluğunu eklemek için orijinal sütunu bırakıp yeniden oluşturmanız gerekir.
ALTER TABLE `products` DROP COLUMN `productDescriptionEmbedding`;
ALTER TABLE
`products` ADD COLUMN `productDescriptionEmbedding` ARRAY<FLOAT32>(vector_length=>768);
Ardından, daha önce çalıştırdığınız Generate Vector embedding
adımından yeniden yerleştirmeleri oluşturun.
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;
Sütun oluşturulduktan sonra dizini oluşturun:
CREATE VECTOR INDEX ProductDescriptionEmbeddingIndex
ON products(productDescriptionEmbedding)
WHERE productDescriptionEmbedding IS NOT NULL
OPTIONS (
distance_type = 'COSINE'
);
Yeni dizini kullanma
Yeni vektör dizini kullanmak için önceki yerleştirme sorgusunu biraz değiştirmeniz gerekir.
Orijinal sorgu şu şekildedir:
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;
Aşağıdaki değişiklikleri yapmanız gerekir:
- Yeni vektör dizini için bir dizin ipucu kullanın:
@{force_index=ProductDescriptionEmbeddingIndex}
COSINE_DISTANCE
işlev çağrısınıAPPROX_COSINE_DISTANCE
olarak değiştirin. Aşağıdaki nihai sorguda JSON seçeneklerinin de gerekli olduğunu unutmayın.- ML.PREDICT işlevinden ayrı olarak yerleştirmeleri oluşturun.
- Yerleştirmelerin sonuçlarını nihai sorguya kopyalayın.
Yerleştirilmiş öğeleri oluşturma
-- Generate the prompt embeddings
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)
)
)
Sorgudaki sonuçları vurgulayın ve kopyalayın.
Ardından, kopyaladığınız yerleştirmeleri yapıştırarak aşağıdaki sorguda <VECTOR>
değerini değiştirin.
-- Embedding query now using the vector index
SELECT productName, productDescription, inventoryCount,
APPROX_COSINE_DISTANCE(productDescriptionEmbedding, array<float32>[@VECTOR], options => JSON '{\"num_leaves_to_search\": 10}')
FROM products @{force_index=ProductDescriptionEmbeddingIndex}
WHERE productDescriptionEmbedding IS NOT NULL AND inventoryCount > 0
ORDER BY distance
LIMIT 5;
Şuna benzer bir görünümde olacaktır:
Özet
Bu adımda, şemanızı bir vektör dizini oluşturacak şekilde dönüştürdünüz. Ardından, vektör dizini kullanarak yapay sinir ağı araması yapmak için gömme sorgusunu yeniden yazdınız. Verileriniz vektör arama iş yüklerini ölçeklendirmek için büyüdükçe bu önemli bir adımdır.
Sonraki Adımlar
Ardından, temizleme işlemini gerçekleştirin.
8. Temizleme (isteğe bağlı)
Temizlemek için Cloud Console'un Cloud Spanner bölümüne gidip kod laboratuvarında oluşturduğumuz 'retail-demo
' örneğini silin.
9. Tebrikler!
Tebrikler, Spanner'ın yerleşik vektör arama özelliğini kullanarak başarıyla bir benzerlik araması yaptınız. Ayrıca, doğrudan SQL kullanarak üretken yapay zeka işlevi sağlamak için yerleştirme ve LLM modelleriyle çalışmanın ne kadar kolay olduğunu gördünüz.
Son olarak, vektör arama iş yüklerini ölçeklendirmek için ScaNN algoritmasının desteklediği ANN aramasını gerçekleştirme sürecini öğrendiniz.
Sırada ne var?
Spanner'ın tam en yakın komşu (KNN vektör arama) özelliği hakkında daha fazla bilgiyi burada bulabilirsiniz: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors
Spanner'ın yaklaşık en yakın komşu (ANN vektör arama) özelliği hakkında daha fazla bilgiyi burada bulabilirsiniz: https://cloud.google.com/spanner/docs/find-approximate-nearest-neighbors
Spanner'ın VertexAI entegrasyonunu kullanarak SQL ile online tahminler yapma hakkında daha fazla bilgiyi https://cloud.google.com/spanner/docs/ml adresinde bulabilirsiniz.