1. Giriş
Derin öğrenmedeki son gelişmeler, metin ve diğer verilerin semantik anlamı yakalayacak şekilde temsil edilmesini mümkün kıldı. Bu durum, kullanıcının sorgusuyla en alakalı dokümanları bulmak için metnin vektör gösterimlerini (gömme olarak bilinir) kullanan vektör arama adı verilen yeni bir arama yaklaşımına yol açtı. Kullanıcıların genellikle öğeleri tam ürün veya marka adlarıyla değil, açıklamalarına, tarzlarına ya da bağlamlarına göre aradığı giyim arama gibi uygulamalarda geleneksel arama yerine vektör arama tercih edilir. Vektör benzerliği eşleştirme işlemi yapmak için Cloud Spanner veritabanını Vector Search ile entegre edebiliriz. Spanner ve Vector Search'ü birlikte kullanan müşteriler, Spanner'ın kullanılabilirliği, güvenilirliği ve ölçeği ile Vertex AI Vector Search'ün gelişmiş benzerlik arama özelliklerini birleştiren güçlü bir entegrasyon oluşturabilir. Bu arama, Vector Search dizinindeki öğelerin yerleştirmeleri karşılaştırılarak ve en benzer eşleşmeler döndürülerek gerçekleştirilir.
Kullanım Örneği
Hızla değişen trendlere, ürün aramalarına ve önerilere ayak uydurmaya çalışan bir moda perakendecisinde veri bilimci olduğunuzu düşünün. Buradaki zorluk, sınırlı kaynaklara ve veri silolarına sahip olmanızdır. Bu blog yayınında, giyim verilerinde benzerlik arama yaklaşımını kullanarak giyim önerisi kullanım alanının nasıl uygulanacağı gösterilmektedir.Aşağıdaki adımlar ele alınmaktadır:
- Spanner'dan alınan veriler
- ML.PREDICT kullanılarak giyim verileri için oluşturulan ve Spanner'da depolanan vektörler
- Dataflow ve iş akışı işleri kullanılarak Vector Search ile entegre edilmiş Spanner vektör verileri
- Kullanıcının girdiği giriş için benzerlik eşleşmesi bulmak üzere yapılan vektör araması
Kullanıcı giriş metnine göre giyim araması yapmak için bir demo web uygulaması oluşturacağız. Uygulama, kullanıcıların metin açıklaması girerek kıyafet aramasına olanak tanır.
Spanner'dan Vector Search dizinine:
Giyim aramayla ilgili veriler Spanner'da depolanır. Makine öğreniminde, doğrudan Spanner verilerinden Vertex AI Embeddings API'sini çağırırız. Ardından, bu verileri (envanter ve gömmeler) Vertex AI'ın Vector Search'üne toplu olarak yükleyen ve dizini yenileyen Dataflow ve Workflow işlerinden yararlanırız.
Dizinde kullanıcı sorguları çalıştırma:
Kullanıcı bir giyim açıklaması girdiğinde uygulama, Text Embeddings API'yi kullanarak yerleştirmeleri gerçek zamanlı olarak oluşturur. Bu, dizinden 10 alakalı ürün açıklaması bulmak için Vector Search API'ye giriş olarak gönderilir ve ilgili resmi gösterir.
Mimarisine Genel Bakış
Spanner-Vector Search uygulamasının mimarisi aşağıdaki 2 bölümlü şemada gösterilmektedir:
Spanner'dan Vector Search dizinine: 
Dizinde kullanıcı sorgularını çalıştırmak için istemci uygulaması:
Ne oluşturacaksınız?
Spanner'dan Vector Index'e:
- Kaynak verileri ve ilgili gömmeleri depolamak ve yönetmek için Spanner veritabanı
- Verileri (kimlik ve yerleştirmeler) Vertex AI Vector Search veritabanına toplu olarak yükleyen bir iş akışı işi.
- Dizinden alakalı ürün açıklamalarını bulmak için kullanılan bir Vector Search API.
Dizinde kullanıcı sorguları çalıştırma:
- Kullanıcıların giyim eşyalarının metin açıklamalarını girmesine olanak tanıyan, dağıtılan dizin uç noktasını kullanarak benzerlik araması yapan ve girişe en yakın giyim eşyalarını döndüren bir web uygulaması.
İşleyiş Şekli
Kullanıcı bir giyim eşyası metin açıklaması girdiğinde web uygulaması, açıklamayı Vector Search API'ye gönderir. Ardından Vector Search API, dizindeki en alakalı ürün açıklamalarını bulmak için giyim açıklamalarının yerleştirmelerini kullanır. Ardından, ürün açıklamaları ve ilgili resimler kullanıcıya gösterilir. Genel iş akışı şu şekildedir:
- Spanner'da depolanan veriler için yerleştirmeler oluşturun.
- Yerleştirmeleri dışa aktarıp bir vektör arama dizinine yükleyin.
- En yakın komşu araması yaparak Vector Search dizininde benzer öğeler için sorgu oluşturun.
2. Şartlar
Başlamadan önce
- Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
- Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını kontrol etmeyi öğrenin.
- Gerekli tüm API'lerin (Cloud Spanner, Vertex AI, Google Cloud Storage) etkinleştirildiğinden emin olun.
- Google Cloud'da çalışan ve gcloud'un önceden yüklendiği bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız. gcloud komutları ve kullanımı için belgelere bakın. Projeniz ayarlanmamışsa ayarlamak için aşağıdaki komutu kullanın:
gcloud config set project <YOUR_PROJECT_ID>
- Başlamak için etkin Google Cloud projenizle Cloud Spanner sayfasına gidin.
3. Arka uç: Spanner veri kaynağınızı ve yerleştirmelerinizi oluşturma
Bu kullanım alanında Spanner veritabanı, giyim envanterini ilgili resim ve açıklamalarla birlikte barındırır. Metin açıklaması için yerleştirilmiş öğeler oluşturduğunuzdan ve bunları Spanner veritabanınızda ARRAY<float64> olarak depoladığınızdan emin olun.
- Spanner verilerini oluşturma
"spanner-vertex" adlı bir örnek ve "spanner-vertex-embeddings" adlı bir veritabanı oluşturun. DDL kullanarak tablo oluşturma:
CREATE TABLE
apparels ( id NUMERIC,
category STRING(100),
sub_category STRING(50),
uri STRING(200),
content STRING(2000),
embedding ARRAY<FLOAT64>
)
PRIMARY KEY
(id);
- INSERT SQL'i kullanarak tabloya veri ekleme
Örnek veriler için ekleme komut dosyalarını burada bulabilirsiniz.
- Create Text Embeddings modelini oluşturma
Girişteki içerik için yerleştirmeler oluşturabilmemiz için bu gereklidir. Aşağıda aynı öğe için DDL verilmiştir:
CREATE MODEL text_embeddings INPUT(content STRING(MAX))
OUTPUT(
embeddings
STRUCT<
statistics STRUCT<truncated BOOL, token_count FLOAT64>,
values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/abis-345004/locations/us-central1/publishers/google/models/textembedding-gecko');
- Kaynak veriler için metin yerleştirmeleri oluşturma
Yerleştirilmiş öğeleri depolamak için bir tablo oluşturun ve oluşturulan yerleştirilmiş öğeleri tabloya ekleyin. Gerçek dünyadaki bir veritabanı uygulamasında, 2. adıma kadar olan Spanner'a veri yükleme işlemi işlemsel olur. Tasarım en iyi uygulamalarını korumak için işlem tablolarını normalleştirilmiş tutmayı tercih ediyorum. Bu nedenle, yerleştirmeler için ayrı bir tablo oluşturuyorum.
CREATE TABLE apparels_embeddings (id string(100), embedding ARRAY<FLOAT64>)
PRIMARY KEY (id);
INSERT INTO apparels_embeddings(id, embeddings)
SELECT CAST(id as string), embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT id, content from apparels)
) ;
Toplu içerik ve yerleştirmeler hazır olduğuna göre, vektör aramasının gerçekleştirilmesine yardımcı olacak yerleştirmeleri depolamak için bir Vector Search dizini ve uç noktası oluşturalım.
4. İş akışı işi: Spanner verilerini Vector Search'e aktarma
- Cloud Storage paketi oluşturma
Bu, Spanner'daki yerleştirmeleri Vector Search'ün giriş olarak beklediği bir JSON biçiminde GCS paketinde depolamak için gereklidir. Spanner'daki verilerinizle aynı bölgede bir paket oluşturun. Gerekirse klasörün içinde bir klasör oluşturun ancak esas olarak klasörde empty.json adlı boş bir dosya oluşturun.
- Cloud Workflow'u ayarlama
Spanner'dan Vertex AI Vector Search dizinine toplu dışa aktarma ayarlamak için:
Boş bir dizin oluşturma:
Vector Search dizininin, Cloud Storage paketi ve verilerle aynı bölgede olduğundan emin olun. Dizinleri yönet sayfasındaki Toplu güncelleme için dizin oluşturma bölümünde, konsol sekmesindeki 11 talimat adımını uygulayın. contentsDeltaUri'ye iletilen klasörde, bu dosya olmadan dizin oluşturamayacağınız için empty.json adlı boş bir dosya oluşturun. Bu işlem boş bir dizin oluşturur.
Dizininiz varsa bu adımı atlayabilirsiniz. İş akışı, dizininizin üzerine yazar.
Not: Boş bir dizini uç noktaya dağıtamazsınız. Bu nedenle, vektör verilerini Cloud Storage'a aktardıktan sonra, uç noktaya dağıtma adımını daha sonraki bir adıma erteliyoruz.
Bu Git deposunu klonlayın: Git deposunu klonlamanın birden fazla yolu vardır. Bunlardan biri, GitHub CLI'yı kullanarak aşağıdaki komutu çalıştırmaktır. Cloud Shell terminalinde aşağıdaki 2 komutu çalıştırın:
gh repo clone cloudspannerecosystem/spanner-ai
cd spanner-ai/vertex-vector-search/workflows
Bu klasörde iki dosya var
batch-export.yaml: Bu, iş akışı tanımıdır.sample-batch-input.json: Bu, iş akışı giriş parametrelerinin bir örneğidir.
Örnek dosyadan input.json dosyasını oluşturun: Öncelikle örnek JSON'u kopyalayın.
cp sample-batch-input.json input.json
Ardından input.json simgesini projenizin ayrıntılarıyla düzenleyin. Bu durumda JSON'unuz aşağıdaki gibi olmalıdır:
{
"project_id": "<<YOUR_PROJECT>>",
"location": "<<us-central1>>",
"dataflow": {
"temp_location": "gs://<<YOUR_BUCKET>>/<<FOLDER_IF_ANY>>/workflow_temp"
},
"gcs": {
"output_folder": "gs://<<YOUR_BUCKET>>/<<FOLDER_IF_ANY>>/workflow_output"
},
"spanner": {
"instance_id": "spanner-vertex",
"database_id": "spanner-vertex-embeddings",
"table_name": "apparels_embeddings",
"columns_to_export": "embedding,id"
},
"vertex": {
"vector_search_index_id": "<<YOUR_INDEX_ID>>"
}
}
Kurulum İzinleri
Üretim ortamları için yeni bir hizmet hesabı oluşturmanızı ve bu hesaba hizmeti yönetmek için gereken minimum izinleri içeren bir veya daha fazla IAM rolü vermenizi önemle tavsiye ederiz. Spanner'dan (yerleştirmeler) Vector Search dizinine veri aktarma iş akışını ayarlamak için aşağıdaki roller gereklidir:
Varsayılan olarak Compute Engine varsayılan hizmet hesabı kullanılır.
Manuel olarak yapılandırılmış bir hizmet hesabı kullanıyorsanız aşağıdaki rolleri eklemeniz gerekir:
Bir Dataflow işini tetiklemek için: Dataflow Yöneticisi, Dataflow Çalışanı.
Bir Dataflow çalışanı hizmet hesabının kimliğine bürünmek için: Hizmet Hesabı Kullanıcısı
Günlük yazmak için: Günlük Yazıcı
Vertex AI Vector Search'ün yeniden oluşturulmasını tetiklemek için: Vertex AI Kullanıcısı
Dataflow Çalışan Hizmet Hesabı:
Manuel olarak yapılandırılmış bir hizmet hesabı kullanıyorsanız aşağıdaki rolleri eklemeniz gerekir:
Dataflow'u yönetmek için: Dataflow Yöneticisi, Dataflow Çalışanı. Spanner'dan veri okumak için: Cloud Spanner Veritabanı Okuyucusu. Seçilen GCS Container Registry üzerinde yazma erişimi: GCS Storage Bucket Owner.
- Bulut iş akışını dağıtma
İş akışı YAML dosyasını Google Cloud projenize dağıtın. İş akışı yürütüldüğünde çalışacağı bölgeyi veya konumu yapılandırabilirsiniz.
gcloud workflows deploy vector-export-workflow --source=batch-export.yaml --location="us-central1" [--service account=<service_account>]
or
gcloud workflows deploy vector-export-workflow --source=batch-export.yaml --location="us-central1"
İş akışı artık Google Cloud Console'daki İş akışları sayfasında görünür olmalıdır.
Not: İş akışını Google Cloud Console'dan da oluşturup dağıtabilirsiniz. Cloud Console'daki istemleri uygulayın. İş akışı tanımı için batch-export.yaml dosyasının içeriğini kopyalayıp yapıştırın.
Bu işlem tamamlandıktan sonra, veri dışa aktarma işleminin başlaması için iş akışını yürütün.
- Cloud İş Akışını Yürütme
İş akışını yürütmek için aşağıdaki komutu çalıştırın:
gcloud workflows execute vector-export-workflow --data="$(cat input.json)"
Yürütme, İş Akışları'ndaki Yürütmeler sekmesinde gösterilir. Bu işlem, verilerinizi Vector Search veritabanına yükleyip dizine ekler.
Not: Yürütme işlemini konsoldan Yürüt düğmesini kullanarak da yapabilirsiniz. İstemleri uygulayın ve giriş için özelleştirilmiş input.json dosyanızın içeriğini kopyalayıp yapıştırın.
5. Vector Search dizinini dağıtma
Dizini bir uç noktaya dağıtma
Dizini dağıtmak için aşağıdaki adımları uygulayabilirsiniz:
- Vector Search dizinleri sayfasında, önceki bölümün 2. adımında oluşturduğunuz dizinin yanında DEPLOY (DAĞIT) düğmesini görmeniz gerekir. Alternatif olarak, dizin bilgileri sayfasına gidip UÇ NOKTAYA DAĞIT düğmesini tıklayabilirsiniz.
- Gerekli bilgileri sağlayın ve dizini bir uç noktaya dağıtın.
Alternatif olarak, bir uç noktaya dağıtmak için bu not defterine bakabilirsiniz (not defterinin dağıtım bölümüne gidin). Dağıtım tamamlandıktan sonra dağıtılan dizin kimliğini ve uç nokta URL'sini not edin.
6. Ön uç: Kullanıcı verilerini Vector Search'e aktarma
Uygulamamızı hızlıca test etmek için Gradio destekli bir kullanıcı deneyimiyle basit bir Python uygulaması oluşturalım: Bu demo uygulamasını kendi Colab not defterinizde uygulamak için buradaki uygulamaya başvurabilirsiniz.
- Yerleştirme API'sini çağırmak ve Vector Search dizin uç noktasını etkinleştirmek için aiplatform Python SDK'sını kullanacağız.
# [START aiplatform_sdk_embedding]
!pip install google-cloud-aiplatform==1.35.0 --upgrade --quiet --user
import vertexai
vertexai.init(project=PROJECT_ID, location="us-central1")
from vertexai.language_models import TextEmbeddingModel
import sys
if "google.colab" in sys.modules:
# Define project information
PROJECT_ID = " " # Your project id
LOCATION = " " # Your location
# Authenticate user to Google Cloud
from google.colab import auth
auth.authenticate_user()
- Gradio'yu kullanarak, kullanıcı arayüzüyle hızlı ve kolay bir şekilde oluşturduğumuz yapay zeka uygulamasının demosunu yapacağız. Bu adımı uygulamadan önce çalışma zamanını yeniden başlatın.
!pip install gradio
import gradio as gr
- Kullanıcı girişi üzerine web uygulamasından Embeddings API'yi çağırın. textembedding-gecko@latest metin yerleştirme modelini kullanacağız.
Aşağıdaki yöntem, Text Embedding Model'i çağırır ve kullanıcı tarafından girilen metnin vektör yerleştirmelerini döndürür:
def text_embedding(content) -> list:
"""Text embedding with a Large Language Model."""
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@latest")
embeddings = model.get_embeddings(content)
for embedding in embeddings:
vector = embedding.values
#print(f"Length of Embedding Vector: {len(vector)}")
return vector
Test etme
text_embedding("red shorts for girls")
Aşağıdakine benzer bir çıkış görmeniz gerekir (Lütfen resmin yüksekliğinin kırpıldığını, bu nedenle vektör yanıtının tamamını göremediğinizi unutmayın):

