Mit Vertex AI nach Vektorähnlichkeiten suchen

Willkommen bei der Suche nach Vektorähnlichkeit von Firebase Data Connect – der Firebase-Implementierung der semantischen Suche, die in Google Vertex AI eingebunden werden kann.

Den Kern dieser Funktion bilden Vektoreinbettungen. Dabei handelt es sich um Arrays von Gleitkommazahlen, die die semantische Bedeutung von Text oder Medien darstellen. Wenn Sie eine Suche nach dem nächsten Nachbarn mit einer Eingabevektoreinbettung ausführen, können Sie alle semantisch ähnlichen Inhalte finden. Data Connect verwendet die pgvector-Erweiterung von PostgreSQL für diese Funktion.

Diese leistungsstarke semantische Suche unterstützt Anwendungsfälle wie Empfehlungssysteme und Suchmaschinen. Außerdem ist sie eine wichtige Komponente der retrieval-gestützten Generierung in generativen KI-Abläufen. Weitere Informationen finden Sie in der Vertex AI-Dokumentation.

Sie können die integrierte Unterstützung von Data Connect für die automatische Generierung von Vektor-Ebenen mithilfe der Embeddings API von Vertex AI nutzen oder diese API verwenden, um sie manuell zu generieren.

Vorbereitung

Einrichtung

Sie können zwischen einem lokalen Entwicklungsablauf (für Web-, Kotlin-Android- oder iOS-Entwickler) und einem IDX-Ablauf (für Webentwickler) wählen. Sie können für die Entwicklung eine lokale Datenbank oder Ihr Produktionsprojekt Data Connect und die zugehörige Cloud SQL for PostgreSQL-Instanz verwenden.

In dieser Anleitung wird davon ausgegangen, dass Sie Ihr Data Connect-Projekt anhand der Kurzanleitung erstellt haben.

Mit lokalem PostgreSQL-Server integrieren

  1. Richten Sie eine lokale PostgreSQL-Instanz ein.
  2. Gewähren Sie sich selbst die IAM-Rolle „Vertex AI-Nutzer“.
  3. Richten Sie Standardanmeldedaten für Google Cloud-Anwendungen in Ihrer Umgebung ein.
  4. Installieren Sie die pgvector-Erweiterung in Ihrer lokalen PostgreSQL-Instanz.
  5. Aktiviere die Erweiterung mit CREATE EXTENSION vector gemäß der Anleitung im pgvectorRepository.

In IDX einbinden

  1. Richten Sie Ihren IDX-Arbeitsbereich mithilfe der Data Connect-Vorlage ein.
  2. Weisen Sie sich die IAM-Rolle Vertex AI User zu.
  3. Aktiviere die Erweiterung mit CREATE EXTENSION vector gemäß der Anleitung im pgvectorRepository.

Schema entwerfen

Fügen Sie Ihrem Schema ein neues Feld vom Typ Vector hinzu, um eine Vektorsuche durchzuführen. Wenn Sie beispielsweise eine semantische Suche mit Filmbeschreibungen durchführen möchten, fügen Sie ein Feld für die Vektoreinbettungen hinzu, die der Filmbeschreibung zugeordnet sind. In diesem Schema wird descriptionEmbedding hinzugefügt, um Vektoreinbettungen für das Feld description zu speichern.

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)
 // ...
}

Einbettungen generieren und abrufen

Data Connect bietet integrierte Unterstützung für Vektoreinbettungen mit dem Serverwert _embed. Dadurch wird Data Connect angewiesen, Vektoreinbettungen durch internes Aufrufen der Embedding APIs von Vertex AI zu generieren. Der Wert _embed für den Server kann sowohl in Mutationen als auch in Abfragen verwendet werden.

Mutationen

Einbettung über Data Connect generieren und speichern

In Ihrer Vektorsuchanwendung möchten Sie wahrscheinlich anfordern, dass Einbettungen generiert werden, sobald Sie Ihrer Datenbank Einträge hinzugefügt haben. Hier ist eine createMovie-Mutation, die der Tabelle Movie einen Filmeintrag hinzufügt und auch eine Filmbeschreibung mit einer angegebenen Einbettung model übergibt.

mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
  movie_insert(data: {
    ...movieData,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.description}
  })
}

In einigen Fällen kann es erforderlich sein, die Filmbeschreibung und die Einbettung zu aktualisieren.

mutation updateDescription($id: String!, $description: String!) {
  movie_update(id: $id, data: {
    description: $description,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
  })
}

So rufen Sie die letzte Mutation von einem Client aus auf:

import { updateMovieDescriptionWithEmbed } from 'lib/dataconnect-sdk/';

await updateMovieDescriptionWithEmbed({ id: movieId, description: description});

// Use the response

Abfragen

Rufen Sie Vektoreinbettungen mit einer Abfrage wie der folgenden ab. Hinweis: Der von der Abfrage zurückgegebene Wert descriptionEmbedding ist ein Array von Gleitkommazahlen, das in der Regel nicht menschenlesbar ist. Daher wird die direkte Rückgabe bei mit Data Connect generierten SDKs nicht unterstützt.

Sie können zurückgegebene Vektoreinbettungen verwenden, um eine Ähnlichkeitssuche durchzuführen, wie im nächsten Abschnitt beschrieben.

