All Products
Search
Document Center

ApsaraDB RDS:AI (rds_ai)

Last Updated:Mar 28, 2026

Ekstensi rds_ai memungkinkan Anda memanggil model bahasa besar (LLM) dan menjalankan operasi penyematan langsung dari SQL di ApsaraDB RDS for PostgreSQL. Ekstensi ini terintegrasi dengan model Alibaba Cloud Model Studio—termasuk Qwen dan text-embedding-v3—sehingga Anda dapat membangun fitur AI tanpa memindahkan data keluar dari database Anda.

Dengan rds_ai, Anda dapat menjalankan tanya jawab LLM, mengonversi teks ke vektor, mengambil catatan yang secara semantik mirip, serta menjalankan pipeline retrieval-augmented generation (RAG) end-to-end—semuanya melalui kueri PostgreSQL standar. Ekstensi ini juga mendukung model kustom, sehingga Anda dapat menghubungkan API model apa pun yang kompatibel dengan HTTP.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Instans ApsaraDB RDS for PostgreSQL yang memenuhi persyaratan versi berikut: Untuk peningkatan, lihat Upgrade a minor engine version.

    Major versionMinimum minor engine version
    PostgreSQL 1620241230
    PostgreSQL 14, 15, 1720250430
    PostgreSQL 1820251130
  • Akun istimewa untuk instans Anda. Untuk membuatnya, lihat Create an account.

  • Langganan aktif Alibaba Cloud Model Studio dengan Kunci API. Untuk mendapatkannya, lihat Obtain an API key.

Konfigurasi jaringan

Secara default, instans RDS for PostgreSQL tidak dapat mengakses jaringan eksternal. Untuk mengaktifkan akses ke model eksternal, Anda harus mengonfigurasi gateway NAT untuk VPC instans tersebut. Untuk informasi lebih lanjut tentang gateway NAT, lihat Use the SNAT feature of an Internet NAT gateway to access the Internet.

Instal ekstensi

Penting

Konfirmasi versi mesin mayor dan minor instans Anda sebelum menginstal. Lihat Prasyarat.

Opsi 1: Instal dari konsol

  1. Buka halaman RDS Instances, pilih wilayah, lalu klik ID instans target.

  2. Di panel navigasi kiri, klik Plug-ins.

  3. Di halaman Plugin Marketplace, klik Install di samping rds_ai.

  4. Pilih database dan akun target, lalu klik Install.

Untuk menguninstal, buka tab Installed Plugins pada halaman Manage Plugins.

Opsi 2: Instal dengan SQL

Jalankan perintah berikut sebagai akun istimewa:

CREATE EXTENSION IF NOT EXISTS rds_ai CASCADE;

Menginstal rds_ai juga akan menginstal ekstensi pgvector dan pgsql-http.

Untuk memverifikasi instalasi:

SELECT * FROM pg_extension;

Untuk menghapus ekstensi:

DROP EXTENSION rds_ai;

Model default

rds_ai dilengkapi model default berikut:

APIParameterDefault ModelOpsi
Promptrds_ai.default_prompt_modelqwen-plusqwen-plus, qwen-max, qwen-turbo
Embedrds_ai.default_embed_modeltext-embedding-v3text-embedding-v3

Untuk mengubah model prompt default, tambahkan rds_ai ke Running Value parameter shared_preload_libraries, lalu atur model tersebut. Untuk petunjuk pembaruan parameter, lihat Set instance parameters. Misalnya, atur Running Value menjadi 'pg_stat_statements,auto_explain,rds_ai', lalu jalankan:

SET rds_ai.default_prompt_model TO 'qwen-max';

Konfigurasi ekstensi

Sebelum memanggil model apa pun, atur Kunci API dan URL model.

Langkah 1: Atur Kunci API

-- Atur Kunci API untuk model tertentu
SELECT rds_ai.update_model('qwen-plus', 'token', 'sk-****');

