Pour construire des pipelines de recherche sémantique ou de génération augmentée par récupération (RAG), la génération d'embeddings de texte nécessite généralement un service externe à votre base de données. L'extension rds_embedding vous permet d'appeler un modèle d'embedding externe directement depuis ApsaraDB RDS for PostgreSQL, de stocker les vecteurs résultants avec vos données et d'exécuter des requêtes de similarité cosinus, le tout au sein de la base de données.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance RDS exécutant PostgreSQL 14 ou une version ultérieure
Pour PostgreSQL 17 : version mineure du moteur 20241030 ou ultérieure. Pour mettre à niveau, consultez la rubrique Mise à niveau de la version mineure du moteur
Une clé API Alibaba Cloud Model Studio. Pour en obtenir une, consultez la rubrique Obtenir votre clé API
-
Une passerelle NAT configurée pour le réseau privé virtuel (VPC) dans lequel votre instance RDS s'exécute. Les instances RDS PostgreSQL ne peuvent pas atteindre Internet par défaut ; une passerelle NAT est donc nécessaire pour appeler des modèles d'embedding externes.
Outre le modèle text-embedding-v3 utilisé dans cette rubrique, vous pouvez enregistrer d'autres modèles d'embedding à l'aide de rds_embedding.add_model(). Pour plus de détails, consultez la section rds_embedding.add_model().
Activer l'extension
Exécutez les commandes suivantes avec un compte privilégié. Activez d'abord vector : elle fournit le type de données vectorielles et les opérations dont dépend rds_embedding.
CREATE EXTENSION vector;
CREATE EXTENSION rds_embedding;
Pour désactiver les extensions :
DROP EXTENSION rds_embedding;
DROP EXTENSION vector;
Générer et interroger des embeddings
L'exemple suivant utilise le modèle text-embedding-v3 d'Alibaba Cloud Model Studio pour générer des vecteurs de 1 024 dimensions et exécuter une requête de similarité cosinus. Pour plus d'informations sur le modèle, consultez la rubrique Présentation du modèle.
Étape 1 : Créer une table
Créez une table avec une colonne text pour votre contenu et une colonne vector(1024) pour les embeddings.
CREATE TABLE test(info text, vec vector(1024) NOT NULL);
Étape 2 : Enregistrer le modèle d'embedding
Enregistrez text-embedding-v3 en fournissant son URL d'endpoint, le modèle d'en-tête d'autorisation, le modèle de corps de requête et le chemin JSON permettant d'extraire l'embedding de la réponse.
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'''
);
Remplacez sk-**** par votre clé API.
Étape 3 : Insérer du texte et des embeddings
Insérez chaque ligne en appelant rds_embedding.get_embedding_by_model() en ligne. La fonction appelle l'API du modèle et renvoie le vecteur d'embedding pour le texte donné.
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[];
Remplacez sk-**** par votre clé API.
Étape 4 : Interroger par similarité vectorielle
Utilisez l'opérateur <=> (distance cosinus) pour classer les lignes par similarité sémantique avec une chaîne de requête. Une distance de 0 signifie que les vecteurs sont identiques ; des valeurs plus faibles indiquent une plus grande similarité.
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;
Remplacez sk-**** par votre clé API.
Sortie attendue :
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)
La requête renvoie « Endless Yangtze River rolls on » en premier (distance 0, correspondance exacte), suivi de « Boundless falling leaves rustle down » comme voisin sémantique le plus proche.



