~/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
- Попробовать поиск на нескольких настоящих строках, прежде чем писать код загрузки для своего приложения
- Выяснить, почему вставка не удаётся: вектор с неверным числом измерений или больше текстов, чем векторов
Как пользоваться
- Вставьте тексты, для которых вы создали эмбеддинги: тело JSON из RAG Text Chunker, массив строк JSON или по одному тексту на строку.
- Отправьте те же тексты в /api/embed и вставьте весь ответ JSON. Введите имена таблицы и столбцов и, при желании, число измерений столбца vector(n).
- Скопируйте 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, ни к базе данных.
Похожие статьи
- Хранение и поиск эмбеддингов Ollama в PostgreSQL с помощью pgvectorЭмбеддинги Ollama в PostgreSQL с pgvector, поиск через HNSW или IVFFlat и передача результатов в /api/chat, чтобы ответ ссылался на источники.
- Эмбеддинги в Ollama: основы поиска и RAGСоздание эмбеддингов через /api/embed в Ollama: модели и их размеры, truncate и dimensions, векторы единичной длины и косинусное сходство, по официальной документации.