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

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

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

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. 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ı.