Cốc Cốc обеспечивает национальный AI-поиск Вьетнама с помощью Milvus
700 млн
Векторы в продакшене: масштабирование к 1,5 млрд
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 — ведущая отечественная поисковая система и браузер Вьетнама. Им пользуются более 30 миллионов человек — примерно каждый третий вьетнамский интернет-пользователь, — совершающих более 600 миллионов поисковых запросов в месяц. Это делает Cốc Cốc второй по величине поисковой системой и вторым по популярности браузером в стране, уступая только Google. Его преимущество — то, что глобальным системам труднее всего скопировать: сам вьетнамский язык, вплоть до языковых моделей, которые собственная команда Cốc Cốc дообучила для него.
С 2023 года Cốc Cốc встраивает ИИ в этот пользовательский опыт с помощью AI Chat и AI Search, распространяя тот же интеллект на Cốc Cốc Ads. Этот сдвиг изменил лежащую в основе проблему: теперь результаты должны извлекаться по смыслу, а не только по ключевым словам, среди сотен миллионов объектов, за миллисекунды. Milvus — семантический слой, который Cốc Cốc выбрал для этого; сегодня он хранит 700 миллионов векторов в пяти их продакшн-системах.
Проблема
Внедрение семантического поиска в поисковую систему и рекламную платформу национального масштаба означало решение сразу трех задач.
- Поиск по ключевым словам не может ответить на запросы, которые пользователи действительно вводят. Каждый день появляются новые запросы и тренды — телефон, выпущенный сегодня утром, новость, произошедшая час назад, вьетнамская формулировка, которую не использует ни одна веб-страница. Поиск по ключевым словам сопоставляет только фактические слова пользователя, поэтому для таких запросов он возвращает мало полезного.
- Векторные библиотеки не могут вместить сотни миллионов векторов. FAISS и USearch хорошо работали в менее масштабных проектах Cốc Cốc, но они дают вам индекс, а не систему — ничего, что распределяло бы сотни миллионов векторов по машинам, сохраняло бы их доступными для запросов во время записи новых данных и надежно работало бы в продакшене. То, что пришло им на смену, также должно было работать на собственных серверах Cốc Cốc, чтобы данные поиска и рекламы оставались внутри их инфраструктуры.
- Подбор рекламы требует двух путей поиска, но бюджет задержки допускает только один. Рекламодатели, делающие ставки на точные слова покупателя, должны быть сопоставлены, но покупатель, описывающий то же самое иначе, всё равно должен их видеть. Запуск обоих путей и объединение их в единый ранжированный список — при самой высокой векторной нагрузке Cốc Cốc, в пределах общего бюджета загрузки страницы — вот где становится трудно.
Почему Milvus
Cốc Cốc проверил Milvus на примерно 30 миллионах эмбеддингов запросов в рамках проверки концепции, прежде чем принять решение. Результаты превзошли ожидания команды, и с тех пор Milvus является их векторной базой данных. Пять факторов удержали его в этой роли по мере роста нагрузки.
- Низкая задержка, сохранявшаяся по мере роста набора данных. Это был главный критерий. Milvus обеспечивал стабильно быстрый векторный поиск, когда корпус Cốc Cốc вырос с 30 миллионов векторов в концептуальном прототипе до 700 миллионов в продакшене, и продолжал держать планку, когда команда перешла к гибридному поиску для рекламной платформы — более тяжелому паттерну запросов при большем объеме.
- Самостоятельное размещение: данные и инфраструктура остаются у 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 выполняет первый этап отбора, а последующие модели уточняют результаты.
В рамках этого одного развертывания Milvus работают пять производственных систем — каждая со своей коллекцией, своим определением вектора и своей конфигурацией индексов, но без отдельной инфраструктуры:
- Релевантность основного веб-поиска — семантический поиск, который выдает релевантные результаты для новых и длиннохвостовых запросов.
- Поисковая и торговая реклама на базе ИИ — семантический и гибридный поиск, сопоставляющий намерения пользователя с релевантными объявлениями.
- Похожие поисковые подсказки — поиск по векторной близости, предлагающий контекстно релевантные уточняющие запросы.
- Lookalike-таргетинг — история просмотров, преобразованная в векторы, для поиска пользователей со схожими интересами в целях медийной рекламы.
- Внутренний RAG-чат-бот — Milvus как уровень поиска, который опирается на собственные документы Cốc Cốc при формировании ответов LLM.
Что представляет собой вектор, зависит от системы: это может быть веб-страница, поисковый запрос, рекламное объявление, профиль пользователя или фрагмент текста. Большинство эмбеддингов получается из bi-encoder моделей, которые команда дообучила на базе PhoBERT, оптимизировав для понимания вьетнамского языка — та самая экспертная область, благодаря которой результаты Cốc Cốc являются вьетнамскими, а не просто переведенными.
Чтобы соответствовать требованиям продакшена по задержке и памяти, Cốc Cốc применяет оптимизацию моделей, сокращая производственные эмбеддинги до 128 измерений с сохранением качества поиска. Более узкие векторы означают меньше памяти на вектор и более быстрое вычисление расстояний, что позволяет держать объем памяти на узел управляемым в таких масштабах. Это дало команде компактный и качественный вектор, на котором можно строить. Следующим вопросом было, какой индекс использовать.
Milvus поддерживает несколько типов индексов, с отдельным индексом для каждой рабочей нагрузки
Рабочие нагрузки Cốc Cốc тянут в противоположные стороны. Пользовательский поиск требует минимально возможной задержки при высоком recall; офлайн-пайплайны пакетной обработки хотят точных результатов, и им неважно, сколько времени это займёт. Milvus поддерживает HNSW, семейство IVF, FLAT и другие индексы в одном развёртывании — поэтому вместо того, чтобы выбрать один индекс и мириться с ним повсюду, команда смогла протестировать варианты на собственных данных, а затем запустить разные индексы бок о бок.
Для онлайн-сервисов они сравнили кандидатов по recall, размеру индекса и производительности:
- IVF-SQ8 — небольшой объём памяти, но более низкий recall и более высокая задержка.
- IVF-PQ — ещё меньший объём, чем у IVF-SQ8, и снова более низкий recall.
- HNSW — лучший recall, на уровне 99%–100%, и самая низкая задержка при более высоких затратах памяти.
Поскольку задержка является ключевым ограничением для пользовательских сервисов, а память в настоящее время не является лимитирующим фактором в их развёртывании, они выбрали HNSW и приняли компромисс по памяти. Для офлайн-пакетных рабочих нагрузок — ежедневных пайплайнов инференса и обработки данных — они вместо этого используют индекс FLAT, достигая точного поиска ближайших соседей со 100% recall, так что дальнейшая обработка работает на основе ground truth. Ни одна рабочая нагрузка не соглашается на компромисс другой, и ни одной не нужна собственная база данных.
Гибридный поиск для подбора рекламы, встроенный в Milvus
Сопоставление рекламы как по точной формулировке, так и по намерению обычно означает запуск кластера поиска по ключевым словам вместе с векторной базой данных и сшивание двух наборов результатов в коде приложения. Milvus устраняет это разделение: лексический и семантический поиск являются встроенной частью одного запроса.
Для каждого пользовательского запроса в системе поиска рекламы на базе ИИ Cốc Cốc параллельно выполняются два пути поиска:
- ANN-семантический поиск по полю плотных эмбеддингов с использованием индекса HNSW.
- Полнотекстовый поиск по полю разреженных векторов, которое Milvus генерирует самостоятельно, с помощью встроенной функции BM25 — поэтому команде не нужно создавать, запускать или синхронизировать второй лексический индекс.
Затем Milvus объединяет два набора результатов с помощью WeightedRanker — своего встроенного примитива слияния, — с весами, контролируемыми Cốc Cốc. Команда остановилась на 0,6 в сторону плотных и 0,4 в сторону разреженных — слегка опираясь на семантическое понимание, но сохраняя реальный вес для точного сопоставления ключевых слов. Это обеспечивает более качественный подбор рекламы: плотная сторона улавливает намерение, которое рекламодатель никогда не формулировал, а разреженная сторона защищает случаи точного совпадения, важные с коммерческой точки зрения. Когда баланс нужно изменить, это просто один настраиваемый параметр, а не перестройка архитектуры.
Укладываем гибридный поиск Milvus в бюджет задержки
Когда Cốc Cốc впервые направила весь продакшен-трафик через гибридный поиск, при пике примерно 166 запросов в секунду, задержка гибридного поиска достигала около 120 мс на P90 — выше целевого показателя.
Ответ команды был архитектурным, а не отступлением по качеству. Они внедрили 24-часовой TTL-кэш на уровне приложения перед слоем поиска. При доле попаданий в кэш примерно 60%, эффективная нагрузка на Milvus во время пикового трафика снизилась примерно до 67 RPS, и задержка вернулась в пределы требований продакшена. В самом поиске ничего не изменилось: Milvus продолжал возвращать те же гибридные результаты того же качества, а Cốc Cốc просто изменила объём трафика, который ей приходилось обрабатывать.
Поддержание стабильной задержки при непрерывной загрузке данных
Коллекции Cốc Cốc не статичны: вставки, апсерты, построение индексов и компакция выполняются в живой системе. Milvus обрабатывает их как фоновые операции, поэтому коллекции остаются доступными для поиска во время записи и переиндексации. Чтобы сделать задержку не просто приемлемой, а предсказуемой, команда планирует фоновую работу на внепиковое окно — с 2 до 4 часов ночи — чтобы технические работы и пользовательский трафик никогда не конкурировали за одни и те же ресурсы.
Результаты и преимущества
- 700 миллионов векторов в продакшене, с запасом до ~1,5 миллиарда. В текущем развертывании Cốc Cốc хранится примерно 700 миллионов векторов для нескольких производственных сценариев использования, и команда спроектировала инфраструктуру так, чтобы она без проблем масштабировалась за пределы 1 миллиарда — с планируемой емкостью около 1,5 миллиарда — без изменения архитектуры слоя поиска.
- 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, ~67 RPS эффективно при 60% попаданий в кэш) Cốc Cốc показывает P50 17,1 мс, P90 32,1 мс, P95 41,6 мс и P99 126 мс.
- 99–100% полноты поиска онлайн, 100% офлайн. HNSW обеспечивает пользовательские сервисы почти исчерпывающей полнотой поиска с наименьшей задержкой среди протестированных индексов, а FLAT предоставляет офлайн-конвейерам точные результаты поиска ближайших соседей, поэтому пакетные результаты строятся на основе эталонных данных, а не приближений.
- 30% поисковых запросов теперь обслуживаются семантическим поиском на базе Milvus — это расширяет покрытие AI Search (с 63% до 92%) и дает лучшие результаты, чем только поиск по ключевым словам.
- Векторный поиск по сотням миллионов векторов при пиковых 166 RPS теперь является рабочей нагрузкой, под которую команда Cốc Cốc может разрабатывать, — классом приложений в условиях жестких ограничений по задержке и пропускной способности, который был недостижим на прежнем стеке.
Стратегический выигрыш в том, что поиск больше не является ограничением для того, что Cốc Cốc может выпускать. Пять различных систем — веб-поиск, реклама, подсказки, таргетинг и внутренний RAG — теперь работают на единой поисковой основе, которую команда полностью контролирует.
Советы Cốc Cốc командам, создающим крупномасштабный AI-поиск
Команда Cốc Cốc прошла весь путь от прототипа до продакшена национального масштаба. Их советы коллегам, идущим по тому же пути:
- Начинайте с малого, но сразу в продакшене. Создайте прототип на нескольких миллионах векторов — например, на трех месяцах данных — и поставьте этот небольшой сервис перед реальным производственным трафиком, прежде чем масштабироваться до данных за один-два года. Постоянно отслеживайте загрузку CPU и RAM по мере роста и масштабируйте оборудование в соответствии с фактическими наблюдениями.
- Сравнивайте типы индексов и конфигурации на своей собственной нагрузке. Не берите конфигурацию по умолчанию. Оцените различные типы индексов и разные конфигурации внутри каждого типа, затем проведите нагрузочные тесты и измерьте задержку P50, P90 и P95. Так вы найдете конфигурацию, подходящую для вашей нагрузки, и ответ редко будет одинаковым для онлайн- и офлайн-путей.
- Выделите векторной базе данных собственное оборудование. Инвестируйте в выделенные серверные узлы для распределенной векторной базы данных на современном оборудовании. Совместное использование инфраструктуры с другими сервисами создает операционные проблемы, которые усугубляются по мере роста; выделенные узлы обеспечивают более масштабируемую и поддерживаемую основу.
Что дальше
Развертывание Milvus у Cốc Cốc в настоящее время работает на версии 2.5.21, и следующий шаг команды — перейти на более новый релиз, чтобы оценить улучшения, особенно в задержке поиска и эффективности использования оборудования, а также опробовать новые функции и конфигурации. Помимо обновления, команда продолжает искать возможности применения векторного поиска как в существующих, так и в будущих продуктах Cốc Cốc.
Начните работу с Milvus
Milvus — это самая широко используемая в мире open-source векторная база данных, созданная специально для векторного поиска в огромных масштабах — с нативным гибридным поиском, полным набором типов индексов и распределённой архитектурой, которая работает где угодно: от ноутбука до производственного кластера Kubernetes. Она преодолела отметку в 45 000 звёзд на GitHub и 100 миллионов загрузок Docker, и поддерживает более 10 000 предприятий и AI-нативных компаний по всему миру. Последний релиз, Milvus 3.0, добавляет lake-native архитектуру, которая индексирует и извлекает данные напрямую из объектного хранилища.
Создаёте ли вы AI-поиск, рекламную выдачу или RAG, Milvus предоставляет вам ту же поисковую основу, которая обеспечивает работу Cốc Cốc. Начните с Milvus GitHub, почитайте документацию Milvus или присоединяйтесь к сообществу на Discord.
Zilliz Cloud — это полностью управляемый Vector Lakebase, созданный командой, стоящей за Milvus. Полностью совместимый с API Milvus, он обеспечивает до 10× лучшее соотношение цены и производительности благодаря собственному движку индексирования Cardinal, а также корпоративную безопасность, надёжность, масштабируемость и SLA до 99.99%.


