- Melalui sistem Retrieval-Augmented Generation (RAG), kita dapat membuat asisten AI yang mampu menjawab pertanyaan berdasarkan basis pengetahuan internal yang sudah ada (wiki, manual, materi pelatihan, dan bahan referensi, dll.)
- Sistem RAG dapat dibangun hanya dengan PostgreSQL, pgvector, ollama, dan kurang dari 200 baris kode Go
Ikhtisar
- Menggunakan beberapa paragraf cerita sebagai "korpus dokumen", lalu membuat embedding dokumen untuk setiap dokumen dengan Meta Llama3 (di-host secara lokal dengan ollama)
- Dokumen dan embedding disimpan dalam tabel PostgreSQL, dan ekstensi pgvector digunakan untuk menyimpan serta mengakses embedding
- Untuk kueri pengguna, sistem mengambil 1 dokumen yang paling relevan dari tabel lalu menghasilkan respons dengan Llama3
- ollama menyediakan HTTP API mirip OpenAI untuk menghasilkan embedding dan respons chat
- Kode Go berkomunikasi dengan Postgres menggunakan jackc/pgx dan pgvector-go, serta memakai paket API klien ollama untuk menangani pemanggilan HTTP API
Menjalankan model dengan Ollama
- Ollama adalah alat yang memungkinkan model open source dijalankan secara lokal, dan menyediakan REST API bergaya OpenAI
- Jalankan model llama3 dengan perintah
ollama pull llama3
- Server HTTP ollama secara default tersedia di
127.0.0.1:11434
Memasang pgvector
- pgvector adalah ekstensi untuk PostgreSQL versi 12~16, dan jika menggunakan repositori APT pgdg dapat dipasang dengan
sudo apt install postgresql-16-pgvector
- Setelah pemasangan, aktifkan ekstensi di database dengan
create extension vector;
- Buat tabel untuk menyimpan dokumen dan embedding dengan
create table items (id serial primary key, doc text, embedding vector(4096));
Data dokumen
- Menggunakan 4 paragraf dari cerita Sherlock Holmes "The Boscombe Valley Mystery" (domain publik - Project Gutenberg)
Kode
- Kode demo yang dirilis di GitHub dengan lisensi MIT dapat digunakan
- Penyisipan dokumen menggunakan
INSERT INTO items (doc, embedding) VALUES ($1, $2)
- Pencarian dokumen yang paling relevan menggunakan
SELECT doc FROM items ORDER BY embedding <-> $1 LIMIT 1 (operator <-> disediakan oleh pgvector)
- Pemanggilan API Ollama menggunakan paket Go ollama
- Pembuatan embedding menggunakan
api.EmbeddingRequest
- Pembuatan respons chat menggunakan
api.ChatRequest (menyertakan dokumen yang diambil dalam prompt)
Antarmuka baris perintah
- Simpan dokumen ke database dengan
ragdemo -insert {path-to-doc-file}
- Masukkan prompt dengan
ragdemo -query {query-text} untuk menghasilkan respons
Seluruh proses
- Saat menyimpan dokumen dengan opsi
-insert, sistem membaca isi file, membuat embedding dengan Llama3, lalu menyimpannya ke PostgreSQL
- Saat menggunakan opsi
-query, sistem membuat embedding untuk prompt lalu membandingkannya dengan embedding lain di tabel items untuk mencari dokumen "tetangga terdekat" (menghitung jarak L2 dengan operator <->)
- Dokumen yang ditemukan dimasukkan ke dalam prompt dan dikirim ke Llama3, lalu respons chat dihasilkan dan ditampilkan
Tips tambahan
- Pertimbangkan menggunakan model yang memang dikhususkan untuk pembuatan embedding (bukan llama3)
- Untuk bahasa selain Inggris, perlu mencari model yang lebih sesuai
- Selain jarak L2, Anda juga bisa mencoba metode perhitungan jarak lain (pgvector mendukung metode lain)
- Full table scan kurang skalabel, jadi manfaatkan indeks pgvector dan sebagainya
- Pada tahap generasi, menggunakan lebih banyak dokumen atau mengambil dokumen tambahan lewat pencocokan kata kunci juga dapat membantu
- Kualitas keluaran dapat ditingkatkan dengan menyesuaikan prompt generasi dan mencoba berbagai LLM
Belum ada komentar.