Chat
Ask me anything
Ithy Logo
Sign in to save

Utilizzo di pgvector per Suggerimenti di Prodotti Simili

Guida dettagliata per implementare raccomandazioni con PostgreSQL e pgvector

scenic database servers equipment

Highlights

  • Integrazione Diretta degli Embeddings: Utilizza pgvector per memorizzare e interrogare gli embeddings direttamente nelle tabelle PostgreSQL.
  • Calcolo della Similarità: Applica operatori dedicati per misurare la distanza tra vettori e determinare la somiglianza dei prodotti.
  • Raccomandazioni Personalizzate: Combina dati sugli acquisti degli utenti con gli embeddings per suggerire prodotti simili ma non ancora acquistati.

Introduzione

In un mondo in cui l’e-commerce e le applicazioni basate su AI stanno rivoluzionando lo shopping online, fornire suggerimenti personalizzati diventa fondamentale per migliorare l’esperienza degli utenti. Una tecnica all’avanguardia consiste nell’utilizzo degli embeddings, ossia rappresentazioni numeriche di alta dimensione dei prodotti, per determinare la somiglianza tra essi. PostgreSQL, abbinato all’estensione pgvector, offre un ambiente flessibile e scalabile che permette di memorizzare, indicizzare e interrogare direttamente questi vettori. In questo articolo esploreremo come integrare pgvector nelle tue tabelle di prodotti e come sfruttarlo per suggerire prodotti simili in base agli acquisti degli utenti.


Impostazione del Database e Creazione delle Tabelle

Struttura delle Tabelle

Prima di procedere con le query per il calcolo delle similarità, è necessario impostare un modello dati corretto. Le tabelle principali che dovrai creare includono:

Tabella dei Prodotti

La tabella dei prodotti contiene informazioni basilari come l’identificativo, il nome, e la descrizione, insieme ad un campo dedicato agli embeddings vettoriali che rappresentano le caratteristiche del prodotto. Un esempio di configurazione potrebbe essere il seguente:


-- Creazione della tabella dei prodotti
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    description TEXT,
    embedding VECTOR(384)  -- Dimensione dell'embedding (modifica in base al modello)
);
  

Tabella degli Acquisti degli Utenti

Per tracciare gli acquisti degli utenti, è utile creare una tabella che registri quali prodotti sono stati acquistati da ciascun utente. In questo modo si potrà estrarre la cronologia degli acquisti e, di conseguenza, determinare le preferenze degli utenti per suggerimenti mirati.


-- Creazione della tabella per tracciare gli acquisti
CREATE TABLE user_purchases (
    user_id INT,
    product_id INT,
    purchase_date TIMESTAMP,
    PRIMARY KEY (user_id, product_id),
    FOREIGN KEY (product_id) REFERENCES products(id)
);
  

Generazione degli Embeddings

Utilizzo dei Modelli di Machine Learning

Gli embeddings sono vettori che rappresentano le caratteristiche numeriche dei prodotti. Comunemente, questi vettori vengono generati utilizzando modelli di machine learning, come le reti neurali o modelli pre-addestrati (ad esempio, quelli di OpenAI). Una volta generato un embedding per ciascun prodotto, questi possono essere inseriti nella tabella dei prodotti.

Ecco un esempio pratico di inserimento dati:


-- Inserimento di prodotti con embeddings
INSERT INTO products (name, description, embedding)
VALUES ('Prodotto A', 'Descrizione del Prodotto A', '[0.12, 0.45, 0.67, ...]'),
       ('Prodotto B', 'Descrizione del Prodotto B', '[0.23, 0.34, 0.56, ...]');
  

La dimensione del vettore (ad esempio, 384) dovrà essere scelta in base al modello utilizzato per la generazione degli embeddings.


Implementazione del Sistema di Raccomandazioni

Fondamenti della Similarità Vettoriale

L'estensione pgvector introduce operatori per il calcolo della distanza tra vettori. Tra i più utilizzati vi sono:

  • Distanza Euclidea (<->): Misura la distanza lineare tra i vettori in uno spazio n-dimensionale.
  • Distanza Coseno (<=>): Valuta la differenza in orientamento (angolare) tra i vettori, particolarmente utile quando si vogliono confrontare le direzioni.
  • Prodotto Interno: A volte si sfrutta il prodotto interno normalizzato per calcolare la similarità.

Questi operatori permettono di ordinare i prodotti in base alla similarità rispetto ad un embedding di riferimento.

Suggerimenti Basati sui Dati degli Acquisti

Calcolo del Vettore di Preferenza

Per suggerire prodotti simili, è importante comprendere le preferenze degli utenti. Una strategia consiste nel calcolare la media degli embeddings dei prodotti acquistati da un utente, ottenendo così un "vettore di preferenza". Questo vettore rappresenta una sintesi dei gusti e delle preferenze dell’utente, e può essere usato per cercare prodotti che si trovino in prossimità nello spazio vettoriale.

Ad esempio, per un utente identificato da user_id, puoi aggregare gli embeddings dei prodotti acquistati e poi cercare i prodotti con embedding simile a questo vettore medio.


-- Query per ottenere prodotti simili in base agli acquisti dell'utente
SELECT p.id, p.name
FROM products p
WHERE p.id NOT IN (
    SELECT product_id 
    FROM user_purchases 
    WHERE user_id = 123  -- Sostituisci con l'ID dell'utente
)
ORDER BY p.embedding <-> (
    SELECT avg(p2.embedding) AS user_pref_vector
    FROM products p2
    JOIN user_purchases up ON p2.id = up.product_id
    WHERE up.user_id = 123
)
LIMIT 5;
  