-- Atur Kunci API yang sama untuk semua model
SELECT rds_ai.update_model(model_name, 'token', 'sk-****')
FROM rds_ai.model_list;

Langkah 2: Atur URL model

-- Model prompt (qwen-plus, qwen-max, qwen-turbo berbagi titik akhir yang sama)
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');

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

Langkah 3: (Opsional) Konfigurasi timeout permintaan

rds_ai menggunakan ekstensi pgsql-http untuk melakukan panggilan remote. Atur timeout untuk menghentikan permintaan yang berjalan lama.

Pengaturan ini hanya berlaku untuk sesi saat ini. Atur ulang untuk setiap koneksi baru.
-- Timeout permintaan (milidetik)
SET http.timeout_msec TO 200000;
SELECT http.http_set_curlopt('CURLOPT_TIMEOUT', '200000');

-- Timeout koneksi (milidetik)
SELECT http.http_set_curlopt('CURLOPT_CONNECTTIMEOUT_MS', '200000');

Tanya jawab LLM

Gunakan rds_ai.prompt untuk mengirim pertanyaan ke model generasi teks Qwen dan mendapatkan respons. Model default adalah qwen-plus.

Panggilan sederhana:

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

Panggilan lengkap dengan parameter eksplisit:

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

Konversi teks ke vektor

Gunakan rds_ai.embed untuk mengonversi teks ke vektor menggunakan model text-embedding-v3. Outputnya adalah vektor padat berdimensi 1.024 secara default. Untuk meminta vektor jarang, berikan {"output_type": "sparse"}—outputnya berdimensi 250.002.

Vektor padat (default):

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

Vektor jarang:

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

Simpan penyematan dalam tabel:

  1. Buat tabel:

    CREATE TABLE test_embed (
      a text,
      b vector(1024),         -- kolom vektor padat
      c sparsevec(250002)     -- kolom vektor jarang
    );
  2. Masukkan teks:

    INSERT INTO test_embed (a) VALUES ('hello world');
  3. Tulis penyematan:

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

Pengambilan vektor semantik

Gunakan rds_ai.retrieve untuk menemukan N catatan paling mirip dengan kueri. Ekstensi ini menyematkan kueri menggunakan text-embedding-v3 dan membandingkannya dengan vektor yang tersimpan menggunakan jenis jarak yang Anda tentukan.

Pilih jenis jarak

Jenis jarakKapan digunakan
cosineMembandingkan makna teks tanpa memperhatikan panjang — pilihan paling umum untuk pencarian semantik
L2Ketika besarnya vektor penting, bukan hanya arahnya
L1Untuk vektor jarang atau berdimensi tinggi di mana L2 mahal secara komputasi
negativeUntuk vektor ternormalisasi di mana dot product setara dengan kemiripan cosine tetapi lebih cepat

Jenis jarak default untuk rds_ai.retrieve adalah cosine.

Pilih jenis indeks vektor

Tanpa indeks, PostgreSQL melakukan pemindaian sekuensial eksak—akurat tetapi lambat untuk dataset besar. Tambahkan indeks vektor untuk pencarian tetangga terdekat aproksimasi (ANN) yang lebih cepat.

Jenis indeksKecepatanAkurasiMemoriKapan digunakan
NoneLambatRecall 100%RendahTabel kecil atau ketika hasil eksak diperlukan
HNSWCepatTinggi (dapat disesuaikan)Lebih tinggiSebagian besar beban kerja produksi — kecepatan kueri terbaik
IVFFlatSedangSedang (dapat disesuaikan)Lebih rendahDataset besar di mana memori terbatas

