惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
博客园 - 聂微东
IT之家
IT之家
The Cloudflare Blog
L
LangChain Blog
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
P
Proofpoint News Feed
aimingoo的专栏
aimingoo的专栏
G
Google Developers Blog
T
The Blog of Author Tim Ferriss
博客园 - 叶小钗
I
Intezer
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
ThreatConnect
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
小众软件
小众软件
T
The Exploit Database - CXSecurity.com
H
Help Net Security
T
Tenable Blog
WordPress大学
WordPress大学
F
Future of Privacy Forum
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
NISL@THU
NISL@THU
The Register - Security
The Register - Security
A
About on SuperTechFans
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MyScale Blog
MyScale Blog
Malwarebytes
Malwarebytes
博客园_首页
T
Threatpost
C
CERT Recently Published Vulnerability Notes
Know Your Adversary
Know Your Adversary
T
Threat Research - Cisco Blogs
V
Vulnerabilities – Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
Blog — PlanetScale
Blog — PlanetScale
Recorded Future
Recorded Future
大猫的无限游戏
大猫的无限游戏
K
Kaspersky official blog
月光博客
月光博客
Jina AI
Jina AI
S
Securelist
Hugging Face - Blog
Hugging Face - Blog
G
GRAHAM CLULEY
腾讯CDC
S
Secure Thoughts
V
V2EX - 技术

Все публикации подряд на Хабре

