Ao construir pipelines de busca semântica ou geração aumentada por recuperação (RAG), a criação de embeddings de texto geralmente exige um serviço externo ao banco de dados. A extensão rds_embedding permite chamar um modelo de embedding externo diretamente do ApsaraDB RDS for PostgreSQL, armazenar os vetores resultantes junto aos dados e executar consultas de similaridade de cosseno, tudo dentro do próprio banco de dados.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância RDS com PostgreSQL 14 ou superior
Para PostgreSQL 17: versão secundária do mecanismo 20241030 ou posterior. Para atualizar, consulte Atualizar a versão secundária do mecanismo
Uma chave de API do Alibaba Cloud Model Studio. Para obter uma, consulte Obter sua chave de API
-
Um NAT Gateway configurado para a Virtual Private Cloud (VPC) onde a instância RDS está em execução. Instâncias RDS PostgreSQL não acessam a internet por padrão; portanto, é necessário um NAT Gateway para chamar modelos de embedding externos
Além do modelo text-embedding-v3 usado neste tópico, é possível registrar outros modelos de embedding com rds_embedding.add_model(). Para mais detalhes, consulte rds_embedding.add_model().
Ative a extensão
Execute os comandos abaixo com uma conta privilegiada. Ative primeiro a extensão vector, pois ela fornece o tipo de dado vetorial e as operações das quais a rds_embedding depende.
CREATE EXTENSION vector;
CREATE EXTENSION rds_embedding;
Para desativar as extensões:
DROP EXTENSION rds_embedding;
DROP EXTENSION vector;
Gerar e consultar embeddings
O exemplo a seguir usa o modelo text-embedding-v3 do Alibaba Cloud Model Studio para gerar vetores de 1024 dimensões e executar uma consulta de similaridade de cosseno. Para mais informações sobre o modelo, consulte Introdução ao modelo.
Etapa 1: Crie uma tabela
Crie uma tabela com uma coluna text para o conteúdo e uma coluna vector(1024) para os embeddings.
CREATE TABLE test(info text, vec vector(1024) NOT NULL);
Etapa 2: Registrar o modelo de embedding
Registre o text-embedding-v3 informando a URL do endpoint, o modelo de cabeçalho de autorização, o modelo de corpo da requisição e o caminho JSON para extrair o embedding da resposta.
SELECT rds_embedding.add_model(
'text-embedding-v3',
'https://dashscope-intl.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding',
'Authorization: Bearer sk-****',
'{"input":{"texts":["%s"]},"model":"text-embedding-v3","parameters":{"text_type":"query"}}',
'->''output''->''embeddings''->0->>''embedding'''
);
Substitua sk-**** pela sua chave de API.
Etapa 3: Inserir texto e embeddings
Insira cada linha chamando rds_embedding.get_embedding_by_model() diretamente na instrução. A função chama a API do modelo e retorna o vetor de embedding correspondente ao texto fornecido.
INSERT INTO test SELECT 'Windy high sky, apes cry sadly',
rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', 'Windy high sky, apes cry sadly')::real[];
INSERT INTO test SELECT 'Clear islet, white sand, birds fly back',
rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', 'Clear islet, white sand, birds fly back')::real[];
INSERT INTO test SELECT 'Boundless falling leaves rustle down',
rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', 'Boundless falling leaves rustle down')::real[];
INSERT INTO test SELECT 'Endless Yangtze River rolls on',
rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', 'Endless Yangtze River rolls on')::real[];
Substitua sk-**** pela sua chave de API.
Etapa 4: Consultar por similaridade vetorial
Use o operador <=> (distância de cosseno) para classificar as linhas por similaridade semântica em relação a uma string de consulta. Uma distância de 0 indica vetores idênticos; valores menores representam maior similaridade.
SELECT
info,
vec <=> rds_embedding.get_embedding_by_model(
'text-embedding-v3',
'sk-****',
'Endless Yangtze River rolls on'
)::real[]::vector AS distance
FROM
test
ORDER BY
vec <=> rds_embedding.get_embedding_by_model(
'text-embedding-v3',
'sk-****',
'Endless Yangtze River rolls on'
)::real[]::vector;
Substitua sk-**** pela sua chave de API.
Saída esperada:
info | distance
-----------------------------------------+--------------------
Endless Yangtze River rolls on | 0
Boundless falling leaves rustle down | 0.42740682200152647
Clear islet, white sand, birds fly back | 0.5161883811726116
Windy high sky, apes cry sadly | 0.5247695147991147
(4 rows)
A consulta retorna "Endless Yangtze River rolls on" em primeiro lugar (distância 0, correspondência exata), seguido por "Boundless falling leaves rustle down" como o vizinho semântico mais próximo.