Contoh: Siapkan tabel dan jalankan pengambilan

  1. Buat tabel dan tambahkan kolom penyematan:

    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. Buat indeks vektor:

    Kedua jenis indeks memerlukan kelas operator vector_cosine_ops.
    -- Indeks HNSW (direkomendasikan untuk sebagian besar beban kerja)
    CREATE INDEX ON test_rag USING hnsw (embedding vector_cosine_ops);
    
    -- Indeks IVFFlat (untuk lingkungan dengan memori terbatas)
    CREATE INDEX ON test_rag USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
  3. Jalankan pencarian kemiripan:

    -- Panggilan sederhana (menggunakan default: text-embedding-v3, 10 teratas, jarak cosine)
    SELECT * FROM rds_ai.retrieve(
      'Why is PostgreSQL considered the most advanced open-source database?',
      'public', 'test_rag', 'chunk', 'embedding'
    );

    Panggilan lengkap dengan parameter eksplisit:

    SELECT * FROM rds_ai.retrieve(
      embed_model   => 'text-embedding-v3',
      question      => 'Why is PostgreSQL considered the most advanced open-source database?',
      source_schema => 'public',         -- skema tabel sumber
      source_table  => 'test_rag',       -- tabel untuk dicari
      chunk_col     => 'chunk',          -- kolom teks
      vector_col    => 'embedding',      -- kolom vektor
      topn          => 10,               -- jumlah hasil yang dikembalikan
      embed_args    => '{}'::jsonb,      -- parameter tambahan untuk model penyematan
      distance_type => 'cosine'          -- algoritma jarak: L1, L2, cosine, atau negative
    );

Tanya jawab RAG

rds_ai.rag menggabungkan pengambilan vektor dan generasi LLM dalam satu panggilan. Ekstensi ini mengambil N potongan teks relevan teratas dari tabel Anda dan meneruskannya sebagai konteks ke model prompt.

Model default adalah text-embedding-v3 untuk penyematan dan qwen-plus untuk generasi teks.

Panggilan sederhana:

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

Panggilan lengkap dengan parameter eksplisit:

SELECT * FROM rds_ai.rag(
  embed_model   => 'text-embedding-v3',  -- model penyematan
  prompt_model  => 'qwen-plus',          -- model generasi teks
  question      => 'Why is PostgreSQL considered the most advanced open-source database?',
  source_schema => 'public',             -- skema tabel sumber
  source_table  => 'test_rag',           -- tabel untuk dicari
  chunk_col     => 'chunk',              -- kolom teks
  vector_col    => 'embedding',          -- kolom vektor
  topn          => 10,                   -- jumlah potongan teks yang diambil
  embed_args    => '{}'::jsonb,          -- parameter tambahan untuk model penyematan
  prompt_args   => '{}'::jsonb,          -- parameter tambahan untuk model prompt
  distance_type => 'L2'                  -- algoritma jarak: L1, L2, cosine, atau inner product
);

Model kustom

rds_ai menyimpan konfigurasi model dalam tabel rds_ai.model_list. Tambahkan model apa pun yang kompatibel dengan HTTP dengan memasukkan baris ke tabel ini.

Penting

Jika Anda mengalami masalah saat menambahkan model kustom, hubungi kami.

Field rds_ai.model_list

FieldTipeDeskripsi
model_namenameNama model. Primary key.
request_typetextMetode HTTP (misalnya, POST)
request_headerhttp.http_header[]Header permintaan HTTP — digunakan untuk otentikasi
uritextURL titik akhir model
content_typetextTipe konten permintaan (misalnya, application/json)
content_templatetextTemplat badan permintaan dengan placeholder %s yang diisi saat dipanggil
json_pathtextEkspresi SQL untuk mengurai respons HTTP
tokentextToken otentikasi yang dimasukkan ke header permintaan

Tambahkan model kustom

SELECT rds_ai.add_model(
  'test-model',                                          -- nama model
  'POST',                                                -- metode HTTP
  ARRAY[('Authorization', 'Bearer %s')]::http.http_header[],  -- header permintaan
  'https://****.com',                                    -- URL model
  'application/json',                                    -- tipe konten
  '{"key":"%s"}',                                        -- templat badan permintaan
  'SELECT %L'                                            -- parser respons JSON
);