MTProxy jumper — делаем автоматическое переключение прокси-серверов Telegram Ты уже используешь агента. Просто не заметил Книжный салон. Послевкусие и благодарности Как отлаживать мини‑приложения в MAX и почему без DevTools это боль Cбор биометрических данных. Как защищается наша биометрия на практике Как запустить учет активов без цифровой свалки: первые 90 дней CGE: визуализация кравлера и скрытых связей между поддоменами Зачем банки тратят миллиарды на науку (спойлер: не благотворительности ради) Книга: «Современный Java Concurrency. Глубокое погружение в Virtual Threads, Structured Concurrency и Scoped Values» Как использовать подписку ChatGPT и Claude в Cursor без оплаты за API токены Специализированная ИСУП или модуль в универсальной платформе: вот в чем вопрос Обход белых списков через WebRTC на стероидах (с поддержкой iOS и десктопа) Регата INFOSTART CIO CAMP: когда команда проверяется не в переговорной, а на воде Пет-проект, который не умер: система бронирования устройств как полигон для AI-разработки Не надо встраивать ИИ в каждую корпоративную систему, это архитектурная ошибка Нейросети для дизайна интерьера: Выбираем лучший ИИ для генерации концептов и планировок квартиры Что там с Ил-114-300 Что такое DAS: как и зачем продукт-менеджеры саботируют запуск новых продуктов 8% компаний измеряют критическое мышление руководителей. Что делают остальные 92% CVE, Shell и побег из контейнера: испытываем возможности PT Cloud Application Firewall Как я научил Алису петь: генерация музыки по голосовой команде Восстановление данных с помощью бесплатной утилиты Easy Disk Checker Как мы построили сквозную аналитику в Power BI Год разработки iOS-игры, 266 тысяч показов и $33: как я делал Vault и почти ничего не заработал Ты прокрастинируешь потому, что избегаешь напрасных усилий, а не чрезмерных нагрузок Я построила диагностику «стоит ли это автоматизировать» — и она трижды говорила глупости. Разбор ошибок Как устроены world models, что показал Google на прошлой неделе и где это меняет gamedev и робототехнику Двухдневная рабочая неделя — будущий стандарт CPU не умер, он просто ждал. Китай строит двухэксафлопсный суперкомпьютер без единого GPU — прорыв, необходимость, фейк? 3Sound: поиск бесплатных звуков для игр больше не боль? 3 Тбит/с по-русски: почему DDoS в 2026 году стал угрозой для любого бизнеса 10 Гбит/с — зачем вам такая скорость передачи данных в облаке Ремонтируем аналоговый XY-самописец Endim 622 [Перевод] IPO компании SpaceX: хорошая попытка, но нет «Ща будет шрифт»: история одного русского embedded‑шрифта Как аквариум на подоконнике превратился в full-stack платформу с AI GiftsHub — из чат-бота в полноценный backend-продукт Пиратство, копирайт и DMCA: как Napster, The Pirate Bay и YouTube изменили закон. Часть II Как найти внутренние резервы для развития предприятия Как один французский чиновник от безысходности начал платил зарплаты картами и практически изобрёл банкноты RAG в энтерпрайзе: почему демо работает, а прод нет AI-агент для финансовых процессов: как мы научили ИИ считать числа из базе данных без галлюцинаций Автопостинг на 8 платформах: архитектура waterfall, custom publisher'ы и API-ловушки Кинетика против бронзы: Почему Голиаф был обречен в дуэли с Давидом [Перевод] Масштабирование LLM: от одного чипа до ЦОДа. Глава 2. Шардинг LLM не работает за вас. Она работает с вами Чем лучше защищает минеральный SPF, тем страшнее он выглядит Стимпанк как часть жизни. История паровых двигателей и место, которое они занимали в мире в XIX-XX веках. Часть 1 Гастарбайтеры ворвались в IT и зарабатывают на рекламе: тут вам не снег лопатой кидать Новые методы и инструменты: как мы обновили курсы по тестированию в Яндекс Практикуме Java 21 в стиле «клятый энтерпрайз» на одноплатном компьютере возрастом 13 лет Ваши секреты внутри LLM. Куда уходят промпты и чего стоит опасаться? 10× труда. 10% к бонусу. Главный риск AI-эпохи — это сениор AI-инженер, который умеет считать Сапожник с сапогами Минимум, который удержит тебя на плаву в период дедлайнов Как без проблем переносить курсы между платформами? Обзор формата SCORM Когда Claude Code ошибается не по своей вине: документационный долг в соло-проектах 70% кода с AI — и ни на день быстрее qrrot — база данных со встроенным ИИ Шахматные программы V. Оценочная функция Восстание масс в обществе спектакля и отчуждение труда в царстве количества: что делать во времена всеобщего упадка? Не умеешь работать с ИИ? Тебя заменит тот, кто умеет Как интеллект становится уязвимостью под давлением Не надо так: три типичные ошибки, которые приводят ко взлому Заметки про код-стайл в C++ Забытый мультиколор (часть 1) Культура ест стратегию на завтрак: почему не работает долгосрочное планирование Советское ИИ: Забытые гении Как оплатить iCloud в России в 2026 году без смены региона Apple ID Глубокая интеграция месседжинга с бизнес процессами в фреймворке NodaLogic Контекстные менеджеры в Python за пределами with open(): пишем свои и упрощаем код Пароль против уборщицы Выяснились детали мега-IPO SpaceX, а также первый прибыльный квартал Anthropic Люди с психическими расстройствами – новая нефть? Когда нейросети перестанут галлюцинировать? И почему на «что за дичь» они несут ещё большую дичь? Мессенджер HalChat теперь в Google Play: 3 года разработки, ИИ в браузере и квест с модерацией Реверс-инжиниринг Xiaomi Smart Band 10 Когда памяти мало Среда повседневности как объект проектирования: что общего у горца, серотониновой ямы и митохондрий AGENTS.md создавали, чтобы помогать агентам. Я использую его, чтобы их вычислять Почему устанавливают join_collapse_limit = 20 Почему устанавливают join_collapse_limit = 20 Эрик Рис, автор Lean Startup: Почему хорошие компании становятся плохими после IPO Context-driven Reusable Form Pattern: Масштабируемая архитектура для Create / Edit / Create-from-Source Пузырьковая сетка, кошачья стая и не только — неожиданные источники вдохновения для QoS-алгоритмов ___, или «Заголовок намеренно оставлен пустым» ИИ-боты сканируют даже логи TLS-сертификатов. Любая информация используется для обучения LLM Нейросеть оживить фото ИИ: Как оживить фото нейросетью в 2026 году? Разбираемся в ML без воды: от базы до Attention. Часть 5: Метрики качества В поисках «кофейного Грааля». Как человечество пытается сварить идеальный кофе и какие рецепты предлагают…математики Программатик: Часть 2 — OpenRTB Интернет до бесконечных лент: каким был 2010 год Перезапуск TrueIndex: что изменилось в рейтинге языков программирования Проектный холст: как менеджеру подбирать «краски» управления под разные команды «Метафизика в формулах: математическое ядро «Веры Паломника — Исход» Java и постквантовый TLS Marcli: Markdown Терминал Кнопочный смартфон с 5G за 2800 рублей — разбираем и изучаем китайскую диковинку Где неприятности — там и жизнь Разворачивайте платформы: stackfile
Хакатон Samsung IT Academy Hack 2026: как студенты оптимизировали поиск в корпоративном мессенджере
ch3rrydrunk · 2026-05-25 · via Все публикации подряд на Хабре

Время на прочтение6 мин

Охват и читатели12

Поиск — штука настолько привычная, что её редко рассматривают как отдельную инженерную задачу. На деле это связка из четырёх частей: парсинг и нормализация исходных данных, индексация, обработка пользовательского запроса и ранжирование результатов. Каждая из них живёт по своим правилам и ломается по своим причинам.

Сложно представить более прикладную область, поэтому на хакатоне IT Academy Hack 2026 от IT Академии Samsung Innovation Campus в этом году, мы решили попросить студентов предложить варианты улучшения поиска по сообщениям в контуре корпоративного мессенджера. Кстати, VK Tech стал индустриальным партнером конкурса уже во второй раз — предоставил инфраструктуру для студентов, и стал одним из постановщиков задач.

