Esta é a pesquisa por similaridade de vetores do Firebase Data Connect, do Firebase implementação de pesquisa semântica que se integra Vertex AI do Google.
No centro desse recurso estão os embeddings vetoriais, que são matrizes de objetos
números de ponto que representam o significado semântico de texto ou mídia. Ao executar uma
pesquisa de vizinho mais próximo usando um embedding de vetor de entrada, você pode encontrar todo
conteúdo semanticamente semelhante. O Data Connect usa o PostgreSQL
Extensão pgvector
para esta capacidade.
Essa pesquisa semântica poderosa pode impulsionar casos de uso como mecanismos de recomendação e mecanismos de pesquisa. Ele também é um componente importante na geração de recuperação aprimorada em fluxos de IA generativa. A documentação da Vertex AI é um ótimo lugar para Saiba mais.
Confie no suporte integrado do Data Connect para gerar vetores embeddings automaticamente usando a API Embeddings da Vertex AI. ou usar essa API para gerá-los manualmente.
Pré-requisitos
Configure o Data Connect para seu projeto.
Ative as APIs Vertex AI.
Configuração
Você pode escolher entre um fluxo de desenvolvimento local (se você for um desenvolvedor da Web, Kotlin Android ou iOS) ou um fluxo IDX (para desenvolvedores da Web). Você pode usar um banco de dados local ou seu projeto de produção Data Connect e os Instância do Cloud SQL para PostgreSQL para desenvolvimento.
Estas instruções pressupõem que você criou o projeto Data Connect seguindo o guia de início rápido.
Integrar com o PostgreSQL local
- Configure uma instância local do PostgreSQL.
- Conceda a si mesmo o papel do IAM de usuário da Vertex AI.
- Configure o Application Default Credentials do Google Cloud no ambiente.
- Instale a extensão
pgvector
na instância local do PostgreSQL. - Ative a extensão usando
CREATE EXTENSION vector
de acordo compgvector
. instruções do repositório.
Integrar com IDX
- Configure seu espaço de trabalho do IDX usando o modelo do Data Connect.
- Conceda a si mesmo o papel de IAM de usuário da Vertex AI.
- Ative a extensão usando
CREATE EXTENSION vector
de acordo compgvector
. instruções do repositório.
Projetar seu esquema
Para realizar a pesquisa de vetor, adicione um novo campo do tipo Vector
no esquema. Por
exemplo, se você quiser fazer uma pesquisa semântica usando descrições de filmes, adicione um
campo para armazenar os embeddings vetoriais associados à descrição do filme. Em
nesse esquema, descriptionEmbedding
é adicionado para armazenar embeddings de vetores para
no 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)
// ...
}
Gerar e extrair embeddings
O Data Connect oferece suporte integrado a embeddings de vetor com
o valor do servidor _embed
. Isso direciona Data Connect para gerar
embeddings de vetor chamando internamente as APIs de embedding da Vertex AI. O _embed
pode ser usado em mutações e consultas.
Mutações
Gere e armazene um embedding por meio de Data Connect
No app de pesquisa vetorial, é recomendável solicitar que os embeddings sejam
gerados assim que você adicionar registros ao banco de dados. Uma mutação createMovie
adiciona um registro de filme à tabela Movie
e também transmite uma descrição
do filme com um model
de incorporação especificado.
mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
movie_insert(data: {
...movieData,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.description}
})
}
Em alguns casos, talvez você queira atualizar a descrição e a incorporação do filme.
mutation updateDescription($id: String!, $description: String!) {
movie_update(id: $id, data: {
description: $description,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
})
}
Para chamar a última mutação de um cliente:
import { updateMovieDescriptionWithEmbed } from 'lib/dataconnect-sdk/';
await updateMovieDescriptionWithEmbed({ id: movieId, description: description});
// Use the response
Consultas
Busque embeddings de vetores usando uma consulta como a seguinte. Observe que o
descriptionEmbedding
retornada pela consulta é uma matriz de pontos flutuantes, que é
geralmente não legíveis por humanos. Portanto, os SDKs gerados pelo Data Connect não
é possível retornar esses dados diretamente.
É possível usar os embeddings de vetor retornados para fazer pesquisas de similaridade, conforme descrito na próxima seção.
query getMovieDescription($id: String!) @auth(is: PUBLIC) {
movie(id: $id)
id
description
descriptionEmbedding
}
Realizar pesquisa por similaridade
Agora podemos realizar a pesquisa de similaridade.
Para cada campo Vector
, Data Connect gera uma função GraphQL
que implementa a pesquisa de similaridade. O nome dessa função gerada é
${pluralType}_${vectorFieldName}_similarity
. Ele oferece suporte a alguns parâmetros,
conforme mostrado nos exemplos a seguir e na lista de referência.
É possível definir uma função GraphQL que invoca a pesquisa por similaridade. Conforme
mencionado acima, o valor do servidor _embed
direciona Data Connect para
gerar os embeddings de vetores usando as APIs de embedding da Vertex AI. Neste caso,
para criar embeddings para a string de pesquisa usada para comparação com filmes
de embeddings de descrições.
Neste exemplo, a pesquisa de similaridade vai retornar até cinco filmes com a descrição mais próxima semanticamente da consulta de entrada. O conjunto de resultados é classificado na ordem crescente da distância, mais próximo do mais distante.
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
}
}
Chamar a consulta de semelhança
Para chamar uma pesquisa de similaridade no código do cliente:
import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';
const response = await searchMovieDescriptionUsingL2similarity({ query });
// Use the response
Usar embeddings personalizados
O Data Connect também permite trabalhar com embeddings diretamente como Vector
s.
em vez de usar o valor de servidor _embed
para gerá-las.
Armazenar um embedding personalizado
Usando a API Vertex Embeddings, especifique um modelo correspondente e solicite e incorporando resultados da dimensão correta.
Em seguida, converta a matriz de números flutuantes retornada em um Vector
para transmitir à operação
de atualização para armazenamento.
mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
movie_update(id: $id, data: {
// title, genre...
description: $description,
descriptionEmbedding: $descriptionEmbedding
})
}
Realizar pesquisa de similaridade usando embeddings personalizados
Realize a mesma operação para extrair embeddings de termos de pesquisa e transmiti-los
a Vectors
.
Em seguida, chame a consulta _similarity
para realizar cada pesquisa.
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
}
}
Implantar para a produção
Implantar o esquema e o conector
A última etapa de uma iteração típica de Data Connect é implantar os recursos na produção.
Ao implantar o esquema que contém tipos Vector
no CloudSQL usando o comando firebase deploy
, a CLI Firebase executa as etapas necessárias para ativar a geração de embeddings com base na Vertex AI na sua instância do CloudSQL.
firebase deploy --only dataconnect
Se você quiser ativar o suporte de incorporação na instância do CloudSQL manualmente ou encontrar um erro na CLI, siga estas instruções.
Sintaxe de pesquisa vetorial
Extensões de esquema
O tipo de dados Vector
de Data Connect é mapeado para o tipo vector
do PostgreSQL, conforme definido pela extensão pgvector
. O tipo vector
do pgvector é armazenado como uma matriz de números de ponto flutuante de precisão única no PostgreSQL.
Em Data Connect, o tipo Vector
é representado como uma matriz de
números JSON. As entradas são convertidas em uma matriz de valores float32
. Se a coerção
falhar, um erro será gerado.
Use o parâmetro de tamanho da diretiva @col
para definir as dimensões do
vetor.
type Question @table {
text: String!
category: String!
textEmbedding: Vector! @col(size: 768)
}
size
só é aceito para tipos Vector
. operações Vector
,
como a pesquisa por similaridade, é necessário que todas as Vector
s tenham a mesma
o número de dimensões.
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 do servidor _embed
para consultas e mutações
_embed
Esse valor do servidor direciona o serviço Data Connect para gerar e armazenar embeddings usando as APIs de embeddings da Vertex AI. Esse valor do servidor pode ser usado em consultas e mutações.
Parâmetros para pesquisa de semelhança
method: COSINE|INNER_PRODUCT|L2
A função de distância usada para pesquisar vizinhos próximos. Os algoritmos com suporte atualmente são um subconjunto de algoritmos de pesquisa de pgvector.
within: float
Restrição da distância dentro da qual está a pesquisa vizinha mais próxima. realizada.
where: FDC filter condition
Consulte o guia de esquemas, consultas e mutações.
limit: int
O número de resultados a serem retornados.