- 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 llama3 komutuyla llama3 modeli çalıştırılabilir
- ollama'nın HTTP sunucusu varsayılan olarak
127.0.0.1:11434 adresinde 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-pgvector ile 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 1 kullanı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.EmbeddingRequest kullanılır
- Sohbet yanıtı oluşturmak için
api.ChatRequest kullanılır (prompt içine getirilen belge eklenir)
Komut satırı arayüzü
ragdemo -insert {path-to-doc-file} ile belge veritabanına kaydedilir
ragdemo -query {query-text} ile prompt girilip yanıt oluşturulur
Tüm süreç
-insert seçeneğiyle belge kaydedilirken dosya içeriği okunur, Llama3 ile embedding oluşturulur ve PostgreSQL'e kaydedilir
-query seçeneği kullanıldığında prompt embedding'i oluşturulur, ardından items tablosundaki 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.