Esta secção descreve como invocar previsões e consultar e indexar incorporações usando a extensão pgvector. Estas funções de IA baseadas na aprendizagem automática estão disponíveis através do AlloyDB AI, que é um conjunto de funcionalidades do AlloyDB para PostgreSQL que lhe permitem aplicar o poder semântico e preditivo dos modelos de aprendizagem automática (ML) aos seus dados.
Saiba mais sobre a IA do AlloyDB em https://cloud.google.com//alloydb/docs/ai.
Invocar previsões
Para integrar o Vertex AI com o AlloyDB Omni e executar previsões em modelos armazenados no Vertex AI, siga estes passos.
Antes de começar
- Ative as previsões online do Vertex AI no GDC.
Crie um segredo do Kubernetes com base na chave da conta de serviço transferida nos passos anteriores executando o seguinte comando. Certifique-se de que cria o segredo do Kubernetes no mesmo espaço de nomes que o recurso
DBCluster
.kubectl create secret generic SECRET_NAME \ --from-file=PATH_TO_SERVICE_ACCOUNT_KEY/private-key.json \ -n NAMESPACE
Substitua o seguinte:
SECRET_NAME
: o nome do segredo usado quando cria um manifestoDBCluster
para permitir que o AlloyDB Omni aceda às funcionalidades de IA do Distributed Cloud. Por exemplo,vertex-ai-key-alloydb
.PATH_TO_SERVICE_ACCOUNT_KEY
: o caminho para a localização onde transferiu a chave da conta de serviço doprivate-key.json
.NAMESPACE
: o espaço de nomes do cluster da base de dados.
Instale o operador AlloyDB Omni através dos passos indicados em Escolha um tipo de motor de base de dados e crie um cluster de base de dados.
Crie um cluster de base de dados com o AlloyDB AI e defina
vertexAIKeyRef
para o segredo do Kubernetes criado nos passos anteriores no campogoogleMLExtension
no manifestoDBCluster
.apiVersion: v1 kind: Secret metadata: name: db-pw-DBCLUSTER_NAME namespace: USER_PROJECT type: Opaque data: DBCLUSTER_NAME: "BASE64_PASSWORD" --- apiVersion: DBENGINE_NAME.dbadmin.gdc.goog/v1 kind: DBCluster metadata: name: DBCLUSTER_NAME namespace: USER_PROJECT spec: primarySpec: adminUser: passwordRef: name: db-pw-DBCLUSTER_NAME features: googleMLExtension: config: vertexAIKeyRef: SECRET_NAME version: "DB_VERSION" resources: memory: DB_MEMORY cpu: DB_CPU disks: - name: DataDisk size: DB_DATA_DISK
Substitua as seguintes variáveis:
DBCLUSTER_NAME
: o nome do cluster da base de dados.USER_PROJECT
: o nome do projeto do utilizador onde o cluster de base de dados vai ser criado.BASE64_PASSWORD
: a codificação base64 da palavra-passe do administrador da base de dados.DBENGINE_NAME
: o nome do motor da base de dados. Definido comoalloydbomni
.DB_VERSION
: a versão do motor da base de dados.DB_MEMORY
: a quantidade de memória atribuída ao cluster da base de dados, por exemplo,5Gi
.DB_CPU
: a quantidade de CPUs atribuídas ao cluster da base de dados, por exemplo,2
.DB_DATA_DISK
: a quantidade de espaço alocada ao cluster da base de dados, por exemplo,10 Gi
.
Aplique o manifesto.
kubectl apply -f DB_CLUSTER_YAML
Substitua o seguinte:
DB_CLUSTER_YAML
: o nome deste ficheiro de manifesto do cluster da base de dados, por exemplo,alloydb-omni-db-cluster.yaml
.
Instale a extensão
google_ml_integration
.CREATE EXTENSION google_ml_integration CASCADE;
Invoque uma previsão
Invoque uma previsão online através de um ponto final do modelo do Vertex AI executando a seguinte função SQL ml_predict_row()
:
SELECT ml_predict_row('PREDICTION_ENDPOINT/PROJECT_NAMESPACE/ORGANIZATION/ZONE/DNS/DNS_SUFFIX', '{ "instances": [ INSTANCES ], "parameters":
PARAMETERS');
Substitua o seguinte:
PREDICTION_ENDPOINT
: o nome qualificado do ponto final da Vertex AIPROJECT_NAMESPACE
: o espaço de nomes no qual o ponto final do Vertex AI é implementadoORGANIZATION
: o nome da organização na qual o ponto final do Vertex AI está implementadoZONE
: a zona na qual o seu ponto final da Vertex AI está implementadoDNS
: o DNS da sua organizaçãoDNS_SUFFIX
: o sufixo do objeto DNSINSTANCES
: as entradas para a chamada de previsão, no formato JSONPARAMETERS
: os parâmetros da chamada de previsão, no formato JSON
Consultar e indexar incorporações com o pgvector
A extensão pgvector
PostgreSQL permite-lhe usar operadores e funções específicos de vetores quando armazena, indexa e consulta incorporações de texto na sua base de dados.
O AlloyDB oferece otimizações para trabalhar com pgvector
, o que lhe permite criar índices que podem acelerar determinadas consultas que envolvem incorporações.
Saiba mais sobre a utilização do AlloyDB como um MDI/CE e a geração e o armazenamento de incorporações de vetores com base num MDI/CE em https://cloud.google.com/alloydb/docs/ai/work-with-embeddings#index.
Crie índices e consulte vetores com o ScaNN
Esta secção mostra como usar incorporações armazenadas para gerar índices e consultar
incorporações. Pode criar ScaNN
índices com o AlloyDB.
Antes de começar
Antes de poder começar a criar índices, tem de concluir os seguintes pré-requisitos.
Os vetores de incorporação são adicionados a uma tabela na sua base de dados do AlloyDB.
A versão
vector
da extensão0.5.0
ou posterior baseada empgvector
, expandida pela Google para o AlloyDB, está instalada.CREATE EXTENSION IF NOT EXISTS vector;
Para gerar índices
ScaNN
, instale a extensãopostgres_ann
, além da extensãovector
.CREATE EXTENSION IF NOT EXISTS postgres_ann;
Crie um ScaNN
índice
Pode criar um ScaNN
índice para tabelas na sua base de dados.
O AlloyDB postgres_ann
é uma extensão do PostgreSQL desenvolvida pela Google que implementa um índice de vizinhos mais próximos altamente eficiente com tecnologia do algoritmo ScaNN.
O índice ScaNN
é um índice de quantização baseado em árvores para a pesquisa aproximada do vizinho mais próximo. Oferece um tempo de criação de índice baixo e uma pequena
pegada de memória. Além disso, oferece CPS rápidas com base na carga de trabalho.
Índice ScaNN
de árvore de dois níveis
Para aplicar um índice de árvore de dois níveis usando o algoritmo ScaNN a uma coluna que contenha incorporações de vetores armazenadas, execute a seguinte consulta DDL:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE);
Substitua o seguinte:
INDEX_NAME
: o nome do índice que quer criar, por exemplo,my-scann-index
. Os nomes dos índices são partilhados na sua base de dados. Certifique-se de que cada nome de índice é exclusivo para cada tabela na sua base de dados.TABLE
: a tabela à qual adicionar o índice.EMBEDDING_COLUMN
: uma coluna que armazenavector
dados.DISTANCE_FUNCTION
: a função de distância a usar com este índice. Selecione uma das seguintes opções:Distância L2:
l2
Produto escalar:
dot_product
Distância do cosseno:
cosine
NUM_LEAVES_VALUE
: o número de partições a aplicar a este índice. Defina qualquer valor entre 1 e 1048576.
Índice de árvore de três níveis ScaNN
Para criar um índice de árvore de três níveis usando o algoritmo ScaNN numa coluna que contenha incorporações de vetores armazenadas, execute a seguinte consulta DDL:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
Substitua o seguinte:
MAX_NUM_LEVELS
: o número máximo de níveis da árvore de agrupamento K-means. Defina como1
(predefinição) para a quantização baseada em árvore de dois níveis e como2
para a quantização baseada em árvore de três níveis.
Depois de criar o índice, pode executar consultas de pesquisa de vizinhos mais próximos que usam o índice seguindo as instruções em Faça uma consulta de vizinhos mais próximos com um determinado texto.
Os parâmetros de índice têm de ser definidos para encontrar o equilíbrio certo entre as consultas por segundo e a capacidade de memorização.
Para criar este índice numa coluna de incorporação que usa o tipo de dados real[]
em vez de vector
, converta a coluna no tipo de dados vector
:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
Substitua DIMENSIONS
pela largura dimensional da coluna de incorporação.
Para ver o progresso da indexação, use a vista pg_stat_progress_create_index
:
SELECT * FROM pg_stat_progress_create_index;
A coluna phase
mostra o estado atual da criação do índice e a fase building index: tree training
desaparece após a criação do índice.
Execute uma consulta
Depois de armazenar e indexar as incorporações na sua base de dados, pode começar a
consultar através da funcionalidade de consulta pgvector
. Não pode executar consultas de pesquisa em massa através da extensão postgres_ann
.
Para encontrar os vizinhos semânticos mais próximos de um vetor de incorporação, pode executar a consulta de exemplo seguinte, em que define a mesma função de distância que usou durante a criação do índice.
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
Substitua o seguinte:
TABLE
: a tabela que contém a incorporação com a qual comparar o texto.INDEX_NAME
: o nome do índice que quer usar, por exemplo,my-scann-index
.EMBEDDING_COLUMN
: a coluna que contém as incorporações armazenadas.DISTANCE_FUNCTION_QUERY
: a função de distância a usar com esta consulta. Escolha uma das seguintes opções com base na função de distância usada ao criar o índice:Distância L2:
<->
Produto interior:
<#>
Distância do cosseno:
<=>
EMBEDDING
: o vetor de incorporação para o qual quer encontrar os vizinhos semânticos armazenados mais próximos.ROW_COUNT
: o número de linhas a devolver.Especifique
1
se quiser apenas a melhor correspondência única.
Também pode usar a função embedding()
para traduzir o texto num vetor. Aplica o vetor a um dos
pgvector
operadores de vizinho mais próximo, <->
para a distância L2, para encontrar as linhas da base de dados com as incorporações semanticamente mais semelhantes. Tenha em atenção que tem de registar primeiro o modelo Gecko de incorporação de texto para usar esta função.
Uma vez que embedding()
devolve uma matriz real
, tem de converter explicitamente a chamada embedding()
em vector
para usar estes valores com operadores pgvector
.
CREATE EXTENSION google_ml_integration;
CREATE EXTENSION IF NOT EXISTS vector;
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN::vector
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
LIMIT ROW_COUNT
Substitua o seguinte:
MODEL_ID
: o ID do modelo a consultar.Se estiver a usar o Model Garden da Vertex AI, especifique
textembedding-gecko@003
como o ID do modelo. Estes são os modelos baseados na nuvem que o Distributed Cloud pode usar para incorporações de texto.Opcional:
VERSION_TAG
: a etiqueta de versão do modelo a consultar. Adicione@
antes da etiqueta.Se estiver a usar um dos
textembedding-gecko
modelos em inglês com a Vertex AI, especifique uma das etiquetas de versão, por exemplo,textembedding-gecko@003
.A Google recomenda vivamente que especifique sempre a etiqueta de versão. Se não especificar a etiqueta de versão, o AlloyDB usa sempre a versão do modelo mais recente, o que pode levar a resultados inesperados.
TEXT
: o texto a traduzir numa incorporação vetorial.
Métricas do índice de vetores
Esta secção apresenta as métricas relacionadas com os índices vetoriais que gera no AlloyDB. Pode ver estas métricas através da vista pg_stat_ann_indexes
disponível quando instala a postgres_ann
extensão.
Métricas de usabilidade
As métricas de usabilidade incluem métricas que ajudam a compreender o estado de utilização do índice com métricas como a configuração do índice e o número de análises do índice.
Nome da métrica | Tipo de dados | Descrição |
---|---|---|
relid |
OID |
Identificador exclusivo da tabela que contém o índice vetorial. |
indexrelid |
OID |
Identificador exclusivo do índice vetorial. |
schemaname |
NAME |
Nome do esquema ao qual o índice pertence. |
relname |
NAME |
Nome da tabela que contém o índice. |
indexrelname |
NAME |
Nome do índice. |
indextype |
NAME |
Tipo de índice. Este valor está sempre definido como postgres_ann . |
indexconfig |
TEXT[] |
Configuração, como a contagem de folhas e o quantizador, definida para o índice quando foi criado. |
indexsize |
TEXT |
Tamanho do índice. |
indexscan |
BIGINT |
Número de análises de índice iniciadas no índice. |
Métricas de aperfeiçoamento
As métricas de ajuste fornecem estatísticas sobre a otimização do índice atual, o que lhe permite aplicar recomendações para um desempenho de consulta mais rápido.
Nome da métrica | Tipo de dados | Descrição |
---|---|---|
insertcount |
BIGINT |
Número de operações de inserção no índice. Esta métrica também inclui qualquer número de linhas que existiam antes da criação do índice. |
updatecount |
BIGINT |
Número de operações de atualização no índice. Esta métrica não tem em conta as atualizações HOT. |
deletecount |
BIGINT |
Número de operações de eliminação no índice. |
distribution |
JSONB |
Distribuições de vetores em todas as partições do índice. Os seguintes campos mostram a distribuição:
Nota: devido às caraterísticas inerentes do algoritmo de agrupamento K-means, haverá sempre algum grau de variação na distribuição de vetores entre partições, mesmo quando o índice é criado inicialmente. |
Ajuste da recomendação com base nas métricas
- Mutação
- As métricas
insertcount
,updatecount
> edeletecount
mostram em conjunto as alterações ou as mutações no vetor do índice. - O índice é criado com um número específico de vetores e partições. Quando são realizadas operações como inserir, atualizar ou eliminar no índice vetorial, estas afetam apenas o conjunto inicial de partições onde os vetores residem. Consequentemente, o número de vetores em cada partição flutua ao longo do tempo, o que pode afetar a capacidade de memorização, o QPS ou ambos.
- Se encontrar problemas de lentidão ou precisão, como um baixo QPS ou uma má capacidade de memorização, nas suas consultas de pesquisa de RNA ao longo do tempo, considere rever estas métricas. Um número elevado de mutações relativamente ao número total de vetores pode indicar a necessidade de reindexação.
- Distribuição
- A métrica
distribution
mostra as distribuições de vetores em todas as partições. - Quando cria um índice, este é criado com um número específico de vetores e partições fixas. O processo de partição e a distribuição subsequente ocorrem com base nesta consideração. Se forem adicionados vetores adicionais, estes são divididos entre as partições existentes, o que resulta numa distribuição diferente em comparação com a distribuição quando o índice foi criado. Uma vez que a distribuição final não considera todos os vetores em simultâneo, a capacidade de memorização, as QPS ou ambas podem ser afetadas.
- Se observar uma diminuição gradual no desempenho das suas consultas de pesquisa de ANN, como tempos de resposta mais lentos ou uma precisão reduzida nos resultados (medida por QPS ou recall), considere verificar esta métrica e reindexar.