Firebase Data Connect'nın vektör benzerliği aramasına hoş geldiniz. Bu, 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ılardan oluşan diziler olan vektör yerleştirmeleri yer alır. Giriş vektörü yerleştirmesini kullanarak en yakın komşu araması çalıştırarak semantik olarak benzer tüm içerikleri bulabilirsiniz. Data Connect, bu özellik için PostgreSQL'in pgvector
uzantısını kullanır.
Bu güçlü anlamsal arama, öneri motorları ve arama motorları gibi kullanım alanlarını destekleyebilir. Ayrıca, üretken yapay zeka akışlarında almayla artırılmış üretim için de önemli bir bileşendir. Daha fazla bilgi edinmek için Vertex AI belgelerine göz atabilirsiniz.
Data 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 Veri Bağlantısı'nı 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 Data Connect projenizi ve bu projenin PostgreSQL için Cloud SQL örneğini kullanabilirsiniz.
Bu talimatlarda, Data Connect projenizi hızlı başlangıç kılavuzundaki adımları uygulayarak oluşturduğunuz varsayılır.
Yerel PostgreSQL ile entegrasyon
- Yerel bir PostgreSQL örneği oluşturun.
- Kendinize Vertex AI kullanıcı IAM rolünü verin.
- Ortamınızda Google Cloud Uygulaması Varsayılan Kimlik Bilgileri'ni ayarlayın.
- Yerel PostgreSQL örneğinize
pgvector
uzantısını yükleyin. CREATE EXTENSION vector
kullanarak uzantıyı etkinleştirin (pgvector
depo talimatlarına göre).
IDX ile entegrasyon
- Veri Bağlantısı şablonunu kullanarak IDX çalışma alanınızı oluşturun.
- Kendinize Vertex AI kullanıcı IAM rolünü verin.
CREATE EXTENSION vector
kullanarak uzantıyı etkinleştirin (pgvector
depo 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ı için vektör yerleştirmelerini depolamak üzere description
alanı 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
Data Connect, _embed
sunucu değeriyle vektör yerleştirmeleri için entegre destek sunar. Bu işlem, Data Connect'yı Vertex AI'ın Embedding 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.
Değişiklikler
Data Connect aracılığıyla yerleştirilmiş öğe oluşturma ve depolama
Vektör arama uygulamanızda, veritabanınıza kayıt eklediğiniz anda gömmelerin oluşturulmasını istemeniz muhtemeldir. Aşağıda, createMovie
mutation, Movie
tablosuna bir film kaydı ekler ve belirtilen yerleştirme ile bir film açıklaması model
iletir.
mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
movie_insert(data: {
...movieData,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.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: "textembedding-gecko@003", text: $description}
})
}
İkinci mutasyonu bir istemciden çağırmak için:
import { updateMovieDescriptionWithEmbed } from 'lib/dataconnect-sdk/';
await updateMovieDescriptionWithEmbed({ 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, Data Connect 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(is: PUBLIC) {
movie(id: $id)
id
description
descriptionEmbedding
}
Benzerlik araması yapma
Artık benzerlik araması yapabiliriz.
Data Connect, her Vector
alanı için 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, Data Connect değerini Vertex AI'ın gömme API'lerini kullanarak vektör gömmeleri oluşturmaya yönlendirir. Bu durumda, film açıklaması gömmeleriyle karşılaştırma için kullanılan arama dizesi için gömmeler oluşturulur.
Bu örnekte, benzerlik araması, açıklaması giriş sorgusuna anlamsal olarak en yakın olan 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: "textembedding-gecko@003", 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 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 within
değerinden daha kısa mesafeye sahip sonuçlar dahil edilir:
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "textembedding-gecko@003", text: $query},
within: 2,
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
_metadata {
distance
}
}
}
Ayrıca, method
parametresini ayarlayarak farklı mesafe işlevlerini deneyebilirsiniz.
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "textembedding-gecko@003", 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
Data 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
'ya yayınlamak için 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 Data Connect yinelemesindeki son adım, öğelerinizi üretim ortamına dağıtmaktır.
Vector
türlerini içeren şemanızı firebase deploy
komutunu kullanarak CloudSQL'e dağıtırken Firebase CLI, CloudSQL örneğinizde Vertex AI tabanlı yerleştirme oluşturmayı etkinleştirmek için gerekli adımları atar.
firebase deploy --only dataconnect
CloudSQL örneğinizde yerleştirme desteğini manuel olarak etkinleştirmek istiyorsanız veya bir CLI hatasıyla karşılaşırsanız bu talimatları uygulayın.
Vektör arama söz dizimi
Şema uzantıları
Data 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ılardan oluşan bir dizi olarak depolanır.
Data Connect içinde Vector
türü, JSON sayıları dizisi olarak gösterilir. Girişler, float32
değerlik bir diziye zorlanır. Zorlama 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ürleri için desteklenir. Vector
işlemleri (ör. benzerlik araması), tüm Vector
'lerin 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, Data 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 mesafe 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 mesafe üzerindeki 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ı.