ApsaraDB RDS for PostgreSQL mendukung ekstensi rds_ai yang mengintegrasikan model canggih dari Alibaba Cloud Model Studio, termasuk Qwen dan model text embedding. Topik ini menjelaskan cara menggunakan ekstensi rds_ai untuk mengimplementasikan Retrieval-Augmented Generation (RAG) dalam database dengan mengeksekusi Pernyataan SQL.
Prasyarat
Instans RDS harus menjalankan PostgreSQL 16.
Instans RDS harus menjalankan versi mesin minor 20241230 atau yang lebih baru.
Untuk memperbarui versi mesin minor, lihat Perbarui Versi Mesin Minor.
Akun istimewa telah dibuat untuk instans RDS. Untuk informasi lebih lanjut, lihat Buat Akun.
Alibaba Cloud Model Studio telah diaktifkan dan Kunci API tersedia untuk memanggil model. Untuk informasi lebih lanjut, lihat Dapatkan Kunci API.
Jaringan instans RDS dikonfigurasi untuk mengakses model eksternal. Untuk informasi lebih lanjut, lihat Konfigurasi Jaringan.
Ikhtisar solusi
Solusi yang dijelaskan dalam topik ini ideal untuk skenario sederhana, memungkinkan Anda mengimplementasikan RAG tanpa perlu melakukan coding.
Dengan menggunakan solusi ini, Anda dapat mengimplementasikan operasi berbasis RAG secara efisien melalui eksekusi Pernyataan SQL. Tidak diperlukan keahlian mendalam dalam RAG atau kekhawatiran terkait O&M kerangka kerja RAG, lingkungan runtime, maupun komponen kompleks lainnya.
Solusi ini melibatkan tahap-tahap utama berikut:
Pemotongan Dokumen: Eksekusi Pernyataan SQL untuk membagi dokumen menjadi beberapa chunk.
Text Embedding: Gunakan rds_ai untuk mengonversi teks menjadi penyematan dan tsvectors.
Pengambilan Multimodal: Gunakan rds_ai untuk mengambil informasi dari berbagai dimensi seperti penyematan dan kata kunci.
Penyusunan Ulang Hasil: Gunakan rds_ai untuk menyusun ulang hasil pengambilan demi optimalisasi relevansi.
Pemanggilan Model Bahasa Besar (LLM): Gunakan rds_ai untuk memanggil LLM untuk Q&A berbasis RAG.
Langkah 1: Instal dan konfigurasikan rds_ai
Instal ekstensi rds_ai.
Buka halaman Instans di konsol ApsaraDB RDS. Di bilah navigasi atas, pilih wilayah tempat instans RDS for PostgreSQL Anda berada lalu klik ID instans RDS Anda di daftar instans.
Di panel navigasi sisi kiri, klik Plug-ins.
Di tab Extension Marketplace, klik Install di bagian rds_ai.
Di kotak dialog yang muncul, pilih database dan akun Anda lalu klik Install.
Tunggu hingga status instans berubah dari Maintaining Instance menjadi Running.
CatatanProses instalasi memakan waktu sekitar satu menit. Anda dapat menyegarkan halaman untuk memeriksa status instans.
Hubungkan ke instans RDS for PostgreSQL Anda dan konfigurasikan ekstensi rds_ai di skema public database Anda.
Konfigurasikan Kunci API yang digunakan untuk memanggil semua model default.
-- Konfigurasikan Kunci API yang digunakan untuk memanggil semua model yang ditentukan dalam rds_ai.model_list. SELECT rds_ai.update_model(model_name,'token','sk-****') FROM rds_ai.model_list;Ekstensi rds_ai memanggil model secara remote berdasarkan ekstensi pgsql-http. Oleh karena itu, Anda harus mengonfigurasi pengaturan timeout untuk menginterupsi pemanggilan yang berjalan lama.
PentingPengaturan timeout hanya tersedia dalam sesi saat ini. Anda harus mengonfigurasinya lagi ketika membuka sesi baru.
-- Konfigurasikan periode timeout permintaan dalam milidetik. SET http.timeout_msec TO 200000; SELECT http.http_set_curlopt('CURLOPT_TIMEOUT', '200000'); -- Konfigurasikan periode timeout koneksi. SELECT http.http_set_curlopt('CURLOPT_CONNECTTIMEOUT_MS', '200000');
Langkah 2: Persiapkan data untuk RAG
Gunakan SQL untuk menyisipkan data dokumen basis pengetahuan ke dalam database. Sebelum disisipkan, escape karakter spesial dalam teks. Misalnya, gunakan \n untuk mengganti line feed.
Buat tabel bernama doc untuk menyimpan data dokumen dan tabel bernama chunk untuk menyimpan chunk. Kemudian, buat indeks pada kedua tabel tersebut.
CREATE TABLE doc ( id SERIAL PRIMARY KEY, title VARCHAR(255), content TEXT ); CREATE TABLE chunk ( id SERIAL PRIMARY KEY, doc_id INTEGER NOT NULL, text TEXT, embedding VECTOR(1024), ts_vector_extra tsvector ); -- Buat indeks pada tabel yang dibuat. CREATE INDEX idx_doc_id ON chunk (doc_id); CREATE INDEX ON chunk USING hnsw (embedding vector_cosine_ops); CREATE INDEX chunk_text_gin ON chunk USING gin (ts_vector_extra); CREATE INDEX ON chunk USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);Buat fungsi split_text untuk membagi teks panjang menjadi chunk dengan panjang tetap dan tentukan panjang overlap untuk chunk. Fungsi ini hanya untuk referensi. Untuk membagi teks kompleks, kami sarankan Anda menggunakan framework pemotongan teks khusus.
CREATE OR REPLACE FUNCTION split_text( input_text TEXT, chunk_size INT, chunk_overlap INT ) RETURNS SETOF TEXT AS $$ DECLARE current_idx INT; start_idx INT; chunk TEXT; BEGIN -- Tangani pengecualian ketika panjang overlap melebihi panjang chunk. IF chunk_overlap >= chunk_size THEN RAISE EXCEPTION 'chunk_overlap must be less than chunk_size'; END IF; current_idx := 1; LOOP -- Tentukan posisi awal. start_idx := current_idx - chunk_overlap; IF start_idx < 1 THEN start_idx := 1; END IF; chunk := substr(input_text, start_idx, chunk_size); IF chunk IS NULL OR length(chunk) = 0 THEN EXIT; END IF; RETURN NEXT chunk; current_idx := current_idx + chunk_size - chunk_overlap; END LOOP; END; $$ LANGUAGE plpgsql;Buat trigger untuk memastikan data terpisah disisipkan secara otomatis ke tabel chunk dan diubah menjadi penyematan dan tsvectors saat data dokumen disisipkan ke tabel doc.
Jika data dokumen kompleks dan sulit dibagi menjadi chunk, lihat Langkah 3: Ubah Data Dokumen Menjadi Penyematan dalam Batch untuk mengubah data menjadi penyematan dalam batch.
-- Buat trigger untuk secara otomatis mengeksekusi fungsi split_text untuk menyisipkan data terpisah ke dalam tabel chunk saat data ditambahkan atau dihapus dari tabel doc. CREATE OR REPLACE FUNCTION insert_into_chunk() RETURNS TRIGGER AS $$ BEGIN INSERT INTO chunk (doc_id, text) SELECT NEW.id, result FROM split_text(NEW.content, 300, 50) AS result; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER after_insert_doc AFTER INSERT ON doc FOR EACH ROW EXECUTE FUNCTION insert_into_chunk(); CREATE OR REPLACE FUNCTION delete_from_chunk() RETURNS TRIGGER AS $$ BEGIN DELETE FROM chunk WHERE doc_id = OLD.id; RETURN OLD; END; $$ LANGUAGE plpgsql; CREATE TRIGGER after_delete_doc AFTER DELETE ON doc FOR EACH ROW EXECUTE FUNCTION delete_from_chunk(); -- Buat trigger untuk secara otomatis mengeksekusi fungsi rds_ai.embed untuk mengonversi chunk dalam tabel chunk menjadi penyematan. CREATE OR REPLACE FUNCTION update_chunk_embedding() RETURNS TRIGGER AS $$ BEGIN NEW.embedding := rds_ai.embed(NEW.text)::vector; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER set_chunk_embedding BEFORE INSERT OR UPDATE ON chunk FOR EACH ROW EXECUTE FUNCTION update_chunk_embedding(); -- Buat trigger untuk secara otomatis mengonversi chunk dalam tabel chunk menjadi tsvectors untuk pengambilan berbasis kata kunci. CREATE TRIGGER embedding_tsvector_update BEFORE UPDATE OR INSERT ON chunk FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger( 'ts_vector_extra', 'pg_catalog.english', 'text' );Sisipkan data dokumen basis pengetahuan ke tabel doc. Data dalam pernyataan ini hanya untuk referensi.
INSERT INTO doc (title, content) VALUES ('Sejarah Singkat PostgreSQL', 'Sistem manajemen database objek-relasional yang sekarang dikenal sebagai PostgreSQL berasal dari paket POSTGRES yang ditulis di Universitas California, Berkeley. Setelah lebih dari dua dekade pengembangan, PostgreSQL adalah database open-source paling canggih yang tersedia di dunia.\n\n2.1. Proyek POSTGRES di Berkeley\nProyek POSTGRES, yang dipimpin oleh Profesor Michael Stonebraker, didanai oleh Defense Advanced Research Projects Agency (DARPA), Army Research Office (ARO), National Science Foundation (NSF), dan ESL, Inc. Implementasi POSTGRES dimulai pada tahun 1986. Konsep asli sistem ini dirinci dalam [ston86]. Definisi model data awal ditemukan dalam [rowe87]. Desain sistem aturan pada saat itu dijelaskan dalam [ston87a]. Dasar teoritis dan arsitektur manajer penyimpanan dijelaskan secara rinci dalam [ston87b].\n\nSejak itu, POSTGRES telah mengalami beberapa pembaruan versi utama. Sistem demonstrasi pertama tersedia pada tahun 1987 dan dipamerkan di konferensi ACM-SIGMOD pada tahun 1988. Versi 1 dirilis pada Juni 1989 (lihat [ston90a]) untuk beberapa pengguna eksternal. Sebagai tanggapan terhadap kritik terhadap sistem aturan pertama ([ston89]), sistem aturan diredesain ([ston90b]), dan versi 2, menggunakan sistem aturan baru, dirilis pada Juni 1990. Versi 3 muncul pada tahun 1991, menambahkan dukungan untuk beberapa manajer penyimpanan dan meningkatkan executor query serta menulis ulang sistem aturan. Versi-versi berikutnya, hingga rilis Postgres95 (lihat di bawah), terutama berfokus pada portabilitas dan keandalan.\n\nPOSTGRES telah digunakan untuk mengimplementasikan banyak aplikasi penelitian dan produksi yang berbeda. Aplikasi-aplikasi ini mencakup sistem analisis data keuangan, paket pemantauan kinerja mesin jet, database pelacakan asteroid, database informasi medis, dan beberapa sistem informasi geografis. POSTGRES juga telah digunakan oleh banyak universitas untuk tujuan pengajaran. Akhirnya, Illustra Information Technologies (kemudian bergabung ke Informix, yang sekarang dimiliki oleh IBM) memonetisasi kode tersebut. Pada akhir 1992, POSTGRES menjadi manajer data utama untuk proyek komputasi ilmiah Sequoia 2000.\n\nPada tahun 1993, jumlah pengguna eksternal hampir dua kali lipat. Seiring bertambahnya jumlah pengguna, waktu yang dihabiskan untuk pemeliharaan kode sumber meningkat dan menghabiskan terlalu banyak waktu yang seharusnya digunakan untuk penelitian database. Untuk mengurangi beban dukungan, proyek POSTGRES di Berkeley secara resmi berakhir pada versi 4.2.\n\n2.2. Postgres95\nPada tahun 1994, Andrew Yu dan Jolly Chen menambahkan interpreter bahasa SQL ke POSTGRES. Mereka kemudian merilis kode sumber tersebut dengan nama baru Postgres95 di Internet untuk semua orang gunakan, menjadi penerus open-source dari kode POSTGRES Berkeley asli.\n\nKode sumber Postgres95 sepenuhnya ANSI C, dan ukuran kode berkurang sebesar 25%. Banyak modifikasi internal meningkatkan performa dan kemampuan pemeliharaan. Versi 1.0.x Postgres95 sekitar 30-50% lebih cepat daripada versi 4.2 POSTGRES saat menjalankan uji Wisconsin Benchmark. Selain memperbaiki beberapa bug, berikut adalah beberapa peningkatan utama:\n\nBahasa query asli PostQUEL digantikan oleh SQL (diimplementasikan di sisi server). Library interface libpq dinamai berdasarkan PostQUEL. Sebelum PostgreSQL, subquery tidak didukung (lihat di bawah), tetapi mereka dapat disimulasikan di Postgres95 dengan fungsi SQL yang ditentukan pengguna. Fungsi agregat diimplementasikan ulang. Dukungan untuk klausa GROUP BY query juga ditambahkan.\n\nProgram baru untuk query SQL interaktif menggunakan Readline GNU ditambahkan (psql). Program ini sebagian besar menggantikan program monitor lama.\n\nLibrary frontend baru (libpgtcl) ditambahkan untuk mendukung klien berbasis Tcl. Shell sampel (pgtclsh) menyediakan perintah Tcl baru untuk interaksi antara program Tcl dan server Postgres95.\n\nAntarmuka untuk objek besar sepenuhnya ditulis ulang. Sistem file inversi dihapus, menyisakan inversi sebagai satu-satunya mekanisme untuk menyimpan objek besar.\n\nSistem aturan tingkat instans dihapus. Namun, aturan masih ada dalam bentuk aturan penulisan ulang.\n\nTutorial singkat yang memperkenalkan fitur-fitur SQL dan Postgres95 ditambahkan ke kode sumber yang dirilis.\n\nPostgres95 dapat dikompilasi menggunakan GCC tanpa tambalan (memperbaiki masalah aligment data presisi ganda).\n\n\n2.3. PostgreSQL\nPada tahun 1996, sudah jelas bahwa nama Postgres95 sudah ketinggalan zaman. Kami memilih nama baru, PostgreSQL, untuk mencerminkan hubungan antara POSTGRES asli dan versi terbaru dengan kemampuan SQL. Nomor versi juga dimulai dari 6.0, kembali ke urutan yang awalnya dimulai oleh proyek POSTGRES Berkeley.\n\nBanyak orang terus menggunakan Postgres untuk merujuk ke PostgreSQL (sekarang jarang dalam huruf kapital semua) karena tradisi atau kemudahan pengucapan. Penggunaan ini diterima secara luas sebagai nama panggilan atau alias.\n\nPengembangan Postgres95 berfokus pada identifikasi dan pemahaman masalah yang ada di kode backend. Pengembangan PostgreSQL beralih ke beberapa fitur dan fungsi kontroversial, dengan pekerjaan di semua area dilakukan secara bersamaan.\n\n Perubahan pada PostgreSQL sejak saat itu dapat ditemukan di Lampiran E.'), ('Ikhtisar Sistem Manajemen Database MySQL', 'MySQL adalah sistem manajemen database SQL open-source paling populer, dikembangkan, dirilis, dan didukung oleh MySQL AB. MySQL AB adalah perusahaan komersial yang didirikan oleh beberapa pengembang MySQL. Ini adalah perusahaan open-source generasi kedua yang menggabungkan nilai-nilai, metode, dan model bisnis open-source yang sukses.\n\nSitus web MySQL (http://www.mysql.com/) menyediakan informasi terbaru tentang MySQL dan MySQL.\n\n· MySQL adalah sistem manajemen database.\n\nDatabase adalah kumpulan data terstruktur. Itu bisa apa saja mulai dari daftar belanja sederhana hingga galeri seni atau sejumlah besar informasi dalam jaringan perusahaan. Untuk menambahkan data ke database atau mengakses dan memproses data yang disimpan dalam database komputer, Anda memerlukan sistem manajemen database seperti server MySQL. Komputer adalah alat yang ideal untuk menangani sejumlah besar data, sehingga sistem manajemen database memainkan peran sentral yang penting dalam komputasi, baik sebagai utilitas mandiri maupun sebagai komponen aplikasi lainnya.\n\nMySQL adalah sistem manajemen database relasional.\n\nDatabase relasional menyimpan data dalam tabel yang berbeda daripada menempatkan semua data dalam satu repositori besar. Ini meningkatkan kecepatan dan fleksibilitas. SQL dalam MySQL mengacu pada Structured Query Language. SQL adalah bahasa standar yang paling umum digunakan untuk mengakses database, yang didefinisikan oleh standar ANSI/ISO SQL. Standar SQL telah berkembang sejak 1986, dengan beberapa versi. Dalam manual ini, SQL-92 mengacu pada standar yang dirilis pada 1992, SQL:1999 mengacu pada standar yang dirilis pada 1999, dan SQL:2003 mengacu pada versi saat ini dari standar. Kami menggunakan istilah standar SQL untuk menunjukkan versi saat ini dari standar SQL.\n\nPerangkat lunak MySQL adalah perangkat lunak open-source.\n\nOpen source berarti siapa pun dapat menggunakan dan mengubah perangkat lunak. Siapa pun dapat mengunduh perangkat lunak MySQL dari Internet tanpa membayar biaya apa pun. Jika Anda mau, Anda dapat mempelajari kode sumber dan membuat perubahan yang sesuai untuk memenuhi kebutuhan Anda sendiri. Perangkat lunak MySQL dilisensikan di bawah GPL (GNU General Public License), http://www.mysql.com/company/legal/licensing/).\n\nServer database MySQL cepat, andal, dan mudah digunakan.\n\nJika itulah yang Anda cari, cobalah. Server MySQL juga memiliki serangkaian fitur praktis yang dikembangkan melalui kerjasama erat dengan pengguna kami. Halaman benchmark kami menyediakan hasil perbandingan server MySQL dan manajer database lainnya. Lihat 7.1.4 Suite Benchmark MySQL.\n\nServer MySQL awalnya dikembangkan untuk menangani database besar, dan lebih cepat daripada solusi yang ada. Selama bertahun-tahun, ia telah berhasil digunakan dalam banyak lingkungan produksi yang menuntut. Meskipun MySQL terus berkembang, server MySQL saat ini menawarkan fitur-fitur yang kaya dan berguna. Ia memiliki konektivitas yang baik, kecepatan, dan keamanan, membuat MySQL sangat cocok untuk mengakses database di Internet.\n\nServer MySQL beroperasi dalam mode client/server atau sistem tertanam.\n\nPerangkat lunak database MySQL adalah sistem client/server yang terdiri dari server SQL multithreaded yang mendukung backend yang berbeda, beberapa program klien dan library yang berbeda, banyak alat manajemen, dan antarmuka pemrograman aplikasi (API) yang luas.\n\nKami juga dapat menyediakan server MySQL sebagai library multithreaded tertanam yang dapat Anda tautkan ke aplikasi Anda, menghasilkan produk yang lebih kecil, lebih cepat, dan lebih mudah dikelola.\n\nAda banyak perangkat lunak MySQL bersama yang tersedia.\n\nKemungkinan besar aplikasi dan bahasa favorit Anda mendukung server database MySQL.\n\nPengucapan resmi MySQL adalah My Ess Que Ell (bukan my sequel), tetapi kami tidak keberatan jika Anda mengucapkannya sebagai my sequel atau dengan cara lokal lainnya.'), ('Apa itu SQL Server?', 'Microsoft SQL Server adalah sistem manajemen database relasional (RDBMS). Aplikasi dan alat terhubung ke instance SQL Server atau database dan berkomunikasi menggunakan Transact-SQL (T-SQL).\n\nOpsi Penyebaran\nSQL Server dapat diinstal di Windows atau Linux, diterapkan di container Linux, atau diterapkan di mesin virtual Azure atau platform mesin virtual lainnya. Anda sebelumnya mungkin merujuknya sebagai produk kotak.\n\nVersi SQL Server mana yang didukung tergantung pada perjanjian lisensi Anda, tetapi untuk tujuan dokumen ini, kami merujuk ke SQL Server 2016 (13.x) dan versi selanjutnya. Untuk dokumentasi tentang SQL Server 2014 (12.x) dan versi sebelumnya, lihat dokumentasi versi sebelumnya SQL Server. Untuk mengetahui versi SQL Server mana yang saat ini didukung, lihat Opsi Akhir Dukungan SQL Server.\n\nProduk dan layanan berikut juga menggunakan mesin database SQL Server yang mendasarinya:\n\nAzure SQL Database\nAzure SQL Managed Instance\nMicrosoft Analytics Platform System (PDW)\nAzure Synapse Analytics\nAzure SQL Edge\nUntuk daftar fitur yang didukung oleh berbagai versi SQL Server di Windows, lihat:\n\nVersi dan fitur yang didukung SQL Server 2022\nVersi dan fitur yang didukung SQL Server 2019\nVersi dan fitur yang didukung SQL Server 2017\nVersi dan fitur yang didukung SQL Server 2016\nKomponen dan Teknologi SQL Server\nBagian ini memperkenalkan beberapa teknologi kunci yang tersedia di SQL Server.\n\nKomponen\tDeskripsi\nMesin Database\tMesin database adalah layanan inti untuk menyimpan, memproses, dan melindungi data. Mesin database menyediakan akses terkontrol dan pemrosesan transaksi untuk memenuhi persyaratan aplikasi konsumsi data yang paling menuntut dalam perusahaan. Mesin database juga menyediakan dukungan komprehensif untuk kelangsungan bisnis dan pemulihan database (SQL Server) untuk menjaga kelangsungan bisnis.\nMachine Learning Services (MLS)\tSQL Server Machine Learning Services mendukung integrasi pembelajaran mesin ke dalam alur kerja perusahaan menggunakan bahasa R dan Python populer.\n\nMachine Learning Services (in-database) mengintegrasikan R dan Python dengan SQL Server, memungkinkan pengguna dengan mudah menghasilkan, melatih ulang model, dan mencetak model dengan memanggil prosedur tersimpan. Machine Learning Server menyediakan dukungan tingkat perusahaan untuk R dan Python, memungkinkan pengguna menggunakannya tanpa SQL Server.\nIntegration Services (SSIS)\tSQL Server Integration Services adalah platform untuk membangun solusi integrasi data berperforma tinggi, termasuk paket untuk pemrosesan extract, transform, dan load (ETL) untuk data warehouse.\nAnalysis Services (SSAS)\tSQL Server Analysis Services adalah platform dan set alat analitik data untuk business intelligence pribadi, tim, dan perusahaan. Desainer server dan klien mendukung solusi OLAP tradisional, solusi pemodelan tabular baru, dan analitik swalayan dan kolaborasi dengan menggunakan Power Pivot, Excel, dan lingkungan SharePoint Server. Analysis Services juga mencakup penambangan data, memungkinkan Anda menemukan pola dan hubungan tersembunyi dalam sejumlah besar data.\nReporting Services (SSRS)\tSQL Server Reporting Services menyediakan kemampuan pelaporan tingkat perusahaan yang diaktifkan web. Ini memungkinkan pengguna membuat laporan yang mengekstrak konten dari berbagai sumber data, menerbitkan laporan dalam berbagai format, dan mengelola keamanan dan langganan secara terpusat.\nReplication\tSQL Server Replication adalah serangkaian teknologi untuk menyalin dan mendistribusikan data dan objek database dari satu database ke database lain dan kemudian menyinkronkan antara database untuk menjaga konsistensi. Replication memungkinkan Anda mendistribusikan data ke lokasi yang berbeda dan mendistribusikannya ke pengguna jarak jauh atau mobile melalui jaringan area lokal, jaringan area luas, koneksi dial-up, koneksi nirkabel, dan Internet.\nData Quality Services (DQS)\tData Quality Services menyediakan solusi pembersihan data berbasis pengetahuan. DQS memungkinkan Anda menghasilkan basis pengetahuan dan kemudian menggunakan basis pengetahuan ini, bersama dengan metode bantuan komputer dan interaktif, untuk melakukan koreksi data dan deduplikasi. Anda dapat menggunakan layanan data referensi berbasis cloud dan menghasilkan solusi manajemen data yang mengintegrasikan DQS dengan SQL Server Integration Services dan Master Data Services.\nMaster Data Services (MDS)\tMaster Data Services adalah solusi manajemen data master untuk SQL Server. Solusi yang dibangun di atas Master Data Services membantu memastikan bahwa laporan dan analisis didasarkan pada informasi yang tepat. Dengan Master Data Services, Anda dapat membuat repositori pusat untuk data master dan mempertahankan catatan data master yang dapat diaudit dan aman saat berubah seiring waktu.\n') ;Lihat data dalam tabel chunk. Data tersebut harus mencakup potongan teks yang dipisahkan dari data dokumen serta penyematan dan tsvectors yang dikonversi dari potongan-potongan tersebut.
SELECT * FROM chunk;
Langkah 3: Ubah data dokumen menjadi penyematan dalam batch
Lewati langkah ini jika Anda membuat trigger untuk penyematan teks otomatis mengikuti Sublangkah 4 dalam Langkah 2: Persiapkan Data untuk RAG.
Dalam skenario di mana data dokumen kompleks dan sulit dibagi menjadi chunk, kami sarankan Anda menggunakan framework RAG seperti LangChain untuk mengembangkan skrip untuk penyematan teks. Dengan metode ini, Anda juga dapat mengimplementasikan penyematan teks pada tabel chunk yang ada dalam database. Anda dapat memanggil fungsi rds_ai.embed untuk secara rekursif mengonversi data dokumen atau memanggil fungsi kustom untuk mengonversi data dokumen dalam batch.
Ubah Data Dokumen Secara Rekursif
Panggil fungsi rds_ai.embed secara rekursif untuk mengonversi teks dalam setiap rekaman menjadi penyematan dan menyimpannya dalam kolom bernama embedding.
-- Secara rekursif panggil rds_ai.embed untuk mengonversi semua data dalam tabel menjadi penyematan. UPDATE chunk SET embedding = rds_ai.embed(text)::vector;Ubah Data Dokumen dalam Batch
Panggil rds_ai.add_model untuk membuat model text-embedding-v3-batch.
SELECT rds_ai.add_model( 'text-embedding-v3-batch', -- Nama model 'POST', -- Metode permintaan ARRAY[('Authorization', 'Bearer %s')]::http.http_header[], -- Header permintaan 'https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings', -- URL permintaan 'application/json', -- Tipe konten permintaan '{ "model": "text-embedding-v3", "input": %s }', -- Body permintaan 'SELECT %L::jsonb->''data''' -- SQL untuk memproses respons );Konfigurasikan Kunci API yang digunakan untuk memanggil model text-embedding-v3-batch.
SELECT rds_ai.update_model( 'text-embedding-v3-batch', 'token', 'sk-xxxxxx' );Uji model.
SELECT * FROM rds_ai.invoke_model( 'text-embedding-v3-batch', ARRAY['["01","02","03"]'] );
Anda dapat memilih salah satu metode penyematan sebelumnya berdasarkan hasil pengujian. Namun, kami sarankan Anda mengonversi data dokumen secara rekursif menjadi penyematan. Kode berikut memberikan contoh:
DO $$
DECLARE
batch_size INT := 20; -- Ukuran batch untuk pemanggilan penyematan, dapat disesuaikan berdasarkan model
pointer INT := 0; -- Penunjuk untuk menjelajahi tabel
record_count INT; -- Jumlah total rekaman dalam tabel
input_text TEXT; -- String gabungan dari bidang yang akan disematkan dalam format ["item1", "item2",..., "item n"]
json_results JSON; -- Respons JSON dari pemanggilan API penyematan
json_item JSON; -- Elemen tunggal dari respons array JSON yang berisi bidang indeks dan penyematan
idx INT; -- Indeks dari respons JSON
BEGIN
-- Dapatkan jumlah total rekaman
SELECT COUNT(*) INTO record_count FROM chunk;
-- Loop melalui setiap batch
WHILE pointer < record_count LOOP
-- Konstruksi input
SELECT json_agg(text::TEXT) INTO input_text
FROM (
SELECT text
FROM chunk
ORDER BY id
LIMIT batch_size OFFSET pointer
) AS subquery;
-- Panggil model penyematan
json_results := rds_ai.invoke_model('text-embedding-v3-batch', ARRAY[input_text]);
-- Loop melalui hasil model dan perbarui baris yang sesuai
FOR idx IN 0..json_array_length(json_results) - 1 LOOP
json_item := json_results->idx;
UPDATE chunk
SET embedding = (SELECT (json_item->>'embedding')::VECTOR(1024))
WHERE id = (SELECT id FROM chunk ORDER BY id LIMIT 1 OFFSET pointer + idx);
END LOOP;
-- Perbarui penunjuk untuk batch berikutnya
pointer := pointer + batch_size;
RAISE NOTICE '%/% telah selesai.', pointer, record_count;
END LOOP;
END;
$$ LANGUAGE plpgsql;Langkah 4: Implementasikan pengambilan multimodal
Implementasikan pengambilan data berdasarkan penyematan dan kata kunci. Kode berikut memberikan contoh:
CREATE OR REPLACE FUNCTION multi_retrieve(query TEXT)
RETURNS TABLE(ret_chunk text, score numeric, method text, rank int) AS $$
DECLARE
rec RECORD;
BEGIN
-- Ambil berdasarkan kata kunci
FOR rec IN
SELECT
text,
subquery.score,
'retrieve_by_key_word' AS method,
RANK() OVER (ORDER BY subquery.score DESC) AS rank_id
FROM (
SELECT
text,
ts_rank(
ts_vector_extra,
to_tsquery(replace(
text(plainto_tsquery('pg_catalog.english', query)), '&', '|'
))
) AS score
FROM chunk
WHERE ts_vector_extra @@ to_tsquery(replace(
text(plainto_tsquery('pg_catalog.english', query)), '&', '|'
))
) AS subquery
ORDER BY subquery.score DESC
LIMIT 5
LOOP
ret_chunk := rec.text;
score := rec.score;
method := rec.method;
rank := rec.rank_id;
RETURN NEXT;
END LOOP;
-- Ambil berdasarkan vektor
FOR rec IN
SELECT
*,
'retrieve_by_vector' AS method,
RANK() OVER (ORDER BY distance) AS rank_id
FROM rds_ai.retrieve(
query,
'public',
'chunk',
'text',
'embedding',
distance_type => 'cosine',
topn => 5
)
LOOP
ret_chunk := rec.chunk;
score := rec.distance;
method := rec.method;
rank := rec.rank_id;
RETURN NEXT;
END LOOP;
END;
$$ LANGUAGE plpgsql;Untuk hanya mengambil data berdasarkan penyematan, panggil fungsi rds_ai.retrieve.
Anda dapat mengeksekusi pernyataan berikut untuk menguji apakah pengambilan multimodal bekerja.
SELECT *
FROM multi_retrieve('Perkenalkan asal-usul database PostgreSQL.')
ORDER BY METHOD, RANK;Langkah 5: Susun ulang hasil
Susun ulang hasil pengambilan multimodal
Anda dapat menggunakan fungsi rds_ai.rank atau RFF untuk menyusun ulang hasil pengambilan multimodal.
Gunakan rds_ai.rank untuk penyusunan ulang
DROP FUNCTION get_reranked_results(text, integer);
CREATE OR REPLACE FUNCTION get_reranked_results(query TEXT, top_n INT DEFAULT 1)
RETURNS TABLE(score FLOAT, value TEXT) AS $$
DECLARE
result_array TEXT[];
BEGIN
SELECT array_agg(ret_chunk)
INTO result_array
FROM multi_retrieve(query);
RETURN QUERY
SELECT *
FROM rds_ai.rank(query, result_array)
ORDER BY score_value DESC
LIMIT top_n;
END $$ LANGUAGE plpgsql;
SELECT * FROM get_reranked_results('Perkenalkan asal-usul database PostgreSQL.');Gunakan fungsi RFF untuk penyusunan ulang
-- Buat fungsi agregat untuk fungsi RFF umum.
CREATE TYPE score_agg_state AS (
vector_score numeric,
keyword_score numeric
);
CREATE OR REPLACE FUNCTION score_agg_transfn(state score_agg_state, rank numeric, method text)
RETURNS score_agg_state AS $$
BEGIN
CASE method
WHEN 'retrieve_by_vector' THEN
state.vector_score := COALESCE(1 / (60+rank), 0);
WHEN 'retrieve_by_key_word' THEN
state.keyword_score := COALESCE(1 / (60+rank), 0);
END CASE;
RETURN state;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION score_agg_finalfn(state score_agg_state)
RETURNS numeric AS $$
BEGIN
RETURN COALESCE(state.vector_score, 0) + COALESCE(state.keyword_score, 0);
END;
$$ LANGUAGE plpgsql;
CREATE AGGREGATE rff_function(numeric, text)(
SFUNC = score_agg_transfn,
STYPE = score_agg_state,
FINALFUNC = score_agg_finalfn,
INITCOND = '(0, 0)'
);Panggil fungsi untuk menyusun ulang hasil.
CREATE OR REPLACE FUNCTION get_reranked_results(query TEXT, top_n INT DEFAULT 1)
RETURNS TABLE(score numeric, value TEXT) AS $$
BEGIN
RETURN QUERY
SELECT
rff_function(rank, method) AS score, -- Gunakan rff_function(rank, method) untuk menghitung skor
ret_chunk AS value
FROM
multi_retrieve(query)
GROUP BY
value
ORDER BY
score DESC
LIMIT top_n;
END $$ LANGUAGE plpgsql;Susun ulang hasil pengambilan berbasis penyematan
Anda dapat mengeksekusi pernyataan SQL berikut untuk memanggil fungsi rds_ai.rank untuk menyusun ulang hasil pengambilan berbasis penyematan:
DROP FUNCTION get_reranked_results(text, integer);
CREATE OR REPLACE FUNCTION get_reranked_results(query TEXT, top_n INT DEFAULT 1)
RETURNS TABLE(score FLOAT, value TEXT) AS $$
DECLARE
result_array TEXT[];
BEGIN
SELECT array_agg(chunk)
INTO result_array
FROM rds_ai.retrieve(query, 'public', 'chunk', 'text', 'embedding');
RETURN QUERY
SELECT *
FROM rds_ai.rank(query, result_array)
ORDER BY score_value DESC
LIMIT top_n;
END $$ LANGUAGE plpgsql;
-- Uji
SELECT * FROM get_reranked_results('Perkenalkan asal-usul database PostgreSQL.');Langkah 6: Panggil LLM untuk mengembalikan hasil
Kembalikan hasil pengambilan multimodal
Buat fungsi escape_for_json untuk menghindari karakter spesial seperti line feed dalam hasil di dalam database. Langkah ini penting karena hasil yang dikembalikan dengan memanggil fungsi rds_ai.prompt adalah objek JSON yang dirakit oleh parameter.
CREATE OR REPLACE FUNCTION escape_for_json(input TEXT) RETURNS TEXT AS $$ BEGIN RETURN replace(replace(input, '"', '\\"'), E'\n', '\\n'); END; $$ LANGUAGE plpgsql;Buat fungsi bernama rag untuk mengembalikan hasil pengambilan multimodal. Kode berikut memberikan contoh:
CREATE OR REPLACE FUNCTION rag(query TEXT) RETURNS TEXT AS $$ DECLARE prompt_content TEXT; result TEXT; BEGIN -- Gunakan fungsi get_reranked_results untuk mendapatkan hasil yang disusun ulang dan agregasikan ke dalam array WITH rank_result AS ( SELECT string_agg(value, ',') AS prompt_content_pre FROM get_reranked_results(query) ) -- Hasilkan prompt dari query rank_result dan dapatkan jawaban model SELECT 'Berdasarkan konten berikut' || prompt_content_pre || 'jawab pertanyaanku,' || query INTO prompt_content FROM rank_result; -- Gunakan fungsi rds_ai.prompt untuk mendapatkan jawaban model AI SELECT rds_ai.prompt(escape_for_json(prompt_content)) INTO result; -- Kembalikan hasil RETURN result; END; $$ LANGUAGE plpgsql;Panggil fungsi rag untuk mendapatkan jawaban yang diperoleh dengan menggunakan pengambilan multimodal.
SELECT rag('Perkenalkan asal-usul database PostgreSQL.');
Kembalikan hasil pengambilan berbasis penyematan
Untuk mendapatkan hasil pengambilan berbasis penyematan, eksekusi pernyataan berikut untuk memanggil fungsi rds_ai.rag:
SELECT *
FROM rds_ai.rag (
'Perkenalkan asal-usul database PostgreSQL.',
'public',
'chunk',
'text',
'embedding'
);