Firebase Data Connect'ın vektör benzerliği aramasına hoş geldiniz. Firebase'ın Google Vertex AI ile entegre olan semantik arama uygulaması budur.
Bu özelliğin temelinde, metnin veya medyanın anlamsal anlamını temsil eden kayan noktalı sayı dizileri olan vektör yerleştirmeleri vardır. Giriş vektör yerleşimini kullanarak en yakın komşu araması yaparak 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ü semantik arama, öneri motorları ve arama motorları gibi kullanım alanlarını destekleyebilir. Ayrıca, üretken yapay zeka akışlarındaki arama destekli üretim için de önemli bir bileşendir. Daha fazla bilgi edinmek için Vertex AI belgelerini inceleyebilirsiniz.
Vertex AI'ın Embeddings API'sini kullanarak vektör gömmelerini otomatik olarak oluşturmak için Data Connect'ün yerleşik desteğinden yararlanabilir veya bunları manuel olarak oluşturmak için bu API'yi kullanabilirsiniz.
Ön koşullar
Projeniz için Data Connect'i ayarlayın.
Vertex AI API'lerini etkinleştirin.
Kurulum
Yerel geliştirme akışı (web, Kotlin Android veya iOS geliştiriciyseniz) ile IDX akışı (web geliştiricileri için) arasından seçim yapabilirsiniz. Geliştirme için yerel bir veritabanı veya üretim Data Connect projenizi ve PostgreSQL için Cloud SQL örneğini kullanabilirsiniz.
Bu talimatlarda, Data Connect projenizi hızlı başlangıç kılavuzundaki talimatları uygulayarak oluşturduğunuz varsayılmaktadı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 Uygulama Varsayılan Kimlik Bilgileri'ni ayarlayın.
- Yerel PostgreSQL örneğinize
pgvector
uzantısını yükleyin. pgvector
depo talimatlarına göreCREATE EXTENSION vector
kullanarak uzantıyı etkinleştirin.
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.
pgvector
depo talimatlarına göreCREATE EXTENSION vector
kullanarak uzantıyı etkinleştirin.
Şemanızı tasarlama
Vektör araması yapmak için şemanıza Vector
türüne sahip 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 barındıracak bir alan ekleyin. Bu şemada, description
alanı için vektör yerleştirmelerini depolamak üzere descriptionEmbedding
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, Data Connect'ü Vertex AI'ın gömme API'lerini dahili olarak çağırarak vektör gömmelerini 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ğinizde gömmelerin oluşturulmasını istemeniz olasıdır. Aşağıda, Movie
tablosuna film kaydı ekleyen ve ayrıca belirli bir yerleştirme model
içeren film açıklaması aktaran bir createMovie
mutasyonu verilmiştir.
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ştirilmesini güncellemeniz gerekebilir.
mutation updateDescription($id: String!, $description: String!) {
movie_update(id: $id, data: {
description: $description,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
})
}
İkinci mutasyonu bir müşteriden ç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 alın. Sorgu tarafından döndürülen descriptionEmbedding
değerinin, genellikle kullanıcı tarafından okunamayan bir kayan nokta dizisi olduğunu unutmayın. Bu nedenle, Data Connect tarafından oluşturulan SDK'lar doğrudan döndürmeyi desteklemez.
Benzerlik araması yapmak için döndürülen vektör yerleştirmelerini kullanabilirsiniz. Bu konu sonraki bölümde açıklanmıştır.
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. 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'ü Vertex AI'ın Embedding API'lerini kullanarak vektör gömmelerini oluşturmaya yönlendirir. Bu durumda, film açıklaması gömmeleriyle karşılaştırma için kullanılan arama dizesi için gömme oluşturması istenir.
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, mesafeye göre artan düzende (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},
method: L2,
within: 2,
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
}
}
Benzerlik sorgusunu çağırma
Benzerlik aramasını istemci kodundan çağırmak için:
import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';
const response = await searchMovieDescriptionUsingL2similarity({ query });
// Use the response
Özel yerleştirmeler kullanma
Data Connect, yerleştirmeleri oluşturmak için _embed
sunucu değerini kullanmak yerine doğrudan Vector
olarak yerleştirmelerle çalışmanıza da olanak tanır.
Özel yerleşimi depolama
Vertex Embeddings API'yi kullanarak eşleşen bir model belirtin ve doğru boyuttaki yerleştirme sonuçlarını isteyin.
Ardından, depolama alanı için güncelleme işlemine iletmek üzere döndürülen kayan nokta dizisiyi bir 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ştirmeler kullanarak benzerlik araması yapma
Arama terimlerinin yerleştirmelerini almak ve bunları Vectors
değerine 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 iterasyonundaki son adım, öğelerinizi üretime dağıtmaktır.
firebase deploy
komutunu kullanarak Vector
türleri içeren şemanızı CloudSQL'a dağıtırken Firebase CLI, CloudSQL örneğinizde Vertex AI tabanlı yerleşik oluşturma özelliğini etkinleştirmek için gerekli adımları atar.
firebase deploy --only dataconnect
CloudSQL örneğinizde yerleşik desteği manuel olarak etkinleştirmek istiyorsanız veya CLI hatasıyla karşılaşırsanız bu talimatları uygulayın.
Vektör araması söz dizimi
Şema uzantıları
Data Connect'ın Vector
veri türü, pgvector
uzantısı tarafından tanımlandığı şekilde PostgreSQL'in vector
türüne eşlenir. pgvector'ın vector
türü, PostgreSQL'de tek hassasiyetli kayan noktalı sayı dizisi olarak depolanır.
Data Connect içinde Vector
türü, JSON sayı dizisi olarak temsil edilir. Girişler, float32
değeri dizisi haline getirilir. Zorunlulaştırma başarısız olursa bir hata meydana gelir.
Vektörün boyutlarını ayarlamak için @col
yönergesinin size parametresini kullanın.
type Question @table {
text: String!
category: String!
textEmbedding: Vector! @col(size: 768)
}
size
yalnızca Vector
türleri için desteklenir. Benzerlik araması gibi Vector
işlemleri, 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 Gömme API'lerini kullanarak gömme oluşturmaya ve depolamaya yönlendirir. Bu sunucu değeri hem sorgularda hem de mutasyonlarda kullanılabilir.
Benzerlik araması için parametreler
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 yapıldığı mesafeyle ilgili bir kısıtlama.
where: FDC filter condition
Şema, sorgu ve mutasyon kılavuzuna bakın.
limit: int
Döndürülecek sonuç sayısı.