Vertex AI ile vektör benzerliği araması yapma

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 adımları uygulayarak oluşturduğunuz varsayılmaktadır.

Yerel PostgreSQL ile entegrasyon

  1. Yerel bir PostgreSQL örneği oluşturun.
  2. Kendinize Vertex AI kullanıcı IAM rolünü verin.
  3. Ortamınızda Google Cloud Uygulama Varsayılan Kimlik Bilgileri'ni ayarlayın.
  4. Yerel PostgreSQL örneğinize pgvector uzantısını yükleyin.
  5. pgvector depo talimatlarına göre CREATE EXTENSION vector kullanarak uzantıyı etkinleştirin.

IDX ile entegrasyon

  1. Veri Bağlantısı şablonunu kullanarak IDX çalışma alanınızı oluşturun.
  2. Kendinize Vertex AI kullanıcı IAM rolünü verin.
  3. pgvector depo talimatlarına göre CREATE 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 belirtilen bir yerleştirme model ile 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 alanına 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 Embedding API'lerini kullanarak yerleştirmeler 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ı.