Firebase SQL Connect'nın vektör benzerliği aramasına hoş geldiniz. Firebase'in, Google Vertex AI ile entegre olan semantik arama uygulamasıdır.
Bu özelliğin temelinde, metnin veya medyanın anlamsal anlamını temsil eden kayan noktalı sayı dizileri olan vektör yerleştirmeleri bulunur. Giriş vektörü yerleştirmesi kullanarak en yakın komşu araması yaparak anlamsal olarak benzer tüm içerikleri bulabilirsiniz. SQL Connect, bu özellik için PostgreSQL'in pgvector uzantısını kullanır.
Bu güçlü semantik arama, öneri motorları ve arama motorları gibi kullanım alanlarını destekleyebilir. Ayrıca, üretken yapay zeka akışlarında almaya dayalı üretkenlik (retrieval-augmented generation) için de önemli bir bileşendir. Daha fazla bilgi edinmek için Vertex AI belgelerine göz atabilirsiniz.
SQL Connect'nın Vertex AI'ın Embeddings API'si kullanılarak vektör yerleştirmelerinin otomatik olarak oluşturulması için yerleşik desteğinden yararlanabilir veya bunları manuel olarak oluşturmak için bu API'yi kullanabilirsiniz.
Ön koşullar
Projeniz için SQL Connect'i ayarlayın.
Vertex AI API'lerini etkinleştirin.
Kurulum
Yerel geliştirme akışı (web, Kotlin Android veya iOS geliştiricisiyseniz) ya da IDX akışı (web geliştiricileri için) arasında seçim yapabilirsiniz. Geliştirme için yerel bir veritabanı veya üretim SQL Connect projenizi ve PostgreSQL örneğini kullanabilirsiniz.Cloud SQL
Bu talimatlarda, SQL Connect projenizi hızlı başlangıç kılavuzunu izleyerek oluşturduğunuz varsayılır.
Yerel PostgreSQL ile entegrasyon
Yerel bir PostgreSQL örneği oluşturun.
Kendinize Vertex AI User IAM rolü verin.
Ortamınızda Google Cloud Uygulama Varsayılan Kimlik Bilgileri'ni ayarlayın.
Yerel PostgreSQL örneğinize
pgvectoruzantısını yükleyin.CREATE EXTENSION vectorsimgesini kullanarak uzantıyı etkinleştirin (pgvectordepo talimatlarına göre).
IDX ile entegrasyon
SQL Connect şablonunu kullanarak IDX çalışma alanınızı oluşturun.
Kendinize Vertex AI User IAM rolü verin.
CREATE EXTENSION vectorsimgesini kullanarak uzantıyı etkinleştirin (pgvectordepo talimatlarına göre).
Şemanızı tasarlama
Vektör araması yapmak için şemanıza Vector türünde yeni bir alan ekleyin. Örneğin, film açıklamalarını kullanarak semantik arama yapmak istiyorsanız film açıklamasıyla ilişkili vektör yerleştirmelerini tutacak bir alan ekleyin. Bu şemada, descriptionEmbedding alanı, description alanı için vektör yerleştirmelerini depolamak üzere eklenir.
type Movie @table {
id: ID! @col(name: "movie_id") @default(id: ID! @col(name: "movie_id") @default(expr: "uuidV4()")
title: String!
description: String
descriptionEmbedding: Vector! @col(size:768)
// ...
}
Yerleştirilmiş öğeler oluşturma ve alma
SQL Connect, _embed sunucu değeriyle vektör yerleştirmeleri için entegre destek sunar. Bu işlem, SQL Connect'yı Vertex AI'ın yerleştirme API'lerini dahili olarak çağırarak vektör yerleştirmeleri oluşturmaya yönlendirir. _embed
Sunucu değeri hem mutasyonlarda hem de sorgularda kullanılabilir.
Mutasyonlar
SQL Connect aracılığıyla yerleştirilmiş öğe oluşturma ve depolama
Vektör arama uygulamanızda, kayıtları veritabanınıza eklediğiniz anda yerleştirmelerin oluşturulmasını isteyebilirsiniz. createMovie
Mutasyon, Movie tablosuna bir film kaydı ekler ve belirtilen yerleştirmeyle birlikte bir film açıklaması da iletir model.
mutation createMovie($title: String!, $description: String!) {
movie_insert(data: {
title: $title,
description: $description,
descriptionEmbedding_embed: {model: "text-embedding-005", text: $description}
})
}
Bazı durumlarda film açıklamasını ve yerleştirmeyi güncellemek isteyebilirsiniz.
mutation updateDescription($id: String!, $description: String!) {
movie_update(id: $id, data: {
description: $description,
descriptionEmbedding_embed: {model: "text-embedding-005", text: $description}
})
}
İkinci mutasyonu bir istemciden çağırmak için:
import { updateMovieDescription } from 'lib/dataconnect-sdk/';
await updateMovieDescription({ id: movieId, description: description});
// Use the response
Sorgular
Aşağıdaki gibi bir sorgu kullanarak vektör yerleştirmelerini getirin. Sorgu tarafından döndürülen descriptionEmbedding değerinin, genellikle insanlar tarafından okunabilir olmayan bir kayan nokta dizisi olduğunu unutmayın. Bu nedenle, SQL Connect ile oluşturulan SDK'lar doğrudan geri döndürmeyi desteklemez.
Döndürülen vektör yerleştirmelerini, sonraki bölümde açıklandığı gibi benzerlik araması yapmak için kullanabilirsiniz.
query getMovieDescription($id: String!) @auth(level: PUBLIC) {
movie(id: $id)
id
description
descriptionEmbedding
}
Benzerlik araması yapma
Artık benzerlik araması yapabiliriz.
Vector alanı için SQL Connect, benzerlik aramasını uygulayan bir GraphQL işlevi oluşturur. Bu oluşturulan işlevin adı ${pluralType}_${vectorFieldName}_similarity. Aşağıdaki örneklerde ve referans listesinde gösterildiği gibi birkaç parametreyi destekler.
Benzerlik aramasını çağıran bir GraphQL işlevi tanımlayabilirsiniz. Yukarıda belirtildiği gibi, _embed sunucu değeri, bu durumda Vertex AI'ın yerleştirme API'lerini kullanarak vektör yerleştirmeleri oluşturmak için SQL Connect değerini yönlendirir. Bu durumda, film açıklaması yerleştirmeleriyle karşılaştırma için kullanılan arama dizesi için yerleştirmeler oluşturulur.
Bu örnekte, benzerlik araması, açıklaması giriş sorgusuna anlamsal olarak en yakın olan en fazla 5 filmi döndürür. Sonuç kümesi, mesafenin artan sırasına göre (en yakından en uzağa) sıralanır.
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "text-embedding-005", text: $query},
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
}
}
Benzerlik sorgusunu ayarlama
method ve within gibi arama parametrelerinin varsayılan değerleri çoğu kullanım alanında iyi performans gösterir. Ancak sorgunuzun çok farklı sonuçlar döndürdüğünü veya dahil edilmesini istediğiniz sonuçların eksik olduğunu fark ederseniz bu parametreleri ayarlamayı deneyin.
within için uygun bir değer bulmak amacıyla, her sonucun sorgu vektöründen ne kadar uzakta olduğunu görmek için seçilen alanlara _metadata.distance ekleyebiliriz. Döndürülen distance değerlerine göre within parametresini ayarlayabiliriz. Yalnızca mesafesi within değerinden daha az olan sonuçlar dahil edilir:
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "text-embedding-005", text: $query},
within: 2,
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
_metadata {
distance
}
}
}
method parametresini ayarlayarak farklı mesafe işlevlerini de deneyebilirsiniz.
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "text-embedding-005", text: $query},
within: .5,
method: COSINE,
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
_metadata {
distance
}
}
}
Farklı yöntemlerin mesafe için çok farklı değerler döndürdüğünü unutmayın: within değerini ayarladıysanız method değerini değiştirdikten sonra bu değeri tekrar ayarlamanız gerekir.
Benzerlik sorgusunu çağırma
İstemci kodundan benzerlik araması çağırmak için:
import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';
const response = await searchMovieDescriptionUsingL2similarity({ query });
// Use the response
Özel yerleştirmeleri kullanma
SQL Connect ayrıca, yerleştirmeleri oluşturmak için _embed sunucu değerini kullanmak yerine doğrudan Vector olarak kullanmanıza da olanak tanır.
Özel yerleştirme depolama
Vertex Embeddings API'yi kullanarak eşleşen bir model belirtin ve doğru boyutta yerleştirme sonuçları isteyin.
Ardından, depolama için güncelleme işlemine iletmek üzere döndürülen kayan nokta dizisini Vector olarak yayınlayın.
mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
movie_update(id: $id, data: {
// title, genre...
description: $description,
descriptionEmbedding: $descriptionEmbedding
})
}
Özel yerleştirmeleri kullanarak benzerlik araması yapma
Arama terimleri ve yayın için yerleştirmeleri almak ve bunları Vectors olarak yayınlamak üzere aynı işlemi gerçekleştirin.
Ardından, her aramayı gerçekleştirmek için _similarity sorgusunu çağırın.
query searchMovieDescriptionUsingL2Similarity($compare: Vector!, $within: Float, $excludesContent: String, $limit: Int) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare: $compare,
method: L2,
within: $within,
where: {content: {ne: $excludesContent}}, limit: $limit)
{
id
title
description
}
}
Üretime dağıtma
Şemanızı ve bağlayıcınızı dağıtma
Tipik bir SQL Connect yinelemesindeki son adım, öğelerinizi üretim ortamına dağıtmaktır.
Vector türlerini içeren şemanızı Cloud SQL'ye firebase deploy komutunu kullanarak dağıtırken Firebase CLI, Cloud SQL örneğinizde Vertex AI tabanlı yerleştirme oluşturmayı etkinleştirmek için gerekli adımları atar.
firebase deploy --only dataconnectCloud SQL örneğinizde yerleştirme desteğini manuel olarak etkinleştirmek veya bir CLI hatasıyla karşılaşmak istiyorsanız bu talimatları uygulayın.
Vector Search söz dizimi
Şema uzantıları
SQL Connect'nın Vector veri türü, pgvector uzantısı tarafından tanımlandığı şekilde PostgreSQL'in vector türüyle eşlenir.
pgvector'ın vector türü, PostgreSQL'de tek duyarlıklı kayan noktalı sayılar dizisi olarak depolanır.
SQL Connect içinde Vector türü, JSON sayılarından oluşan bir dizi olarak gösterilir. Girişler, float32 değerlerinden oluşan bir diziye dönüştürülür. Dönüştürme başarısız olursa hata oluşur.
Vektörün boyutlarını ayarlamak için @col yönergesinin boyut parametresini kullanın.
type Question @table {
text: String!
category: String!
textEmbedding: Vector! @col(size: 768)
}
size yalnızca Vector türlerinde desteklenir. Vector işlemleri (ör. benzerlik araması), tüm Vector'ların aynı sayıda boyuta sahip olmasını gerektirir.
directive @col(
# … existing args
"""
Defines a fixed column size for certain scalar types.
- For Vector, size is required.
- For all other types, size is currently unsupported and hence supplying it will result in a schema error.
"""
size: Int
) on FIELD_DEFINITION
Sorgular ve mutasyonlar için _embed sunucu değeri
_embed
Bu sunucu değeri, SQL Connect hizmetini Vertex AI'ın yerleştirme API'lerini kullanarak yerleştirmeler oluşturup depolamaya yönlendirir. Bu sunucu değeri hem sorgularda hem de mutasyonlarda kullanılabilir.
Benzerlik arama parametreleri
method: COSINE|INNER_PRODUCT|L2
Yakındaki komşuları aramak için kullanılan uzaklık işlevi. Şu anda desteklenen algoritmalar, pgvector arama algoritmalarının bir alt kümesidir.
within: float
En yakın komşu aramasının gerçekleştirildiği mesafeyle ilgili bir kısıtlama.
where: FDC filter condition
Şemalar, sorgular ve mutasyonlar kılavuzuna bakın.
limit: int
Döndürülecek sonuç sayısı.