26 poin oleh xguru 2024-05-20 | Belum ada komentar. | Bagikan ke WhatsApp
  • 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

  1. Saat menyimpan dokumen dengan opsi -insert, sistem membaca isi file, membuat embedding dengan Llama3, lalu menyimpannya ke PostgreSQL
  2. 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 <->)
  3. 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.

Belum ada komentar.