Navigasi utama

Bisakah Postgres menangani pipeline RAG Anda?

Kami menguji pendekatan pgai yang mengutamakan basis data untuk melihat bagian operasi RAG yang dipermudah—dan beban kerja kompleks yang masih memerlukan fleksibilitas lebih besar.

Ringkasan eksekutif

  • LLM hanya dapat “melihat” teks dalam jumlah terbatas pada satu waktu (jendela konteks). Cara ini cocok untuk tugas kecil, tetapi tidak lagi efektif ketika basis pengetahuan mencakup ribuan halaman. Bahkan ketika jendela konteksnya memadai, performa masih dapat menurun akibat masalah “mencari jarum dalam tumpukan jerami”.

  • RAG (‘retrieval augmented generation’ atau pembuatan berbantuan pengambilan) telah menjadi pola yang sangat umum: Anda mengelola basis pengetahuan (dokumen, wiki, kebijakan, transkrip, dan sebagainya), menjalankan pencarian semantik atas kueri pengguna untuk mengambil cuplikan paling relevan menggunakan embedding, lalu memasukkan potongan tersebut ke LLM bersama pertanyaannya. Cara ini membatasi konteks model dan, jika diterapkan dengan benar, dapat meningkatkan kualitas jawaban serta mengurangi halusinasi.

  • pgai adalah ekstensi Postgres sumber terbuka (beserta alat pendampingnya) yang membantu Anda membangun alur kerja “pengambilan AI” di atas PostgreSQL, basis data sumber terbuka yang tepercaya.

  • Gagasan utamanya adalah memindahkan lebih banyak proses standar RAG ke lapisan basis data (serap → pecah → buat embedding → jaga agar embedding tetap sinkron), alih-alih memperlakukan basis data sebagai “sekadar penyimpanan” embedding.

  • Kesan awal kami, pgai cukup menjanjikan, tetapi tidak cocok begitu pipeline RAG Anda mulai agak rumit, terutama dalam pendekatan pemecahan teks. Meski demikian, kami akan terus memantau proyek ini dengan saksama.

Pola RAG

