PostgreSQL ile RAG sistemi kurmak
(pgdash.io)- Retrieval-Augmented Generation (RAG) sistemi sayesinde mevcut iç bilgi tabanına (wiki, kılavuzlar, eğitim ve referans materyalleri vb.) dayanarak soruları yanıtlayabilen bir yapay zeka asistanı oluşturulabilir
- Yalnızca PostgreSQL, pgvector, ollama ve 200 satırdan az Go koduyla bir RAG sistemi kurulabilir
Genel Bakış
- Birkaç paragraf metin "belge korpusu" olarak kullanılıyor ve her belge için Meta'nın Llama3 modeliyle belge embedding'leri oluşturuluyor (ollama ile yerelde barındırılıyor)
- Belgeler ve embedding'ler PostgreSQL tablosunda saklanıyor; embedding'leri depolamak ve erişmek için pgvector eklentisi kullanılıyor
- Kullanıcı sorgusu için tablodan en ilgili 1 belge getiriliyor ve Llama3 ile yanıt üretiliyor
- ollama, embedding ve sohbet yanıtları üretmek için OpenAI benzeri bir HTTP API sağlıyor
- Go kodu, Postgres ile iletişim için jackc/pgx ve pgvector-go kullanıyor; HTTP API çağrıları için ise ollama istemci API paketinden yararlanıyor
Ollama ile modelleri çalıştırmak
- Ollama, açık kaynak modelleri yerelde çalıştırmayı sağlayan bir araç ve OpenAI tarzı bir REST API sunuyor
ollama pull llama3komutuyla llama3 modeli çalıştırılabilir- ollama'nın HTTP sunucusu varsayılan olarak
127.0.0.1:11434adresinde erişilebilir
pgvector kurulumu
- pgvector, PostgreSQL 12~16 sürümleri için bir eklentidir; pgdg APT deposu kullanılıyorsa
sudo apt install postgresql-16-pgvectorile kurulabilir - Kurulumdan sonra veritabanında eklentiyi etkinleştirmek için
create extension vector;kullanılır - Belgeleri ve embedding'leri saklamak için
create table items (id serial primary key, doc text, embedding vector(4096));tablosu oluşturulur
Belge verisi
- Sherlock Holmes hikâyesi "The Boscombe Valley Mystery" içinden 4 paragraf kullanılıyor (public domain - Project Gutenberg)
Kod
- GitHub'da MIT lisansı ile yayımlanmış demo kodu kullanılabilir
- Belge ekleme işlemi
INSERT INTO items (doc, embedding) VALUES ($1, $2) - En ilgili belgeyi bulmak için
SELECT doc FROM items ORDER BY embedding <-> $1 LIMIT 1kullanılır (<->operatörü pgvector tarafından sağlanır) - Ollama API çağrıları için ollama Go paketi kullanılır
- Embedding oluşturmak için
api.EmbeddingRequestkullanılır - Sohbet yanıtı oluşturmak için
api.ChatRequestkullanılır (prompt içine getirilen belge eklenir)
- Embedding oluşturmak için
Komut satırı arayüzü
ragdemo -insert {path-to-doc-file}ile belge veritabanına kaydedilirragdemo -query {query-text}ile prompt girilip yanıt oluşturulur
Tüm süreç
-insertseçeneğiyle belge kaydedilirken dosya içeriği okunur, Llama3 ile embedding oluşturulur ve PostgreSQL'e kaydedilir-queryseçeneği kullanıldığında prompt embedding'i oluşturulur, ardındanitemstablosundaki diğer embedding'lerle karşılaştırılarak "en yakın" belge bulunur (<->operatörü ile L2 mesafesi hesaplanır)- Getirilen belge prompt'a eklenerek Llama3'e gönderilir, sohbet yanıtı üretilir ve çıktı verilir
Ek ipuçları
- Embedding üretimine özel bir model kullanmayı değerlendirin (llama3 yerine)
- İngilizce dışındaki diller için daha uygun modeller araştırmak gerekebilir
- L2 mesafesi dışında başka uzaklık hesaplama yöntemleri de denenebilir (pgvector başka yöntemleri de destekler)
- Tüm tabloyu taramak ölçeklenebilir değildir; bu yüzden pgvector indeksleri gibi yöntemlerden yararlanın
- Üretim aşamasında daha fazla belge kullanmak veya anahtar kelime eşleştirmesiyle ek belgeler getirmek de faydalı olabilir
- Üretim prompt'unu ayarlamak ve farklı LLM'leri denemek çıktı kalitesini artırabilir
Henüz yorum yok.