Cốc Cốc alimenta la ricerca AI su scala nazionale in Vietnam con Milvus
700M
Vettori in produzione, scalando verso 1,5B
19.8 ms
Latenza P90 della ricerca semantica al picco di traffico
32.1 ms
Latenza della ricerca ibrida P90 al traffico di picco
99–100%
Recall in produzione con HNSW
Rispondiamo in meno di 20 millisecondi su centinaia di milioni di vettori, e ogni prodotto di AI che abbiamo creato — ricerca, advertising, RAG — gira sulla stessa implementazione Milvus. È questo che ci permette di continuare a rilasciare funzionalità senza aggiungere infrastruttura.
Nam Doan Ngoc Giang
Informazioni su Cốc Cốc
Cốc Cốc è il principale motore di ricerca e browser di produzione vietnamita. Lo usano oltre 30 milioni di persone — circa un utente internet vietnamita su tre — con oltre 600 milioni di ricerche al mese, il che rende Cốc Cốc il secondo motore di ricerca e il secondo browser del paese, dietro solo a Google. Il suo vantaggio è ciò che i motori globali trovano più difficile da copiare: il vietnamita stesso, fino ai modelli linguistici che il team di Cốc Cốc ha messo a punto per esso.
Dal 2023, Cốc Cốc ha integrato l'AI in questa esperienza con AI Chat e AI Search, estendendo la stessa intelligenza a Cốc Cốc Ads. Questo cambiamento ha trasformato il problema sottostante: i risultati ora devono essere recuperati per significato, non solo per parola chiave, tra centinaia di milioni di elementi, in millisecondi. Milvus è il livello semantico che Cốc Cốc ha scelto per farlo — oggi contiene 700 milioni di vettori distribuiti su cinque dei loro sistemi di produzione.
La sfida
Portare il recupero semantico in un motore di ricerca e una piattaforma pubblicitaria su scala nazionale significava risolvere tre problemi contemporaneamente.
- La ricerca per parola chiave non può rispondere alle query che gli utenti digitano realmente. Nuove query e tendenze compaiono ogni giorno — un telefono uscito stamattina, un fatto di attualità di un'ora fa, una frase in vietnamita che nessuna pagina web usa. La ricerca per parola chiave corrisponde solo alle parole effettive dell'utente, quindi per queste restituisce poco di valore.
- Le librerie vettoriali non possono contenere centinaia di milioni di vettori. FAISS e USearch hanno funzionato bene sui progetti su scala ridotta di Cốc Cốc, ma forniscono un indice, non un sistema — niente che distribuisca centinaia di milioni di vettori tra più macchine, li mantenga interrogabili mentre vengono scritti nuovi dati e funzioni in modo affidabile in produzione. Qualunque cosa li sostituisse doveva anche girare sui server di Cốc Cốc, così che i dati di ricerca e pubblicità rimanessero all'interno della loro infrastruttura.
- L'abbinamento degli annunci richiede due percorsi di recupero, ma il budget di latenza ne supporta solo uno. Gli inserzionisti che fanno offerte sulle parole esatte di un acquirente devono essere abbinati, ma un acquirente che descrive la stessa cosa in modo diverso dovrebbe comunque vederli. Eseguire entrambi e fonderli in un'unica lista ordinata — nel carico di lavoro vettoriale di volume più alto di Cốc Cốc, all'interno di un budget condiviso per il caricamento della pagina — è qui che diventa difficile.
Perché Milvus
Cốc Cốc ha validato Milvus con una prova di concetto su circa 30 milioni di embedding di query prima di adottarlo. I risultati hanno superato le aspettative del team e da allora Milvus è il loro database vettoriale. Cinque elementi lo hanno mantenuto al suo posto mentre il carico di lavoro cresceva.
- Bassa latenza che ha retto con la crescita del dataset. Questo era il criterio principale. Milvus ha garantito una ricerca vettoriale costantemente veloce mentre il corpus di Cốc Cốc passava dai 30 milioni di vettori della proof of concept ai 700 milioni in produzione, e ha continuato a reggere quando il team è passato alla ricerca ibrida per la piattaforma pubblicitaria — un pattern di query più pesante e a volume più alto.
- Self-hosted, così dati e infrastruttura restano a Cốc Cốc. Milvus è open source e gira nell'ambiente di Cốc Cốc. I dati degli utenti non escono mai dalla loro infrastruttura, e il team controlla direttamente topologia di deployment, configurazione degli indici, allocazione delle risorse e tempistiche di upgrade.
- Ricerca ibrida nativa, invece di un secondo sistema da gestire. Milvus genera vettori sparsi con una funzione BM25 integrata e li combina con i risultati ANN densi all'interno di una singola query. Il motore degli annunci di Cốc Cốc ottiene il recupero lessicale e semantico da un unico database, con un'unica superficie operativa — invece di gestire un cluster separato di ricerca per parole chiave e cucire insieme due set di risultati nel codice applicativo.
- Una cassetta degli attrezzi completa di indici, così ogni carico di lavoro ottiene il giusto compromesso. I carichi di lavoro di Cốc Cốc non hanno le stesse esigenze. La ricerca online richiede la latenza più bassa con un'alta recall; le pipeline batch offline vogliono risultati esatti senza preoccuparsi dei tempi. Milvus supporta HNSW, la famiglia IVF, FLAT e molti altri nello stesso deployment, quindi il team ha scelto per ogni carico di lavoro invece di scendere a compromessi per tutti.
- Semplice da distribuire, gestire e imparare. Milvus è stato semplice da avviare, gestire e scalare in produzione, il che ha mantenuto bassi i costi operativi per il team di ingegneria. L'architettura modulare di Milvus Distributed, con cruscotti dettagliati per ogni componente, permette al team di vedere esattamente quale parte del sistema è sotto pressione e dimensionare l'hardware in base al vero collo di bottiglia. E la documentazione era completa e facile da seguire, il che ha accelerato l'implementazione iniziale e semplificato l'integrazione con i sistemi esistenti di Cốc Cốc.
La soluzione
Milvus si trova in cima alle pipeline di Cốc Cốc: è il passo di recupero, prima del filtraggio e del re-ranking. La rilevanza della ricerca web principale di Cốc Cốc segue un'architettura retrieve-and-rerank, con Milvus che gestisce il recall in prima fase e i modelli a valle che affinano i risultati.
Cinque sistemi di produzione girano su quell'unico deployment di Milvus — ognuno con la propria collection, la propria definizione di cosa significa un vettore, e la propria configurazione degli indici, ma nessuna infrastruttura separata:
- Rilevanza della ricerca web principale — recupero semantico che mostra risultati pertinenti per query mai viste e a coda lunga.
- Search & Shopping Ads basati su IA — recupero semantico e ibrido che abbina l'intento dell'utente agli annunci pertinenti.
- Suggerimenti di ricerca correlati — similarità vettoriale che mostra query di follow-up contestualmente pertinenti.
- Targeting lookalike — cronologia di navigazione trasformata in vettori, usata per trovare utenti con interessi simili per la pubblicità display.
- Un chatbot RAG interno — Milvus come livello di recupero che basa le risposte degli LLM sui documenti di Cốc Cốc.
Ciò che un vettore rappresenta dipende dal sistema: una pagina web, una query di ricerca, un annuncio, un profilo utente o un passaggio di testo. La maggior parte degli embedding proviene da modelli bi-encoder che il team ha ottimizzato a partire da PhoBERT, ottimizzati per la comprensione della lingua vietnamita — la competenza di dominio che rende i risultati di Cốc Cốc vietnamiti, non semplicemente tradotti.
Per soddisfare i requisiti di latenza e memoria in produzione, Cốc Cốc applica l'ottimizzazione dei modelli per ridurre i propri embedding di produzione a 128 dimensioni, mantenendo al contempo la qualità del recupero. Vettori più compatti significano meno memoria per vettore e un calcolo della distanza più veloce, il che aiuta a mantenere la memoria per nodo gestibile a questa scala. Questo ha fornito al team un vettore compatto e di alta qualità su cui costruire. La domanda successiva era su quale indice costruire.
Milvus supporta più tipi di indici con un indice diverso per ogni carico di lavoro
I carichi di lavoro di Cốc Cốc vanno in direzioni opposte. La ricerca rivolta agli utenti vuole la latenza più bassa possibile con un recall elevato; le pipeline batch offline vogliono risultati esatti e non si preoccupano di quanto tempo impiegano. Milvus supporta HNSW, la famiglia IVF, FLAT e altro sulla stessa distribuzione — quindi invece di scegliere un unico indice e conviverci ovunque, il team ha potuto confrontare le opzioni con i propri dati e poi eseguire diversi indici fianco a fianco.
Per i servizi online, hanno confrontato i candidati su recall, dimensione dell'indice e prestazioni:
- IVF-SQ8 — un piccolo ingombro di memoria, ma recall inferiore e latenza maggiore.
- IVF-PQ — un ingombro ancora più piccolo di IVF-SQ8, con un recall nuovamente inferiore.
- HNSW — il miglior recall, con 99%–100%, e la latenza più bassa, a un costo di memoria più elevato.
Poiché la latenza è il vincolo stringente per i servizi rivolti agli utenti e la memoria non è attualmente il fattore limitante sulla loro distribuzione, hanno scelto HNSW e accettato il compromesso sulla memoria. Per i carichi di lavoro batch offline — pipeline quotidiane di inferenza ed elaborazione dati — usano invece l'indice FLAT, ottenendo una ricerca esatta del vicino più prossimo con 100% di recall, così l'elaborazione a valle lavora a partire dalla ground truth. Nessuno dei due carichi di lavoro si accontenta del compromesso dell'altro, e nessuno dei due ha bisogno del proprio database.
Recupero ibrido per il matching degli annunci, integrato in Milvus
Il matching degli annunci basato sia sulla formulazione esatta che sull'intento di solito significa eseguire un cluster di ricerca per parole chiave insieme a un database vettoriale e cucire insieme i due insiemi di risultati nel codice applicativo. Milvus elimina questa separazione: il recupero lessicale e semantico sono nativi della stessa query.
Per ogni query utente nel sistema di annunci di ricerca basato sull'IA di Cốc Cốc, due percorsi di recupero vengono eseguiti in parallelo:
- Una ricerca semantica ANN sul campo di embedding denso, utilizzando l'indice HNSW.
- Una ricerca full-text su un campo vettoriale sparso che Milvus genera da sé, tramite la sua funzione integrata BM25 — quindi non c'è un secondo indice lessicale che il team debba costruire, eseguire o mantenere sincronizzato.
Milvus fonde quindi i due insiemi di risultati utilizzando WeightedRanker, la sua primitiva di fusione integrata, con pesi controllati da Cốc Cốc. Il team ha optato per 0,6 verso il denso e 0,4 verso lo sparso — inclinandosi leggermente verso la comprensione semantica mantenendo un peso reale sul matching esatto delle parole chiave. Ciò produce un recupero di annunci di qualità superiore: il lato denso cattura l'intento che l'inserzionista non ha mai formulato, e il lato sparso protegge i casi di corrispondenza esatta che contano commercialmente. Quando l'equilibrio deve cambiare, si tratta di un singolo numero regolabile piuttosto che di una riarchitettura.
Portare la ricerca ibrida di Milvus all'interno del budget di latenza
Quando Cốc Cốc ha instradato per la prima volta tutto il traffico di produzione attraverso la ricerca ibrida, con un picco di circa 166 richieste al secondo, la latenza del recupero ibrido ha raggiunto circa 120 ms al P90 — sopra il loro obiettivo.
La risposta del team è stata architettonica piuttosto che un passo indietro sulla qualità. Hanno introdotto una cache TTL a livello applicativo di 24 ore davanti al livello di recupero. Con un tasso di hit della cache di circa 60%, il carico effettivo su Milvus durante il traffico di punta è sceso a circa 67 RPS, e la latenza è tornata entro i requisiti di produzione. Nulla è cambiato nel recupero stesso: Milvus ha continuato a restituire gli stessi risultati ibridi con la stessa qualità, e Cốc Cốc ha semplicemente modificato la quantità di traffico che doveva gestire.
Mantenere la latenza stabile sotto ingestione continua
Le collezioni di Cốc Cốc non sono statiche; insert, upsert, costruzione di indici e compattazione vengono eseguiti su un sistema live. Milvus gestisce queste operazioni come operazioni in background, quindi le collezioni rimangono ricercabili mentre vengono scritte e reindicizzate. Per rendere la latenza non solo disponibile ma prevedibile, il team pianifica quel lavoro in background in una finestra di bassa attività — dalle 2 alle 4 di notte — così manutenzione e traffico utente non competono mai per le stesse risorse.
Risultati e Benefici
- 700 milioni di vettori in produzione, con margine pianificato fino a ~1,5 miliardi. La distribuzione di Cốc Cốc contiene attualmente circa 700 milioni di vettori in più casi d'uso produttivi, e il team ha progettato la propria infrastruttura per scalare agevolmente oltre 1 miliardo — con capacità pianificata per circa 1,5 miliardi — senza dover riprogettare il livello di recupero.
- Latenza di ricerca semantica P90 di 19,8 ms al picco. Per la normale ricerca semantica in condizioni di traffico di picco (34 RPS), Cốc Cốc registra un P50 di 11,1 ms, un P90 di 19,8 ms, un P95 di 26,7 ms e un P99 di 88,3 ms.
- P90 della ricerca ibrida ridotto a 32,1 ms, portando in produzione un aggiornamento della qualità del recupero che era bloccato dalla latenza. In condizioni di traffico di picco (166 RPS, ~67 RPS effettivi con un tasso di cache hit del 60%), Cốc Cốc registra un P50 di 17,1 ms, un P90 di 32,1 ms, un P95 di 41,6 ms e un P99 di 126 ms.
- Recall del 99–100% online, recall del 100% offline. HNSW fornisce ai servizi rivolti agli utenti un recall quasi esaustivo con la latenza più bassa tra gli indici testati, mentre FLAT fornisce alle pipeline offline risultati esatti del vicino più prossimo, quindi gli output batch si basano su ground truth piuttosto che su approssimazioni.
- Il 30% delle richieste di ricerca è ora servito dal recupero semantico basato su Milvus - ampliando la copertura di AI Search (dal 63% al 92%) con risultati migliori rispetto alla sola ricerca per parole chiave.
- La ricerca vettoriale su centinaia di milioni di vettori con un picco di 166 RPS è ora un carico di lavoro su cui il team di Cốc Cốc può sviluppare — una classe di applicazioni, con vincoli rigorosi di bassa latenza e alto throughput, che era fuori portata con il loro stack precedente.
Il vantaggio strategico è che il recupero non è più il vincolo su ciò che Cốc Cốc può rilasciare. Cinque sistemi distinti — ricerca web, pubblicità, suggerimenti, targeting e RAG interno — ora si basano su un'unica base di recupero che il team controlla end-to-end.
I consigli di Cốc Cốc per i team che sviluppano ricerca AI su larga scala
Il team di Cốc Cốc ha percorso l'intera curva, dal proof of concept alla produzione su scala nazionale. I loro consigli per i colleghi che stanno percorrendo lo stesso cammino:
- Inizia in piccolo, ma in produzione. Costruisci un proof of concept su qualche milione di vettori — per esempio, tre mesi di dati — e metti quel servizio su piccola scala davanti al traffico di produzione reale prima di scalare fino a uno o due anni di dati. Monitora continuamente l'utilizzo di CPU e RAM man mano che cresci e dimensiona l'hardware in base a ciò che osservi effettivamente.
- Fai un benchmark dei tipi di indice e delle configurazioni sul tuo carico di lavoro. Non accontentarti della configurazione predefinita. Valuta diversi tipi di indice e diverse configurazioni per ciascun tipo, poi esegui test di carico e misura la latenza P50, P90 e P95. È così che trovi la configurazione adatta al tuo carico di lavoro, e la risposta è raramente la stessa per i percorsi online e offline.
- Dai al database vettoriale un hardware dedicato. Investi in nodi server dedicati per il database vettoriale distribuito, su hardware moderno. Condividere l'infrastruttura con altri servizi crea problemi operativi che peggiorano man mano che cresci; i nodi dedicati forniscono una base più scalabile e manutenibile.
Prossimi passi
La distribuzione Milvus di Cốc Cốc utilizza attualmente la versione 2.5.21, e il prossimo passo del team è passare a una versione più recente per valutare i miglioramenti — in particolare nella latenza di ricerca e nell'efficienza hardware — e provare nuove funzionalità e configurazioni. Oltre all'aggiornamento, il team continua a cercare opportunità per applicare la ricerca vettoriale sia nei prodotti Cốc Cốc esistenti che in quelli futuri.
Inizia con Milvus
Milvus è il database vettoriale open-source più adottato al mondo, progettato appositamente per la ricerca vettoriale su larga scala — con ricerca ibrida nativa, una gamma completa di tipi di indici e un'architettura distribuita che funziona ovunque, da un laptop a un cluster Kubernetes di produzione. Ha superato 45,000 stelle su GitHub e 100 milioni di pull Docker, e supporta più di 10,000 aziende e imprese AI-native in tutto il mondo. L'ultima release, Milvus 3.0, aggiunge un'architettura lake-native che indicizza e recupera i dati direttamente dall'object storage.
Che tu stia costruendo una ricerca AI, un recupero pubblicitario o un sistema RAG, Milvus ti offre la stessa base di recupero che alimenta Cốc Cốc. Inizia su GitHub di Milvus, leggi la documentazione di Milvus, oppure unisciti alla community su Discord.
Zilliz Cloud è un Vector Lakebase completamente gestito, creato dal team dietro Milvus. Totalmente compatibile con l'API di Milvus, offre prestazioni fino a 10× migliori in termini di rapporto prezzo/prestazioni grazie al suo motore di indicizzazione proprietario Cardinal, oltre a sicurezza di livello enterprise, affidabilità, scalabilità e un SLA fino al 99.99%.