Ada banyak cara untuk membangun RAG. Untuk pembahasan lebih panjang tentang berbagai pendekatannya, baca Contoh Praktis Solusi RAG yang Disesuaikan. Ruang desainnya ternyata sangat luas ketika kualitas menjadi perhatian, dan pendekatan “bawaan” yang umum biasanya seperti ini:

  1. Kumpulkan sejumlah dokumen.

  2. Pecah dokumen menjadi beberapa potongan. Ada banyak metode untuk melakukannya (misalnya berdasarkan paragraf atau pengelompokan semantik).

  3. Ubah setiap potongan menjadi embedding.

  4. Simpan embedding dalam basis data vektor (Pinecone, Milvus, dan sebagainya) atau di Postgres menggunakan pgvector.

  5. Saat kueri dijalankan, cari potongan terdekat `dan masukkan ke LLM (sekali lagi... ada banyak cara untuk melakukannya).

Dalam banyak tumpukan teknologi, langkah (1)–(3) berlangsung di luar basis data, dalam kode aplikasi atau pipeline data. Basis data terutama digunakan untuk:

  • menyimpan embedding

  • mencari embedding

Tujuan pgai

pgai adalah ekstensi Postgres sumber terbuka yang dikembangkan oleh Timescale dan berupaya mengaburkan batas tersebut.

Alih-alih menjadikan embedding sesuatu yang harus dikelola aplikasi Anda secara manual, pgai menjadikannya fitur basis data:

  • Anda menentukan tabel atau dokumen yang ingin dibuatkan embedding.

  • Anda menentukan model embedding dan strategi pemecahan teks.

  • pgai mengelola sisanya, termasuk memperbarui embedding ketika data sumber Anda berubah.

Tawaran ini menarik:

  • Lebih sedikit kode perekat khusus yang perlu dipelihara.

  • Embedding seharusnya lebih mudah dijaga agar tetap ‘mutakhir’ saat dokumen sumber yang mendasarinya berubah.

  • Postgres/pgai mengelola percobaan ulang, batas laju, pekerjaan yang gagal, dan sebagainya.

Catatan untuk pembaca: pgai menyertakan pgvector (ekstensi Postgres lain yang sangat populer untuk RAG) di dalamnya. pgvector menambahkan penyimpanan vektor dan pencarian kemiripan ke Postgres, sedangkan pgai memanfaatkannya untuk mengotomatiskan tahapan pipeline RAG, seperti pemecahan teks, pembuatan embedding, dan pemutakhiran embedding tersebut.

Kesan awal tentang pgai

Hal yang kami sukai

1) Mudah untuk mulai dijalankan.

Alur idealnya cukup sederhana:

  • Tarik image Docker Timescale (basis data + worker).

  • Masukkan kunci API penyedia embedding Anda.

  • Jalankan sedikit SQL untuk mendeklarasikan vectoriser (intinya: apa yang akan dibuatkan embedding, bagaimana memecahnya, dan model mana yang digunakan).

Setelah itu, pgai mengatur agar worker vectoriser berjalan sebagai proses terpisah dan menghasilkan embedding secara asinkron (misalnya setiap 5 menit atau sesuai frekuensi yang Anda inginkan).

2) Menyenangkan bisa menjalankan seluruh pipeline “di dekat” basis data.

pgai dapat menyerap konten dari tabel serta memuat dokumen dari tempat seperti S3, lalu mengurai, memecah, dan membuat embedding-nya. pgai juga dapat menangani berbagai format dokumen teks, seperti PDF, Markdown, dan sebagainya.

Keterbatasan yang kami rasakan

1) Anda kehilangan banyak kendali (padahal RAG terkadang membutuhkannya).

Sistem RAG berperforma tinggi (jika diukur berdasarkan kualitas jawaban) sering kali memerlukan pipeline khusus, seperti:

  • aturan pemecahan khusus (berdasarkan judul bagian, halaman, giliran pembicara, dan sebagainya)

  • pemecahan yang mempertimbangkan metadata (mempertahankan judul bagian, stempel waktu, penulis, dan jenis dokumen)

  • strategi embedding yang berbeda untuk setiap jenis dokumen

pgai menawarkan fleksibilitas yang lebih terbatas untuk hal-hal di atas.

Saat ini ada dua strategi pemecahan utama: pemisah teks berdasarkan karakter dan pemisah teks karakter rekursif, serta opsi tanpa pemecahan. Itu mungkin cukup untuk beberapa kasus penggunaan, tetapi banyak sistem RAG produksi memerlukan penyesuaian lebih lanjut.

Akan sangat menarik jika Timescale dapat menyertakan strategi pemecahan yang lebih canggih seperti yang tersedia dalam pustaka semacam Chonkie, sekaligus mendukung desain tingkat lanjut seperti pengambilan kontekstual Anthropic.

2) Mengutamakan teks, bukan multimodal.

Banyak persoalan RAG yang menarik kini tidak lagi terbatas pada teks:

  • PDF dengan diagram

  • tangkapan layar/gambar

  • rekaman audio

  • klip video

Meskipun Anda dapat “mengekstrak teks” dari sumber-sumber tersebut, hasilnya tidak sama dengan pipeline embedding multimodal yang sesungguhnya.

Jika kelak pgai mendukung model multimodal secara menyeluruh (memuat → memecah → membuat embedding untuk gambar besar/audio/video yang tersimpan di S3, dengan sinkronisasi yang andal), itu akan sangat menarik. Namun, saat ini pgai masih berupa alur kerja embedding teks.

3) Jika hanya memerlukan embedding, Anda mungkin tidak memerlukan pgai.

Jika pipeline penyerapan Anda sudah dibuat khusus (atau memang harus demikian), maka “membuat embedding dari potongan teks” bukanlah bagian tersulit dari RAG. Dalam kondisi tersebut, pgai hanya menyelesaikan bagian termudah dari masalahnya.

Selain itu, jika basis pengetahuan Anda jarang diperbarui, manfaat sinkronisasi embedding otomatis juga tidak terlalu besar.

Lapisan text-to-SQL

Salah satu cara yang sangat baik untuk menggunakan pgai adalah menerapkan antarmuka text-to-SQL pada basis data Anda. Ini dapat dilakukan dengan cukup mudah menggunakan modul semantic_catalog yang disediakan pgai. Cukup lakukan penyiapan seperti ini:

Bash

OPENAI_API_KEY="your-OpenAPI-key-goes-here"TARGET_DB="postgres://user:password@host:port/database"CATALOG_DB="postgres://user:password@host:port/database"

lalu gunakan katalog semantik untuk memindai kamus data Anda dengan pgai semantic-catalog create. Langkah ini menghasilkan konteks dari penyimpanan data Anda yang kurang lebih terlihat seperti ini:

Plain Text

---schema: postgres_airname: aircrafttype: tabledescription: Lists aircraft models with performance characteristics and unique codes.columns:- name: model  description: Commercial name of the aircraft model.- name: range  description: Maximum flight range in kilometers.- name: class  description: Airframe class category or configuration indicator.- name: velocity  description: Cruising speed of the aircraft.- name: code  description: Three-character aircraft code serving as the primary key....

Konteks ini kini tersedia bagi pgai melalui berbagai cara;

Melalui pencarian semantik:

Kueri ini akan menampilkan tabel, fungsi, dan objek lain yang mungkin relevan dengan kueri bahasa alami Anda:

Bash

pgai semantic-catalog search -p "Your natural language question goes here!"

Dapatkan konteks mentah:

Ini akan merender konteks YAML mentah yang terkait dengan kueri bahasa alami Anda:

Bash

pgai semantic-catalog search -p "Your natural language question goes here!" --render

Buat SQL:

Atau, Anda dapat langsung menghasilkan SQL mentah yang diperlukan untuk menjawab kueri Anda. Konteks dari langkah sebelumnya dikirim ke LLM, lalu respons dihasilkan:

Bash

pgai semantic-catalog generate-sql -p "Your natural language question goes here!"

Cara menggunakan pgai saat ini

Jika Anda membangun sistem RAG yang relatif sederhana, pgai patut dicoba apabila Anda menginginkan:

  • Postgres sebagai sistem pencatatan utama,

  • kode perekat seminimal mungkin,

  • embedding yang otomatis tetap sinkron,

  • cara cepat untuk menerapkan text-to-SQL pada basis data Anda,

  • mencoba berbagai alat RAG dan ekstensi Postgres baru.

Hal yang perlu diwaspadai

Sebaiknya tunda penggunaan pgai jika pipeline RAG Anda memerlukan salah satu hal berikut:

  • logika penyerapan atau pemecahan teks khusus yang kompleks

  • banyak jenis dokumen dengan kebutuhan penguraian yang berbeda

  • embedding multimodal

Terakhir, meskipun pgvector jelas telah diadopsi secara luas, belum jelas apakah pgai akan mendapatkan tingkat minat dan dukungan yang sama (meski baru tersedia sekitar 18 bulan).

Grafik riwayat bintang GitHub yang menunjukkan adopsi pgai dari Timescale dari waktu ke waktu.

Ringkasan

pgai menawarkan pendekatan RAG yang menarik dengan menyerahkan lebih banyak pekerjaan operasional rutin kepada basis data agar kode aplikasi Anda lebih sederhana.

Saat ini, pgai:

  • dapat digunakan dan benar-benar nyaman untuk konfigurasi RAG sederhana

  • belum cukup fleksibel untuk pipeline yang lebih khusus (terutama multimodal)

pgai menunjukkan potensi dan perkembangannya jelas layak terus dipantau.

Penulis

Andrew Liubinas