Panggil model kustom

Gunakan rds_ai.raw_invoke_model untuk mendapatkan respons HTTP lengkap, atau rds_ai.invoke_model untuk mengekstrak hanya field yang ditentukan dalam json_path:

-- Mengembalikan respons HTTP lengkap
SELECT * FROM rds_ai.raw_invoke_model('qwen-plus', ARRAY['who are you']);

-- Mengembalikan hasil yang diurai dari json_path
SELECT * FROM rds_ai.invoke_model('qwen-plus', ARRAY['who are you']);

Hapus model kustom

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

Tambahkan model PAI-RAG

Terapkan instans RDS dan layanan PAI-EAS Anda di VPC yang sama agar seluruh trafik tetap berada dalam jaringan pribadi Anda.

  1. Terapkan layanan RAG di PAI-EAS. Lihat Deploy an LLM-based RAG chatbot using PAI-EAS and ApsaraDB RDS for PostgreSQL.

  2. Dapatkan titik akhir layanan dan token:

    1. Klik nama layanan RAG untuk membuka halaman Service Details.

    2. Di Basic Information, klik View Endpoint Information.

    3. Di kotak dialog Invocation Information, salin titik akhir layanan dan token.

  3. Tambahkan model PAI-RAG. Ganti URL dengan titik akhir aktual Anda dan tambahkan /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. Atur token otentikasi:

    SELECT rds_ai.update_model('pai-rag', 'token', 'MTFkYjMwZjgzYzA1YmE2N2YyNWMxM2NkNDVjMjEzNjYxMDAzMzE5****');
  5. Verifikasi model:

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

Untuk informasi lebih lanjut tentang pemanggilan model PAI-RAG, lihat Call PAI models using APIs.

Tambahkan model RAG Function Compute

  1. Terapkan aplikasi AgentCraft di Function Compute. Lihat Cloud Deployment of AgentCraft.

  2. Buat agen dan integrasi Client Access. Saat membuat Client Integration (seperti dalam Integrate an agent into a DingTalk robot), simpan titik akhir dan token.

  3. Tambahkan model RAG Function Compute. Ganti URL dengan titik akhir aktual Anda dan tambahkan /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. Atur token otentikasi:

    SELECT rds_ai.update_model('fc-rag', 'token', '8UiGAziWgYGPxM3qR5sAChBfDJRt****');
  5. Verifikasi model:

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

Referensi API

rds_ai.prompt

Mengirim prompt ke LLM dan mengembalikan respons.

rds_ai.prompt(
  model_name TEXT,
  content    TEXT,
  args       jsonb DEFAULT '{}'
) RETURNS text
ParameterTipeDeskripsiDefault
model_nametextModel yang dipanggil.qwen-plus
contenttextTeks prompt.
argsjsonbParameter model tambahan (misalnya, {"top_p": 0.2}).{}

rds_ai.embed

Mengonversi teks ke vektor menggunakan model penyematan yang ditentukan.

rds_ai.embed(
  model_name TEXT,
  content    TEXT,
  args       jsonb DEFAULT '{}'
) RETURNS text
ParameterTipeDeskripsiDefault
model_nametextModel yang dipanggil.text-embedding-v3
contenttextTeks yang akan dikonversi.
argsjsonbParameter tambahan (misalnya, {"output_type": "dense"}).{}

rds_ai.retrieve

Mencari tabel untuk N catatan paling mirip dengan teks kueri.

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)
ParameterTipeDeskripsiDefault
model_nametextModel penyematan yang dipanggil.text-embedding-v3
questiontextTeks kueri yang dicari.
source_schematextSkema tabel yang dicari.
source_tabletextTabel yang dicari.
chunk_coltextKolom yang berisi potongan teks.
vector_coltextKolom yang berisi vektor yang tersimpan.
topnintJumlah hasil yang dikembalikan.10
embed_argsjsonbParameter tambahan untuk model penyematan.{}
distance_typetextAlgoritma jarak: L1, L2, cosine, atau negative.cosine

