Cốc Cốc propulse la recherche IA à l'échelle nationale du Vietnam avec Milvus
700M
Vecteurs en production, mise à l'échelle vers 1.5B
19.8 ms
Latence de recherche sémantique P90 en période de trafic maximal
32.1 ms
Latence P90 de la recherche hybride en période de trafic maximal
99–100%
Rappel en production avec HNSW
Nous répondons en moins de 20 millisecondes sur des centaines de millions de vecteurs, et chaque produit d'IA que nous avons construit — recherche, publicité, RAG — fonctionne sur le même déploiement Milvus. C'est ce qui nous permet de continuer à livrer sans ajouter d'infrastructure.
Nam Doan Ngoc Giang
À propos de Cốc Cốc
Cốc Cốc est le moteur de recherche et navigateur local leader au Vietnam. Plus de 30 millions de personnes l'utilisent — environ un internaute vietnamien sur trois — avec plus de 600 millions de recherches par mois, ce qui fait de Cốc Cốc le deuxième moteur de recherche et le deuxième navigateur du pays, derrière Google uniquement. Son avantage est ce que les moteurs mondiaux trouvent le plus difficile à copier : la langue vietnamienne elle-même, jusqu'aux modèles linguistiques que l'équipe de Cốc Cốc a affinés pour elle.
Depuis 2023, Cốc Cốc intègre l'IA dans cette expérience avec AI Chat et AI Search, et étend la même intelligence à Cốc Cốc Ads. Ce changement a modifié le problème sous-jacent : les résultats doivent désormais être récupérés par le sens plutôt que par le simple mot-clé, à travers des centaines de millions d'éléments, en quelques millisecondes. Milvus est la couche sémantique que Cốc Cốc a choisie pour y parvenir — elle détient aujourd'hui 700 millions de vecteurs dans cinq de leurs systèmes de production.
Le défi
Apporter la recherche sémantique à un moteur de recherche et une plateforme publicitaire à l'échelle nationale impliquait de résoudre trois problèmes à la fois.
La recherche par mots-clés ne peut pas répondre aux requêtes que les utilisateurs saisissent réellement. De nouvelles requêtes et tendances apparaissent chaque jour — un téléphone lancé ce matin, un événement d'actualité d'il y a une heure, une formulation vietnamienne qu'aucune page web n'utilise. La recherche par mots-clés ne correspond qu'aux mots exacts de l'utilisateur, elle renvoie donc peu de valeur pour ces cas.
Les bibliothèques vectorielles ne peuvent pas contenir des centaines de millions de vecteurs. FAISS et USearch ont bien fonctionné sur les projets à plus petite échelle de Cốc Cốc, mais ils fournissent un index, pas un système — rien qui répartisse des centaines de millions de vecteurs sur des machines, les maintienne interrogeables pendant l'écriture de nouvelles données, et fonctionne de manière fiable en production. Ce qui les remplaçait devait également fonctionner sur les serveurs de Cốc Cốc, afin que les données de recherche et de publicité restent dans leur infrastructure.
L'appariement publicitaire nécessite deux chemins de récupération, mais le budget de latence n'en supporte qu'un. Les annonceurs qui enchérissent sur les mots exacts d'un acheteur doivent être mis en correspondance, mais un acheteur décrivant la même chose différemment devrait quand même les voir. Exécuter les deux et les fusionner en une seule liste classée — avec la charge de travail vectorielle la plus élevée de Cốc Cốc, dans un budget de chargement de page partagé — c'est là que cela devient difficile.
Pourquoi Milvus
Cốc Cốc a validé Milvus avec une preuve de concept sur environ 30 millions d'embeddings de requêtes avant de s'engager. Les résultats ont dépassé les attentes de l'équipe, et Milvus est depuis leur base de données vectorielles. Cinq éléments l'ont maintenu en place à mesure que la charge de travail augmentait.
- Faible latence qui s'est maintenue à mesure que le jeu de données grandissait. C'était le critère principal. Milvus a fourni une recherche vectorielle constamment rapide alors que le corpus de Cốc Cốc passait de 30 millions de vecteurs pour la preuve de concept à 700 millions en production, et cela s'est maintenu lorsque l'équipe s'est étendue à la recherche hybride pour la plateforme publicitaire — un schéma de requêtes plus lourd à un volume plus élevé.
- Auto-hébergé, pour que les données et l'infrastructure restent chez Cốc Cốc. Milvus est open source et fonctionne dans l'environnement propre de Cốc Cốc. Les données utilisateur ne quittent jamais leur infrastructure, et l'équipe contrôle elle-même la topologie de déploiement, la configuration des index, l'allocation des ressources et le calendrier des mises à niveau.
- Recherche hybride native, plutôt qu'un second système à faire fonctionner. Milvus génère des vecteurs creux avec une fonction BM25 intégrée et les combine avec les résultats ANN denses dans une seule requête. Le moteur publicitaire de Cốc Cốc obtient la récupération lexicale et sémantique à partir d'une seule base de données, avec une seule surface opérationnelle — au lieu d'exécuter un cluster de recherche par mots-clés séparé et d'assembler deux ensembles de résultats dans le code applicatif.
- Une boîte à outils d'index complète, afin que chaque charge de travail obtienne le bon compromis. Les charges de travail de Cốc Cốc ne veulent pas la même chose. La recherche en ligne veut la latence la plus faible avec un rappel élevé ; les pipelines batch hors ligne veulent des résultats exacts sans se soucier du temps d'exécution. Milvus prend en charge HNSW, la famille IVF, FLAT, et bien d'autres sur le même déploiement, alors l'équipe a choisi par charge de travail plutôt que de faire des compromis pour toutes.
- Simple à déployer, à exploiter et à apprendre. Milvus était facile à mettre en place, à gérer et à faire évoluer en production, ce qui a maintenu des frais opérationnels faibles pour l'équipe d'ingénieurs. L'architecture modulaire de Milvus Distributed, avec des tableaux de bord détaillés pour chaque composant, permet à l'équipe de voir exactement quelle partie du système est sous pression et de dimensionner le matériel en fonction du vrai goulot d'étranglement. Et la documentation était complète et facile à suivre, ce qui a accéléré l'implémentation initiale et simplifié l'intégration avec les systèmes existants de Cốc Cốc.
La solution
Milvus se situe tout en haut des pipelines de Cốc Cốc : c'est l'étape de récupération, avant le filtrage et le re-ranking. La pertinence de la recherche web principale de Cốc Cốc suit une architecture de récupération puis re-ranking, avec Milvus qui gère le rappel de première étape et les modèles en aval qui affinent les résultats.
Cinq systèmes de production fonctionnent sur ce même déploiement Milvus — chacun avec sa propre collection, sa propre définition de ce qu'un vecteur signifie, et sa propre configuration d'index, mais sans infrastructure séparée :
- Pertinence de la recherche web principale — récupération sémantique qui fait remonter des résultats pertinents pour les requêtes inédites et à longue traîne.
- Search & Shopping Ads propulsés par l'IA — récupération sémantique et hybride qui fait correspondre l'intention de l'utilisateur à des publicités pertinentes.
- Suggestions de recherche associées — similarité vectorielle faisant remonter des requêtes de suivi contextuellement pertinentes.
- Ciblage par similarité (lookalike) — historique de navigation transformé en vecteurs, utilisé pour trouver des utilisateurs ayant des intérêts similaires pour la publicité display.
- Un chatbot RAG interne — Milvus comme couche de récupération ancrant les réponses du LLM dans les propres documents de Cốc Cốc.
Ce qu'un vecteur représente dépend du système : une page web, une requête de recherche, une publicité, un profil utilisateur ou un passage de texte. La plupart des embeddings proviennent de modèles bi-encodeurs que l'équipe a affinés à partir de PhoBERT, optimisés pour la compréhension de la langue vietnamienne — l'expertise métier qui rend les résultats de Cốc Cốc vietnamiens plutôt que simplement traduits.
Pour répondre aux exigences de latence et de mémoire en production, Cốc Cốc applique une optimisation de modèle pour réduire ses embeddings de production à 128 dimensions, tout en maintenant la qualité de récupération. Des vecteurs plus étroits signifient moins de mémoire par vecteur et un calcul de distance plus rapide, ce qui aide à garder une mémoire par nœud gérable à cette échelle. Cela a donné à l'équipe un vecteur compact et de haute qualité sur lequel s'appuyer. La question suivante était de savoir quel index construire dessus.
Milvus prend en charge plusieurs types d'index avec un index différent pour chaque charge de travail
Les charges de travail de Cốc Cốc tirent dans des directions opposées. La recherche orientée utilisateur veut la latence la plus faible possible avec un rappel élevé ; les pipelines batch hors ligne veulent des résultats exacts et ne se soucient pas du temps que cela prend. Milvus prend en charge HNSW, la famille IVF, FLAT, et plus encore sur le même déploiement — ainsi, au lieu de choisir un index et de s'en contenter partout, l'équipe a pu comparer les options sur ses propres données puis exécuter différents index côte à côte.
- IVF-SQ8 — une empreinte mémoire réduite, mais un rappel plus faible et une latence plus élevée.
- IVF-PQ — une empreinte encore plus réduite que IVF-SQ8, avec un rappel encore plus faible.
- HNSW — le meilleur rappel, à 99%–100%, et la latence la plus faible, au prix d'une empreinte mémoire plus élevée.
Parce que la latence est la contrainte déterminante pour les services orientés utilisateur et que la mémoire n'est actuellement pas le facteur limitant de leur déploiement, ils ont choisi HNSW et accepté le compromis mémoire. Pour les charges de travail batch hors ligne — pipelines d'inférence quotidienne et de traitement de données — ils utilisent plutôt l'index FLAT, obtenant une recherche exacte du plus proche voisin avec 100% de rappel, afin que le traitement en aval travaille à partir de la vérité terrain. Aucune des deux charges de travail ne se contente du compromis de l'autre, et aucune n'a besoin de sa propre base de données.
Récupération hybride pour l'appariement d'annonces, intégrée à Milvus
L'appariement des annonces à la fois sur le libellé exact et l'intention implique généralement d'exécuter un cluster de recherche par mots-clés parallèlement à une base de données vectorielle et de réunir les deux ensembles de résultats dans le code applicatif. Milvus élimine cette séparation : la récupération lexicale et sémantique est native dans la même requête.
Pour chaque requête utilisateur dans le système de publicité par recherche propulsé par l'IA de Cốc Cốc, deux chemins de récupération s'exécutent en parallèle :
- Une recherche sémantique ANN sur le champ d'embedding dense, utilisant l'index HNSW.
- Une recherche en texte intégral sur un champ de vecteur sparse que Milvus génère lui-même, grâce à sa fonction intégrée BM25 — il n'y a donc pas de deuxième index lexical à construire, à exécuter ou à maintenir en synchronisation pour l'équipe.
Milvus fusionne ensuite les deux ensembles de résultats à l'aide de WeightedRanker, sa primitive de fusion intégrée, avec des poids contrôlés par Cốc Cốc. L'équipe a opté pour 0,6 vers le dense et 0,4 vers le sparse — s'appuyant légèrement sur la compréhension sémantique tout en conservant un poids réel sur la correspondance exacte des mots-clés. Cela produit une récupération d'annonces de meilleure qualité : le côté dense capte l'intention que l'annonceur n'a jamais formulée, et le côté sparse protège les cas de correspondance exacte qui comptent commercialement. Lorsque l'équilibre doit changer, c'est un seul paramètre ajustable plutôt qu'une réarchitecture.
Ramener la recherche hybride Milvus dans le budget de latence
Lorsque Cốc Cốc a d'abord acheminé tout le trafic de production via la recherche hybride, à un pic d'environ 166 requêtes par seconde, la latence de récupération hybride a atteint environ 120 ms au P90 — au-dessus de leur objectif.
La réponse de l'équipe était architecturale plutôt qu'un recul sur la qualité. Ils ont introduit un cache TTL de 24 heures au niveau applicatif devant la couche de récupération. Avec un taux de succès de cache d'environ 60%, la charge effective sur Milvus pendant le trafic de pointe est tombée à environ 67 RPS, et la latence est revenue dans les limites des exigences de production. Rien dans la récupération elle-même n'a changé : Milvus a continué à renvoyer les mêmes résultats hybrides avec la même qualité, et Cốc Cốc a simplement modifié le volume de trafic qu'il devait gérer.
Maintenir la latence stable sous ingestion continue
Les collections de Cốc Cốc ne sont pas statiques ; les insertions, les upserts, la construction d'index et la compaction s'exécutent tous sur un système en direct. Milvus gère ces opérations en arrière-plan, de sorte que les collections restent interrogeables pendant qu'elles sont écrites et réindexées. Pour rendre la latence non seulement disponible mais prévisible, l'équipe planifie ce travail en arrière-plan dans une fenêtre creuse — de 2 à 4 heures du matin — afin que la maintenance et le trafic utilisateur ne se disputent jamais les mêmes ressources.
Résultats et bénéfices
- 700 millions de vecteurs en production, avec une marge prévue jusqu'à ~1,5 milliard. Le déploiement de Cốc Cốc contient actuellement environ 700 millions de vecteurs dans plusieurs cas d'utilisation en production, et l'équipe a conçu son infrastructure pour évoluer confortablement au-delà d'un milliard — avec une capacité prévue d'environ 1,5 milliard — sans repenser l'architecture de la couche de récupération.
- Latence P90 de la recherche sémantique de 19,8 ms en période de pointe. Pour la recherche sémantique normale au trafic maximal (34 RPS), Cốc Cốc maintient un P50 de 11,1 ms, un P90 de 19,8 ms, un P95 de 26,7 ms et un P99 de 88,3 ms.
- P90 de la recherche hybride réduit à 32,1 ms, apportant en production une amélioration de la qualité de récupération bloquée par la latence. Au trafic maximal (166 RPS, ~67 RPS effectifs avec un taux de succès de cache de 60 %), Cốc Cốc maintient un P50 de 17,1 ms, un P90 de 32,1 ms, un P95 de 41,6 ms et un P99 de 126 ms.
- 99–100 % de rappel en ligne, 100 % de rappel hors ligne. HNSW offre aux services destinés aux utilisateurs un rappel quasi exhaustif avec la latence la plus faible parmi les index testés, tandis que FLAT fournit aux pipelines hors ligne des résultats exacts de plus proches voisins, de sorte que les sorties par lots s'appuient sur la vérité terrain plutôt que sur des approximations.
- 30 % des requêtes de recherche sont désormais servies par la récupération sémantique propulsée par Milvus - élargissant la couverture de la recherche IA (passant de 63 % à 92 %) avec de meilleurs résultats que la recherche par mots-clés seule.
- La recherche vectorielle sur des centaines de millions de vecteurs avec un pic de 166 RPS est désormais une charge de travail sur laquelle l'équipe de Cốc Cốc peut développer — une classe d'applications, sous des contraintes strictes de faible latence et de haut débit, qui était hors de portée sur leur pile précédente.
Le bénéfice stratégique est que la récupération n'est plus la contrainte sur ce que Cốc Cốc peut livrer. Cinq systèmes distincts — recherche web, publicité, suggestions, ciblage et RAG interne — fonctionnent désormais sur une base de récupération unique que l'équipe contrôle de bout en bout.
Les conseils de Cốc Cốc aux équipes qui construisent une recherche IA à grande échelle
L'équipe de Cốc Cốc a parcouru toute la courbe, de la preuve de concept à la production à l'échelle nationale. Leurs conseils pour leurs pairs qui suivent le même chemin :
- Commencez petit, mais commencez en production. Construisez une preuve de concept sur quelques millions de vecteurs — disons, trois mois de données — et placez ce service à petite échelle devant un trafic de production réel avant de passer à l'échelle avec un ou deux ans de données. Surveillez en continu l'utilisation du CPU et de la RAM pendant que vous grandissez, et dimensionnez le matériel en fonction de ce que vous observez réellement.
- Évaluez les types d'index et les configurations par rapport à votre propre charge de travail. Ne vous contentez pas de la configuration par défaut. Testez différents types d'index et différentes configurations au sein de chaque type, puis exécutez des tests de charge et mesurez les latences P50, P90 et P95. C'est ainsi que vous trouverez la configuration qui correspond à votre charge de travail, et la réponse est rarement la même pour les chemins en ligne et hors ligne.
- Donnez à la base de données vectorielle son propre matériel. Investissez dans des nœuds de serveur dédiés pour la base de données vectorielle distribuée, sur du matériel moderne. Le partage de l'infrastructure avec d'autres services crée des problèmes opérationnels qui s'aggravent à mesure que vous grandissez ; des nœuds dédiés fournissent une base plus évolutive et plus maintenable.
La suite
Le déploiement Milvus de Cốc Cốc fonctionne actuellement avec la version 2.5.21, et la prochaine étape de l'équipe est de passer à une version plus récente pour évaluer les améliorations — notamment en matière de latence de recherche et d'efficacité matérielle — et pour essayer de nouvelles fonctionnalités et configurations. Au-delà de la mise à niveau, l'équipe continue de chercher des opportunités pour appliquer la recherche vectorielle aux produits existants et à venir de Cốc Cốc.
Commencez avec Milvus
Milvus est la base de données vectorielle open-source la plus adoptée au monde, conçue spécifiquement pour la recherche vectorielle à grande échelle — avec une recherche hybride native, une gamme complète de types d'index, et une architecture distribuée qui fonctionne partout, d'un ordinateur portable à un cluster Kubernetes en production. Elle a dépassé 45 000 étoiles GitHub et 100 millions de téléchargements Docker, et prend en charge plus de 10 000 entreprises et sociétés natives de l'IA dans le monde. La dernière version, Milvus 3.0, ajoute une architecture lake-native qui indexe et récupère les données directement depuis le stockage d'objets.
Que vous construisiez une recherche IA, une récupération publicitaire ou un RAG, Milvus vous offre le même socle de récupération qui alimente Cốc Cốc. Commencez sur Milvus GitHub, lisez les Milvus docs, ou rejoignez la communauté sur Discord.
Zilliz Cloud est une Vector Lakebase entièrement gérée, construite par l'équipe de Milvus. Entièrement compatible avec l'API Milvus, elle offre un rapport prix/performance jusqu'à 10× meilleur grâce à son moteur d'indexation propriétaire Cardinal, ainsi qu'une sécurité, une fiabilité, une évolutivité de niveau entreprise et un SLA allant jusqu'à 99,99 %.
- À propos de Cốc Cốc
- Le défi
- Pourquoi Milvus
- La solution
- Résultats et bénéfices
- Les conseils de Cốc Cốc aux équipes qui construisent une recherche IA à grande échelle
- La suite
- Commencez avec Milvus
Contenu
Cas d'usage
Secteur d'activité
Services Internet