Меня зовут Сергей Харламов, я руковожу Исследовательской лабораторией VK Tech. В этой статье расскажу об актуальных проблемах оптимизации поиска, а также о задаче и подходах, которые можно было применить для ее решения. 

Немного контекста про поиск

При создании задачи, мы обратились к собственному опыту. Внутри VK WorkSpace — это наш корпоративный суперапп с почтой, мессенджером, календарём, облаком, доской и другими сервисами — поиском по сообщениям ежедневно пользуются более 20% активных пользователей. Это повседневный сценарий: люди не помнят, в каком чате обсуждали ссылку, договорённость или дату, и идут искать. Поэтому метрики качества поиска — точность выдачи и положение первого верного результата — это вполне продуктовая величина, а не академическое упражнение.

Важно, что поиск и рекомендации — разные задачи. В поиске пользователь знает, что ищет, и хочет получить конкретный результат. В рекомендациях точного запроса нет, система достраивает желание сама. Мы работаем именно с поиском.

И последнее общее место. Для классического поиска по тексту существуют две большие семьи индексов. Полнотекстовые индексы (например, Elasticsearch) хранят соответствие токен-документ и хорошо отрабатывают, когда запрос совпадает с документом по словам. Векторные индексы (например, Qdrant — это векторная СУБД, в которой объекты хранятся как векторы в пространстве смыслов) работают с эмбеддингами (векторами), то есть числовыми представлениями текста, в которых близкие по смыслу фрагменты лежат рядом. Они выручают, когда запрос и документ говорят об одном и том же разными словами. На практике обычно ставят оба индекса параллельно и склеивают результаты.

Из чего собирается поиск по сообщениям

Если разложить поиск на конвейер, получаются две независимые стадии.

Первая — индексация. Берём поток сообщений из чатов, режем его на куски (чанки), для каждого чанка получаем эмбеддинги (смысловой и полнотекстовый) и кладём всё это в индекс вместе с дополнительными полями, по которым потом будет фильтрация и ранжирование. Здесь важно не только что класть, но и как нарезать: окна разного размера и величина перекрытия (overlap) меняют, сколько контекста сохраняется внутри одного фрагмента.

Вторая — обработка запроса. На вход приходит вопрос пользователя, на выходе нужен ранжированный список ответов. Между ними — превращение исходного текста в один или несколько запросов к индексу, отбор кандидатов и реранкинг, то есть переупорядочивание результатов так, чтобы релевантные стояли ближе к началу. Запрос можно предобрабатывать: убирать мусор, доставать даты и сущности, использовать переформулировки. 

Чтобы понять, работает ли всё это в итоге, нужны метрики. Классика — точность (precision), полнота (recall) и средний обратный ранг (MRR — mean reciprocal rank, обратное число к позиции первого правильного ответа). Полноту в реальной разработке получить тяжело: часто непонятно, сколько вообще в корпусе релевантных документов. А вот точность и положение первого верного ответа в выдаче считать намного проще, и они достаточно близко отражают то, что чувствует пользователь.

Задача от VK Tech

В рамках хакатона мы предложили участникам улучшить метрики поиска по сообщениям, не выходя за рамки заданного пайплайна и инфраструктуры. От участников требовалось реализовать два сервиса – сервис индексации и сервис поиска.

Index Service. На вход он получает массив сообщений (в том числе сообщения для overlap) и должен вернуть текст получившихся чанков.
Помимо этого, мы решили дать участникам больше свободы, поэтому они могли строить смысловой и полнотекстовый эмбеддинги от разных представлений текста, а также менять модель построения полнотекстового вектора.

Search Service. На вход получает обогащенный запрос пользователя: исходный запрос был заранее дополнен нами метаинформацией, подобную которой в нашем production мы получаем «на лету» от LLM: массив переформулировок вопроса пользователя, гипотетических ответов (hyde – тексты, которые похожи на релевантные сообщениях), ключевые слова, дату вопроса, упоминания дат в тексте, и блок упомянутых в вопросе сущностей — люди, email’ы, документы, имена систем и ссылки. Возвращать сервис должен ранжированный список message_ids, где сверху самые релевантные.

Вычисление семантических векторов, реранжирование и хранение чанков происходило не на стороне участников, а в нашем контуре. Студентам было необходимо лишь сдать Docker образа сервисов в тестирующую систему, и она уже вычисляла score участников. 

Для каждого вопроса нашего датасета в оценивании мы учитывали только первые 50-и сообщений, полученных из сервиса поиска.
Метрики выбрали классические: 

  • Recall@50 — доля правильных сообщений. Например, если для вопроса было 2 эталонных сообщения, а сервис поиска нашёл только 1 – Recall будет 0.5.

  • nDCG@50 — оценивает не только факт нахождения правильных сообщений, но и их позиции в выдаче. Отличается от MRR тем, что учитывает не только первый найденный правильный результат, а все релевантные сообщения в топ-50

