pgvector: Embeddings and vector similarity
pgvector is a PostgreSQL extension for vector similarity search. It can also be used for storing embeddings.
Learn more about Supabase's AI & Vector offering.
Concepts#
Vector similarity#
Vector similarity refers to a measure of the similarity between two related items. For example, if you have a list of products, you can use vector similarity to find similar products. To do this, you need to convert each product into a "vector" of numbers, using a mathematical model. You can use a similar model for text, images, and other types of data. Once all of these vectors are stored in the database, you can use vector similarity to find similar items.
Embeddings#
This is particularly useful if you're building on top of OpenAI's GPT-3. You can create and store embeddings for retrieval augmented generation.
Usage#
Enable the extension#
- Go to the Database page in the Dashboard.
- Click on Extensions in the sidebar.
- Search for "vector" and enable the extension.
Usage#
Create a table to store vectors#
_10create table posts (_10 id serial primary key,_10 title text not null,_10 body text not null,_10 embedding vector(384)_10);
Storing a vector / embedding#
In this example we'll generate a vector using Transformer.js, then store it in the database using the Supabase client.
_21import { pipeline } from '@xenova/transformers'_21const generateEmbedding = await pipeline('feature-extraction', 'Supabase/gte-small')_21_21const title = 'First post!'_21const body = 'Hello world!'_21_21// Generate a vector using Transformers.js_21const output = await generateEmbedding(body, {_21 pooling: 'mean',_21 normalize: true,_21})_21_21// Extract the embedding output_21const embedding = Array.from(output.data)_21_21// Store the vector in Postgres_21const { data, error } = await supabase.from('posts').insert({_21 title,_21 body,_21 embedding,_21})