0

pg_vector : l’IA et PostgreSQL

twitterlinkedinmail

1. Introduction : L’intelligence artificielle et le rôle des bases de données

L’intelligence artificielle (IA) connaît une popularité croissante, des assistants virtuels aux voitures autonomes, en passant par les recommandations de films et de produits. Mais pour que ces technologies fonctionnent, elles ont besoin de données, souvent en grande quantité. C’est là qu’interviennent les bases de données : elles stockent, gèrent et permettent d’accéder à ces données de manière efficace.

Les bases de données, comme PostgreSQL, ont donc un rôle clé dans l’IA. Mais l’IA ne traite pas toujours des informations simples comme des noms ou des chiffres ; souvent, elle doit manipuler des informations complexes, comme des représentations numériques d’images, de sons, ou de textes. Pour gérer ces données spécifiques, il faut des outils adaptés, et c’est là que l’extension pg_vector de PostgreSQL entre en jeu.

2. Les vecteurs en informatique et dans pg_vector

Dans le cadre de l’informatique, un vecteur est simplement une liste de nombres. Ces nombres peuvent représenter n’importe quoi : les caractéristiques d’un produit, les mots d’un texte ou même une image. Par exemple, pour un document texte, chaque mot peut être transformé en une série de nombres qui capture son sens dans un certain contexte.

L’extension pg_vector permet à PostgreSQL de stocker et de manipuler ces vecteurs. Elle offre un moyen simple de les utiliser directement dans une base de données. Imaginons que nous avons des centaines de documents et que nous souhaitions rechercher les plus similaires à un texte donné : en stockant les représentations numériques (ou embeddings) de ces documents sous forme de vecteurs, nous pouvons facilement comparer leur similarité grâce à pg_vector.

3. Le lien entre l’IA et les vecteurs

L’intelligence artificielle repose sur la capacité à comprendre et traiter des informations complexes. Par exemple, quand une IA doit reconnaître une image, elle ne “voit” pas comme nous. Au lieu de cela, l’image est transformée en une série de nombres, un vecteur, qui représente ses caractéristiques (couleurs, formes, etc.).

Le même principe s’applique au texte. Les modèles de traitement du langage, comme ceux utilisés par les moteurs de recherche ou les chatbots, transforment chaque mot ou phrase en vecteur. Ces vecteurs capturent le sens des mots et permettent à l’IA de manipuler des informations complexes sans “comprendre” le langage humain.

C’est ici que les embeddings entrent en jeu. Un embedding est un vecteur qui représente des données sous une forme que l’IA peut utiliser. Par exemple, dans un système de recommandation, chaque produit est converti en un embedding, et les produits les plus proches de celui que nous venons de consulter (en termes de vecteur) nous seront recommandés. Grâce à pg_vector, ces embeddings peuvent être stockés et comparés directement dans une base de données.

4. Pourquoi est-ce utile ?

L’extension pg_vector est très utile pour des applications qui nécessitent la recherche par similarité. Par exemple, dans un moteur de recherche, si nous voulons trouver les documents les plus proches d’un texte donné, pg_vector permet de comparer les vecteurs (ou embeddings) de chaque document pour voir lesquels sont les plus similaires.

Autre exemple, dans une plateforme de streaming musical, chaque chanson peut être convertie en vecteur qui représente ses caractéristiques (comme le tempo, la tonalité, etc.). Grâce à pg_vector, on peut facilement recommander des chansons similaires à celles que nous écoutons.

L’avantage de pg_vector, c’est qu’il permet de gérer ces vecteurs directement dans la base de données, ce qui évite de passer par des systèmes externes plus complexes. Cela simplifie le développement et améliore la performance, car tout est géré au même endroit.

5. Le test

Pour démontrer le fonctionnement de l’extension, rien de tel qu’un petit test pour éprouver les fonctionnalités qu’elle propose. Le test sera plutôt simple et succinct pour être accessible. Le prérequi est d’avoir une version PostgreSQL 14 ou plus récente d’installée.

Etape 1 :

On commence par installer l’extension pg_vector. Pour cela, nous allons avoir besoin d’un certain nombre d’outils pour le faire fonctionner. Une partie de ces outils sont disponible dans la distribution dev de PostgreSQL

root@ip-192-1-1-201:~# sudo apt install postgresql-server-dev-14

Nous aurons également besoin de gcc et make :

root@ip-192-1-1-201:~# apt install make
root@ip-192-1-1-201:~# apt-get install gcc

On effectue ensuite un git clone du projet :

root@ip-192-1-1-201:~# git clone https://github.com/pgvector/pgvector.git

Et une fois que c’est fait, on l’installe avec make :

root@ip-192-1-1-201:~# cd pgvector
root@ip-192-1-1-201:~# make && sudo make install

Etape 2 :

On se connecte à PostgreSQL pour créer l’extension. Au passage, on créé aussi une base de données pour faire nos test.

root@ip-192-1-1-201:~# su - postgres
postgres@ip-192-1-1-201:~$ psql
psql (14.13 (Ubuntu 14.13-0ubuntu0.22.04.1))
Type "help" for help.
postgres=# create database test_vector;
CREATE DATABASE
postgres=# \c test_vector
You are now connected to database "test_vector" as user "postgres".
test_vector=# CREATE EXTENSION vector;
CREATE EXTENSION

