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.
| Ricerca | Risultati | Byte | Tempo |
|---|---|---|---|
| delete | 296 | 726 | 378 ms |
| dashboard | 12 | 739 | 537 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.