Realiza una búsqueda de similitud vectorial con Vertex AI

Te damos la bienvenida a la búsqueda de similitud de vectores de Firebase Data Connect, la implementación de la búsqueda semántica de Firebase que se integra con Google Vertex AI.

En el centro de esta función se encuentran las incorporaciones vectoriales, que son arrays de números de punto flotante que representan el significado semántico de los textos o los elementos multimedia. Si ejecutas una búsqueda de vecino más cercano con una incorporación de vector de entrada, puedes encontrar todo el contenido semánticamente similar. Data Connect usa la extensión pgvector de PostgreSQL para esta función.

Esta potente búsqueda semántica puede impulsar casos de uso como motores de recomendaciones y motores de búsqueda. También es un componente clave en la generación con recuperación enriquecida en los flujos de IA generativa. La documentación de Vertex AI es un excelente recurso para obtener más información.

Puedes confiar en la compatibilidad integrada de Data Connect para generar incorporaciones de vectores automáticamente con la API de incorporaciones de Vertex AI, o bien usar esa API para generarlas de forma manual.

Requisitos previos

  • Configura Data Connect para tu proyecto.

  • Habilita las APIs de Vertex AI.

Configuración

Puedes elegir entre un flujo de desarrollo local (si eres desarrollador web, de Kotlin para Android o de iOS) o un flujo de IDX (para desarrolladores web). Puedes usar una base de datos local o tu proyecto Data Connect de producción y su instancia de Cloud SQL para PostgreSQL para el desarrollo.

En estas instrucciones, se da por sentado que creaste tu proyecto Data Connect siguiendo la guía de inicio rápido.

Integración con PostgreSQL local

  1. Configura una instancia local de PostgreSQL.
  2. Otórgate el rol de IAM de usuario de Vertex AI.
  3. Configura las credenciales predeterminadas de la aplicación de Google Cloud en tu entorno.
  4. Instala la extensión pgvector en tu instancia local de PostgreSQL.
  5. Habilita la extensión con CREATE EXTENSION vector según las instrucciones del repositorio pgvector.

Realiza la integración con IDX

  1. Configura tu espacio de trabajo de IDX con la plantilla de Data Connect.
  2. Otórgate el rol de IAM de usuario de Vertex AI.
  3. Habilita la extensión con CREATE EXTENSION vector según las instrucciones del repositorio pgvector.

Diseña tu esquema

Para realizar una búsqueda vectorial, agrega un campo nuevo de tipo Vector en tu esquema. Por ejemplo, si deseas realizar una búsqueda semántica con descripciones de películas, agrega un campo para contener las incorporaciones de vectores asociadas con la descripción de la película. En este esquema, se agrega descriptionEmbedding para almacenar embeddings de vectores para el campo description.

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

Genera y recupera incorporaciones

Data Connect ofrece compatibilidad integrada para incorporaciones de vectores con el valor de servidor _embed. Esto le indica a Data Connect que genere incorporaciones de vectores llamando de forma interna a las APIs de Embedding de Vertex AI. El valor del servidor _embed se puede usar en mutaciones y consultas.

Mutaciones

Genera y almacena una incorporación a través de Data Connect

En tu app de búsqueda de vectores, es probable que desees solicitar que se generen las incorporaciones en cuanto agregues registros a tu base de datos. Esta es una mutación createMovie que agrega un registro de película a la tabla Movie y también pasa una descripción de la película con una incorporación model especificada.

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

En algunos casos, es posible que desees actualizar la descripción y la incorporación de la película.

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

Para llamar a la última mutación desde un cliente, haz lo siguiente:

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

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

// Use the response

Consultas

Recupera las incorporaciones de vectores con una consulta como la siguiente. Ten en cuenta que el descriptionEmbedding que muestra la consulta es un array de números de punto flotante, que, por lo general, no es legible por humanos. Por lo tanto, los SDKs generados por Data Connect no admiten devolverlo directamente.

Puedes usar las incorporaciones de vectores que se muestran para realizar una búsqueda de similitud, como se describe en la siguiente sección.

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

