Ricerca basata su parole chiave
In Tokopedia siamo consapevoli che il valore del nostro corpus di prodotti si libera solo quando i nostri acquirenti possono trovare prodotti rilevanti per loro, quindi ci impegniamo a migliorare la rilevanza dei risultati di ricerca.
Per favorire questo sforzo, stiamo introducendo la ricerca per similarità su Tokopedia. Se andate nella pagina dei risultati della ricerca sui dispositivi mobili, troverete un pulsante "..." che espone un menu che vi dà la possibilità di cercare prodotti simili al prodotto.
Ricerca basata su parole chiave
Tokopedia Search utilizza Elasticsearch per la ricerca e la classificazione dei prodotti. Per ogni richiesta di ricerca, interroghiamo prima Elasticsearch, che classifica i prodotti in base alla query di ricerca. ElasticSearch memorizza ogni parola come una sequenza di numeri che rappresentano i codici ASCII (o UTF) per ogni lettera. Costruisce un indice invertito per scoprire rapidamente quali documenti contengono le parole della query dell'utente e poi trova la migliore corrispondenza tra questi utilizzando vari algoritmi di punteggio. Questi algoritmi di punteggio prestano poca attenzione al significato delle parole, ma piuttosto alla loro frequenza nel documento, alla loro vicinanza, ecc. La rappresentazione ASCII contiene ovviamente informazioni sufficienti a trasmettere la semantica (dopotutto noi esseri umani siamo in grado di capirla). Purtroppo, non esiste un buon algoritmo che consenta al computer di confrontare le parole codificate in ASCII in base al loro significato.
Rappresentazione vettoriale
Una soluzione a questo problema sarebbe quella di trovare una rappresentazione alternativa, che ci dica non solo le lettere contenute nella parola, ma anche qualcosa sul suo significato. Ad esempio, potremmo codificare quali sono le altre parole con cui la nostra parola viene usata di frequente (rappresentate dal probabile contesto). Potremmo quindi ipotizzare che contesti simili rappresentino cose simili e cercare di confrontarli con metodi matematici. Potremmo anche trovare un modo per codificare intere frasi in base al loro significato.
Blog_Come abbiamo usato la ricerca semantica per rendere la nostra ricerca 10 volte più intelligente_2.png
Selezionare un motore di ricerca per la similarità di incorporazione
Ora che abbiamo i vettori di caratteristiche, il problema rimanente è come recuperare dal grande volume di vettori quelli che sono simili al vettore di destinazione. Per quanto riguarda il motore di ricerca degli embeddings, abbiamo provato il POC su diversi motori disponibili su Github, tra cui FAISS, Vearch e Milvus.
In base ai risultati dei test di carico, preferiamo Milvus agli altri motori. Da un lato, abbiamo già usato FAISS in altri team e quindi vorremmo provare qualcosa di nuovo. Rispetto a Milvus, FAISS è più che altro una libreria sottostante, quindi non è del tutto comodo da usare. Dopo aver imparato di più su Milvus, abbiamo deciso di adottarlo per le sue due caratteristiche principali:
Milvus è molto facile da usare. È sufficiente prelevare l'immagine Docker e aggiornare i parametri in base al proprio scenario.
Supporta più indici e dispone di una documentazione di supporto dettagliata.
In poche parole, Milvus è molto amichevole per gli utenti e la documentazione è abbastanza dettagliata. Se ci si imbatte in qualche problema, di solito è possibile trovare le soluzioni nella documentazione; altrimenti, è sempre possibile ottenere supporto dalla comunità di Milvus.
Servizio cluster Milvus
Dopo aver deciso di utilizzare Milvus come motore di ricerca vettoriale, abbiamo deciso di usarlo per uno dei nostri casi d'uso del servizio Ads, in cui volevamo abbinare parole chiave a basso tasso di riempimento con parole chiave ad alto tasso di riempimento. Abbiamo configurato un nodo autonomo in un ambiente di sviluppo (DEV) e abbiamo iniziato il servizio, che ha funzionato bene per alcuni giorni e ci ha fornito metriche CTR/CVR migliori. Se un nodo standalone si bloccasse in produzione, l'intero servizio diventerebbe indisponibile. Pertanto, è necessario implementare un servizio di ricerca ad alta disponibilità.
Milvus fornisce sia Mishards, un middleware di sharding per cluster, sia Milvus-Helm per la configurazione. In Tokopedia utilizziamo i playbook Ansible per la configurazione dell'infrastruttura, quindi abbiamo creato un playbook per l'orchestrazione dell'infrastruttura. Il diagramma sottostante, tratto dalla documentazione di Milvus, mostra il funzionamento di Mishards:
Blog_Come abbiamo usato la ricerca semantica per rendere la nostra ricerca 10 volte più intelligente_3.png
Mishards esegue una richiesta a cascata da upstream verso i suoi sottomoduli, suddividendo la richiesta a monte, e poi raccoglie e restituisce i risultati dei sottoservizi a upstream. L'architettura complessiva della soluzione cluster basata su Mishards è mostrata di seguito: Blog_Come abbiamo usato la ricerca semantica per rendere la nostra ricerca 10 volte più intelligente_4.jpeg
La documentazione ufficiale fornisce una chiara introduzione a Mishards. Se siete interessati, potete fare riferimento a Mishards.
Nel nostro servizio keyword-to-keyword, abbiamo distribuito un nodo scrivibile, due nodi di sola lettura e un'istanza del middleware Mishards in GCP, utilizzando Milvus ansible. Finora è stato stabile. Una componente importante di ciò che rende possibile interrogare in modo efficiente gli insiemi di dati vettoriali da un milione, un miliardo o addirittura un trilione su cui si basano i motori di ricerca per similarità è l'indicizzazione, un processo di organizzazione dei dati che accelera drasticamente la ricerca sui big data.
In che modo l'indicizzazione vettoriale accelera la ricerca per similarità?
I motori di ricerca per similarità funzionano confrontando l'input con un database per trovare gli oggetti più simili all'input. L'indicizzazione è il processo di organizzazione efficiente dei dati e svolge un ruolo fondamentale nel rendere utile la ricerca per similarità, accelerando drasticamente le interrogazioni che richiedono molto tempo su grandi insiemi di dati. Una volta indicizzato un enorme insieme di dati vettoriali, le query possono essere indirizzate verso i cluster, o sottoinsiemi di dati, che hanno maggiori probabilità di contenere vettori simili alla query di input. In pratica, questo significa sacrificare un certo grado di accuratezza per velocizzare le interrogazioni su dati vettoriali molto grandi.
Si può fare un'analogia con un dizionario, dove le parole sono ordinate alfabeticamente. Quando si cerca una parola, è possibile navigare rapidamente verso una sezione che contiene solo parole con la stessa iniziale, accelerando drasticamente la ricerca della definizione della parola inserita.
E poi?
Blog_Come abbiamo usato la ricerca semantica per rendere la nostra ricerca 10 volte più intelligente_5.jpeg
Come si è visto, non esiste una soluzione che vada bene per tutti: vogliamo sempre migliorare le prestazioni del modello utilizzato per ottenere le incorporazioni.
Inoltre, da un punto di vista tecnico, vogliamo eseguire più modelli di apprendimento contemporaneamente e confrontare i risultati dei vari esperimenti. Seguite questo spazio per ulteriori informazioni sui nostri esperimenti, come la ricerca di immagini e video.
Riferimenti:
- Documenti Mishards: https://milvus.io/docs/v0.10.2/mishards.md
- Mishards: https://github.com/milvus-io/milvus/tree/master/shards
- Milvus-Helm: https://github.com/milvus-io/milvus-helm/tree/master/charts/milvus
Questo articolo del blog è stato ripostato da: https://medium.com/tokopedia-engineering/how-we-used-semantic-search-to-make-our-search-10x-smarter-bd9c7f601821
Leggete le altre storie degli utenti per saperne di più sulla realizzazione di oggetti con Milvus.
- Rappresentazione vettoriale
- Selezionare un motore di ricerca per la similarità di incorporazione
- Servizio cluster Milvus
- In che modo l'indicizzazione vettoriale accelera la ricerca per similarità?
- E poi?
- Riferimenti:
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word