Cốc Cốc, Milvus로 베트남 국가 규모의 AI 검색을 지원하다
700M
프로덕션 환경의 벡터, 1.5B 규모로 확장하기
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천만 명 이상이 사용하며, 이는 베트남 인터넷 사용자의 약 3분의 1에 해당합니다. 월 6억 건 이상의 검색을 처리하여 Cốc Cốc은 베트남에서 구글에 이어 두 번째로 큰 검색 엔진이자 두 번째로 큰 브라우저입니다. 그 강점은 글로벌 엔진들이 가장 따라 하기 어려워하는 부분, 즉 베트남어 자체에 있으며, 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억 개의 벡터를 보유하고 있습니다.
도전 과제
국가 규모의 검색 엔진과 광고 플랫폼에 의미론적 검색을 도입하는 것은 한 번에 세 가지 문제를 해결해야 한다는 뜻이었습니다.
- 키워드 검색은 사용자가 실제로 입력하는 질문에 답할 수 없습니다. 새로운 질문과 트렌드가 매일 나타납니다. 오늘 아침에 출시된 휴대폰, 한 시간 전의 뉴스, 어떤 웹 페이지에서도 사용하지 않는 베트남어 표현 같은 것들입니다. 키워드 검색은 사용자의 실제 단어와만 일치하므로 이러한 경우 가치 있는 결과를 거의 반환하지 못합니다.
- 벡터 라이브러리로는 수억 개의 벡터를 보관할 수 없습니다. FAISS와 USearch는 Cốc Cốc의 소규모 프로젝트에서는 잘 작동했지만, 이들은 시스템이 아니라 인덱스만 제공합니다. 수억 개의 벡터를 여러 머신에 분산하고, 새 데이터가 기록되는 동안에도 쿼리 가능한 상태를 유지하며, 프로덕션에서 안정적으로 실행되는 기능은 없습니다. 이를 대체할 도구는 또한 Cốc Cốc의 자체 서버에서 실행되어야 했으므로 검색 및 광고 데이터가 인프라 내부에 유지될 수 있었습니다.
- 광고 매칭에는 두 가지 검색 경로가 필요하지만, 지연 시간 예산은 하나만 지원합니다. 쇼핑객이 입력한 정확한 단어에 입찰하는 광고주는 매칭되어야 하지만, 같은 것을 다르게 표현하는 쇼핑객에게도 해당 광고가 여전히 보여야 합니다. 두 가지를 모두 실행하고 이를 하나의 순위 목록으로 통합하는 것, 즉 Cốc Cốc에서 가장 많은 벡터 워크로드가 발생하는 상황에서 공유된 페이지 로드 예산 내에서 처리하는 것이 어려운 지점입니다.
Milvus를 선택한 이유
Cốc Cốc은 확정하기 전에 약 3천만 개의 쿼리 임베딩을 대상으로 한 개념 증명을 통해 Milvus를 검증했습니다. 결과는 팀의 기대를 뛰어넘었고, 그 이후로 Milvus는 그들의 벡터 데이터베이스로 자리 잡았습니다. 워크로드가 증가하면서 다섯 가지 이유가 Milvus를 유지하게 했습니다.
- 데이터셋이 커져도 유지되는 낮은 지연 시간. 이것이 주요 기준이었다. Milvus는 Cốc Cốc의 코퍼스가 개념 증명의 3천만 벡터에서 프로덕션의 7억 벡터로 확장되는 동안 일관되게 빠른 벡터 검색을 제공했으며, 팀이 광고 플랫폼을 위한 하이브리드 검색으로 확장했을 때도 그 성능을 유지했다. 이는 더 높은 볼륨에서 더 무거운 쿼리 패턴이었다.
- 자체 호스팅으로 데이터와 인프라가 Cốc Cốc에 유지된다. Milvus는 오픈 소스이며 Cốc Cốc 자체 환경에서 실행된다. 사용자 데이터는 인프라를 벗어나지 않으며, 팀이 배포 토폴로지, 인덱스 구성, 리소스 할당, 업그레이드 시점을 직접 제어한다.
- 별도 시스템을 실행하는 대신 네이티브 하이브리드 검색. Milvus는 내장 BM25 함수로 희소 벡터를 생성하고 단일 쿼리 내에서 밀집 ANN 결과와 결합한다. Cốc Cốc의 광고 엔진은 하나의 데이터베이스에서 어휘 및 의미 검색을 얻고, 하나의 운영 표면을 가진다. 별도의 키워드 검색 클러스터를 실행하고 애플리케이션 코드에서 두 결과 집합을 이어 붙이는 대신에 말이다.
- 각 워크로드에 적합한 트레이드오프를 제공하는 완전한 인덱스 도구 모음. 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가 1단계 리콜을 처리하고 다운스트림 모델이 결과를 정제한다.
다섯 개의 프로덕션 시스템이 단일 Milvus 배포에서 실행된다. 각 시스템은 자체 컬렉션, 벡터에 대한 자체 정의, 자체 인덱스 구성을 가지지만 별도의 인프라는 없다.
- 핵심 웹 검색 관련성 — 보지 못한 쿼리와 롱테일 쿼리에 대해 관련성 높은 결과를 표면화하는 의미 검색.
- AI 기반 검색 및 쇼핑 광고 — 사용자 의도를 관련 광고에 매칭하는 의미 및 하이브리드 검색.
- 관련 검색 제안 — 문맥상 관련된 후속 쿼리를 표면화하는 벡터 유사도.
- 유사 타겟팅 — 브라우징 기록을 벡터로 임베딩하여 디스플레이 광고를 위해 유사한 관심사를 가진 사용자를 찾는 데 사용.
- 내부 RAG 챗봇 — Milvus가 검색 계층 역할을 하여 LLM 응답을 Cốc Cốc 자체 문서에 근거하도록 함.
벡터가 무엇을 나타내는지는 시스템에 따라 다르다. 웹 페이지, 검색 쿼리, 광고, 사용자 프로필, 또는 텍스트 구절일 수 있다. 대부분의 임베딩은 팀이 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% 재현율로 정확한 최근접 이웃 검색을 달성하므로 다운스트림 처리가 ground truth를 기반으로 작동합니다. 어떤 워크로드도 다른 쪽의 절충안을 채택하지 않으며, 각자 자체 데이터베이스가 필요하지 않습니다.
광고 매칭을 위한 하이브리드 검색, Milvus에 내장
정확한 문구와 의도 모두에 대해 광고를 매칭하는 것은 일반적으로 키워드 검색 클러스터와 벡터 데이터베이스를 함께 운영하고 두 결과 집합을 애플리케이션 코드에서 결합하는 것을 의미합니다. Milvus는 이러한 분리를 제거합니다. 어휘 검색과 의미 검색이 동일한 쿼리에 기본적으로 함께 제공됩니다.
Cốc Cốc의 AI 기반 검색 광고 시스템의 각 사용자 쿼리에 대해 두 가지 검색 경로가 병렬로 실행됩니다:
- ANN 의미 검색: HNSW 인덱스를 사용하여 밀집 임베딩 필드에서 수행됩니다.
- 전문 검색: Milvus가 자체 생성하는 희소 벡터 필드에 대해 수행되며, 기본 제공 BM25 함수를 통해 이루어집니다. 따라서 팀이 구축, 실행, 동기화해야 할 두 번째 어휘 인덱스가 없습니다.
Milvus는 그런 다음 내장 융합 기본 요소인 WeightedRanker를 사용하여 두 결과 집합을 융합하며, 가중치는 Cốc Cốc이 제어합니다. 팀은 밀집에 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.8ms. 피크 트래픽(34 RPS)에서 일반 의미 검색의 경우 Cốc Cốc는 P50 11.1ms, P90 19.8ms, P95 26.7ms, P99 88.3ms를 유지합니다.
- 하이브리드 검색 P90을 32.1ms로 단축, 지연 시간으로 인해 차단되었던 리트리벌 품질 업그레이드를 프로덕션에 도입. 피크 트래픽(166 RPS, 60% 캐시 적중률 기준 약 67 RPS)에서 Cốc Cốc는 P50 17.1ms, P90 32.1ms, P95 41.6ms, P99 126ms를 유지합니다.
- 온라인 99–100% 재현율, 오프라인 100% 재현율. HNSW는 테스트된 인덱스 중 가장 낮은 지연 시간으로 사용자 대상 서비스에 사실상 완전한 재현율을 제공하며, FLAT는 오프라인 파이프라인에 정확한 최근접 이웃 결과를 제공하므로 배치 출력은 근사치가 아닌 실제 정답에 기반합니다.
- 검색 요청의 30% 는 이제 Milvus 기반 의미 검색이 처리합니다 — AI 검색 커버리지를 확장(63%에서 92%로)하며 키워드 검색 단독보다 더 나은 결과를 제공합니다.
- 피크 166 RPS에서 수억 개의 벡터에 대한 벡터 검색 은 이제 Cốc Cốc 팀이 기반으로 구축할 수 있는 워크로드가 되었습니다 — 엄격한 저지연 및 고처리량 제약 조건에서 이전 스택으로는 도달할 수 없었던 애플리케이션 클래스입니다.
전략적 성과는 리트리벌이 더 이상 Cốc Cốc가 제공할 수 있는 기능의 제약이 아니라는 점입니다. 웹 검색, 광고, 추천, 타게팅, 내부 RAG라는 다섯 가지 서로 다른 시스템이 이제 팀이 엔드투엔드로 제어하는 단일 리트리벌 기반 위에서 실행됩니다.
대규모 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를 지원합니다.