- Dağıtılan dizin kimliğini ve uç nokta kimliğini bildirin
from google.cloud import aiplatform
DEPLOYED_INDEX_ID = "spanner_vector1_1702366982123"
#Vector Search Endpoint
index_endpoint = aiplatform.MatchingEngineIndexEndpoint('projects/273845608377/locations/us-central1/indexEndpoints/2021628049526620160')
- Dizin uç noktasını çağırmak ve sonucu, kullanıcı giriş metnine karşılık gelen yerleştirme yanıtı için en yakın 10 eşleşmeyle göstermek üzere Vector Search yöntemini tanımlayın.
Vektör Arama'nın aşağıdaki yöntem tanımında, en yakın 10 vektörü belirlemek için find_neighbors yönteminin çağrıldığını unutmayın.
def vector_search(content) -> list:
result = text_embedding(content)
#call_vector_search_api(content)
index_endpoint = aiplatform.MatchingEngineIndexEndpoint('projects/273845608377/locations/us-central1/indexEndpoints/2021628049526620160')
# run query
response = index_endpoint.find_neighbors(
deployed_index_id = DEPLOYED_INDEX_ID,
queries = [result],
num_neighbors = 10
)
out = []
# show the results
for idx, neighbor in enumerate(response[0]):
print(f"{neighbor.distance:.2f} {spanner_read_data(neighbor.id)}")
out.append(f"{spanner_read_data(neighbor.id)}")
return out
Ayrıca, spanner_read_data yöntemine yapılan çağrıyı da göreceksiniz. Bunu sonraki adımda inceleyelim.
- Son adımda döndürülen en yakın komşu vektörlerinin kimliklerine karşılık gelen resimleri ayıklamak için execute_sql yöntemini çağıran Spanner okuma verileri yöntemi uygulamasını tanımlayın.
!pip install google-cloud-spanner==3.36.0
from google.cloud import spanner
instance_id = "spanner-vertex"
database_id = "spanner-vertex-embeddings"
projectId = PROJECT_ID
client = spanner.Client()
client.project = projectId
instance = client.instance(instance_id)
database = instance.database(database_id)
def spanner_read_data(id):
query = "SELECT uri FROM apparels where id = " + id
outputs = []
with database.snapshot() as snapshot:
results = snapshot.execute_sql(query)
for row in results:
#print(row)
#output = "ID: {}, CONTENT: {}, URI: {}".format(*row)
output = "{}".format(*row)
outputs.append(output)
return "\n".join(outputs)
Seçilen vektörlere karşılık gelen resimlerin URL'lerini döndürmelidir.
- Son olarak, parçaları bir kullanıcı arayüzünde bir araya getirelim ve Vector Search sürecini tetikleyelim.
from PIL import Image
def call_search(query):
response = vector_search(query)
return response
input_text = gr.Textbox(label="Enter your query. Examples: Girls Tops White Casual, Green t-shirt girls, jeans shorts, denim skirt etc.")
output_texts = [gr.Image(label="") for i in range(10)]
demo = gr.Interface(fn=call_search, inputs=input_text, outputs=output_texts, live=True)
resp = demo.launch(share = True)
Sonucu aşağıdaki gibi görmeniz gerekir:

