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 de vectores, que son arreglos de números de punto flotante que representan el significado semántico del texto o el contenido multimedia. Cuando 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 generar 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
- Configura una instancia local de PostgreSQL.
- Otórgate el rol de IAM de usuario de Vertex AI.
- Configura las credenciales predeterminadas de la aplicación de Google Cloud en tu entorno.
- Instala la extensión
pgvector
en tu instancia local de PostgreSQL. - Habilita la extensión con
CREATE EXTENSION vector
según las instrucciones del repositoriopgvector
.
Cómo realizar la integración con IDX
- Configura tu espacio de trabajo de IDX con la plantilla de Data Connect.
- Otórgate el rol de IAM de usuario de Vertex AI.
- Habilita la extensión con
CREATE EXTENSION vector
según las instrucciones del repositoriopgvector
.
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 con incorporaciones de vectores con el valor del 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 similitudes. Como se mencionó anteriormente, el valor del servidor _embed
dirige a Data Connect a generar las incorporaciones de vectores con las APIs de Embedding de Vertex AI, en este caso, para crear incorporaciones para la cadena de búsqueda que se usa para comparar con las incorporaciones de descripciones 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 el orden ascendente de la distancia, de la más cercana a la más lejana.
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, convierte el array de números de punto flotante que se muestra en un Vector
para pasarlo a la operación de actualización para el almacenamiento.
mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
movie_update(id: $id, data: {
// title, genre...
description: $description,
descriptionEmbedding: $descriptionEmbedding
})
}
Realiza una búsqueda 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.