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 version Minimum minor engine version PostgreSQL 16 20241230 PostgreSQL 14, 15, 17 20250430 PostgreSQL 18 20251130 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
Konfirmasi versi mesin mayor dan minor instans Anda sebelum menginstal. Lihat Prasyarat.
Opsi 1: Instal dari konsol
Buka halaman RDS Instances, pilih wilayah, lalu klik ID instans target.
Di panel navigasi kiri, klik Plug-ins.
Di halaman Plugin Marketplace, klik Install di samping rds_ai.
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:
| API | Parameter | Default Model | Opsi |
|---|---|---|---|
| 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 |
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:
Buat tabel:
CREATE TABLE test_embed ( a text, b vector(1024), -- kolom vektor padat c sparsevec(250002) -- kolom vektor jarang );Masukkan teks:
INSERT INTO test_embed (a) VALUES ('hello world');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 jarak | Kapan digunakan |
|---|---|
cosine | Membandingkan makna teks tanpa memperhatikan panjang — pilihan paling umum untuk pencarian semantik |
L2 | Ketika besarnya vektor penting, bukan hanya arahnya |
L1 | Untuk vektor jarang atau berdimensi tinggi di mana L2 mahal secara komputasi |
negative | Untuk 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 indeks | Kecepatan | Akurasi | Memori | Kapan digunakan |
|---|---|---|---|---|
| None | Lambat | Recall 100% | Rendah | Tabel kecil atau ketika hasil eksak diperlukan |
| HNSW | Cepat | Tinggi (dapat disesuaikan) | Lebih tinggi | Sebagian besar beban kerja produksi — kecepatan kueri terbaik |
| IVFFlat | Sedang | Sedang (dapat disesuaikan) | Lebih rendah | Dataset besar di mana memori terbatas |
Contoh: Siapkan tabel dan jalankan pengambilan
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;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);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.
Jika Anda mengalami masalah saat menambahkan model kustom, hubungi kami.
Field rds_ai.model_list
| Field | Tipe | Deskripsi |
|---|---|---|
model_name | name | Nama model. Primary key. |
request_type | text | Metode HTTP (misalnya, POST) |
request_header | http.http_header[] | Header permintaan HTTP — digunakan untuk otentikasi |
uri | text | URL titik akhir model |
content_type | text | Tipe konten permintaan (misalnya, application/json) |
content_template | text | Templat badan permintaan dengan placeholder %s yang diisi saat dipanggil |
json_path | text | Ekspresi SQL untuk mengurai respons HTTP |
token | text | Token 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.
Terapkan layanan RAG di PAI-EAS. Lihat Deploy an LLM-based RAG chatbot using PAI-EAS and ApsaraDB RDS for PostgreSQL.
Dapatkan titik akhir layanan dan token:
Klik nama layanan RAG untuk membuka halaman Service Details.
Di Basic Information, klik View Endpoint Information.
Di kotak dialog Invocation Information, salin titik akhir layanan dan token.
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' );Atur token otentikasi:
SELECT rds_ai.update_model('pai-rag', 'token', 'MTFkYjMwZjgzYzA1YmE2N2YyNWMxM2NkNDVjMjEzNjYxMDAzMzE5****');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
Terapkan aplikasi AgentCraft di Function Compute. Lihat Cloud Deployment of AgentCraft.
Buat agen dan integrasi Client Access. Saat membuat Client Integration (seperti dalam Integrate an agent into a DingTalk robot), simpan titik akhir dan token.
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' );Atur token otentikasi:
SELECT rds_ai.update_model('fc-rag', 'token', '8UiGAziWgYGPxM3qR5sAChBfDJRt****');Verifikasi model:
SELECT rds_ai.invoke_model('fc-rag', ARRAY['What parameters are related to WAL log accumulation?']);
Referensi API
Langkah selanjutnya
pgvector User Guide — pelajari lebih lanjut tentang penyimpanan dan pencarian vektor di PostgreSQL
Deploy an LLM-based RAG chatbot using PAI-EAS and ApsaraDB RDS for PostgreSQL — panduan penerapan chatbot RAG end-to-end