Resim: Bağlantı
Sonuç videosunu buradan izleyebilirsiniz.
7. Temizleme
Bu yayında kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız şu adımları uygulayın:
- Google Cloud Console'da Kaynakları yönetin sayfasına gidin.
- Proje listesinde silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
- İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.
- Projeyi silmek istemiyorsanız bu proje için yeni oluşturduğunuz örneğe gidip örnek genel bakış sayfasının sağ üst köşesindeki ÖRNEĞİ SİL düğmesini tıklayarak Spanner örneğini silin.
- Ayrıca Vector Search dizinine gidebilir, uç noktanın ve dizinin dağıtımını kaldırabilir ve dizini silebilirsiniz.
8. Sonuç
Tebrikler! Aşağıdaki adımları uygulayarak Spanner - Vertex Vector Search uygulamasını başarıyla tamamladınız:
- Spanner veritabanından alınan uygulamalar için Spanner veri kaynağı ve yerleştirmeler oluşturma.
- Vector Search veritabanı dizini oluşturma.
- Dataflow ve iş akışı işlerini kullanarak Spanner'daki vektör verilerini Vector Search ile entegre etme.
- Dizini bir uç noktaya dağıtma
- Son olarak, Vertex AI SDK'nın Python destekli bir uygulamasında kullanıcı girişinde Vector Search'ü çağırma.
Uygulamayı kendi kullanım alanınıza göre genişletebilir veya mevcut kullanım alanını yeni özelliklerle geliştirebilirsiniz. Spanner'ın makine öğrenimi özellikleri hakkında daha fazla bilgiyi burada bulabilirsiniz.