Realiza una búsqueda de similitud

Ahora podemos realizar la búsqueda de similitud.

Para cada campo Vector, Data Connect genera una función de GraphQL que implementa la búsqueda de similitudes. El nombre de esta función generada es ${pluralType}_${vectorFieldName}_similarity. Admite algunos parámetros, como se muestra en los siguientes ejemplos y en la lista de referencia.

Puedes definir una función de GraphQL que invoque la búsqueda de similitud. Como se mencionó antes, el valor del servidor _embed le indica a Data Connect que genere las incorporaciones vectoriales con las APIs de Embedding de Vertex AI, en este caso, para crear incorporaciones para la cadena de búsqueda que se usa en la comparación con las incorporaciones de descripción de películas.

En este ejemplo, la búsqueda de similitud mostrará hasta 5 películas cuya descripción sea semánticamente la más cercana a la consulta de entrada. El conjunto de resultados se ordena en orden ascendente de la distancia, de mayor a menor.

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

Llama a la consulta de similitud

Para llamar a una búsqueda de similitud desde el código del cliente, haz lo siguiente:

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

const response = await searchMovieDescriptionUsingL2similarity({ query });

// Use the response

Usa incorporaciones personalizadas

Data Connect también te permite trabajar con incorporaciones directamente como Vector en lugar de usar el valor del servidor _embed para generarlas.

Almacena una incorporación personalizada

Con la API de Vertex Embeddings, especifica un modelo coincidente y solicita resultados de incorporación de la dimensión correcta.

Luego, transmite el array de números de punto flotante que se muestra a un Vector para pasar a la operación de actualización de almacenamiento.

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

Realiza búsquedas de similitud con incorporaciones personalizadas

Realiza la misma operación para recuperar las incorporaciones de los términos de búsqueda y transmitirlas a Vectors.

Luego, llama a la consulta _similarity para realizar cada búsqueda.

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

Implementar en producción

Implementa tu esquema y conector

El último paso en una iteración típica de Data Connect es implementar tus recursos en producción.

Cuando implementas tu esquema que contiene tipos Vector en CloudSQL con el comando firebase deploy, la CLI de Firebase toma los pasos necesarios para habilitar la generación de incorporaciones basadas en Vertex AI en tu instancia de CloudSQL.

firebase deploy --only dataconnect

Si deseas habilitar la compatibilidad con la incorporación en tu instancia de CloudSQL de forma manual o si encuentras un error de la CLI, sigue estas instrucciones.

Sintaxis de la Búsqueda de vectores

Extensiones de esquema

El tipo de datos Vector de Data Connect se asigna al tipo vector de PostgreSQL, como se define en la extensión pgvector. El tipo vector de pgvector se almacena como un array de números de punto flotante de precisión simple en PostgreSQL.

En Data Connect, el tipo Vector se representa como un array de números JSON. Las entradas se convierten en un array de valores float32. Si la coerción falla, se genera un error.

Usa el parámetro de tamaño de la directiva @col para establecer las dimensiones del vector.

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

size solo es compatible con los tipos Vector. Las operaciones Vector, como la búsqueda de similitudes, requieren que todos los Vector tengan la misma cantidad de dimensiones.

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

Valor del servidor _embed para consultas y mutaciones

_embed

Este valor de servidor dirige al servicio Data Connect para que genere y almacene incorporaciones con las APIs de incorporaciones de Vertex AI. Este valor de servidor se puede usar en consultas y mutaciones.

Parámetros para la búsqueda de similitud

method: COSINE|INNER_PRODUCT|L2

Es la función de distancia que se usa para buscar vecinos cercanos. Los algoritmos que se admiten actualmente son un subconjunto de los algoritmos de búsqueda de pgvector.

within: float

Es una restricción en la distancia dentro de la cual se realiza la búsqueda del vecino más cercano.

where: FDC filter condition

Consulta la guía de esquemas, consultas y mutaciones.

limit: int

Es la cantidad de resultados que se mostrarán.