~/tools / Embeddings et recherche (RAG) / Embeddings to pgvector INSERT

Embeddings to pgvector INSERT — Transformez résultats /api/embed et textes en INSERT pgvector

Transformez les textes dont vous avez calculé les embeddings et la réponse de /api/embed d'Ollama (ou d'un endpoint /v1/embeddings compatible OpenAI) en instructions INSERT pour une table pgvector dans PostgreSQL. Chaque texte est associé à son vecteur dans l'ordre, les guillemets sont échappés, et l'outil vérifie que les nombres et les dimensions correspondent avant que vous n'exécutiez quoi que ce soit. Rien ne quitte votre navigateur.

L'exemple utilise des vecteurs inventés, de longueur unitaire et à 4 dimensions pour qu'ils restent lisibles. Les vrais embeddings ont des centaines ou des milliers de dimensions.

3 lignes de 4 dimensions. Textes lus comme le corps de la requête /api/embed, vecteurs comme une réponse d'Ollama /api/embed.

Instructions INSERT

Exécutez-les dans psql ou un autre client. Les lignes sont insérées dans une seule transaction.

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;

Format des vecteurs d'après le README de pgvector, vérifié avec pgvector 0.8.7 le 2026-11-04. README de pgvector

Tout se passe dans votre navigateur. L'outil écrit du SQL et ne se connecte à rien.

Après avoir calculé avec Ollama les embeddings des fragments de vos documents, les vecteurs doivent entrer dans la base de données avec les textes dont ils proviennent. /api/embed d'Ollama renvoie un vecteur par chaîne d'entrée, dans le même ordre que l'entrée, donc le premier texte correspond au premier vecteur. Cet outil fait l'association et écrit le SQL. Collez les textes, soit sous forme du corps JSON que vous avez envoyé à /api/embed (le RAG Text Chunker de ce site le produit), soit sous forme de tableau JSON de chaînes, soit un par ligne, puis collez la réponse. L'outil lit la réponse d'Ollama ({"embeddings": [[…], …]}) et celle au format compatible OpenAI ({"data": [{"embedding": […]}]}, remise dans l'ordre de index). Il écrit les vecteurs dans le format texte de pgvector, comme '[0.1,-0.2,0.3]', et écrit chaque texte comme une constante de chaîne SQL : la documentation de PostgreSQL indique qu'une apostrophe à l'intérieur d'une chaîne s'écrit avec deux apostrophes, et les barres obliques inverses sont conservées telles quelles car standard_conforming_strings est activé par défaut depuis PostgreSQL 9.1. Avant d'écrire quoi que ce soit, il vérifie ce qui ferait échouer l'INSERT ou associerait les mauvaises lignes : un nombre différent de textes et de vecteurs, des vecteurs de dimensions différentes, une dimension différente de celle du vector(n) de la colonne, des valeurs qui ne sont pas des nombres finis (pgvector n'accepte ni NaN ni Infinity), des embeddings en base64, et le caractère NUL, que PostgreSQL ne peut pas stocker dans un texte. Les instructions sont enveloppées dans BEGIN et COMMIT, à raison de 100 lignes par INSERT. Nous avons exécuté la sortie sur pgvector 0.8.7 avec PostgreSQL 16 à partir d'une vraie réponse d'Ollama, avec des textes contenant des guillemets, des barres obliques inverses, des sauts de ligne et des emoji, et les textes sont ressortis inchangés.

Le cœur de cet outil est open source, sous licence MIT. github.com/seigo5555/toolkitbox-lib/src/pgvector-insert.ts

Cas d'usage

  • Charger dans PostgreSQL les fragments d'un manuel ou d'une FAQ et leurs embeddings d'Ollama pour une recherche RAG
  • Essayer une recherche sur quelques vraies lignes avant d'écrire le code de chargement de votre application
  • Comprendre pourquoi une insertion échoue : un vecteur avec un mauvais nombre de dimensions, ou plus de textes que de vecteurs

Utilisation

  1. Collez les textes dont vous avez calculé les embeddings : le corps JSON du RAG Text Chunker, un tableau JSON de chaînes ou un texte par ligne.
  2. Envoyez les mêmes textes à /api/embed et collez la réponse JSON entière. Saisissez les noms de la table et des colonnes, et éventuellement les dimensions de la colonne vector(n).
  3. Copiez le SQL et exécutez-le dans psql ou un autre client. Le pgvector SQL Builder de ce site écrit une table et une requête de recherche qui correspondent.

FAQ

Comment savoir quel vecteur correspond à quel texte ?

Par l'ordre. /api/embed d'Ollama renvoie les embeddings dans le même ordre que le tableau d'entrée, donc l'outil associe le premier texte au premier vecteur, le deuxième au deuxième, et ainsi de suite. Si les nombres diffèrent, l'outil s'arrête au lieu de deviner.

Mes fragments contiennent des sauts de ligne. Puis-je les coller un par ligne ?

Non, un saut de ligne couperait un fragment en deux textes. Collez plutôt le corps JSON que vous avez envoyé à /api/embed ou un tableau JSON de chaînes ; les sauts de ligne à l'intérieur de chaque chaîne sont conservés dans le SQL.

Est-ce sûr de coller du texte avec des guillemets ?

L'outil double chaque apostrophe, ce qui est la façon dont la documentation de PostgreSQL indique d'écrire une apostrophe dans une constante de chaîne. Les barres obliques inverses sont laissées telles quelles, ce qui est correct avec la valeur par défaut standard_conforming_strings = on. Si votre serveur l'a désactivé, n'exécutez pas la sortie. Dans le code d'une application, utilisez les paramètres du pilote de votre base de données au lieu de construire des chaînes SQL.

Que se passe-t-il si les dimensions ne correspondent pas à la colonne ?

pgvector rejette la ligne, avec une erreur comme "expected 384 dimensions, not 768". Saisissez les dimensions de la colonne dans l'outil pour le détecter avant d'exécuter le SQL. Des dimensions différentes signifient généralement que les vecteurs viennent d'un autre modèle ou d'un autre réglage de dimensions.

Combien de lignes puis-je convertir à la fois ?

Jusqu'à 1,000 textes et vecteurs. Pour des chargements plus volumineux, le README de pgvector présente le chargement en masse avec COPY.

Mes données sont-elles envoyées quelque part ?

Non. La conversion s'exécute dans votre navigateur. L'outil ne se connecte jamais à Ollama ni à une base de données.

Articles liés

Voir aussi