Tous les produits
Search
Centre de documentation

ApsaraDB RDS:AI (rds_ai)

Dernière mise à jour :Aug 09, 2026

L'extension rds_ai vous permet d'appeler des modèles de langage (LLM) et d'exécuter des opérations d'embedding directement depuis SQL dans ApsaraDB RDS pour PostgreSQL. Elle s'intègre aux modèles Alibaba Cloud Model Studio, notamment Qwen et text-embedding-v3, afin que vous puissiez développer des fonctionnalités d'IA sans déplacer vos données hors de la base de données.

Avec rds_ai, vous pouvez exécuter des questions-réponses par LLM, convertir du texte en vecteurs, récupérer des enregistrements sémantiquement similaires et mettre en œuvre des pipelines complets de génération augmentée par récupération (RAG), le tout via des requêtes PostgreSQL standard. L'extension prend également en charge les modèles personnalisés, ce qui vous permet de connecter n'importe quelle API de modèle compatible HTTP.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Une instance ApsaraDB RDS for PostgreSQL répondant aux exigences de version suivantes. Pour effectuer une mise à niveau, consultez Mettre à niveau une version mineure du moteur.

    Version majeure Version mineure minimale du moteur
    PostgreSQL 16 20241230
    PostgreSQL 14, 15, 17 20250430
    PostgreSQL 18 20251130
  • Un compte privilégié pour votre instance. Pour en créer un, consultez Créer un compte.

  • Un abonnement actif à Alibaba Cloud Model Studio avec une clé API. Pour en obtenir une, consultez Obtenir une clé API.

Configuration réseau

Par défaut, une instance RDS for PostgreSQL ne peut pas accéder aux réseaux externes. Pour activer l'accès aux modèles externes, vous devez configurer une passerelle NAT pour le VPC de l'instance. Pour plus d'informations sur les passerelles NAT, consultez Utiliser la fonctionnalité SNAT d'une passerelle NAT Internet pour accéder à Internet.

Installer l'extension

Important

Confirmez les versions majeure et mineure du moteur de votre instance avant l'installation. Consultez Prérequis.

Option 1 : Installer depuis la console

  1. Accédez à la page Instances RDS, sélectionnez une région et cliquez sur l'ID de l'instance cible.

  2. Dans le volet de navigation de gauche, cliquez sur Plug-ins.

  3. Sur la page Plugin Marketplace, cliquez sur Install à côté de rds_ai.

  4. Sélectionnez la base de données et le compte cibles, puis cliquez sur Install.

Pour désinstaller, accédez à l'onglet Installed Plugins sur la page Manage Plugins.

Option 2 : Installer avec SQL

Exécutez la commande suivante en tant que compte privilégié :

CREATE EXTENSION IF NOT EXISTS rds_ai CASCADE;

L'installation de rds_ai installe également les extensions pgvector et pgsql-http.

Pour vérifier l'installation :

SELECT * FROM pg_extension;

Pour supprimer l'extension :

DROP EXTENSION rds_ai;

Modèles par défaut

rds_ai est fourni avec les modèles par défaut suivants :

API Paramètre Modèle par défaut Options
Prompt rds_ai.default_prompt_model qwen-plus qwen-plus, qwen-max, qwen-turbo
Embed rds_ai.default_embed_model text-embedding-v3 text-embedding-v3

Pour modifier le modèle d'invite par défaut, ajoutez rds_ai à la Running Value du paramètre shared_preload_libraries, puis définissez le modèle. Pour les instructions de mise à jour des paramètres, consultez Définir les paramètres de l'instance. Par exemple, définissez la Running Value sur 'pg_stat_statements,auto_explain,rds_ai', puis exécutez :

SET rds_ai.default_prompt_model TO 'qwen-max';

Configurer l'extension

Avant d'appeler un modèle, définissez la clé API et les URL des modèles.

Étape 1 : Définir la clé API

-- Set the API key for a specific model
SELECT rds_ai.update_model('qwen-plus', 'token', 'sk-****');

-- Set the same API key for all models
SELECT rds_ai.update_model(model_name, 'token', 'sk-****')
FROM rds_ai.model_list;

Étape 2 : Définir les URL des modèles