rds_ai.rag

Mengambil potongan teks relevan dari tabel dan meneruskannya ke LLM untuk menghasilkan jawaban yang berbasis konteks.

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
ParameterTipeDeskripsiDefault
embed_modeltextModel penyematan untuk pencarian vektor.text-embedding-v3
prompt_modeltextLLM untuk menghasilkan jawaban.qwen-plus
questiontextPertanyaan yang akan dijawab.
source_schematextSkema tabel yang dicari.
source_tabletextTabel yang dicari.
chunk_coltextKolom yang berisi potongan teks.
vector_coltextKolom yang berisi vektor yang tersimpan.
topnintJumlah potongan teks yang diambil.10
embed_argsjsonbParameter tambahan untuk model penyematan.{}
prompt_argsjsonbParameter tambahan untuk model prompt.{}
distance_typetextAlgoritma jarak: L1, L2, cosine, atau inner product.L2

rds_ai.show_models

Menampilkan semua model yang dikonfigurasi.

rds_ai.show_models() RETURNS setof rds_ai.model_list

rds_ai.add_model

Menambahkan konfigurasi model.

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
ParameterTipeDeskripsiContoh
model_nameTEXTNama untuk mengidentifikasi model.'text-embedding-v3'
request_typeTEXTMetode HTTP.'POST'
request_headerhttp.http_header[]Header permintaan. Gunakan %s sebagai placeholder untuk token.ARRAY[('Authorization', 'Bearer %s')]
uriTEXTURL titik akhir model.

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

content_typeTEXTTipe konten permintaan.'application/json'
content_templateTEXTTemplat badan permintaan. Gunakan %s untuk nilai yang diisi saat dipanggil.'{ "model": "text-embedding-v3", "input": {"texts": ["%s"]}, "parameters": %s }'
json_pathTEXTEkspresi SQL untuk mengekstrak hasil dari respons HTTP. Gunakan 'SELECT %L' jika jalur eksak tidak diketahui.'SELECT %L'

rds_ai.update_model

Memperbarui field dalam konfigurasi model yang sudah ada.

rds_ai.update_model(
  model_name  TEXT,
  config_name TEXT,
  value       TEXT
) RETURNS void
ParameterTipeDeskripsiContoh
model_nameTEXTNama model yang akan diperbarui.'text-embedding-v3'
config_nameTEXTField yang akan diperbarui. Lihat rds_ai.add_model untuk nama field.'uri'
valueTEXTNilai baru untuk field tersebut.

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

rds_ai.del_model

Menghapus konfigurasi model.

rds_ai.del_model(model_name text) RETURNS void
ParameterTipeDeskripsiContoh
model_nametextNama model yang akan dihapus.'test-model'

rds-ai.invoke_model

Memanggil model dan mengembalikan hasil yang diurai oleh ekspresi json_path dalam konfigurasi model.

rds-ai.invoke_model(
  model_name  TEXT,
  params_list TEXT[]
) RETURNS http.http_response
ParameterTipeDeskripsiContoh
model_nametextModel yang dipanggil.'qwen-plus'
params_listtext[]Nilai untuk mengisi content_template, secara berurutan.ARRAY['who are you', '{}']

rds-ai.raw_invoke_model

Memanggil model dan mengembalikan respons HTTP lengkap.

rds-ai.raw_invoke_model(
  model_name  TEXT,
  params_list TEXT[]
) RETURNS http.http_response
ParameterTipeDeskripsiContoh
model_nametextModel yang dipanggil.'qwen-plus'
params_listtext[]Nilai untuk mengisi content_template, secara berurutan.ARRAY['who are you', '{}']

Langkah selanjutnya