Nesta página, você verá um exemplo de fluxo de trabalho que demonstra como a função embedding()
funciona com os dados armazenados nas suas tabelas e a funcionalidade de consulta pgvector
. O exemplo
usa uma entrada de texto simples para buscar um resultado de um banco de dados que depende da análise semântica
de significado do texto orientada por modelo de linguagem grande (LLM).
Exemplo de cenário de um fluxo de trabalho de incorporação
Imagine um banco de dados em execução no Cloud SQL para PostgreSQL com os seguintes aspectos:
O banco de dados contém uma tabela:
items
. Cada linha nesta tabela descreve um item que sua empresa vende.A tabela
items
contém uma coluna:complaints
. Essa coluna armazena reclamações do comprador registradas sobre cada item como texto simples.O banco de dados se integra ao Grupo de modelos da Vertex AI, concedendo acesso ao LLM
textembedding-gecko
.
Embora esse banco de dados armazene reclamações sobre itens, elas são armazenadas como texto simples, dificultando a consulta. Por exemplo, se você quiser saber quais itens têm mais reclamações de clientes que receberam a cor errada do produto, realize consultas SQL comuns na tabela, procurando várias correspondências de palavras-chave. No entanto, essa abordagem corresponde apenas às linhas que contêm essas palavras-chave exatas.
Por exemplo, uma consulta SQL básica, como SELECT * FROM item WHERE complaints LIKE
"%wrong color%"
, não retorna uma linha em que o campo complaints
contém apenas The picture shows a blue one, but the one I received was red
.
Consultas SQL que usam embeddings com tecnologia LLM podem ajudar a preencher essa lacuna. Ao aplicar embeddings, é possível consultar a tabela neste exemplo para itens em que as reclamações têm semelhança semântica com um determinado prompt de texto, como "Era a cor errada".
As etapas a seguir mostram como ativar isso no cenário de exemplo descrito anteriormente.
Preparar a tabela
Antes de executar consultas baseadas em LLM no conteúdo da tabela items
, você precisa
preparar a tabela para armazenar e indexar embeddings com base nos seus dados
atuais.
Criar uma coluna para armazenar embeddings
Adicione uma coluna à tabela para armazenar os embeddings.
ALTER TABLE items ADD COLUMN complaint_embedding vector(768);
Este exemplo especifica 768
como argumento porque é a quantidade compatível com o LLM textembedding-gecko
. Para mais informações, consulte Gerar um embedding.
O exemplo aplica o tipo de dados vector
à coluna para simplificar o uso de funções e operadores pgvector
com os valores da coluna.
Preencha a nova coluna
Use a função embedding()
para preencher essa nova coluna com embeddings com base no valor do texto de cada linha que aparece na coluna complaints
. Neste exemplo, o Cloud SQL gera os embeddings usando o LLM com o ID de textembedding-gecko
, versão 001
.
UPDATE items SET complaint_embedding = embedding('textembedding-gecko@001', complaints);
Este exemplo transmite o valor de retorno real[]
de embedding()
em um vector
implicitamente para armazenar o valor na coluna vector
que você criou em Criar uma coluna para armazenar embeddings.
Criar um índice
Para melhorar o desempenho, adicione um índice à tabela items
. Esse índice usa as
técnicas de quantização escalar mostradas em Criar um índice otimizado de vizinho mais próximo.
CREATE INDEX complaint_embed_idx ON items
USING ivf (complaint_embedding vector_l2_ops)
WITH (lists = 20, quantizer = 'SQ8');
Para mais informações sobre como criar índices de vizinhos mais próximos, consulte Indexação.
Executar consultas com tecnologia de LLMs com texto fornecido
Agora é possível fazer consultas semânticas de vizinhos mais próximos na tabela items
. A consulta a seguir usa o operador <->
fornecido por pgvector
para concluir as seguintes ações:
- Classifique as linhas da tabela quanto à proximidade semântica do texto de
It was the wrong color
. - Retorne as dez principais reclamações.
A consulta exibe os valores id
e name
da primeira linha classificada.
SELECT id, name FROM items
ORDER BY complaint_embedding
<-> embedding('textembedding-gecko@001', 'It was the wrong color')::vector LIMIT 10;