Cốc Cốc Impulsiona a Busca de IA em Escala Nacional do Vietnã com Milvus
700M
Vetores em produção, escalando para 1,5B
19.8 ms
Latência de busca semântica P90 em pico de tráfego
32.1 ms
Latência de busca híbrida P90 no pico de tráfego
99–100%
Recall em produção com HNSW
Respondemos em menos de 20 milissegundos em centenas de milhões de vetores, e todos os produtos de IA que construímos — busca, publicidade, RAG — rodam na mesma implantação Milvus. É isso que nos permite continuar entregando sem adicionar infraestrutura.
Nam Doan Ngoc Giang
Sobre o Cốc Cốc
Cốc Cốc é o principal mecanismo de busca e navegador nacional do Vietnã. Mais de 30 milhões de pessoas o utilizam — aproximadamente um em cada três usuários de internet vietnamitas — realizando mais de 600 milhões de buscas por mês, o que torna o Cốc Cốc o segundo mecanismo de busca e o segundo navegador do país, atrás apenas do Google. Sua vantagem é o que os mecanismos globais acham mais difícil de copiar: o próprio vietnamita, até os modelos de linguagem que a equipe do Cốc Cốc ajustou para ele.
Desde 2023, o Cốc Cốc vem incorporando IA a essa experiência com o AI Chat e o AI Search, e estendendo a mesma inteligência ao Cốc Cốc Ads. Essa mudança alterou o problema subjacente: os resultados agora precisam ser recuperados pelo significado, e não apenas por palavra-chave, entre centenas de milhões de itens, em milissegundos. Milvus é a camada semântica que o Cốc Cốc escolheu para isso — hoje contendo 700 milhões de vetores em cinco de seus sistemas de produção.
O Desafio
Levar a recuperação semântica a um mecanismo de busca e a uma plataforma de anúncios de escala nacional significou resolver três problemas ao mesmo tempo.
- A busca por palavras-chave não consegue responder às consultas que os usuários realmente digitam. Novas consultas e tendências surgem todos os dias — um celular lançado esta manhã, um evento de notícias de uma hora atrás, uma frase em vietnamita que nenhuma página da web usa. A busca por palavras-chave apenas corresponde às palavras exatas do usuário, então, para esses casos, ela retorna pouco valor.
- Bibliotecas de vetores não conseguem conter centenas de milhões de vetores. FAISS e USearch funcionaram bem nos projetos de menor escala do Cốc Cốc, mas eles fornecem um índice, não um sistema — nada que distribua centenas de milhões de vetores entre máquinas, mantenha-os consultáveis enquanto novos dados são gravados e funcione de forma confiável em produção. O que quer que os substituísse também precisava rodar nos próprios servidores do Cốc Cốc, para que os dados de busca e publicidade permanecessem em sua infraestrutura.
- A correspondência de anúncios exige dois caminhos de recuperação, mas o orçamento de latência suporta apenas um. Os anunciantes que fazem lances pelas palavras exatas de um comprador precisam ser correspondidos, mas um comprador que descreve a mesma coisa de forma diferente ainda deve vê-los. Executar ambos e fundi-los em uma única lista classificada — na carga de trabalho vetorial de maior volume do Cốc Cốc, dentro de um orçamento compartilhado de carregamento de página — é onde a coisa fica difícil.
Por que Milvus
O Cốc Cốc validou o Milvus com uma prova de conceito em aproximadamente 30 milhões de embeddings de consulta antes de se comprometer. Os resultados superaram as expectativas da equipe, e o Milvus tem sido seu banco de dados vetorial desde então. Cinco fatores o mantiveram no lugar à medida que a carga de trabalho crescia.
- Baixa latência que se manteve à medida que o conjunto de dados crescia. Este foi o critério principal. O Milvus entregou busca vetorial consistentemente rápida enquanto o corpus da Cốc Cốc escalava de 30 milhões de vetores no prova de conceito para 700 milhões em produção, e continuou se mantendo quando a equipe expandiu para busca híbrida na plataforma de anúncios — um padrão de consulta mais pesado em maior volume.
- Auto-hospedado, para que dados e infraestrutura permaneçam com a Cốc Cốc. O Milvus é open source e roda no ambiente da própria Cốc Cốc. Os dados do usuário nunca saem da infraestrutura deles, e a equipe controla a topologia de implantação, a configuração do índice, a alocação de recursos e o momento dos upgrades.
- Busca híbrida nativa, em vez de um segundo sistema para operar. O Milvus gera vetores esparsos com uma função BM25 integrada e os combina com resultados ANN densos dentro de uma única consulta. O mecanismo de anúncios da Cốc Cốc obtém recuperação lexical e semântica de um único banco de dados, com uma única superfície operacional — em vez de executar um cluster separado de busca por palavras-chave e combinar dois conjuntos de resultados no código da aplicação.
- Um kit completo de índices, para que cada carga de trabalho obtenha a compensação certa. As cargas de trabalho da Cốc Cốc não querem a mesma coisa. A busca online quer a menor latência com alta revocação; pipelines offline em lote querem resultados exatos e não se importam com o tempo que levam. O Milvus suporta HNSW, a família IVF, FLAT e muitos outros na mesma implantação, então a equipe escolheu por carga de trabalho em vez de comprometer entre todas.
- Simples de implantar, operar e aprender. O Milvus foi fácil de subir, gerenciar e escalar em produção, o que manteve a sobrecarga operacional baixa para a equipe de engenharia. A arquitetura modular do Milvus Distributed, com painéis de dashboard detalhados para cada componente, significa que a equipe pode ver exatamente qual parte do sistema está sob pressão e dimensionar o hardware para o gargalo real. E a documentação era abrangente e fácil de seguir, o que acelerou a implementação inicial e simplificou a integração com os sistemas existentes da Cốc Cốc.
A Solução
O Milvus fica no topo dos pipelines da Cốc Cốc: é a etapa de recuperação, antes da filtragem e do re-ranking. A relevância da busca web principal da Cốc Cốc segue uma arquitetura de recuperar e reordenar, com o Milvus cuidando da recuperação de primeiro estágio e modelos a jusante refinando os resultados.
Cinco sistemas de produção rodam nessa única implantação do Milvus — cada um com sua própria coleção, sua própria definição do que um vetor significa e sua própria configuração de índice, mas sem infraestrutura separada:
- Relevância da busca web principal — recuperação semântica que traz resultados relevantes para consultas não vistas e de cauda longa.
- Busca e Anúncios de Compras com IA — recuperação semântica e híbrida que corresponde a intenção do usuário a anúncios relevantes.
- Sugestões de busca relacionada — similaridade vetorial que traz consultas de acompanhamento contextualmente relevantes.
- Segmentação por similaridade (lookalike) — histórico de navegação incorporado como vetores, usado para encontrar usuários com interesses semelhantes para publicidade display.
- Um chatbot RAG interno — o Milvus como camada de recuperação que fundamenta respostas do LLM nos próprios documentos da Cốc Cốc.
O que um vetor representa depende do sistema: uma página web, uma consulta de busca, um anúncio, um perfil de usuário ou um trecho de texto. A maioria dos embeddings vem de modelos bi-encoder que a equipe ajustou a partir do PhoBERT, otimizados para compreensão do vietnamita — a experiência de domínio que torna os resultados da Cốc Cốc vietnamitas, e não meramente traduzidos.
Para atender aos requisitos de latência e memória em produção, a Cốc Cốc aplica otimização de modelos para reduzir seus embeddings de produção para 128 dimensões, mantendo a qualidade da recuperação. Vetores mais estreitos significam menos memória por vetor e cálculo de distância mais rápido, o que ajuda a manter a memória por nó gerenciável nessa escala. Isso deu à equipe um vetor compacto e de alta qualidade para construir. A próxima pergunta era qual índice construir sobre ele.
O Milvus suporta vários tipos de índice, com um índice diferente para cada carga de trabalho
As cargas de trabalho da Cốc Cốc puxam em direções opostas. A busca voltada para o usuário quer a menor latência possível com alto recall; pipelines de lote offline querem resultados exatos e não se importam com quanto tempo levam. O Milvus suporta HNSW, a família IVF, FLAT e outros na mesma implantação — então, em vez de escolher um índice e conviver com ele em todos os lugares, a equipe pôde comparar as opções com seus próprios dados e então executar diferentes índices lado a lado.
Para serviços online, eles compararam os candidatos em recall, tamanho do índice e desempenho:
- IVF-SQ8 — uma pequena pegada de memória, mas menor recall e maior latência.
- IVF-PQ — uma pegada ainda menor que a do IVF-SQ8, com recall novamente menor.
- HNSW — o melhor recall, com 99%–100%, e a menor latência, a um custo de memória maior.
Como a latência é a restrição determinante para serviços voltados ao usuário e a memória não é atualmente o fator limitante em sua implantação, eles escolheram HNSW e aceitaram o trade-off de memória. Para cargas de trabalho de lote offline — pipelines diários de inferência e processamento de dados — eles usam o índice FLAT em vez disso, alcançando busca exata do vizinho mais próximo com 100% de recall, para que o processamento downstream trabalhe a partir do ground truth. Nenhuma das cargas de trabalho aceita o compromisso da outra, e nenhuma precisa de seu próprio banco de dados.
Recuperação híbrida para correspondência de anúncios, integrada ao Milvus
Corresponder anúncios tanto pela redação exata quanto pela intenção geralmente significa executar um cluster de busca por palavras-chave ao lado de um banco de dados vetorial e unir os dois conjuntos de resultados no código da aplicação. O Milvus elimina essa divisão: a recuperação lexical e semântica são nativas da mesma consulta.
Para cada consulta de usuário no sistema de Publicidade em Busca com IA da Cốc Cốc, dois caminhos de recuperação são executados em paralelo:
- Uma busca semântica ANN sobre o campo de embeddings densos, usando o índice HNSW.
- Uma busca de texto completo sobre um campo de vetores esparsos que o próprio Milvus gera, por meio de sua função BM25 embutida — portanto, não há um segundo índice lexical para a equipe construir, operar ou manter sincronizado.
O Milvus então funde os dois conjuntos de resultados usando WeightedRanker, sua primitiva de fusão embutida, com pesos controlados pela Cốc Cốc. A equipe definiu 0,6 para o denso e 0,4 para o esparso — inclinando-se levemente para a compreensão semântica enquanto mantém peso real na correspondência exata de palavras-chave. Isso produz recuperação de anúncios de maior qualidade: o lado denso captura a intenção que o anunciante nunca expressou, e o lado esparso protege os casos de correspondência exata que importam comercialmente. Quando o equilíbrio precisa mudar, é um único número ajustável, em vez de uma re-arquitetura.
Trazendo a busca híbrida do Milvus para dentro do orçamento de latência
Quando a Cốc Cốc roteou pela primeira vez todo o tráfego de produção pela busca híbrida, no pico de aproximadamente 166 requisições por segundo, a latência da recuperação híbrida atingiu cerca de 120 ms no P90 — acima da meta.
A resposta da equipe foi arquitetural, e não um recuo na qualidade. Eles introduziram um cache TTL de 24 horas no nível da aplicação à frente da camada de recuperação. Com uma taxa de acerto de cache de aproximadamente 60%, a carga efetiva no Milvus durante o tráfego de pico caiu para cerca de 67 RPS, e a latência voltou a ficar dentro dos requisitos de produção. Nada mudou na recuperação em si: o Milvus continuou retornando os mesmos resultados híbridos com a mesma qualidade, e a Cốc Cốc simplesmente mudou a quantidade de tráfego que precisava lidar.
Mantendo a latência estável sob ingestão contínua
As coleções da Cốc Cốc não são estáticas; inserções, upserts, construção de índices e compactação são executados em um sistema ativo. O Milvus lida com essas operações em segundo plano, então as coleções permanecem pesquisáveis enquanto estão sendo gravadas e reindexadas. Para tornar a latência não apenas disponível, mas previsível, a equipe agenda esse trabalho em segundo plano para uma janela fora do pico — das 2 às 4 da manhã — para que a manutenção e o tráfego de usuários nunca disputem os mesmos recursos.
Resultados e Benefícios
- 700 milhões de vetores em produção, com margem planejada para ~1,5 bilhão. A implantação da Cốc Cốc atualmente contém cerca de 700 milhões de vetores em vários casos de uso de produção, e a equipe projetou sua infraestrutura para escalar confortavelmente além de 1 bilhão — com capacidade planejada para aproximadamente 1,5 bilhão — sem reestruturar a camada de recuperação.
- Latência de busca semântica P90 de 19,8 ms no pico. Para busca semântica normal no pico de tráfego (34 RPS), a Cốc Cốc mantém P50 de 11,1 ms, P90 de 19,8 ms, P95 de 26,7 ms e P99 de 88,3 ms.
- Busca híbrida com P90 reduzido para 32,1 ms, trazendo para produção uma melhoria na qualidade de recuperação que estava bloqueada por latência. No pico de tráfego (166 RPS, ~67 RPS efetivos com taxa de acerto de cache de 60%), a Cốc Cốc mantém P50 de 17,1 ms, P90 de 32,1 ms, P95 de 41,6 ms e P99 de 126 ms.
- 99–100% de recall online, 100% de recall offline. O HNSW fornece serviços voltados ao usuário com recall quase exaustivo na menor latência entre os índices testados, enquanto o FLAT fornece pipelines offline com resultados exatos de vizinhos mais próximos, para que as saídas em lote sejam construídas com base na verdade absoluta, e não em aproximações.
- 30% das solicitações de busca agora são atendidas pela recuperação semântica baseada no Milvus - ampliando a cobertura da AI Search (de 63% para 92%) com resultados melhores do que apenas a busca por palavras-chave.
- Busca vetorial sobre centenas de milhões de vetores com pico de 166 RPS agora é uma carga de trabalho sobre a qual a equipe da Cốc Cốc pode desenvolver — uma classe de aplicação, sob restrições estritas de baixa latência e alta vazão, que estava fora do alcance em sua pilha anterior.
O retorno estratégico é que a recuperação não é mais a restrição sobre o que a Cốc Cốc pode oferecer. Cinco sistemas distintos — busca na web, anúncios, sugestões, segmentação e RAG interno — agora operam sobre uma base de recuperação única que a equipe controla de ponta a ponta.
Conselhos da Cốc Cốc para equipes que constroem busca com IA em grande escala
A equipe da Cốc Cốc percorreu toda a curva, do conceito à produção em escala nacional. Seus conselhos para colegas que seguem o mesmo caminho:
- Comece pequeno, mas comece em produção. Construa uma prova de conceito com alguns milhões de vetores — digamos, três meses de dados — e coloque esse serviço em pequena escala diante do tráfego real de produção antes de escalar para um ou dois anos de dados. Monitore continuamente a utilização de CPU e RAM conforme você cresce e dimensione o hardware com base no que você realmente observa.
- Avalie tipos de índice e configurações contra sua própria carga de trabalho. Não use o padrão. Avalie diferentes tipos de índice e diferentes configurações dentro de cada tipo; em seguida, execute testes de carga e meça a latência P50, P90 e P95. É assim que você encontra a configuração que se ajusta à sua carga de trabalho, e a resposta raramente é a mesma para os caminhos online e offline.
- Dê ao banco de dados vetorial seu próprio hardware. Invista em nós de servidor dedicados para o banco de dados vetorial distribuído, em hardware moderno. Compartilhar infraestrutura com outros serviços cria problemas operacionais que pioram conforme você cresce; nós dedicados fornecem uma base mais escalável e de fácil manutenção.
O que vem a seguir
A implantação do Milvus da Cốc Cốc atualmente executa a versão 2.5.21, e o próximo passo da equipe é migrar para uma versão mais recente para avaliar as melhorias — especialmente em latência de busca e eficiência de hardware — e experimentar novos recursos e configurações. Além da atualização, a equipe continua procurando oportunidades para aplicar a busca vetorial em produtos existentes e futuros da Cốc Cốc.
Comece com o Milvus
Milvus é o banco de dados vetorial de código aberto mais amplamente adotado do mundo, construído especificamente para busca vetorial em escala massiva — com busca híbrida nativa, uma gama completa de tipos de índice e uma arquitetura distribuída que roda em qualquer lugar, de um laptop a um cluster Kubernetes de produção. Ele ultrapassou 45.000 estrelas no GitHub e 100 milhões de pulls no Docker, e atende mais de 10.000 empresas e companhias nativas de IA em todo o mundo. O lançamento mais recente, Milvus 3.0, adiciona uma arquitetura nativa de lake que indexa e recupera dados diretamente do armazenamento de objetos.
Esteja você construindo busca de IA, recuperação de anúncios ou RAG, o Milvus oferece a mesma base de recuperação que alimenta o Cốc Cốc. Comece no GitHub do Milvus, leia a documentação do Milvus ou junte-se à comunidade no Discord.
O Zilliz Cloud é um Vector Lakebase totalmente gerenciado, construído pela equipe por trás do Milvus. Totalmente compatível com a API do Milvus, ele oferece até 10× melhor custo-benefício com seu motor proprietário de indexação Cardinal, além de segurança, confiabilidade e escalabilidade de nível empresarial, com um SLA de até 99,99%.


