~/tools / Embedding'ler ve arama (RAG) / pgvector SQL Builder
pgvector SQL Builder — pgvector SQL'i yazın: tablo, HNSW/IVFFlat indeksi ve komşu sorgusu
PostgreSQL'de pgvector ile embedding'leri saklamak ve aramak için SQL yazın: vector(n) veya halfvec(n) sütunlu bir tablo, uzaklığınıza uyan operatör sınıfıyla bir HNSW veya IVFFlat indeksi ve okunaklı bir skorla en yakın komşu sorgusu. Araç, pgvector belgelerinde verilen sınırları denetler ve vektörlerin ne kadar yer kapladığını tahmin eder. Hiçbir veri tarayıcınızdan çıkmaz.
Her vektör 1,544 bayt kaplar; bu yüzden 10,000 satır yalnızca vektörler için yaklaşık 15.4 MB yer kaplar (indeksler ve diğer sütunlar dahil değil).
1. Eklenti ve tablo
CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE documents ( id bigserial PRIMARY KEY, content text NOT NULL, embedding vector(384) NOT NULL );
2. İndeks
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);
3. Arama
PREPARE, sorunun /api/embed'den gelen vektörünü $1 olarak alır. Onu metin olarak geçirin, örneğin '[0.01,-0.02,…]'.
PREPARE search_documents(vector(384)) AS
SELECT id, content, 1 - (embedding <=> $1) AS cosine_similarity
FROM documents
ORDER BY embedding <=> $1
LIMIT 5;
-- EXECUTE search_documents('[0.0123, -0.0456, ...]');Sınırlar ve varsayılanlar pgvector 0.8.7 README'sinden ve kaynak kodundan alındı, 2026-11-04 tarihinde denetlendi. pgvector README
Her şey tarayıcınızda yapılır. Araç SQL yazar ve hiçbir yere bağlanmaz.
pgvector, PostgreSQL'e vektör benzerliği araması ekleyen açık kaynaklı bir eklentidir; böylece Ollama ile oluşturduğunuz embedding'ler, diğer verilerinizle aynı veritabanında saklanabilir. Birkaç ayrıntıyı yanlış yapmak kolaydır. Sütun, embedding modelinizle aynı sayıda boyuta sahip olmalıdır. Her uzaklığın kendi operatörü vardır: kosinüs uzaklığı için <=>, L2 uzaklığı için <->, negatif nokta çarpımı için <#> ve L1 uzaklığı için <+>. Yaklaşık bir indeks yalnızca aynı uzaklığın operatör sınıfıyla oluşturulmuşsa, örneğin <=> için vector_cosine_ops, ve sorgu operatörün kendisine göre artan sırada sıralıyor ve LIMIT içeriyorsa kullanılır. Bu araç üç parçayı tek bir seçim kümesinden yazar: CREATE EXTENSION ve CREATE TABLE, CREATE INDEX ve en yakın satırları okunaklı bir skorla döndüren bir PREPARE ifadesi (kosinüs benzerliği, 1 eksi kosinüs uzaklığıdır; nokta çarpımı ise <#> çarpı -1'dir). pgvector 0.8.7 sürümünün README'sindeki ve kaynak kodundaki sınırları uygular: bir sütunda 16,000 boyuta kadar, vector için 2,000 ve halfvec için 4,000 boyuta kadar indeks, IVFFlat için L1 operatör sınıfı yok, HNSW için m 2 ile 100 arasında ve ef_construction 4 ile 1,000 arasında ve en az 2 × m. HNSW'de bir arama en fazla hnsw.ef_search satır döndürür (varsayılan 40), bu yüzden LIMIT daha büyükse araç uyarır. IVFFlat için lists ve probes değerlerini README'nin başlangıç noktalarından doldurur: 1M satıra kadar rows / 1000, bunun üzerinde sqrt(rows) ve probes için sqrt(lists). Üretilen SQL, pgvector 0.8.7 ve PostgreSQL 16 üzerinde, Ollama'dan alınan gerçek 384 boyutlu vektörlerle çalıştırıldı ve EXPLAIN indeksin kullanıldığını gösterdi.
Bu aracın temel mantığı MIT lisansıyla açık kaynaktır. github.com/seigo5555/toolkitbox-lib/src/pgvector-sql.ts
Kullanım örnekleri
- Ollama'dan PostgreSQL'e embedding yüklemeden önce belge parçalarınız için tabloyu oluşturmak
- İndeksin gerçekten kullanılması için kosinüs, L2, nokta çarpımı veya L1 uzaklığında hangi operatörün hangi operatör sınıfıyla gittiğini denetlemek
- Küçük bir VPS'te vektörlerin ne kadar yer kapladığını tahmin etmek ve vector ile halfvec'i karşılaştırmak
Nasıl kullanılır
- Tablo adını ve embedding modelinizin boyut sayısını girin. Bu, /api/embed'den gelen bir vektörün uzunluğudur; bu sitedeki Embedding Similarity Calculator onu gösterir.
- Türü, uzaklığı ve indeksi seçin. Ollama'nın belgeleri anlamsal aramanın çoğu için kosinüs benzerliğini önerir ve /api/embed uzunluğu 1 olan vektörler döndürür.
- Üç bloğu kopyalayın ve psql veya başka bir istemcide çalıştırın. IVFFlat indeksini veriler yüklendikten sonra oluşturun; HNSW indeksi boş bir tabloda oluşturulabilir.
SSS
Hangi uzaklığı seçmeliyim?
Ollama'nın embedding belgeleri, anlamsal aramanın çoğu kullanım senaryosu için kosinüs benzerliğini önerir. pgvector'de <=> kosinüs uzaklığını döndürür ve araç bunu 1 eksi uzaklık ile cosine_similarity'ye çevirir. /api/embed'in verdiği gibi uzunluğu 1 olan vektörlerde kosinüs uzaklığı, L2 uzaklığı ve nokta çarpımı satırları aynı sıraya koyar; çünkü bu tür vektörlerde L2 uzaklığının karesi, 2 eksi 2 çarpı kosinüs benzerliğidir.
HNSW mi, IVFFlat mi?
pgvector README'si, HNSW'nin sorgu performansının (hız-recall dengesi açısından) IVFFlat'ten daha iyi olduğunu, ancak daha yavaş oluştuğunu ve daha fazla bellek kullandığını, eğitim adımı olmadığı için boş bir tabloda oluşturulabildiğini söyler. IVFFlat daha hızlı oluşur, daha az bellek kullanır ve tabloda biraz veri olduktan sonra oluşturulmalıdır. İndeks olmadan pgvector, mükemmel recall veren kesin bir arama yapar.
Sorgum neden indeksi kullanmıyor?
README, sorguda ORDER BY ve LIMIT olması gerektiğini, ORDER BY'ın artan sırada uzaklık operatörünün kendisi olması gerektiğini, 1 - (embedding <=> …) DESC gibi bir ifade olmaması gerektiğini söyler. Operatör ayrıca indeksin operatör sınıfıyla da uyuşmalıdır: vector_cosine_ops ile <=>, vector_l2_ops ile <->, vector_ip_ops ile <#> ve vector_l1_ops ile <+>. Araç ikisini de aynı seçimden yazar. README ayrıca tablo küçükken tablo taramasının daha hızlı olabileceğini belirtir.
Neden LIMIT'ten az satır alıyorum?
HNSW'de sonuçlar, varsayılanı 40 olan hnsw.ef_search ile sınırlıdır; 200 satırlık bir tabloda LIMIT 100'ü denediğimizde, hnsw.ef_search değerini 100'e çıkarana kadar 40 satır aldık. README, WHERE ile filtrelemenin indeks tarandıktan sonra uygulandığını ve bu yüzden bir koşulun daha da az satır bırakabileceğini ekler. 0.8.0 sürümünden beri yinelemeli indeks taramaları (SET hnsw.iterative_scan = strict_order veya relaxed_order) gerektiğinde indeksin daha fazlasını tarar.
halfvec nedir?
Yarım duyarlıklı bir vektör türü. Her vektör 4 × boyut + 8 yerine 2 × boyut + 8 bayt kaplar ve halfvec üzerindeki HNSW ve IVFFlat indeksleri 2,000 yerine 4,000 boyuta kadar destekler. Her öğe yarım duyarlıklı bir kayan noktalı sayıdır, bu yüzden değerler daha az hassas saklanır.
Verilerim bir yere gönderiliyor mu?
Hayır. Araç yalnızca tarayıcınızda SQL yazar ve hiçbir veritabanına bağlanmaz.
İlgili makaleler
- Ollama embedding'lerini pgvector ile PostgreSQL'de saklama ve aramaOllama embedding'lerini pgvector ile PostgreSQL'de saklayın, HNSW veya IVFFlat ile arayın ve sonuçları /api/chat'e iletin; yanıt kaynaklarını belirtsin.
- Ollama ile embedding: arama ve RAG için temellerOllama'nın /api/embed uç noktasıyla embedding üretin: modeller ve boyutları, truncate ve dimensions, birim uzunlukta vektörler ve kosinüs benzerliği, resmî belgelere göre.