Saat membangun pipeline pencarian semantik atau Generasi yang Diperkaya dengan Pengambilan Data (RAG), pembuatan penyematan teks biasanya memerlukan layanan terpisah di luar database Anda. Ekstensi rds_embedding memungkinkan Anda memanggil model penyematan eksternal langsung dari ApsaraDB RDS for PostgreSQL, menyimpan vektor hasilnya bersama data Anda, dan menjalankan kueri kemiripan kosinus — semuanya dalam database. Karena risiko keamanan, ekstensi ini dibatasi agar tidak dapat dibuat pada semua versi. Konten dalam topik ini hanya berlaku untuk instans tempat ekstensi tersebut sudah dibuat.
Karena risiko keamanan, ekstensi rds_embedding dibatasi agar tidak dapat dibuat pada semua versi mesin mayor dan minor RDS PostgreSQL. Peningkatan versi mesin minor tidak mencabut pembatasan ini. Instans tempat ekstensi sudah dibuat tidak terpengaruh dan dapat terus menggunakannya. Konten dalam topik ini hanya berlaku untuk instans semacam itu.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans RDS yang menjalankan PostgreSQL 14 atau versi lebih baru
Instans tempat ekstensi
rds_embeddingsudah dibuat. Ekstensi ini dibatasi agar tidak dapat dibuat pada semua versi, dan peningkatan versi mesin minor tidak mencabut pembatasan ini.Kunci API Alibaba Cloud Model Studio. Untuk mendapatkannya, lihat Dapatkan kunci API Anda.
Gateway NAT yang dikonfigurasi untuk virtual private cloud (VPC) tempat instans RDS Anda berjalan. Instans RDS PostgreSQL tidak dapat mengakses Internet secara default, sehingga diperlukan Gateway NAT untuk memanggil model penyematan eksternal.
Aktifkan ekstensi
Jalankan perintah berikut menggunakan akun istimewa. Aktifkan terlebih dahulu ekstensi vector — ekstensi ini menyediakan tipe data vektor dan operasi yang menjadi dependensi rds_embedding. Ekstensi rds_embedding dibatasi agar tidak dapat dibuat pada semua versi. Pernyataan berikut hanya berlaku untuk instans tempat ekstensi tersebut sudah dibuat.
CREATE EXTENSION vector;
CREATE EXTENSION rds_embedding;Untuk menonaktifkan ekstensi:
DROP EXTENSION rds_embedding;
DROP EXTENSION vector;Hasilkan dan kueri penyematan
Contoh berikut menggunakan model text-embedding-v3 dari Alibaba Cloud Model Studio untuk menghasilkan vektor berdimensi 1024 dan menjalankan kueri kemiripan kosinus. Untuk informasi lebih lanjut tentang model ini, lihat Pengenalan model.
Langkah 1: Buat tabel
Buat tabel dengan kolom text untuk konten Anda dan kolom vector(1024) untuk penyematan.
CREATE TABLE test(info text, vec vector(1024) NOT NULL);Langkah 2: Daftarkan model penyematan
Daftarkan text-embedding-v3 dengan menyediakan URL titik akhirnya, templat header otorisasi, templat badan permintaan, serta jalur JSON untuk mengekstraksi penyematan dari respons.
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'''
);Ganti sk-**** dengan kunci API Anda.
Langkah 3: Masukkan teks dan penyematan
Masukkan setiap baris dengan memanggil rds_embedding.get_embedding_by_model() secara inline. Fungsi ini memanggil API model dan mengembalikan vektor penyematan untuk teks yang diberikan.
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[];Ganti sk-**** dengan kunci API Anda.
Langkah 4: Kueri berdasarkan kemiripan vektor
Gunakan operator <=> (jarak kosinus) untuk mengurutkan baris berdasarkan kemiripan semantik terhadap string kueri. Jarak sebesar 0 berarti vektor identik; nilai yang lebih rendah menunjukkan kemiripan yang lebih besar.
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;Ganti sk-**** dengan kunci API Anda.
Output yang diharapkan:
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)Kueri mengembalikan "Endless Yangtze River rolls on" terlebih dahulu (jarak 0, kecocokan persis), diikuti oleh "Boundless falling leaves rustle down" sebagai tetangga semantik terdekat.