-- Prompt models (qwen-plus, qwen-max, qwen-turbo share the same endpoint)
SELECT rds_ai.update_model('qwen-plus', 'uri', 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation');
SELECT rds_ai.update_model('qwen-max', 'uri', 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation');
SELECT rds_ai.update_model('qwen-turbo', 'uri', 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation');

-- Embedding model
SELECT rds_ai.update_model('text-embedding-v3', 'uri', 'https://dashscope-intl.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding');

Étape 3 : (Facultatif) Configurer les délais d'expiration des requêtes

rds_ai utilise l'extension pgsql-http pour effectuer des appels distants. Définissez des délais d'expiration pour interrompre les requêtes de longue durée.

Ces paramètres s'appliquent uniquement à la session en cours. Réinitialisez-les pour chaque nouvelle connexion.
-- Request timeout (milliseconds)
SET http.timeout_msec TO 200000;
SELECT http.http_set_curlopt('CURLOPT_TIMEOUT', '200000');

-- Connection timeout (milliseconds)
SELECT http.http_set_curlopt('CURLOPT_CONNECTTIMEOUT_MS', '200000');

Questions-réponses par LLM

Utilisez rds_ai.prompt pour envoyer une question à un modèle de génération de texte Qwen et obtenir une réponse. Le modèle par défaut est qwen-plus.

Appel simple :

SELECT rds_ai.prompt('Give me a recipe using carrots, potatoes, and eggplants.');

Appel complet avec paramètres explicites :

SELECT rds_ai.prompt(
  model_name => 'qwen-plus',                                 -- model name
  content    => 'Give me a recipe using carrots, potatoes, and eggplants.',  -- prompt text
  args       => '{"top_p": 0.7}'::jsonb                      -- model parameters
);

Conversion texte vers vecteur

Utilisez rds_ai.embed pour convertir du texte en vecteur à l'aide du modèle text-embedding-v3. La sortie est un vecteur dense de 1024 dimensions par défaut. Pour demander un vecteur creux, passez {"output_type": "sparse"} ; la sortie comportera alors 250 002 dimensions.

Vecteur dense (par défaut) :

SELECT rds_ai.embed(
  'A strong wind blows from a high sky, and monkeys cry sadly.'
);

Vecteur creux :

SELECT rds_ai.embed(
  content => 'A strong wind blows from a high sky, and monkeys cry sadly.',
  args    => '{"output_type": "sparse"}'::jsonb
);

Stocker les embeddings dans une table :

  1. Créez la table :

    CREATE TABLE test_embed (
      a text,
      b vector(1024),         -- dense vector column
      c sparsevec(250002)     -- sparse vector column
    );
  2. Insérez du texte :

    INSERT INTO test_embed (a) VALUES ('hello world');
  3. Écrivez les embeddings :

    -- Write a dense vector
    UPDATE test_embed
    SET b = rds_ai.embed(a, '{"output_type": "dense"}'::jsonb)::vector;
    
    -- Write a sparse vector
    UPDATE test_embed
    SET c = rds_ai.embed(a, '{"output_type": "sparse"}'::jsonb)::sparsevec;

Récupération sémantique par vecteur

Utilisez rds_ai.retrieve pour trouver les N enregistrements les plus similaires à une requête. Cette fonction intègre la requête à l'aide de text-embedding-v3 et la compare aux vecteurs stockés en utilisant le type de distance que vous spécifiez.

Choisir un type de distance

Type de distance Quand l'utiliser
cosine Comparaison du sens du texte indépendamment de la longueur — choix le plus courant pour la recherche sémantique
L2 Lorsque l'amplitude des vecteurs importe, pas seulement leur direction
L1 Pour les vecteurs creux ou de haute dimension lorsque L2 est coûteux en calcul
negative Pour les vecteurs normalisés où le produit scalaire équivaut à la similarité cosinus mais est plus rapide

Le type de distance par défaut pour rds_ai.retrieve est cosine.

Choisir un type d'index vectoriel

Sans index, PostgreSQL effectue un balayage séquentiel exact, précis mais lent pour les grands ensembles de données. Ajoutez un index vectoriel pour accélérer la recherche des plus proches voisins approximatifs (ANN).

Type d'index Vitesse Précision Mémoire Quand l'utiliser
Aucun Lent Rappel à 100 % Faible Petites tables ou lorsque des résultats exacts sont requis
HNSW Rapide Élevée (ajustable) Plus élevée La plupart des charges de travail en production — meilleure vitesse de requête
IVFFlat Modérée Modérée (ajustable) Plus faible Grands ensembles de données où la mémoire est limitée

Exemple : Configurer une table et exécuter la récupération

  1. Créez une table et ajoutez une colonne d'embedding :

    CREATE TABLE test_rag (
      id    SERIAL PRIMARY KEY,
      chunk TEXT
    );
    
    ALTER TABLE test_rag ADD COLUMN embedding VECTOR(1024);
    UPDATE test_rag SET embedding = rds_ai.embed(chunk)::vector;
  2. Créez un index vectoriel :

    Les deux types d'index nécessitent la classe d'opérateurs vector_cosine_ops.
    -- HNSW index (recommended for most workloads)
    CREATE INDEX ON test_rag USING hnsw (embedding vector_cosine_ops);
    
    -- IVFFlat index (for memory-constrained environments)
    CREATE INDEX ON test_rag USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
  3. Exécutez une recherche de similarité :

    -- Simple call (uses defaults: text-embedding-v3, top 10, cosine distance)
    SELECT * FROM rds_ai.retrieve(
      'Why is PostgreSQL considered the most advanced open-source database?',
      'public', 'test_rag', 'chunk', 'embedding'
    );

    Appel complet avec paramètres explicites :

    SELECT * FROM rds_ai.retrieve(
      embed_model   => 'text-embedding-v3',
      question      => 'Why is PostgreSQL considered the most advanced open-source database?',
      source_schema => 'public',         -- schema of the source table
      source_table  => 'test_rag',       -- table to search
      chunk_col     => 'chunk',          -- text column
      vector_col    => 'embedding',      -- vector column
      topn          => 10,               -- number of results to return
      embed_args    => '{}'::jsonb,      -- extra parameters for the embedding model
      distance_type => 'cosine'          -- distance algorithm: L1, L2, cosine, or negative
    );

Questions-réponses RAG

rds_ai.rag combine la récupération vectorielle et la génération LLM en un seul appel. Il récupère les N fragments les plus pertinents de votre table et les transmet comme contexte au modèle d'invite.

Les modèles par défaut sont text-embedding-v3 pour l'embedding et qwen-plus pour la génération de texte.

Appel simple :

SELECT * FROM rds_ai.rag(
  'Why is PostgreSQL considered the most advanced open-source database?',
  'public', 'test_rag', 'chunk', 'embedding'
);

Appel complet avec paramètres explicites :

SELECT * FROM rds_ai.rag(
  embed_model   => 'text-embedding-v3',  -- embedding model
  prompt_model  => 'qwen-plus',          -- text generation model
  question      => 'Why is PostgreSQL considered the most advanced open-source database?',
  source_schema => 'public',             -- schema of the source table
  source_table  => 'test_rag',           -- table to search
  chunk_col     => 'chunk',              -- text column
  vector_col    => 'embedding',          -- vector column
  topn          => 10,                   -- number of chunks to retrieve
  embed_args    => '{}'::jsonb,          -- extra parameters for the embedding model
  prompt_args   => '{}'::jsonb,          -- extra parameters for the prompt model
  distance_type => 'L2'                  -- distance algorithm: L1, L2, cosine, or inner product
);

Modèles personnalisés

rds_ai stocke les configurations de modèle dans la table rds_ai.model_list. Ajoutez n'importe quel modèle compatible HTTP en insérant une ligne dans cette table.

Important

Si vous rencontrez des problèmes lors de l'ajout d'un modèle personnalisé, contactez-nous.

Champs de rds_ai.model_list

Champ Type Description
model_name name Nom du modèle. Clé primaire.
request_type text Méthode HTTP (par exemple, POST)
request_header http.http_header[] En-têtes de requête HTTP — utilisés pour l'authentification
uri text URL de l'endpoint du modèle
content_type text Type de contenu de la requête (par exemple, application/json)
content_template text Modèle de corps de requête avec des espaces réservés %s remplis au moment de l'appel
json_path text Expression SQL pour analyser la réponse HTTP
token text Jeton d'authentification placé dans l'en-tête de la requête

Ajouter un modèle personnalisé

SELECT rds_ai.add_model(
  'test-model',                                          -- model name
  'POST',                                                -- HTTP method
  ARRAY[('Authorization', 'Bearer %s')]::http.http_header[],  -- request header
  'https://****.com',                                    -- model URL
  'application/json',                                    -- content type
  '{"key":"%s"}',                                        -- request body template
  'SELECT %L'                                            -- JSON response parser
);

Appeler un modèle personnalisé

Utilisez rds_ai.raw_invoke_model pour obtenir la réponse HTTP complète, ou rds_ai.invoke_model pour extraire uniquement le champ défini dans json_path :

-- Returns the full HTTP response
SELECT * FROM rds_ai.raw_invoke_model('qwen-plus', ARRAY['who are you']);

-- Returns the parsed result from json_path
SELECT * FROM rds_ai.invoke_model('qwen-plus', ARRAY['who are you']);

Supprimer un modèle personnalisé

SELECT rds_ai.del_model('test-model');

Ajouter un modèle PAI-RAG

Déployez votre instance RDS et votre service PAI-EAS dans le même VPC pour maintenir tout le trafic au sein de votre réseau privé.

  1. Déployez le service RAG dans PAI-EAS. Consultez Déployer un chatbot RAG basé sur un LLM à l'aide de PAI-EAS et d'ApsaraDB RDS for PostgreSQL.

  2. Obtenez l'endpoint du service et le jeton :

    1. Cliquez sur le nom du service RAG pour ouvrir la page Service Details.

    2. Dans Basic Information, cliquez sur View Endpoint Information.

    3. Dans la boîte de dialogue Invocation Information, copiez l'endpoint du service et le jeton.

  3. Ajoutez le modèle PAI-RAG. Remplacez l'URL par votre endpoint réel et ajoutez /service/query :

    SELECT rds_ai.add_model(
      'pai-rag',
      'POST',
      ARRAY[('Authorization', '%s')]::http.http_header[],
      'http://rds-pai-rag-demo.****.cn-hangzhou.pai-eas.aliyuncs.com/service/query',
      'application/json',
      '{"question": "%s"}',
      'SELECT (%L::jsonb->''answer'')::text'
    );
  4. Définissez le jeton d'authentification :

    SELECT rds_ai.update_model('pai-rag', 'token', 'MTFkYjMwZjgzYzA1YmE2N2YyNWMxM2NkNDVjMjEzNjYxMDAzMzE5****');
  5. Vérifiez le modèle :

    SELECT rds_ai.invoke_model('pai-rag', ARRAY['What parameters are related to WAL log accumulation?']);

Pour plus d'informations sur l'appel des modèles PAI-RAG, consultez Appeler les modèles PAI à l'aide des API.

Ajouter un modèle RAG Function Compute

  1. Déployez l'application AgentCraft dans Function Compute. Consultez Déploiement cloud d'AgentCraft.

  2. Créez un agent et une intégration Client Access. Lors de la création de l'intégration Client Integration (comme dans Intégrer un agent dans un robot DingTalk), enregistrez l'endpoint et le jeton.

  3. Ajoutez le modèle RAG Function Compute. Remplacez l'URL par votre endpoint réel et ajoutez /completions :

    SELECT rds_ai.add_model(
      'fc-rag',
      'POST',
      ARRAY[('Authorization', 'Bearer %s')]::http.http_header[],
      'https://agentcrckend-de-obnhjsknam.cn-hangzhou.fcapp.run/v1/chat/completions',
      'application/json',
      '{
        "messages": [{"role": "user", "content": "%s"}],
        "stream": false,
        "max_tokens": 1024
      }',
      'SELECT (%L::jsonb->''choices''->0->''message''->>''content'')::text'
    );
  4. Définissez le jeton d'authentification :

    SELECT rds_ai.update_model('fc-rag', 'token', '8UiGAziWgYGPxM3qR5sAChBfDJRt****');
  5. Vérifiez le modèle :

    SELECT rds_ai.invoke_model('fc-rag', ARRAY['What parameters are related to WAL log accumulation?']);

Référence API

rds_ai.prompt

Envoie une invite à un LLM et renvoie la réponse.

rds_ai.prompt(
  model_name TEXT,
  content    TEXT,
  args       jsonb DEFAULT '{}'
) RETURNS text
Paramètre Type Description Par défaut
model_name text Modèle à appeler. qwen-plus
content text Texte de l'invite. —
args jsonb Paramètres de modèle supplémentaires (par exemple, {"top_p": 0.2}). {}

rds_ai.embed

Convertit du texte en vecteur à l'aide du modèle d'embedding spécifié.

rds_ai.embed(
  model_name TEXT,
  content    TEXT,
  args       jsonb DEFAULT '{}'
) RETURNS text
Paramètre Type Description Par défaut
model_name text Modèle à appeler. text-embedding-v3
content text Texte à convertir. —
args jsonb Paramètres supplémentaires (par exemple, {"output_type": "dense"}). {}

rds_ai.retrieve

Recherche dans une table les N enregistrements les plus similaires au texte de la requête.

rds_ai.retrieve(
  model_name    TEXT,
  question      TEXT,
  source_schema TEXT,
  source_table  TEXT,
  chunk_col     TEXT,
  vector_col    TEXT,
  topn          INT DEFAULT 10,
  embed_args    jsonb DEFAULT '{}',
  distance_type TEXT DEFAULT 'cosine'
) RETURNS TABLE(chunk TEXT, distance float)
Paramètre Type Description Par défaut
model_name text Modèle d'embedding à appeler. text-embedding-v3
question text Texte de la requête à rechercher. —
source_schema text Schéma de la table à rechercher. —
source_table text Table à rechercher. —
chunk_col text Colonne contenant les fragments de texte. —
vector_col text Colonne contenant les vecteurs stockés. —
topn int Nombre de résultats à renvoyer. 10
embed_args jsonb Paramètres supplémentaires pour le modèle d'embedding. {}
distance_type text Algorithme de distance : L1, L2, cosine ou negative. cosine

rds_ai.rag

Récupère les fragments pertinents d'une table et les transmet à un LLM pour générer une réponse fondée.

rds_ai.rag(
  embed_model   TEXT,
  prompt_model  TEXT,
  question      TEXT,
  source_schema TEXT,
  source_table  TEXT,
  chunk_col     TEXT,
  vector_col    TEXT,
  topn          INT DEFAULT 10,
  embed_args    jsonb DEFAULT '{}',
  prompt_args   jsonb DEFAULT '{}',
  distance_type TEXT DEFAULT 'L2'
) RETURNS text
Paramètre Type Description Par défaut
embed_model text Modèle d'embedding pour la recherche vectorielle. text-embedding-v3
prompt_model text LLM pour la génération de la réponse. qwen-plus
question text Question à laquelle répondre. —
source_schema text Schéma de la table à rechercher. —
source_table text Table à rechercher. —
chunk_col text Colonne contenant les fragments de texte. —
vector_col text Colonne contenant les vecteurs stockés. —
topn int Nombre de fragments à récupérer. 10
embed_args jsonb Paramètres supplémentaires pour le modèle d'embedding. {}
prompt_args jsonb Paramètres supplémentaires pour le modèle d'invite. {}
distance_type text Algorithme de distance : L1, L2, cosine ou inner product. L2

rds_ai.show_models

Répertorie tous les modèles configurés.

rds_ai.show_models() RETURNS setof rds_ai.model_list

rds_ai.add_model

Ajoute une configuration de modèle.

rds_ai.add_model(
  model_name       TEXT,
  request_type     TEXT,
  request_header   http.http_header[],
  uri              TEXT,
  content_type     TEXT,
  content_template TEXT,
  json_path        TEXT
) RETURNS TEXT
ParamètreTypeDescriptionExemple
model_nameTEXTNom permettant d'identifier le modèle.'text-embedding-v3'
request_typeTEXTMéthode HTTP.'POST'
request_headerhttp.http_header[]En-têtes de requête. Utilisez %s comme espace réservé pour le jeton.ARRAY[('Authorization', 'Bearer %s')]
uriTEXTURL de l'endpoint du modèle.

'https://dashscope-intl.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding'

content_typeTEXTType de contenu de la requête.'application/json'
content_templateTEXTModèle de corps de requête. Utilisez %s pour les valeurs remplies au moment de l'appel.'{ "model": "text-embedding-v3", "input": {"texts": ["%s"]}, "parameters": %s }'
json_pathTEXTExpression SQL pour extraire le résultat de la réponse HTTP. Utilisez 'SELECT %L' si le chemin exact est inconnu.'SELECT %L'

rds_ai.update_model

Met à jour un champ dans une configuration de modèle existante.

rds_ai.update_model(
  model_name  TEXT,
  config_name TEXT,
  value       TEXT
) RETURNS void
ParamètreTypeDescriptionExemple
model_nameTEXTNom du modèle à mettre à jour.'text-embedding-v3'
config_nameTEXTChamp à mettre à jour. Consultez rds_ai.add_model pour les noms de champs.'uri'
valueTEXTNouvelle valeur pour le champ.

'https://dashscope-intl.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding'

rds_ai.del_model

Supprime une configuration de modèle.

rds_ai.del_model(model_name text) RETURNS void
Paramètre Type Description Exemple
model_name text Nom du modèle à supprimer. 'test-model'

rds-ai.invoke_model

Appelle un modèle et renvoie le résultat analysé par l'expression json_path dans la configuration du modèle.

rds-ai.invoke_model(
  model_name  TEXT,
  params_list TEXT[]
) RETURNS http.http_response
Paramètre Type Description Exemple
model_name text Modèle à appeler. 'qwen-plus'
params_list text[] Valeurs à remplir dans content_template, dans l'ordre. ARRAY['who are you', '{}']

rds-ai.raw_invoke_model

Appelle un modèle et renvoie la réponse HTTP complète.

rds-ai.raw_invoke_model(
  model_name  TEXT,
  params_list TEXT[]
) RETURNS http.http_response
Paramètre Type Description Exemple
model_name text Modèle à appeler. 'qwen-plus'
params_list text[] Valeurs à remplir dans content_template, dans l'ordre. ARRAY['who are you', '{}']

Étapes suivantes