~/tools / Embedding và tìm kiếm (RAG) / Embeddings to pgvector INSERT
Embeddings to pgvector INSERT — Biến kết quả /api/embed của Ollama và văn bản thành INSERT cho pgvector
Biến các văn bản bạn đã tạo embedding và phản hồi từ /api/embed của Ollama (hoặc một endpoint /v1/embeddings tương thích OpenAI) thành các câu lệnh INSERT cho một bảng pgvector trong PostgreSQL. Mỗi văn bản được ghép với vector của nó theo thứ tự, dấu nháy được thoát, và công cụ kiểm tra số lượng và số chiều có khớp không trước khi bạn chạy bất cứ thứ gì. Không có gì rời khỏi trình duyệt của bạn.
Ví dụ dùng các vector tự đặt, có độ dài 1 và 4 chiều để bạn dễ đọc. Embedding thật có hàng trăm hoặc hàng nghìn chiều.
3 hàng với 4 chiều. Các văn bản được đọc là phần thân yêu cầu /api/embed, các vector được đọc là một phản hồi /api/embed của Ollama.
Các câu lệnh INSERT
Chạy trong psql hoặc một ứng dụng khách khác. Các hàng được chèn trong một giao dịch.
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;Định dạng vector lấy từ README của pgvector, kiểm tra với pgvector 0.8.7 vào ngày 2026-11-04. pgvector README
Mọi thứ diễn ra trong trình duyệt của bạn. Công cụ chỉ viết SQL và không kết nối tới đâu cả.
Sau khi bạn tạo embedding cho các chunk tài liệu bằng Ollama, các vector phải được đưa vào cơ sở dữ liệu cùng với văn bản mà chúng sinh ra từ đó. /api/embed của Ollama trả về một vector cho mỗi chuỗi đầu vào, theo cùng thứ tự với đầu vào, nên văn bản đầu tiên thuộc về vector đầu tiên. Công cụ này thực hiện việc ghép và viết SQL. Hãy dán các văn bản, dưới dạng phần thân JSON bạn đã gửi tới /api/embed (RAG Text Chunker trên trang này tạo ra nó), một mảng JSON các chuỗi, hoặc mỗi dòng một văn bản, rồi dán phản hồi. Công cụ đọc phản hồi của Ollama ({"embeddings": [[…], …]}) và phản hồi tương thích OpenAI ({"data": [{"embedding": […]}]}, được sắp lại theo thứ tự index). Nó viết các vector theo định dạng văn bản của pgvector, chẳng hạn '[0.1,-0.2,0.3]', và viết mỗi văn bản thành một hằng chuỗi SQL: tài liệu PostgreSQL nói rằng một dấu nháy đơn trong chuỗi được viết thành hai dấu nháy đơn, và dấu gạch chéo ngược được giữ nguyên vì standard_conforming_strings được bật theo mặc định từ PostgreSQL 9.1. Trước khi viết bất cứ thứ gì, nó kiểm tra những điều khiến INSERT thất bại hoặc ghép nhầm hàng: số lượng văn bản và vector khác nhau, các vector có số chiều khác nhau, số chiều khác với vector(n) của cột, các giá trị không phải số hữu hạn (pgvector không chấp nhận NaN hay Infinity), embedding dạng base64, và ký tự NUL mà PostgreSQL không thể lưu trong text. Các câu lệnh được bao trong BEGIN và COMMIT, 100 hàng cho mỗi INSERT. Chúng tôi đã chạy đầu ra trên pgvector 0.8.7 với PostgreSQL 16 bằng một phản hồi thật từ Ollama, kể cả các văn bản có dấu nháy, dấu gạch chéo ngược, ngắt dòng và emoji, và các văn bản quay lại không thay đổi.
Phần xử lý chính của công cụ này là mã nguồn mở theo giấy phép MIT. github.com/seigo5555/toolkitbox-lib/src/pgvector-insert.ts
Trường hợp dùng
- Nạp các chunk của một bản hướng dẫn hoặc một FAQ cùng embedding của chúng từ Ollama vào PostgreSQL để tìm kiếm RAG
- Thử một lần tìm kiếm trên vài hàng thật trước khi bạn viết mã nạp dữ liệu cho ứng dụng của mình
- Tìm hiểu vì sao một lần chèn thất bại: một vector có sai số chiều, hoặc có nhiều văn bản hơn vector
Cách dùng
- Dán các văn bản bạn đã tạo embedding: phần thân JSON từ RAG Text Chunker, một mảng JSON các chuỗi, hoặc mỗi dòng một văn bản.
- Gửi cùng các văn bản đó tới /api/embed và dán toàn bộ phản hồi JSON. Nhập tên bảng và tên cột, và nếu muốn thì nhập cả số chiều của cột vector(n).
- Sao chép SQL và chạy trong psql hoặc một ứng dụng khách khác. pgvector SQL Builder trên trang này viết một bảng và truy vấn tìm kiếm tương ứng.
Hỏi đáp
Làm sao tôi biết vector nào thuộc về văn bản nào?
Theo thứ tự. /api/embed của Ollama trả về các embedding theo cùng thứ tự với mảng đầu vào, nên công cụ ghép văn bản đầu tiên với vector đầu tiên, văn bản thứ hai với vector thứ hai, và cứ thế. Nếu số lượng khác nhau, công cụ dừng lại thay vì đoán.
Các chunk của tôi có ngắt dòng. Tôi có thể dán mỗi dòng một chunk không?
Không, một lần ngắt dòng sẽ tách một chunk thành hai văn bản. Thay vào đó hãy dán phần thân JSON bạn đã gửi tới /api/embed hoặc một mảng JSON các chuỗi; các ngắt dòng bên trong mỗi chuỗi được giữ trong SQL.
Dán văn bản có dấu nháy có an toàn không?
Công cụ nhân đôi mọi dấu nháy đơn, đúng như cách tài liệu PostgreSQL nói để viết một dấu nháy trong hằng chuỗi. Dấu gạch chéo ngược được giữ nguyên, điều này đúng với standard_conforming_strings = on mặc định. Nếu máy chủ của bạn đã tắt nó, đừng chạy đầu ra. Trong mã ứng dụng, hãy dùng các tham số của trình điều khiển cơ sở dữ liệu thay vì tự ghép chuỗi SQL.
Điều gì xảy ra nếu số chiều không khớp với cột?
pgvector từ chối hàng đó, với một lỗi như "expected 384 dimensions, not 768". Hãy nhập số chiều của cột vào công cụ để phát hiện điều này trước khi bạn chạy SQL. Số chiều khác nhau thường có nghĩa là các vector đến từ một mô hình khác hoặc một thiết lập số chiều khác.
Tôi có thể chuyển đổi bao nhiêu hàng cùng lúc?
Tối đa 1,000 văn bản và vector. Với các lần nạp lớn hơn, README của pgvector trình bày cách nạp hàng loạt bằng COPY.
Dữ liệu của tôi có bị gửi đi đâu không?
Không. Việc chuyển đổi chạy trong trình duyệt của bạn. Công cụ không bao giờ kết nối tới Ollama hay tới một cơ sở dữ liệu.
Bài viết liên quan
- Lưu và tìm kiếm embedding của Ollama trong PostgreSQL bằng pgvectorLưu embedding của Ollama trong PostgreSQL bằng pgvector, tìm kiếm bằng HNSW hoặc IVFFlat, rồi chuyển kết quả sang /api/chat để câu trả lời trích dẫn các nguồn của nó.
- Embedding với Ollama: kiến thức nền tảng cho tìm kiếm và RAGTạo embedding bằng /api/embed của Ollama: các mô hình và dung lượng, truncate và dimensions, vector độ dài đơn vị và độ tương đồng cosine, theo tài liệu chính thức.