pgvector: embeddings in PostgreSQL
Abiliterà l'estensione pgvector in PostgreSQL, creerà una tabella con una colonna vettoriale, inserirà gli embeddings ed eseguirà query dei nearest neighbor usando l'operatore di distanza coseno .
pgvector: embeddings in PostgreSQL è una lezione AI Engineering Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Engineering Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Engineering Academy include 4 lezioni in totale.
pgvector: ricerca vettoriale in PostgreSQL
pgvector è un'estensione open source di PostgreSQL che aggiunge un tipo di dati vector e operatori per la ricerca di similarità. Consente di archiviare gli embedding insieme ai normali dati dell'applicazione nello stesso database già in uso, evitando un vector store separato.
È la soluzione ideale per i team che utilizzano già PostgreSQL e vogliono aggiungere la ricerca semantica senza introdurre una nuova dipendenza infrastrutturale.
Abilitazione dell'estensione pgvector
Installi pgvector dal repository ufficiale oppure utilizzi un provider PostgreSQL gestito che lo preinstalli (Supabase, Neon, AWS RDS, Render). Quindi lo abiliti nel database con un singolo comando SQL, senza bisogno di riavviare.
-- Run this once per database to enable the extension
CREATE EXTENSION IF NOT EXISTS vector;
-- Verify it's installed
SELECT extname, extversion
FROM pg_extension
WHERE extname = 'vector';
-- Returns: vector | 0.7.0 (or similar)Creazione di una tabella con una colonna vector
Aggiunga una colonna vector specificando vector(n), dove n è la dimensione dell'embedding. Può combinarla con le normali colonne PostgreSQL per i metadati, così da filtrare per user_id, created_at o qualsiasi altro campo utilizzando le normali clausole SQL WHERE.
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
content TEXT NOT NULL,
category TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
embedding vector(1536) -- must match your model dimension
);
-- Index on category for fast metadata filtering
CREATE INDEX ON documents (category);
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'documents';Inserimento degli embedding da Python
Utilizzi il driver psycopg2 o asyncpg per inserire righe con gli embedding. Converta la lista Python di valori float in una stringa nel formato '[0.1, 0.2, ...]', che pgvector analizza correttamente. Il pacchetto Python pgvector fornisce un helper register_vector che gestisce automaticamente questa conversione.
import psycopg2
from pgvector.psycopg2 import register_vector
from openai import OpenAI
conn = psycopg2.connect('postgresql://user:pass@localhost/mydb')
register_vector(conn)
cur = conn.cursor()
client = OpenAI()
document = 'pgvector adds vector search to PostgreSQL.'
resp = client.embeddings.create(model='text-embedding-3-small', input=document)
embedding = resp.data[0].embedding
cur.execute(
'INSERT INTO documents (content, category, embedding) VALUES (%s, %s, %s)',
(document, 'database', embedding)
)
conn.commit()
print('Inserted document with embedding')Similarità coseno con l'operatore <=>
pgvector aggiunge tre operatori di distanza:
<=>— distanza coseno (1 - cosine_similarity)<->— distanza euclidea (L2)<#>— prodotto interno negativo (da utilizzare per la similarità del prodotto scalare)
Per gli embedding testuali, utilizzi <=> (distanza coseno). ORDER BY distance ASC restituisce prima i documenti più simili.
-- Find top 5 documents most similar to a query embedding
-- Replace '[0.1, 0.2, ...]' with the actual query vector
SELECT
id,
content,
category,
1 - (embedding <=> '[0.1, 0.2, 0.3]'::vector) AS cosine_similarity
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, 0.3]'::vector
LIMIT 5;Combinazione della ricerca vettoriale con i filtri SQL
Uno dei principali vantaggi di pgvector è la possibilità di combinare la ricerca ANN con le normali clausole SQL WHERE. Questo consente di filtrare nativamente i metadati senza alcuna sintassi speciale: è sufficiente scrivere SQL.
-- Semantic search filtered to the 'database' category
-- and only recent documents
SELECT
id,
content,
1 - (embedding <=> %s::vector) AS similarity
FROM documents
WHERE
category = 'database'
AND created_at > NOW() - INTERVAL '30 days'
ORDER BY embedding <=> %s::vector
LIMIT 5;
-- In Python with psycopg2:
# cur.execute(sql, (query_embedding, query_embedding))Creazione di un indice HNSW per aumentare la velocità
Senza un indice, pgvector esegue una scansione esatta di ogni riga: una soluzione adeguata per meno di 10.000 righe, ma lenta quando il volume aumenta. Crei un indice HNSW per la ricerca approssimata dei vicini più prossimi. I parametri m (connessioni per nodo) ed ef_construction (ampiezza della ricerca durante la creazione) bilanciano dimensioni e tempo di creazione dell'indice con l'accuratezza del recall.
-- Create an HNSW index for cosine distance queries
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- At query time, control recall vs speed:
SET hnsw.ef_search = 40; -- higher = better recall, slower
-- Verify the index is being used:
EXPLAIN SELECT * FROM documents
ORDER BY embedding <=> '[0.1]'::vector(1)
LIMIT 5;Indice IVFFlat: un'alternativa a HNSW
Il tipo di indice IVFFlat raggruppa i vettori in bucket lists e, al momento della query, cerca soltanto nei bucket probes più vicini. Viene creato più velocemente rispetto a HNSW e utilizza meno memoria, ma offre un recall leggermente inferiore a parità di velocità.
Regola generale: utilizzi IVFFlat quando servono creazioni più rapide degli indici durante frequenti reindicizzazioni; utilizzi HNSW per corpus stabili che richiedono la massima velocità nelle query.
-- IVFFlat index: good for large, infrequently updated corpora
-- lists ≈ sqrt(n) where n is the number of vectors
CREATE INDEX ON documents
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
-- At query time, probes controls recall vs speed:
SET ivfflat.probes = 10; -- check 10 of 100 clustersEsempio completo di query Python
Ecco una funzione Python completa che accetta una query dell'utente, la trasforma in un embedding, esegue una ricerca di similarità con pgvector applicando un filtro sui metadati e restituisce i primi k risultati sotto forma di elenco di dict.
import psycopg2
from pgvector.psycopg2 import register_vector
from openai import OpenAI
conn = psycopg2.connect('postgresql://user:pass@localhost/mydb')
register_vector(conn)
client = OpenAI()
def semantic_search(query, category=None, top_k=5):
resp = client.embeddings.create(model='text-embedding-3-small', input=query)
q_vec = resp.data[0].embedding
sql = '''
SELECT content,
1 - (embedding <=> %s::vector) AS similarity
FROM documents
{where}
ORDER BY embedding <=> %s::vector
LIMIT %s
'''
where = 'WHERE category = %s' if category else ''
params = [q_vec, q_vec, top_k] if not category else [q_vec, category, q_vec, top_k]
cur = conn.cursor()
cur.execute(sql.format(where=where), params)
return [{'text': r[0], 'score': r[1]} for r in cur.fetchall()]Compromessi tra pgvector e Pinecone
Confronto tra pgvector e Pinecone:
- pgvector: self-hosted, nessun costo aggiuntivo, integrazione SQL perfetta, buona scalabilità fino a circa 5 milioni di vettori, richiede competenze DBA per la messa a punto
- Pinecone: completamente gestito, scalabilità enorme (miliardi di vettori), filtri specializzati, più costoso, servizio separato da gestire
Scelga pgvector se utilizza già PostgreSQL e il corpus contiene meno di alcuni milioni di documenti. Scelga Pinecone per volumi enormi o quando evitare l'onere operativo giustifica il costo.
Utilizzo di pgvector con Supabase
Supabase è un servizio PostgreSQL in hosting con pgvector preinstallato. Fornisce un client Python (supabase-py) e un'API REST per le query vettoriali, rappresentando il modo più semplice per configurare pgvector in produzione senza gestire personalmente un server database.
from supabase import create_client
import os
url = os.environ['SUPABASE_URL']
key = os.environ['SUPABASE_SERVICE_KEY']
supabase = create_client(url, key)
# Insert a document with embedding
supabase.table('documents').insert({
'content': 'Supabase hosts PostgreSQL with pgvector.',
'embedding': embedding # list of 1536 floats
}).execute()
# Vector similarity search via RPC (Supabase edge function)
# result = supabase.rpc('match_documents', {'query_embedding': q_vec, 'match_count': 5}).execute()Verifica rapida
Verifichi la propria comprensione dei concetti di AI Engineering trattati in questa lezione.
Riepilogo della lezione
In questa lezione ha imparato che: pgvector aggiunge a PostgreSQL un tipo di colonna vector e operatori di distanza coseno/euclidea, gli indici HNSW consentono una ricerca approssimata e veloce dei vicini più prossimi su larga scala e le normali clausole SQL WHERE permettono di filtrare i metadati senza alcuna sintassi speciale. Nella prossima lezione confronteremo le principali opzioni di vector store per aiutarLa a scegliere quella più adatta al Suo progetto.
Domande Frequenti
La lezione «pgvector: embeddings in PostgreSQL» è gratuita?
Sì — il testo completo di «pgvector: embeddings in PostgreSQL» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Engineering Academy, passa a CoddyKit PRO. Il corso AI Engineering Academy include 4 lezioni in totale.
Cosa imparerò in «pgvector: embeddings in PostgreSQL»?
Abiliterà l'estensione pgvector in PostgreSQL, creerà una tabella con una colonna vettoriale, inserirà gli embeddings ed eseguirà query dei nearest neighbor usando l'operatore di distanza coseno . Eserciti AI Engineering Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Engineering Academy?
Non è richiesta alcuna esperienza precedente. AI Engineering Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «pgvector: embeddings in PostgreSQL»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Engineering Academy?
Sì. Ogni lezione AI Engineering Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Perché serve un database vettoriale
- Iniziare con Pinecone
- pgvector: embeddings in PostgreSQL
- Scegliere e valutare i vector store