~/tools / Эмбеддинги и поиск (RAG) / Embeddings to pgvector INSERT

Embeddings to pgvector INSERT — Результаты Ollama /api/embed и тексты в INSERT для pgvector

Превратите тексты, для которых вы создали эмбеддинги, и ответ /api/embed от Ollama (или эндпоинта /v1/embeddings, совместимого с OpenAI) в операторы INSERT для таблицы pgvector в PostgreSQL. Каждый текст сопоставляется со своим вектором по порядку, кавычки экранируются, а инструмент проверяет, совпадают ли количества и измерения, прежде чем вы что-либо выполните. Ничто не покидает ваш браузер.

В примере использованы выдуманные векторы длиной 1 с 4 измерениями, чтобы их можно было прочитать. У настоящих эмбеддингов сотни или тысячи измерений.

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;

Формат вектора из README pgvector, проверен на pgvector 0.8.7 2026-11-04. pgvector README

Всё происходит в вашем браузере. Инструмент пишет SQL и ни к чему не подключается.

После того как вы создали эмбеддинги для фрагментов документов в Ollama, векторы нужно записать в базу данных вместе с текстами, из которых они получены. /api/embed в Ollama возвращает по одному вектору на каждую входную строку, в том же порядке, что и вход, поэтому первому тексту соответствует первый вектор. Этот инструмент выполняет сопоставление и пишет SQL. Вставьте тексты — как тело JSON, которое вы отправляли в /api/embed (его создаёт RAG Text Chunker на этом сайте), как массив строк JSON или по одному на строку — и вставьте ответ. Инструмент читает ответ Ollama ({"embeddings": [[…], …]}) и ответ, совместимый с OpenAI ({"data": [{"embedding": […]}]}, приведённый обратно к порядку по индексу). Он записывает векторы в текстовом формате pgvector, например '[0.1,-0.2,0.3]', а каждый текст — как строковую константу SQL: документация PostgreSQL говорит, что одинарная кавычка внутри строки записывается как две одинарные кавычки, а обратные косые черты остаются как есть, потому что standard_conforming_strings включён по умолчанию начиная с PostgreSQL 9.1. Прежде чем что-либо записать, он проверяет то, из-за чего INSERT завершится ошибкой или сопоставит не те строки: разное число текстов и векторов, векторы с разными измерениями, измерение, отличающееся от vector(n) столбца, значения, не являющиеся конечными числами (pgvector не принимает NaN и Infinity), эмбеддинги в base64 и символ NUL, который PostgreSQL не может сохранить в text. Операторы заключаются в BEGIN и COMMIT, по 100 строк на INSERT. Мы выполнили результат на pgvector 0.8.7 с PostgreSQL 16, используя настоящий ответ Ollama, включая тексты с кавычками, обратными косыми чертами, переводами строк и эмодзи, и тексты вернулись без изменений.

Основная логика этого инструмента открыта под лицензией MIT. github.com/seigo5555/toolkitbox-lib/src/pgvector-insert.ts

Когда пригодится

  • Загрузить фрагменты руководства или FAQ и их эмбеддинги из Ollama в PostgreSQL для поиска в RAG
  • Попробовать поиск на нескольких настоящих строках, прежде чем писать код загрузки для своего приложения
  • Выяснить, почему вставка не удаётся: вектор с неверным числом измерений или больше текстов, чем векторов

Как пользоваться

  1. Вставьте тексты, для которых вы создали эмбеддинги: тело JSON из RAG Text Chunker, массив строк JSON или по одному тексту на строку.
  2. Отправьте те же тексты в /api/embed и вставьте весь ответ JSON. Введите имена таблицы и столбцов и, при желании, число измерений столбца vector(n).
  3. Скопируйте SQL и выполните его в psql или другом клиенте. pgvector SQL Builder на этом сайте пишет подходящую таблицу и поисковый запрос.

Вопросы

Как понять, какой вектор принадлежит какому тексту?

По порядку. /api/embed в Ollama возвращает эмбеддинги в том же порядке, что и входной массив, поэтому инструмент сопоставляет первый текст с первым вектором, второй — со вторым и так далее. Если количества различаются, инструмент останавливается, а не гадает.

В моих фрагментах есть переводы строк. Можно ли вставить их по одному на строку?

Нет, перевод строки разделил бы фрагмент на два текста. Вместо этого вставьте тело JSON, которое вы отправляли в /api/embed, или массив строк JSON; переводы строк внутри каждой строки сохраняются в SQL.

Безопасно ли вставлять текст с кавычками?

Инструмент удваивает каждую одинарную кавычку — так, по документации PostgreSQL, записывается кавычка внутри строковой константы. Обратные косые черты остаются без изменений, что верно при значении по умолчанию standard_conforming_strings = on. Если на вашем сервере оно выключено, не выполняйте результат. В коде приложения используйте параметры драйвера базы данных вместо сборки строк SQL.

Что будет, если измерения не совпадают со столбцом?

pgvector отклоняет строку с ошибкой вроде "expected 384 dimensions, not 768". Введите в инструменте измерения столбца, чтобы заметить это до выполнения SQL. Разные измерения обычно означают, что векторы получены другой моделью или с другой настройкой измерений.

Сколько строк можно преобразовать за один раз?

До 1,000 текстов и векторов. Для больших загрузок README pgvector показывает массовую загрузку через COPY.

Отправляются ли мои данные куда-либо?

Нет. Преобразование выполняется в вашем браузере. Инструмент никогда не подключается ни к Ollama, ни к базе данных.

Похожие статьи

Похожие