Cốc Cốc、Milvusを活用してベトナムの国家規模AI検索を強化
700M
本番環境におけるベクトル、15億へ向けたスケーリング
19.8 ms
P90 セマンティック検索レイテンシ(ピークトラフィック時)
32.1 ms
ピークトラフィック時におけるP90ハイブリッド検索レイテンシー
99–100%
本番環境でのHNSWのリコール
私たちは数億件のベクトルに対して20ミリ秒未満で応答します。そして、私たちが構築したすべてのAIプロダクト — 検索、広告、RAG — は、同じMilvusデプロイメント上で動作します。それが、インフラを追加することなくリリースし続けることを可能にしているのです。
Nam Doan Ngoc Giang
Cốc Cốcについて
Cốc Cốc は、ベトナムを代表する国産検索エンジン兼ブラウザです。3,000万人以上が利用しており、これはベトナムのインターネットユーザーの約3人に1人に相当します。毎月6億回以上の検索が実行され、Cốc Cốc は国内でGoogleに次ぐ第2位の検索エンジン、かつ第2位のブラウザとなっています。その強みは、世界の検索エンジンが最も模倣しにくいもの、すなわちベトナム語そのものにあり、Cốc Cốc の自社チームが微調整した言語モデルにまで及んでいます。
2023年以降、Cốc Cốc は AI Chat と AI Search を通じてAIをその体験に組み込み、同じインテリジェンスを Cốc Cốc Ads にも拡張しています。この変化により、根本的な課題が変わりました。結果は単なるキーワードではなく意味によって、数億件のアイテムの中からミリ秒単位で取得される必要があるのです。Milvus は、Cốc Cốc がそれを実現するために選んだセマンティックレイヤーであり、現在は5つの本番システムにわたって7億のベクトルを保持しています。
課題
国規模の検索エンジンと広告プラットフォームにセマンティック検索を導入するには、3つの問題を同時に解決する必要がありました。
- キーワード検索では、ユーザーが実際に入力するクエリに答えられません。 新しいクエリやトレンドは毎日現れます。今朝発売された携帯電話、1時間前のニュース、どのWebページにも使われていないベトナム語の言い回しなどです。キーワード検索はユーザーの実際の語句にのみ一致するため、これらに対してはほとんど価値のある結果を返せません。
- ベクトルライブラリでは、数億ものベクトルを保持できません。 FAISS と USearch は Cốc Cốc の小規模プロジェクトではうまく機能しましたが、それらが提供するのはインデックスであってシステムではありません。数億のベクトルを複数のマシンに分散し、新しいデータが書き込まれている間も検索可能に保ち、本番環境で確実に稼働させるような仕組みはありません。後継となるものも、Cốc Cốc の自社サーバー上で動作する必要があり、検索データと広告データを自社のインフラ内に留めることが求められました。
- 広告マッチングには2つの検索経路が必要ですが、レイテンシ予算は1つしか許容しません。 買い物客の正確な語句に入札する広告主はマッチングされる必要がありますが、同じものを別の言い方で表現した買い物客にもその広告が表示されるべきです。この両方を実行し、単一のランキングリストに融合すること、しかも Cốc Cốc で最もボリュームの大きいベクトルワークロードにおいて、ページロード予算を共有しながら行うこと、ここが難所です。
Milvusを選んだ理由
Cốc Cốc は、コミットする前に約3,000万のクエリ埋め込みを用いた概念実証で Milvus を検証しました。その結果はチームの期待を上回り、それ以来 Milvus は彼らのベクターデータベースとなっています。ワークロードが増大しても Milvus が選ばれ続けた理由は、5つの点にあります。
- データセットが成長しても維持された低レイテンシー。 これが最優先の基準でした。Milvusは、Cốc Cốcのコーパスが概念実証の3000万ベクトルから本番環境の7億ベクトルに拡大するにつれて、一貫して高速なベクトル検索を提供し続け、チームが広告プラットフォーム向けにハイブリッド検索へと拡張した際にも、その性能を維持しました。これは、より高負荷で高頻度のクエリパターンです。
- セルフホスト型なので、データとインフラはCốc Cốcの管理下に留まります。 Milvusはオープンソースであり、Cốc Cốcの自社環境で稼働します。ユーザーデータがインフラの外に出ることはなく、チームはデプロイメントのトポロジー、インデックス構成、リソース割り当て、アップグレードのタイミングを自ら制御できます。
- 別システムを追加するのではなく、ネイティブなハイブリッド検索。 Milvusは組み込みのBM25関数でスパースベクトルを生成し、単一のクエリ内で高密度ANNの結果と組み合わせます。Cốc Cốcの広告エンジンは、1つのデータベースから、1つの運用面で、語彙的検索と意味的検索の両方を取得できます。別途キーワード検索クラスターを実行し、アプリケーションコードで2つの結果セットをつなぎ合わせる必要はありません。
- 豊富なインデックスツールボックスにより、各ワークロードに適切なトレードオフを選択可能。 Cốc Cốcのワークロードは、それぞれ求めるものが異なります。オンライン検索は高い再現率で最低のレイテンシーを望み、オフラインのバッチパイプラインは正確な結果を望み、処理時間は気にしません。Milvusは同一デプロイメント上でHNSW、IVFファミリー、FLATなど、多数のインデックスをサポートしているため、チームはすべてのワークロードで妥協するのではなく、ワークロードごとに選択しました。
- デプロイ、運用、学習が簡単。 Milvusは本番環境でのセットアップ、管理、スケーリングが容易で、エンジニアリングチームの運用オーバーヘッドを低く抑えました。Milvus Distributedのモジュール式アーキテクチャと、各コンポーネントの詳細なダッシュボードパネルにより、チームはシステムのどの部分に負荷がかかっているかを正確に把握し、実際のボトルネックに合わせてハードウェアをサイズ調整できます。また、ドキュメントは網羅的で理解しやすく、初期実装を加速し、Cốc Cốcの既存システムとの統合を簡素化しました。
ソリューション
MilvusはCốc Cốcのパイプラインの最上位に位置しています。フィルタリングと再ランキングの前に位置する検索ステップです。Cốc Cốcのコアウェブ検索関連性は、検索と再ランクのアーキテクチャに従い、Milvusが第一段階のリコールを処理し、下流のモデルが結果を洗練します。
5つの本番システムがこの1つのMilvusデプロイメント上で稼働しています。各システムは独自のコレクション、独自のベクトル定義、独自のインデックス構成を持ちますが、インフラは別々ではありません。
- コアウェブ検索関連性 — 未知のクエリやロングテールクエリに対して関連する結果を表面化する意味的検索。
- AIを活用した検索&ショッピング広告 — ユーザーの意図を関連する広告にマッチングする意味的・ハイブリッド検索。
- 関連検索サジェスチョン — 文脈的に関連するフォローアップクエリを表面化するベクトル類似性。
- 類似オーディエンスターゲティング — 閲覧履歴をベクトルとして埋め込み、ディスプレイ広告のために類似した関心を持つユーザーを見つけるために使用。
- 社内RAGチャットボット — LLMの応答をCốc Cốcの自社ドキュメントに基づかせるための検索層としてのMilvus。
ベクトルが表すものはシステムによって異なります。Webページ、検索クエリ、広告、ユーザープロファイル、テキストの一節などです。ほとんどの埋め込みは、チームがPhoBERTからファインチューニングしたバイエンコーダーモデルから生成され、ベトナム語の言語理解に最適化されています。これが、Cốc Cốcの結果を単なる翻訳ではなく、ベトナム語としての専門性を持つものにしているドメイン知識です。
本番環境のレイテンシーとメモリ要件を満たすため、Cốc Cốcはモデル最適化を適用し、検索品質を維持しながら本番用の埋め込みを128次元に削減しました。より狭いベクトルは、ベクトルあたりのメモリを減らし、距離計算を高速化し、この規模でノードあたりのメモリを管理可能に保つのに役立ちます。これにより、チームは構築の基盤となるコンパクトで高品質なベクトルを得ました。次の疑問は、その上にどのインデックスを構築するかでした。
Milvusは、ワークロードごとに異なるインデックスを選択できる、複数のインデックスタイプをサポートしています
Cốc Cốcのワークロードは、相反する方向性を持っています。ユーザー向け検索は、高い再現率を維持しながら可能な限り低いレイテンシを求めます。一方、オフラインのバッチパイプラインは正確な結果を求めており、処理にどれだけ時間がかかっても構いません。Milvusは同一デプロイメント上でHNSW、IVFファミリー、FLATなどをサポートしているため、チームは単一のインデックスを選択してすべての環境で使い回す代わりに、自社データを用いて各オプションをベンチマークし、異なるインデックスを並行して実行することができました。
オンラインサービス向けには、再現率、インデックスサイズ、パフォーマンスの観点で候補を比較しました:
- IVF-SQ8 — メモリフットプリントは小さいものの、再現率が低く、レイテンシが高くなります。
- IVF-PQ — IVF-SQ8よりもさらにフットプリントが小さく、再現率はさらに低くなります。
- HNSW — 再現率が99%~100%と最も高く、レイテンシが最も低い一方、メモリコストは高くなります。
レイテンシがユーザー向けサービスの制約条件であり、メモリが現時点ではデプロイメント上の制限要因ではないため、チームはHNSWを選択し、メモリとのトレードオフを受け入れました。オフラインのバッチワークロード(毎日の推論処理やデータ処理パイプライン)では、代わりにFLATインデックスを使用し、100%の再現率で正確な最近傍探索を実現しているため、後続の処理はグラウンドトゥルースに基づいて動作します。どちらのワークロードも、もう一方の妥協案を受け入れる必要はなく、それぞれ専用のデータベースも必要ありません。
広告マッチングのためのハイブリッド検索をMilvusに内蔵
広告を厳密な文言と意図の両方でマッチングするには通常、キーワード検索クラスタをベクターデータベースと並行して稼働させ、アプリケーションコード内で2つの結果セットを統合する必要があります。Milvusはその分断を解消します。字句検索と意味検索が同一クエリにネイティブに統合されているのです。
Cốc CốcのAI駆動型検索広告システムでは、各ユーザークエリに対して2つの検索パスが並行して実行されます:
- HNSWインデックスを使用した、高密度埋め込みフィールドに対するANN意味検索。
- 内蔵のBM25関数を通じてMilvusが自ら生成するスパースベクトルフィールドに対する全文検索 — そのため、チームは別の字句インデックスを構築、運用、同期する必要がありません。
Milvusはその後、内蔵の融合プリミティブであるWeightedRankerを使用して、Cốc Cốcが制御する重みで2つの結果セットを融合します。チームは高密度側0.6、スパース側0.4に決定しました。意味理解にやや重点を置きつつ、厳密なキーワードマッチングにも確かな重みを残しています。これにより、より高品質な広告検索が実現します。高密度側は広告主が明示しなかった意図を捉え、スパース側は商業的に重要な完全一致のケースを保護します。バランスを調整する必要がある場合は、アーキテクチャの再設計ではなく、単一のチューニング可能な数値を変更するだけです。
Milvusハイブリッド検索をレイテンシ予算内に収める
Cốc Cốcが初めてすべての本番トラフィックをハイブリッド検索にルーティングした際、ピーク時はおよそ毎秒166リクエストに達し、ハイブリッド検索のレイテンシはP90で約120msまで上昇し、目標値を超えていました。
チームの答えは、品質を犠牲にするのではなく、アーキテクチャによるものでした。彼らは検索レイヤーの前に24時間のアプリケーションレベルTTLキャッシュを導入しました。キャッシュヒット率はおよそ60%で、ピーク時のMilvusへの実効負荷は約67 RPSに低下し、レイテンシは本番要件の範囲内に戻りました。検索自体には何の変更もありません。Milvusは同じ品質で同じハイブリッド結果を返し続け、Cốc Cốcは単に処理すべきトラフィック量を変更しただけです。
継続的なデータ取り込み下でのレイテンシ安定化
Cốc Cốcのコレクションは静的ではありません。挿入、アップサート、インデックス構築、コンパクションはすべて稼働中のシステムに対して実行されます。Milvusはこれらをバックグラウンド操作として処理するため、コレクションは書き込みや再インデックス中も検索可能な状態を維持します。レイテンシを単に利用可能な状態にするだけでなく、予測可能な状態にするため、チームはそのバックグラウンド作業をオフピーク時間帯(午前2時から4時)にスケジュールし、メンテナンスとユーザートラフィックが同じリソースを奪い合わないようにしています。
結果と利点
- 本番環境で7億ベクトル、約15億ベクトルまでの拡張余地を計画。 Cốc Cốcのデプロイメントは現在、複数の本番ユースケースにわたって約7億ベクトルを保持しており、チームはリトリーバル層を再構築することなく、10億をはるかに超える規模まで快適にスケールできるようインフラを設計しています。容量は約15億ベクトルを計画しています。
- ピーク時のP90セマンティック検索レイテンシは19.8ミリ秒。 通常のセマンティック検索では、ピークトラフィック時(34 RPS)に、Cốc CốcはP50が11.1ミリ秒、P90が19.8ミリ秒、P95が26.7ミリ秒、P99が88.3ミリ秒を記録しています。
- ハイブリッド検索のP90を32.1ミリ秒に短縮し、レイテンシによって妨げられていたリトリーバル品質のアップグレードを本番環境に投入しました。ピークトラフィック時(166 RPS、60%のキャッシュヒット率で実効約67 RPS)には、Cốc CốcはP50が17.1ミリ秒、P90が32.1ミリ秒、P95が41.6ミリ秒、P99が126ミリ秒を記録しています。
- オンラインでの再現率99〜100%、オフラインでの再現率100%。 HNSWは、テストしたインデックスの中で最も低いレイテンシで、ユーザー向けサービスにほぼ完全な再現率を提供します。一方、FLATはオフラインパイプラインに正確な最近傍結果を提供するため、バッチ出力は近似ではなくグラウンドトゥルースに基づいて構築されます。
- 検索リクエストの30% が現在、Milvusを搭載したセマンティックリトリーバルによって処理されています - AI検索のカバレッジを(63%から92%へ)拡大し、キーワード検索のみよりも優れた結果を提供しています。
- ピーク時166 RPSでの数億ベクトルにわたるベクトル検索 は、現在ではCốc Cốcのチームが構築できるワークロードです。これは、厳格な低レイテンシと高スループットの制約下でのアプリケーションのクラスであり、以前のスタックでは実現不可能でした。
戦略的な成果として、リトリーバルはもはやCốc Cốcが提供できるものを制約する要因ではなくなりました。ウェブ検索、広告、サジェスチョン、ターゲティング、社内RAGという5つの異なるシステムが、現在ではチームがエンドツーエンドで管理する単一のリトリーバル基盤上で動作しています。
大規模AI検索を構築するチームへのCốc Cốcのアドバイス
Cốc Cốcのチームは、概念実証から国家規模の本番運用までの全過程を経験してきました。同じ道を歩もうとする仲間へのアドバイスは次のとおりです。
- 小さく始めるが、本番環境で始める。 数百万ベクトル(たとえば3か月分のデータ)で概念実証を構築し、1〜2年分のデータにスケールする前に、その小規模なサービスを実際の本番トラフィックにさらします。成長に合わせてCPUとRAMの使用率を継続的に監視し、実際に観測された値に基づいてハードウェアをスケールします。
- 自分のワークロードに基づいてインデックスの種類と構成をベンチマークする。 デフォルトをそのまま使わないでください。さまざまなインデックス種類と、各種類内のさまざまな構成を評価し、負荷テストを実行してP50、P90、P95レイテンシを測定します。そうすることで自分のワークロードに合った構成が見つかります。その答えは、オンラインとオフラインのパスで同じになることはほとんどありません。
- ベクトルデータベースに専用ハードウェアを割り当てる。 最新のハードウェア上で、分散ベクトルデータベース用の専用サーバーノードに投資してください。他のサービスとインフラを共有すると、運用上の問題が発生し、成長するにつれて悪化します。専用ノードは、よりスケーラブルで保守しやすい基盤を提供します。
次のステップ
Cốc CốcのMilvusデプロイメントは現在バージョン2.5.21で稼働しており、チームの次のステップは、新しいリリースに移行して改善点(特に検索レイテンシとハードウェア効率)を評価し、新機能と新しい構成を試すことです。アップグレードに加えて、チームは既存および今後のCốc Cốc製品全体にベクトル検索を適用する機会を引き続き模索しています。
Milvusを始める
Milvusは、世界で最も広く採用されているオープンソースのベクターデータベースであり、大規模なベクター検索専用に設計されています。ネイティブのハイブリッド検索、あらゆる種類のインデックスタイプ、そしてラップトップから本番Kubernetesクラスターまでどこでも動作する分散アーキテクチャを備えています。45,000以上のGitHubスターと1億回以上のDockerプルを達成し、世界中の10,000社以上の企業およびAIネイティブ企業をサポートしています。最新リリースのMilvus 3.0では、オブジェクトストレージから直接データをインデックス化および取得するレイクネイティブアーキテクチャが追加されました。
AI検索、広告検索、またはRAGのいずれを構築している場合でも、MilvusはCốc Cốcを支えるのと同じ検索基盤を提供します。Milvus GitHubで始めるか、Milvusドキュメントを読むか、Discordでコミュニティに参加してください。
Zilliz Cloudは、Milvusの開発チームによって構築された完全マネージドのVector Lakebaseです。Milvus APIと完全互換であり、独自のCardinalインデックスエンジンにより最大10倍のコストパフォーマンスを実現します。さらに、エンタープライズグレードのセキュリティ、信頼性、スケーラビリティ、そして最大99.99%のSLAを提供します。