query getMovieDescription($id: String!) @auth(is: PUBLIC) {
 movie(id: $id)
   id
   description
   descriptionEmbedding
}

Ähnlichkeitssuche durchführen

Jetzt können wir eine Ähnlichkeitssuche durchführen.

Für jedes Vector-Feld generiert Data Connect eine GraphQL-Funktion, die die Ähnlichkeitssuche implementiert. Der Name dieser generierten Funktion lautet ${pluralType}_${vectorFieldName}_similarity. Es werden einige Parameter unterstützt, wie in den folgenden Beispielen und in der Referenzliste gezeigt.

Sie können eine GraphQL-Funktion definieren, die die Ähnlichkeitssuche aufruft. Wie bereits erwähnt, weist der _embed-Serverwert Data Connect an, die Vektoreinbettungen mithilfe der Einbettungs-APIs von Vertex AI zu generieren. In diesem Fall werden Einbettungen für den Suchstring erstellt, der mit den Einbettungen der Filmbeschreibungen verglichen wird.

In diesem Beispiel gibt die Ähnlichkeitssuche bis zu 5 Filme zurück, deren Beschreibung semantisch der Eingabeabfrage semantisch am nächsten liegt. Die Ergebnismenge wird in aufsteigender Reihenfolge nach der Entfernung sortiert, also vom Nächsten zum Weiten.

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
      }
  }

Ähnlichkeitsabfrage aufrufen

So rufen Sie eine Ähnlichkeitssuche aus dem Clientcode auf:

import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';

const response = await searchMovieDescriptionUsingL2similarity({ query });

// Use the response

Benutzerdefinierte Einbettungen verwenden

Mit Data Connect können Sie Einbettungen auch direkt als Vectors verwenden, anstatt sie mit dem Serverwert _embed zu generieren.

Benutzerdefinierte Einbettung speichern

Geben Sie mit der Vertex Embeddings API ein passendes Modell an und fordern Sie Einbettungsergebnisse der richtigen Dimension an.

Wandeln Sie dann das zurückgegebene Array von Floats in ein Vector um, um es an den Aktualisierungsvorgang zum Speichern weiterzugeben.

mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
  movie_update(id: $id, data: {
    // title, genre...
    description: $description,
    descriptionEmbedding: $descriptionEmbedding
  })
}

Ähnlichkeitssuche mit benutzerdefinierten Einbettungen durchführen

Führen Sie dieselben Schritte aus, um Einbettungen für Suchbegriffe abzurufen und in Vectors umzuwandeln.

Rufen Sie dann die _similarity-Abfrage auf, um die einzelnen Suchanfragen auszuführen.

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
      }
  }

In der Produktion bereitstellen

Schema und Connector bereitstellen

Der letzte Schritt in einer typischen Data Connect-Iteration besteht darin, Ihre Assets in der Produktion bereitzustellen.

Wenn Sie Ihr Schema mit Vector-Typen mit dem Befehl firebase deploy in Cloud SQL bereitstellen, werden mit der Firebase CLI die erforderlichen Schritte ausgeführt, um die Vertex AI-basierte Generierung von Einbettungen in Ihrer Cloud SQL-Instanz zu aktivieren.

firebase deploy --only dataconnect

Wenn Sie die Einbettungsunterstützung in Ihrer CloudSQL-Instanz manuell aktivieren möchten oder ein Befehlszeilenfehler auftritt, folgen Sie dieser Anleitung.

Syntax der Vektorsuche

Schemaerweiterungen

Der Datentyp Vector von Data Connect ist dem vector-Typ von PostgreSQL zugeordnet, wie durch die Erweiterung pgvector definiert. Der Typ vector von pgvector wird als Array von Gleitkommazahlen mit einfacher Genauigkeit in PostgreSQL gespeichert.

In Data Connect wird der Typ Vector als Array von JSON-Zahlen dargestellt. Eingaben werden in ein Array von float32-Werten umgewandelt. Wenn die Umwandlung fehlschlägt, wird ein Fehler ausgegeben.

Verwenden Sie den Parameter „size“ der Direktive @col, um die Abmessungen des Vektors festzulegen.

type Question @table {
    text: String!
    category: String!
    textEmbedding: Vector! @col(size: 768)
}

size wird nur für Vector-Typen unterstützt. Für Vector-Vorgänge wie die Ähnlichkeitssuche müssen alle Vectors die gleiche Anzahl von Dimensionen haben.

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

_embed-Serverwert für Abfragen und Mutationen

_embed

Dieser Serverwert weist den Data Connect-Dienst an, Einbettungen mithilfe der Embedding APIs von Vertex AI zu generieren und zu speichern. Dieser Serverwert kann sowohl für Abfragen als auch für Mutationen verwendet werden.

Parameter für die Ähnlichkeitssuche

method: COSINE|INNER_PRODUCT|L2

Die Entfernungsfunktion, die für die Suche nach nächsten Nachbarn verwendet wird. Die derzeit unterstützten Algorithmen sind eine Teilmenge der pgvector-Suchalgorithmen.

within: float

Eine Einschränkung der Entfernung, innerhalb derer die Suche nach dem nächsten Nachbarn durchgeführt wird.

where: FDC filter condition

Weitere Informationen finden Sie im Leitfaden zu Schemas, Abfragen und Mutationen.

limit: int

Die Anzahl der zurückzugebenden Ergebnisse.