pgvector: Embeddings and vector similarity
pgvector is a PostgreSQL extension for vector similarity search. It can also be used for storing embeddings.
The name of pgvector's Postgres extension is vector.
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})