~/tools / Embedding'ler ve arama (RAG) / Embeddings to pgvector INSERT
Embeddings to pgvector INSERT — Ollama /api/embed sonuçlarını ve metinleri pgvector INSERT'lerine çevirin
Embedding'e çevirdiğiniz metinleri ve Ollama'nın /api/embed (veya OpenAI uyumlu bir /v1/embeddings uç noktasının) yanıtını, PostgreSQL'deki bir pgvector tablosu için INSERT ifadelerine dönüştürün. Her metin sırasıyla vektörüyle eşleştirilir, tırnaklar kaçışlanır ve araç, siz herhangi bir şey çalıştırmadan önce sayıların ve boyutların uyuşup uyuşmadığını denetler. Hiçbir veri tarayıcınızdan çıkmaz.
Örnek, okuyabilmeniz için uydurma, birim uzunlukta, 4 boyutlu vektörler kullanır. Gerçek embedding'lerin yüzlerce ya da binlerce boyutu vardır.
4 boyutlu 3 satır. Metinler /api/embed istek gövdesi olarak, vektörler bir Ollama /api/embed yanıtı olarak okundu.
INSERT ifadeleri
psql veya başka bir istemcide çalıştırın. Satırlar tek bir işlemde (transaction) eklenir.
BEGIN;
INSERT INTO documents (content, embedding) VALUES
('Embeddings turn text into numeric vectors.', '[0.620186,0.410123,0.550165,0.380114]'),
('pgvector stores vectors in PostgreSQL, next to the rest of your data.', '[0.578815,0.469039,0.518937,0.419142]'),
('Ollama''s /api/embed returns one vector per input, in the same order.', '[0.119982,0.809879,-0.329951,0.46993]');
COMMIT;Vektör biçimi pgvector README'sinden alındı, pgvector 0.8.7 ile 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.
Belge parçalarınızı Ollama ile embedding'e çevirdikten sonra, vektörlerin geldikleri metinlerle birlikte veritabanına girmesi gerekir. Ollama'nın /api/embed uç noktası her girdi dizesi için bir vektör döndürür, girdiyle aynı sırada; yani ilk metin ilk vektöre aittir. Bu araç eşleştirmeyi yapar ve SQL'i yazar. Metinleri yapıştırın: /api/embed'e gönderdiğiniz JSON gövdesi olarak (bu sitedeki RAG Text Chunker onu üretir), dizelerden oluşan bir JSON dizisi olarak ya da satır başına bir metin olarak; ardından yanıtı yapıştırın. Araç, Ollama yanıtını ({"embeddings": [[…], …]}) ve OpenAI uyumlu olanı ({"data": [{"embedding": […]}]}, indeks sırasına geri konarak) okur. Vektörleri pgvector'ün metin biçiminde yazar, örneğin '[0.1,-0.2,0.3]', ve her metni bir SQL dize sabiti olarak yazar: PostgreSQL belgeleri, bir dizenin içindeki tek tırnağın iki tek tırnak olarak yazıldığını söyler; ters eğik çizgiler olduğu gibi bırakılır, çünkü standard_conforming_strings PostgreSQL 9.1'den beri varsayılan olarak açıktır. Herhangi bir şey yazmadan önce, INSERT'in başarısız olmasına ya da yanlış satırların eşleşmesine yol açacak durumları denetler: metin ve vektör sayısının farklı olması, farklı boyutlu vektörler, sütunun vector(n) değerinden farklı bir boyut, sonlu sayı olmayan değerler (pgvector NaN veya Infinity kabul etmez), base64 embedding'ler ve PostgreSQL'in text içinde saklayamadığı NUL karakteri. İfadeler BEGIN ve COMMIT içine alınır, INSERT başına 100 satırla. Çıktıyı pgvector 0.8.7 ve PostgreSQL 16 üzerinde, Ollama'dan alınan gerçek bir yanıtla, tırnak, ters eğik çizgi, satır sonu ve emoji içeren metinler dahil çalıştırdık ve metinler değişmeden geri geldi.
Bu aracın temel mantığı MIT lisansıyla açık kaynaktır. github.com/seigo5555/toolkitbox-lib/src/pgvector-insert.ts
Kullanım örnekleri
- Bir kılavuzun veya SSS'nin parçalarını ve Ollama'dan gelen embedding'lerini RAG araması için PostgreSQL'e yüklemek
- Uygulamanız için yükleme kodunu yazmadan önce birkaç gerçek satırda bir aramayı denemek
- Bir eklemenin neden başarısız olduğunu bulmak: yanlış sayıda boyutlu bir vektör ya da vektörlerden fazla metin
Nasıl kullanılır
- Embedding'e çevirdiğiniz metinleri yapıştırın: RAG Text Chunker'dan gelen JSON gövdesi, dizelerden oluşan bir JSON dizisi ya da satır başına bir metin.
- Aynı metinleri /api/embed'e gönderin ve JSON yanıtının tamamını yapıştırın. Tablo ve sütun adlarını ve isterseniz vector(n) sütununun boyutlarını girin.
- SQL'i kopyalayın ve psql veya başka bir istemcide çalıştırın. Bu sitedeki pgvector SQL Builder uygun bir tablo ve arama sorgusu yazar.
SSS
Hangi vektörün hangi metne ait olduğunu nasıl anlarım?
Sıradan. Ollama'nın /api/embed uç noktası embedding'leri girdi dizisiyle aynı sırada döndürür; bu yüzden araç ilk metni ilk vektörle, ikinciyi ikinciyle eşleştirir ve böyle sürer. Sayılar farklıysa araç tahmin etmek yerine durur.
Parçalarımda satır sonları var. Onları satır başına bir tane olarak yapıştırabilir miyim?
Hayır, bir satır sonu bir parçayı iki metne böler. Bunun yerine /api/embed'e gönderdiğiniz JSON gövdesini ya da dizelerden oluşan bir JSON dizisini yapıştırın; her dizenin içindeki satır sonları SQL'de korunur.
Tırnak içeren metni yapıştırmak güvenli mi?
Araç her tek tırnağı ikiye katlar; PostgreSQL belgelerinin bir dize sabitinin içindeki tırnağı yazmak için söylediği yol budur. Ters eğik çizgiler değiştirilmez; bu, varsayılan standard_conforming_strings = on ile doğrudur. Sunucunuzda bu kapalıysa çıktıyı çalıştırmayın. Uygulama kodunda SQL dizeleri oluşturmak yerine veritabanı sürücünüzün parametrelerini kullanın.
Boyutlar sütunla uyuşmazsa ne olur?
pgvector satırı "expected 384 dimensions, not 768" gibi bir hatayla reddeder. Bunu SQL'i çalıştırmadan önce yakalamak için araca sütunun boyutlarını girin. Farklı boyutlar genellikle vektörlerin farklı bir modelden ya da farklı bir boyut ayarıyla geldiği anlamına gelir.
Aynı anda kaç satır dönüştürebilirim?
1,000 metin ve vektöre kadar. Daha büyük yüklemeler için pgvector README'si COPY ile toplu yüklemeyi gösterir.
Verilerim bir yere gönderiliyor mu?
Hayır. Dönüştürme tarayıcınızda çalışır. Araç hiçbir zaman Ollama'ya ya da 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.