In questa query si esegue l’operazione di ordinamento dei prodotti in base alla distanza (utilizzando l’operatore <->) tra il loro embedding e il vettore medio calcolato. Vengono esclusi i prodotti già acquistati dall’utente.

Suggerimenti Collaborativi

Un ulteriore approccio consiste nell’analizzare gli acquisti di utenti simili. Se due utenti hanno una storia di acquisti simile, i prodotti acquistati da uno possono essere raccomandati anche all'altro. Ecco un esempio di query che sfrutta una strategia collaborativa:


-- Query collaborativa per suggerimenti basati su acquisti simili tra utenti
WITH similar_users AS (
    SELECT user_id
    FROM user_purchases
    WHERE product_id IN (
        SELECT product_id 
        FROM user_purchases
        WHERE user_id = 123  -- ID dell'utente corrente
    )
    AND user_id <> 123
    GROUP BY user_id
    ORDER BY count(*) DESC
    LIMIT 5
),
recommended_products AS (
    SELECT DISTINCT up.product_id
    FROM user_purchases up
    JOIN similar_users su ON up.user_id = su.user_id
    WHERE up.product_id NOT IN (
        SELECT product_id FROM user_purchases WHERE user_id = 123
    )
)
SELECT p.id, p.name
FROM products p
WHERE p.id IN (SELECT product_id FROM recommended_products)
LIMIT 5;
  

In questo esempio si identificano gli utenti con acquisti simili e, successivamente, si raccolgono i prodotti da loro acquistati, escludendo quelli già posseduti dall’utente in esame, al fine di fornire raccomandazioni nuove e potenzialmente interessanti.


Ottimizzazione delle Prestazioni e Considerazioni Tecniche

Indici sui Vettori

La ricerca di similarità vettoriale, sebbene molto efficiente grazie a pgvector, può beneficiare notevolmente dell’uso di indici specializzati. In particolare, pgvector supporta indici IVFFlat e HNSW per la ricerca di vicini più prossimi approssimativi (ANN).


-- Creazione di un indice IVFFlat per migliorare le prestazioni di ricerca
CREATE INDEX ON products USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);
  

L'indice migliora la velocità delle query, in particolare quando il numero di prodotti è elevato, garantendo tempi di risposta rapidi nelle operazioni di corrispondenza tra vettori.

Normalizzazione e Calibrazione degli Embeddings

Quando si utilizza il calcolo della similarità, specialmente mediante il prodotto interno o distanze coseno, è consigliabile normalizzare i vettori. La normalizzazione converte ogni embedding in un vettore unitario, il che permette di confrontare meglio le direzioni invece che le magnitudini. Questo approccio può migliorare la precisione delle raccomandazioni.

Per normalizzare un vettore in un'applicazione, potresti utilizzare funzioni di librerie di machine learning prima del salvataggio in PostgreSQL oppure eseguire trasformazioni direttamente nel tuo codice SQL se il database le supporta.

Monitoraggio e Debug delle Query

PostgreSQL mette a disposizione strumenti come EXPLAIN ANALYZE per monitorare le performance di una query. Utilizzando questo comando, è possibile identificare eventuali colli di bottiglia e ottimizzare l'uso degli indici.


-- Utilizzo di EXPLAIN ANALYZE per verificare le prestazioni della query
EXPLAIN ANALYZE
SELECT p.id, p.name
FROM products p
WHERE p.id NOT IN (
    SELECT product_id FROM user_purchases WHERE user_id = 123
)
ORDER BY p.embedding <-> (
    SELECT avg(p2.embedding) 
    FROM products p2
    JOIN user_purchases up ON p2.id = up.product_id
    WHERE up.user_id = 123
)
LIMIT 5;
  

Esempi Pratici e Tabella di Sintesi

Esempio di Workflow per Raccomandazioni

Di seguito è presentato un workflow pratico per implementare un sistema di raccomandazione:

  1. Installa e abilita pgvector eseguendo il comando CREATE EXTENSION vector; sul tuo database.
  2. Crea le tabelle products e user_purchases per memorizzare rispettivamente le informazioni sui prodotti e gli acquisti degli utenti.
  3. Genera gli embeddings per ciascun prodotto tramite modelli di machine learning e inseriscili nella tabella dei prodotti.
  4. Calcola il vettore medio basato sugli acquisti di un utente per determinare le preferenze.
  5. Esegui una query che ordina i prodotti (escludendo quelli già acquistati) in base alla distanza tra il loro embedding e il vettore degli interessi dell’utente.

Tabella Riassuntiva dei Passaggi

Passaggio Descrizione Esempio SQL/Dettagli
1. Installazione Abilitare pgvector in PostgreSQL CREATE EXTENSION vector;
2. Creazione Tabelle Definire tabelle per prodotti e acquisti Utilizzare CREATE TABLE per products e user_purchases
3. Generazione Embeddings Generare e inserire vettori per ogni prodotto Utilizzare modelli ML e INSERT INTO
4. Calcolo Similarità Calcolare distanza tra vettori Utilizzare operatori come <-> e <=>
5. Suggerimenti Personalizzati Ordinare e filtrare i prodotti secondo le preferenze dell’utente Query SQL che esclude prodotti già acquistati
6. Ottimizzazione Implementare indici e normalizzare i vettori Utilizzare tecniche come IVFFlat e funzioni di normalizzazione

Riferimenti

Raccomandazioni Utili


Last updated March 2, 2025

AI-assisted research. Sources, methodology and corrections · Source-checked guides and tools · Explore published answers

Ask Ithy AI
Download Article
Delete Article