AI & MCP

Ricerca semantica nel sito: quando bastano i sinonimi

Gli embedding servono quando la query non usa le parole del contenuto. Con un vocabolario chiuso una tabella di sinonimi risponde prima e costa zero.

In sintesi

  • Una tabella di sinonimi copre un vocabolario chiuso senza servizi esterni e senza latenza di rete.
  • Gli embedding costano su tre fronti: generazione, archiviazione e indice.
  • 111.985 vettori da 1.536 dimensioni in float32 occupano circa 656 MiB prima dell'indice.

La ricerca semantica serve quando chi cerca usa parole diverse da quelle del contenuto; se il vocabolario è chiuso e prevedibile, una tabella di sinonimi costa zero e risponde in meno di un secondo.

Quando una mappa basta

Una mappa di sinonimi copre il vocabolario che conosci: icone, categorie, stati. Non richiede servizi, non ha latenza di rete e si revisiona leggendo un file. Il limite è che qualcuno deve scriverla e tenerla aggiornata.

RicercaRisultatiByteTempo
delete296726378 ms
dashboard12739537 ms

Sono misure singole, misurate da un client HTTP il 1 novembre 2026 con una richiesta per query: valgono come ordine di grandezza, non come media.

Quando servono i vettori

Gli embedding servono quando la query è una frase e il contenuto non contiene quelle parole. Il prezzo si paga in tre punti: generazione, archiviazione e indice.

La matrice si calcola in fretta: 111.985 vettori da 1.536 dimensioni in float32 occupano 688.035.840 byte, circa 656 MiB, prima di qualsiasi indice.

CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE component_embedding (
  component_id text PRIMARY KEY,
  embedding vector(1536) NOT NULL
);

CREATE INDEX ON component_embedding
  USING hnsw (embedding vector_cosine_ops);

Ibrido, non religioso

La ricerca che funziona somma due segnali: il filtro esatto su categoria e libreria e la similarità sul testo. Il filtro riduce lo spazio prima del calcolo, quindi il risultato resta corretto anche quando il vettore sbaglia.

La limitazione

Non abbiamo una misura di qualità: recall e precisione richiedono un set di query con la risposta attesa, e questo sito non lo ha pubblicato. Il pacchetto pgvector 0.3.0 su npm pesa 52.767 byte, letto il 1 novembre 2026, ma l'indice HNSW vive in memoria e va dimensionato.

Dove continuare

Una palette da tastiera sopra la ricerca è in command menu con shadcn, la scelta del database in SQLite o Postgres, i filtri di catalogo in ricerca a faccette. I record: 111.985 componenti, 12.808 icone, Aceternity UI.

Domande frequenti

La ricerca semantica migliora sempre i risultati?

No. Migliora le query in linguaggio naturale e peggiora quelle esatte, come un codice prodotto o un nome di componente. Per questo si usa in ibrido con un filtro esatto.

Quanto costa indicizzare un catalogo di 111.985 elementi?

Dipende dai token di ogni elemento. Con text-embedding-3-small a 0,02 $ per milione di token, il costo è il numero di token diviso un milione per 0,02 $. Lo spazio è prevedibile: circa 656 MiB in float32 a 1.536 dimensioni.

Serve un database vettoriale dedicato?

No per un catalogo di questa scala. Postgres con pgvector, o SQLite con sqlite-vec, tengono i vettori accanto ai dati e permettono di filtrare nella stessa query.

Quanti risultati deve restituire la ricerca?

Dieci sono un buon punto di partenza per una pagina di catalogo, con paginazione a cursore dopo. Il numero vero dipende da quante righe l'utente riesce a valutare prima di cambiare query.

Come misuro se la ricerca è migliorata?

Con un set di venti o trenta query reali e il risultato atteso scritto accanto, misurando quanti risultati corretti compaiono nei primi dieci. Senza quel set ogni confronto è un'impressione.