~/tools / 嵌入與搜尋(RAG) / Embeddings to pgvector INSERT

Embeddings to pgvector INSERT — 把 Ollama /api/embed 的結果與文字轉成 pgvector INSERT 陳述式

把你做過 embedding 的文字,以及 Ollama 的 /api/embed(或與 OpenAI 相容的 /v1/embeddings 端點)的回應,轉成 PostgreSQL 中 pgvector 資料表用的 INSERT 陳述式。每段文字會依序與它的向量配對,引號會被跳脫,而且在你執行任何東西之前,工具就會檢查筆數與維度是否相符。資料不會離開你的瀏覽器。

範例使用虛構、長度為 1 的 4 維向量,方便閱讀。真實的 embedding 有數百或數千個維度。

3 列,4 維。文字讀為 /api/embed 的請求內容,向量讀為 Ollama /api/embed 的回應。

INSERT 陳述式

在 psql 或其他用戶端中執行。這些列會在同一個交易中插入。

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;

向量格式取自 pgvector README,於 2026-11-04 對照 pgvector 0.8.7 確認。 pgvector README

一切都在你的瀏覽器中完成。這個工具只會寫出 SQL,不會連線到任何地方。

用 Ollama 對文件區塊做完 embedding 後,向量必須連同它們來源的文字一起放進資料庫。Ollama 的 /api/embed 會為每個輸入字串回傳一個向量,順序與輸入相同,所以第一段文字對應第一個向量。這個工具負責配對,並寫出 SQL。請貼上文字,格式可以是你送給 /api/embed 的 JSON 內容(本站的 RAG Text Chunker 會產生它)、字串的 JSON 陣列,或一行一段,然後貼上回應。工具可讀取 Ollama 的回應({"embeddings": [[…], …]})與 OpenAI 相容的回應({"data": [{"embedding": […]}]},會依 index 順序排回)。它以 pgvector 的文字格式寫出向量,例如 '[0.1,-0.2,0.3]',並把每段文字寫成 SQL 字串常數:PostgreSQL 文件說,字串中的單引號要寫成兩個單引號,而反斜線則維持原樣,因為自 PostgreSQL 9.1 起 standard_conforming_strings 預設為開啟。在寫出任何內容之前,它會先檢查哪些情況會讓 INSERT 失敗或讓列配錯對象:文字與向量的數量不同、向量的維度不一致、維度與欄位的 vector(n) 不同、不是有限數字的值(pgvector 不接受 NaN 或 Infinity)、base64 的 embedding,以及 PostgreSQL 無法存進 text 的 NUL 字元。這些陳述式會包在 BEGIN 與 COMMIT 之間,每個 INSERT 含 100 列。我們用 Ollama 的真實回應,在 PostgreSQL 16 上的 pgvector 0.8.7 執行了輸出,其中包含帶有引號、反斜線、換行與 emoji 的文字,取回的文字與原文相同。

這個工具的核心邏輯以 MIT 授權開放原始碼。 github.com/seigo5555/toolkitbox-lib/src/pgvector-insert.ts

使用情境

  • 把手冊或 FAQ 的區塊,連同 Ollama 產生的 embedding,載入 PostgreSQL 以進行 RAG 搜尋
  • 在為你的應用程式寫載入程式碼之前,先用幾列真實資料試試搜尋
  • 找出插入失敗的原因:向量的維度數不對,或文字比向量多

使用方法

  1. 貼上你做過 embedding 的文字:RAG Text Chunker 的 JSON 內容、字串的 JSON 陣列,或一行一段文字。
  2. 把相同的文字送給 /api/embed,並貼上完整的 JSON 回應。輸入資料表與欄位名稱,也可以選擇性地輸入 vector(n) 欄位的維度數。
  3. 複製 SQL,在 psql 或其他用戶端中執行。本站的 pgvector SQL Builder 可以寫出相配的資料表與搜尋查詢。

FAQ

我怎麼知道哪個向量屬於哪段文字?

靠順序。Ollama 的 /api/embed 會以與輸入陣列相同的順序回傳 embedding,所以工具會把第一段文字配給第一個向量,第二段配給第二個,依此類推。如果數量不同,工具會停下來,而不是猜測。

我的區塊含有換行。可以一行一段貼上嗎?

不行,換行會把一個區塊拆成兩段文字。請改貼你送給 /api/embed 的 JSON 內容,或字串的 JSON 陣列;每個字串內部的換行會保留在 SQL 中。

貼上含有引號的文字安全嗎?

工具會把每個單引號變成兩個,這正是 PostgreSQL 文件所說在字串常數中寫入引號的方式。反斜線維持不變,這在預設的 standard_conforming_strings = on 下是正確的。如果你的伺服器把它關掉了,請不要執行輸出。在應用程式程式碼中,請使用資料庫驅動程式的參數,而不要自己組出 SQL 字串。

如果維度與欄位不符會怎樣?

pgvector 會拒絕該列,並回傳類似 "expected 384 dimensions, not 768" 的錯誤。在工具中輸入欄位的維度數,就能在執行 SQL 之前發現這個問題。維度不同通常表示向量來自不同的模型,或使用了不同的維度設定。

一次可以轉換多少列?

最多 1,000 段文字與向量。更大量的載入,pgvector 的 README 示範了用 COPY 做大量載入。

我的資料會被傳送到別處嗎?

不會。轉換在你的瀏覽器中執行。工具從不連線到 Ollama 或資料庫。

相關文章

相關工具