Итоговый score считался по формуле score = recall_avg 0.8 + ndcg_avg 0.2.
То есть основной вес оценки заключался в полноте найденных сообщений, а ранжирование имело дополнительный вклад. 

В качестве отправной точки мы выложили baseline, который укладывался в ограничения по времени и давал score равный пример 0.45.

Где можно было копать

Само построение базового решения — задача на несколько часов. Дальше начинается более содержательная часть: что именно крутить, чтобы метрики поползли вверх. В постановке мы выделили три направления, и они хорошо отражают, где у такого поиска вообще есть рычаги.

Первое — обогащение данных на этапе индексации. Baseline нарезает сообщения наивно (по символам, разрывая контекст между словами и предложениями) и игнорирует метаданные (участники переписки, даты и прочее). Можно играть с размером окна и перекрытием; можно вытаскивать из сообщений сущности и складывать их в отдельные поля; можно по-разному формировать тексты под смысловой и полнотекстовый вектора. 

Второе — обогащение поискового запроса. Как мы уже говорили ранее, вместе с исходным вопросом пользователя мы предоставляли поисковому сервису обширный массив метаданных. С помощью них можно было различные фильтры для запросов в Qdrant.

Третье — стратегия поиска и реранкинг. Базовое решение делает один поход к Qdrant и склеивает результаты простым RRF. Участникам же можно было делать несколько запросов в Qdrant для каждого запроса. Здесь большое пространство для экспериментов, так как можно собирать кандидатов несколькими разными запросами, расширять выборку и аккуратнее переупорядочивать её — в том числе через предоставленный rerank-API. 

Лучшие решения студентов

По итогам двухдневного хакатона абсолютным победителем в нашей задаче стала команда «азаза» (САФУ, Архангельск). Второе и третье места заняли команды «ИИКбо» (РТУ МИРЭА, Москва) и «Кофе с коньяком» (ЮУрГУ, Челябинск).

Команда-победитель грамотно воспользовалась всеми возможностями, которые мы предоставили. Они сделали качественную структурированную индексацию, активно использовали метаданные обогащающие поисковой запрос, а также сделали несколько подзапросов в Qdrant и поигрались с их слиянием и реранжированием. Что мы особенно оценили — е ребята не ограничились  классическим RRF, а добавили своё доп. награждение чанков, которые содержат«следы» метаданных поискового запроса.
Ну и гиперпараметры были подобраны очень хорошо — почти также, как в нашей продакшн-среде(размер чанка, размер скользящего окна и тд). Всё это позволило команде увеличить score до 0.6, превзойдя наш baseline на 0.15, что является значительным приростом.

Команда, занявшая второе место, предложила структурированный алгоритм, подобрала необычные гиперпараметры индексации (а именно меньший размер чанков, чем предложили мы) и грамотно реализовала  поиск в целом, а еще  отличилась аккуратной фильтрацией по временным диапазонам — это помогает значительно улучшить качество при правильном использовании.

Команда на третьем месте применила необычные правила индексации, от посимвольного разделения сообщений перешли на чанки на параметр “количество сообщений в чанке”, написали свой алгоритм реранжирования финального набора сообщений (а не чанков!) по ключевым словам и сделали подзапрос в Qdrant с поиском чанков по фильтрам упомянутых людей и сущностей

Что в итоге

В поиске по сообщениям можно долго добиваться идеала. Можно крутить чанкинг, можно собирать запрос из десятка подготовленных полей, можно перестраивать стратегию отбора и реранкинга, и каждый из этих рычагов влияет на метрики по-своему. Хакатон в этом смысле — удобный полигон: контракты зафиксированы, инфраструктура у всех одинаковая, проверка автоматическая, и фокус смещается с перебора моделей и их гиперпараметров на гипотезы и эксперименты с имеющимися данными и их обработкой.

Если вы сами делали поиск по похожим данным — чатам, переписке, тикетам, заметкам — расскажите в комментариях, какие приёмы у вас сработали, а какие наоборот не зашли. Особенно интересно про чанкинг и про то, как вы используете дополнительные поля запроса при ранжировании. И про места, где гибридный поиск с RRF упирается в потолок и приходится менять схему.  

Будем рады почитать и спасибо за прочтение статьи! 

P. S. Хочу закончить благодарностями команде разработки Исследовательской лаборатории VK Tech, которая участвовала в подготовке кейса, проведении хакатона и разборе решений студентов — Заман Габдрахманов, Backend-разработчик и Даниил Хасанов, Backend-разработчик и Владимир Северов, техлид команды.