Евгений Астафуров, ведущий разработчик Отдела экспериментальных технологий AI VK, рассказывает о разработке Discovery AI — набора ИИ‑технологий для интеллектуального поиска, рекомендаций и взаимодействия с контентом. В него вошли нейропоиск, анализ контекста, персонализация, генеративные модели и рекомендательные алгоритмы.
Технология объединяет большую языковую модель (LLM), поиск, инференс и данные многомиллиардной контентной базы VK. Она будет поэтапно внедряться в сервисы для пользователей, авторов и бизнеса (Дзен, VK, Медиапроекты Mail, VK Видео и другие).
Нейропоиск в Discovery AI работает с петабайтами гетерогенных данных и выдаёт точные ответы в режиме реального времени. Задержка от отправки запроса до первого токена ответа — менее 500 мс. Для реализации проекта оптимизировали поиск и инференс, собрали датасеты из миллиардов качественных синтетических разметок, обучили семейство BERT-like трансформеров и создали агентский сценарий Deep Research для многошагового поиска и анализа контента.
Точка входа для пользовательского запроса — общий маршрутизатор. Он распределяет запрос по изолированным вертикалям кандидатогенерации, каждая из которых обслуживает свой тип контента, имеет собственную логику индексации и поиска. В поиске используются два вида кандидатогенераторов: текстовый BM25 и семантический векторный нейросетевой поиск. Для семантического поиска применяется метод Approximate Nearest Neighbors (ANN): ранжирование строится по убыванию косинусной схожести на основании расстояния между точкой запроса и точками кандидатов в многомерном метрическом пространстве. BM25 находит документы по словоформам, но часто уступает семантическому поиску в случае широких смысловых запросов.
После получения сырых кандидатов из разных вертикалей данные отправляются в «блендер». Он выполняет следующие действия:
* назначает приоритеты: каждому источнику контента присваивается динамический вес в зависимости от продуктового контекста запроса;
* выполняет дедупликацию: исключает пересекающиеся или идентичные документы;
* смешивает кандидатов через Round-Robin: объединяет их в пул с использованием модифицированного алгоритма round-robin, чтобы в топ с большей вероятностью попали лучшие представители от каждой вертикали.
Для фильтрации релевантных документов используется нейросетевая модель ранжирования. Она выделяет релевантные кусочки каждого документа и обеспечивает фиксированный размер контекста для LLM. Документы режут на чанки текста так, чтобы сумма токенов запроса и чанка не превышала 320, с перекрытием в 160 токенов между чанками. Для оценки релевантности каждого чанка к запросу пользователя применяется кастомная BERT-like модель.
В условиях промышленной эксплуатации GPU инференс нейросетей — это компромисс между пропускной способностью (throughput) и задержкой (latency). Модель способна обрабатывать до 5 тысяч документов (или около 30 тысяч чанков) в секунду на одном GPU среднего консьюмерского уровня.
Для достижения производительности в 30 тысяч чанков в секунду были использованы различные оптимизации:
* Токенизация и архитектура. Был обучен токенизатор Byte-Pair Encoding (BPE) на контенте из соцсетей и новостях. Фертильность составила 1,2 (в среднем 12 токенов на 10 слов текста) при размере словаря в 128 тысяч. Это дало прирост к скорости инференса примерно на 50 %.
* Pre-train моделей разных размеров. С учётом опыта в высокопроизводительном инференсе выбраны оптимальные гиперпараметры модели, чтобы снизить вероятность эффекта квантования волн (GPU Wave Quantization).
* Teacher-Student Knowledge Distillation: сначала обучили большую модель (teacher), затем маленькую — по сигналу задачи и логитам большой модели.
* QAT & Structured Sparsity & TensorRT: применяли симуляцию INT8‑квантования (Quantize Aware Training) и симуляцию паттерна структурной разреженности Structured Sparsity 2:4. Это позволило кратно увеличить скорость инференса практически без снижения качества.
Для обучения семантического поиска и ранжирования релевантности чанков использовали датасеты, созданные с помощью конвейера LLM-as-a-judge. Конвейер включал следующие этапы:
* Обратное генерирование интентов: с помощью крупной LLM-модели для каждого документа создали список гипотетических вопросов, ответы на которые содержатся в тексте. На этом этапе столкнулись с двумя проблемами: LLM склонна галлюцинировать и имеет байес, который нельзя исправить только промптом.
* Аугментация запросов: базовые вопросы подвергли семантической аугментации — меняли лексику, стиль, усложняли синтаксические конструкции, имитируя живую речь пользователей. В итоге для каждого документа получилось около 100–200 вариаций интентов.
* Нарезка на чанки и оценка релевантности: документ разбивали на чанки с учётом перекрытия в 160 токенов, чтобы исключить потерю контекста. Каждую пару (интент-чанк) оценивали на релевантность через отдельно обученный LLM-judge («NOREL», «REL‑», «REL», «REL+»).
* Фильтрация: если для интента X среди всех чанков документа Y есть хотя бы один «REL+», то документ Y считается релевантным для интента X. В итоге из пяти миллиардов интентов получили 200 миллионов пар (интент, документ) для обучения эмбеддеров семантического векторного поиска и миллиард троек (интент, чанк, label) для обучения модели ранжирования релевантности.
В среде исполнения после блендера, нарезки документов на чанки и скоринга получается ранжирование документов. Чтобы собрать контекст для LLM, для каждого документа из топ‑7 конкатенируют наиболее релевантные чанки в хронологическом порядке без пересечения, чтобы итоговое количество токенов с каждого документа не превышало 1000. Полученный контекст передают в LLM с набором политик и получают связный текст — ответ на вопрос пользователя. Используется легковесная языковая модель (8B) на основе архитектуры LLaMA. Модель ограничена переданным ей контекстом, чтобы минимизировать галлюцинации.
Одна из ключевых функций нейропоиска — сценарий Deep Research. Это автономный агентский цикл поиска с уточнениями. Deep Research работает итеративно: на каждом шаге агент оценивает достаточность собранной информации, балансируя между сужением скоупа (поиском специфических деталей) и его расширением (запросом смежного контекста). Например, при запросе «Изменения в законе о маркировке рекламы за последний квартал: новые штрафы для самозанятых авторов и пошаговый алгоритм действий» агент:
1. Начинает с общего интента и собирает свежие новостные заметки и разборы.
2. Сужает скоуп, ища штрафы для самозанятых.
3. Расширяет скоуп на процедурный домен: ищет, как автору зарегистрироваться в ОРД, получить токен, промаркировать креатив, отчитываться.
4. Сверяет и проверяет факты, переоценяя собранное и приоритизируя самые свежие источники.
5. Достигает достаточности: у агента на руках три согласованных блока — суть правовых изменений, санкции для самозанятых и проверенный алгоритм действий. Контекст уходит в LLM, и пользователь получает единый ответ.
Такая технология будет актуальной как минимум ближайшее десятилетие: сценарий обобщения поиска эффективнее решать через комбинацию легковесной LLM и механизма сбора документов в контекстное окно.