Et dans la foulée, on crée une table qui contient les vecteurs sur lesquels nous allons faire les test

test_vector=# CREATE TABLE documents (
id SERIAL PRIMARY KEY,
title TEXT,
embedding vector(3) -- vecteur de dimension 3 pour cet exemple
);
CREATE TABLE

Insertion des données d’exemple :

test_vector=# INSERT INTO documents (title, embedding) VALUES
('Document 1', '[0.1, 0.2, 0.3]'),
('Document 2', '[0.4, 0.5, 0.6]'),
('Document 3', '[0.9, 0.8, 0.7]');
INSERT 0 3

Etape 3 :

Nous avons deux types de choses à tester pour montrer l’efficacité de notre extension. En effet, pour rechercher un vecteur, deux modes s’offrent à nous :

  1. La distance cosinus

La distance cosinus mesure non pas combien deux vecteurs sont éloignés, mais l’angle entre eux. C’est un peu comme comparer la direction dans laquelle pointent deux vecteurs plutôt que la distance réelle entre eux.

Imaginons que nous sommes en train de lancer deux flèches. La distance cosinus nous dira si les deux flèches pointent dans la même direction (sont similaires) ou si elles pointent dans des directions très différentes (sont moins similaires).

Dans le cadre de l’IA, cette mesure est souvent utilisée pour comparer des embeddings (représentations numériques complexes), car elle se concentre sur la relation entre les éléments, indépendamment de leur taille exacte.

Exemple simple :

Prenons les deux films :

  • Film A : [1, 5, 50, 120]
  • Film B : [2, 4, 45, 110]

La distance cosinus ne va pas se soucier de la différence de valeur entre chaque composant, mais va regarder si les deux films ont des proportions similaires. Autrement dit, est-ce que leur “profil” général est proche ou éloigné ?

Pour tester cette distance, dans notre pg vector, on utilise la méthode suivante :

test_vector=# SELECT title, embedding, embedding <=> '[0.2, 0.1, 0.3]' AS distance
FROM documents
ORDER BY embedding <=> '[0.2, 0.1, 0.3]' ASC
LIMIT 3;
title | embedding | distance
------------+---------------+---------------------
Document 2 | [0.4,0.5,0.6] | 0.05582537807240784
Document 1 | [0.1,0.2,0.3] | 0.07142855242198809
Document 3 | [0.9,0.8,0.7] | 0.09815280896106982
(3 rows)

Le symbole <=> représente une distance cosinus.

2. La distance Euclidienne

Imaginons que nous sommes sur une carte avec deux points : le point A et le point B. La distance euclidienne, c’est la façon la plus intuitive de mesurer la distance entre ces deux points, comme si nous tracions une ligne droite entre eux. Pour parler en terme simple, c’est la “distance à vol d’oiseau”.

Dans le cadre des vecteurs, la distance euclidienne mesure la différence entre deux vecteurs, un peu comme si chaque vecteur était un point sur une carte en plusieurs dimensions. Plus cette distance est petite, plus les deux vecteurs (et donc les objets qu’ils représentent) sont similaires.

Exemple simple :

Imaginons deux films représentés par les vecteurs suivants :

  • Film A : [1, 5, 50, 120]
  • Film B : [2, 4, 45, 110]

La distance euclidienne va calculer la différence entre chaque nombre des deux vecteurs et déterminer à quel point ces films sont proches en termes de caractéristiques (genre, nombre d’acteurs, budget, etc.).

Dans pg_vector on peut le tester ainsi :

test_vector=# SELECT title, embedding, embedding &lt;-&gt; '[0.2, 0.1, 0.3]' AS distance
FROM documents
ORDER BY embedding &lt;-&gt; '[0.2, 0.1, 0.3]' ASC
LIMIT 3;
title | embedding | distance
------------+---------------+--------------------
Document 1 | [0.1,0.2,0.3] | 0.1414213612422477
Document 2 | [0.4,0.5,0.6] | 0.5385165006363984
Document 3 | [0.9,0.8,0.7] | 1.0677078185041473
(3 rows)

Elle est représentée par le cigle <-> dans pg_vector.

3. Quand choisir l’une ou l’autre des distances ?

  • La distance euclidienne est utile quand tu veux mesurer la différence globale entre deux objets. Elle est facile à comprendre et à utiliser pour des comparaisons directes.
  • La distance cosinus est utile quand tu veux savoir si deux objets sont globalement similaires dans leur profil, indépendamment de leur taille ou de leur échelle. Elle est souvent utilisée pour comparer des documents textuels ou des données complexes en IA

Conclusion

L’extension pg_vector apporte une fonctionnalité puissante à PostgreSQL, permettant de manipuler des données complexes sous forme de vecteurs. Que ce soit pour des systèmes de recommandation, des moteurs de recherche ou toute autre application liée à l’intelligence artificielle, elle offre un moyen simple et efficace d’intégrer l’IA dans les bases de données. Et tout cela, sans avoir besoin de comprendre des mathématiques avancées : il suffit de savoir que ces vecteurs permettent de traiter des informations complexes de manière très efficace.

Continuez votre lecture sur le blog :

twitterlinkedinmail

Sarah FAVEERE

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.