Capstone: сквозной проект

Рейтинг: 64.6% · 12 голосов
Полный курс об устройстве веб-поиска: обход, индексирование, факторы ранжирования, нейропоиск, поведенческие сигналы, антиспам, SEO. 23 модуля по главам с разбором и обсуждением.
Ответить
Аватара пользователя
kirill_ir
Сообщения: 25
Зарегистрирован: 11 май 2026, 05:31

Capstone: сквозной проект

Сообщение kirill_ir »

Оглавление курса (23)
  1. Введение
  2. Теоретический фундамент (Information Retrieval)
  3. Краулинг (обход)
  4. Идентичность документа: каноникализация и дубли
  5. Индексирование и хранение
  6. Обработка и понимание запроса
  7. Текстовая релевантность
  8. Анализ ссылочного графа
  9. Таксономия факторов ранжирования
  10. Машинное обучение ранжированию (Learning-to-Rank)
  11. Нейросетевой поиск (Neural IR)
  12. Поведенческие сигналы и клик-модели
  13. Каскад ранжирования и обслуживание (serving)
  14. Инфраструктура и распределённое обслуживание
  15. Метапоиск и федерация источников
  16. Группировка, схлопывание, разнообразие
  17. Постранжирование, антиспам и качество выдачи
  18. Свежесть и реалтайм
  19. Локализация, гео и персонализация
  20. Измерение качества и эксперименты
  21. SEO: оптимизация под факторы
  22. Этика, приватность и борьба со злоупотреблениями
  23. Capstone: сквозной проект (вы здесь)
Часть VII · ~12 ч · Сложность: (продвинутый) · Пререквизиты: весь курс (Модули 0–21)
Обзор модуля

Этот модуль не вводит новых идей — он связывает всё, что вы изучили, в один работающий организм. До сих пор каждое звено конвейера «обход → индекс → факторы → ранжирование → выдача → постобработка → измерение» вы разбирали по отдельности: краулер (Модуль 2), каноникализатор (Модуль 3), обратный индекс (Модуль 4), понимание запроса (Модуль 5), BM25 и текстовая релевантность (Модуль 6), ссылочный граф (Модуль 7), таксономия факторов (Модуль 8), learning-to-rank (Модуль 9), нейропоиск (Модуль 10), поведенческие сигналы (Модуль 11), каскад L0–L3 (Модуль 12), инфраструктура (Модуль 13), метапоиск и федерация (Модуль 14), группировка и разнообразие (Модуль 15), постранжирование и антиспам (Модуль 16), свежесть (Модуль 17), локализация и персонализация (Модуль 18), измерение и эксперименты (Модуль 19), SEO (Модуль 20), этика (Модуль 21). Capstone требует увидеть систему целиком: как изменение в одном звене аукается в трёх других, где спрятаны бюджеты латентности и где теряется recall.

В сквозном конвейере этот модуль — смотровая площадка над всем маршрутом. Глава 22.1 проводит сквозную трассировку «путь одного запроса»: одна и та же пара (документ, запрос) прослеживается от момента, когда краулер впервые увидел URL, до того, почему документ оказался на 3-й позиции выдачи в 14:32 для пользователя из конкретного региона. Глава 22.2 даёт развёрнутое поэтапное техническое задание на учебный мини-поисковик (стенд) — реализуемый за разумное время проект, где каждый этап опирается на свой модуль и имеет явные критерии приёмки. Глава 22.3 описывает защиту проекта, типовые кейсы и рубрику оценивания, чтобы и студент, и проверяющий работали по одной шкале.

После модуля вы сможете не только реализовать поиск «от веба до позиции», но и объяснить причинно-следственные связи внутри него: почему документ не нашёлся (recall на L0), почему нашёлся, но низко (фактор/формула), почему его обогнал сосед (постранжирование, разнообразие), почему позиция изменилась завтра (свежесть, переобучение модели, дрейф клик-модели).
Интуиция. Представьте, что весь курс — это разбор отдельных органов: сердце, лёгкие, печень. Capstone — это вскрытие живого организма в движении: вы прослеживаете, как один импульс (запрос) проходит по всем системам сразу, и собираете из деталей работающее тело (мини-поисковик).
Как читать по трекам
  • Студент CS — обязательно всё. Ядро — глава 22.1 (трассировка как способ проверить, что вы понимаете связи между алгоритмами) и этапы 1–5 проекта (краулер → индекс → BM25 → факторы → LTR). Реализуйте стенд руками; метапоиск и постранжирование (этапы 6–7) — минимум как заглушки.
  • Инженер поиска/ML — обязательно всё, особенно инженерные заметки про бюджеты, кэш, воспроизводимость и измерение (этап 8). Стенд — повод отработать сквозную наблюдаемость (логирование «пути запроса») и офлайн-оценку. Реализуйте все 8 этапов.
  • SEO-специалист — обязательно глава 22.1 целиком (она показывает, на какие звенья вы реально влияете и где «обрыв провода» убивает документ), этапы 1–4 и 6–7 проекта — хотя бы как наблюдатель. Вывод формул LTR — обзорно; зато трассировку «почему мой документ не на месте» разберите досконально.
  • Смешанный/руководитель — Обзор, глава 22.1, рубрика 22.3. Проект — на уровне ТЗ и критериев приёмки: вы должны уметь поставить такую задачу команде и принять её.
Карта модуля
  • 22.1. Сквозной разбор «путь одного запроса»: от обхода и индексации документа до его позиции в выдаче (продвинутый)
  • 22.2. Проект: учебный мини-поисковик (стенд) — поэтапное ТЗ от краулера до оценки (продвинутый)
  • 22.3. Защита проекта, разбор кейсов и рубрика оценивания (средний)
Глава 22.1. Сквозной разбор «путь одного запроса» (продвинутый)

Цели обучения

После главы студент сможет:
  • Провести сквозную трассировку конкретного документа от обхода до позиции в выдаче, называя на каждом шаге ответственный компонент и модуль.
  • Объяснить, где на маршруте документ может «потеряться» (recall) и где — «упасть в позиции» (precision/ранжирование).
  • Различать офлайн-ветвь (обход → индекс → факторы) и онлайн-ветвь (запрос → каскад → выдача) и точку их встречи.
  • Связать наблюдаемый симптом («документа нет в выдаче», «он слишком низко») с конкретным звеном-причиной.
  • Использовать «путь запроса» как инструмент отладки реальной поисковой системы.
Конспект

«Путь одного запроса» — это центральный учебный приём всего курса (он анонсирован в README). Идея проста: берём одну конкретную пару — документ D и запрос q — и проходим весь конвейер по шагам, не пропуская ни одного звена. На каждом шаге фиксируем три вещи: (1) что происходит с D, (2) кто отвечает (компонент + модуль), (3) как здесь можно потерять или сдвинуть документ.

Удобно разделить маршрут на две ветви, которые сходятся в индексе.

Код: Выделить всё

ОФЛАЙН-ВЕТВЬ (заранее, асинхронно):
  [веб] → краулер → каноникализатор → индексатор → (факторы документа) → ИНДЕКС
                                                                            │
ОНЛАЙН-ВЕТВЬ (в момент запроса, за десятки мс):                            ▼
  q → понимание запроса → L0 отбор кандидатов ←──────────────────── читает ИНДЕКС
                              → L1 быстрые факторы
                              → L2 главная модель (LTR/нейро)
                              → L3 реранк
                              → метапоиск/федерация
                              → группировка/разнообразие
                              → постранжирование/антиспам
                              → СТРАНИЦА ВЫДАЧИ (позиция D)
Интуиция. Офлайн-ветвь — это «подготовка склада»: товар (документ) приехал, его распаковали, описали, разложили по полкам. Онлайн-ветвь — «выдача заказа»: пришёл покупатель (запрос), кладовщик за секунды нашёл подходящее, сравнил варианты и выложил витрину. Если товар не разложили — его не выдадут, как ни старайся на витрине.
Сквозная трассировка по шагам

Возьмём конкретику. Документ D — страница рецепта, URL https://site.example/recipe/plov?utm=ad. Запрос q = «как приготовить плов». Прослеживаем.

Шаг 1. Обнаружение и обход (Модуль 2).
Планировщик обхода (crawl scheduler) узнаёт об URL из ссылки на уже известной странице или из карты сайта, проверяет правила обхода (robots), назначает приоритет и вежливый темп (politeness), скачивает HTML.
  • Где теряется D: URL запрещён правилами обхода; страница не связана ссылками («сирота») и нет в карте сайта; краулер счёл её низкоприоритетной и не дошёл; сервер отдал ошибку/таймаут.
  • Симптом наверху: документа вообще нет в выдаче, и в инструментах для вебмастеров он «не обойден».
Шаг 2. Идентичность документа: каноникализация и дубли (Модуль 3).
Каноникализатор отбрасывает шум URL (?utm=ad), приводит к канонической форме, выявляет, что это дубль или почти-дубль другой страницы, и выбирает одного представителя кластера (canonical).
  • Где теряется D: представителем кластера выбран не он, а другая копия; его контент схлопнут как near-duplicate (Модуль 3, shingling/SimHash).
  • Симптом наверху: в выдаче «вместо моей» показывается другая версия страницы.
Шаг 3. Индексирование (Модуль 4).
Индексатор парсит HTML, извлекает текст и зоны (title, заголовки, тело, анкоры), токенизирует, нормализует (Модуль 5 даёт тот же анализатор, что и для запроса!), строит/обновляет обратный индекс (inverted index): для каждого терма — постинг-лист с D и позициями. Сохраняет прямой документ-стор для сниппетов.
  • Где теряется D: контент рендерится только JS, а индексатор не исполнил его; важные слова попали в зону с низким весом; рассинхрон анализаторов запроса и документа (слово «плов» в индексе нормализовано иначе, чем в запросе) — тогда L0 его не найдёт.
Внимание. Анализатор документа и анализатор запроса (Модуль 5) обязаны совпадать. Если на индексации применили стемминг, а на запросе нет (или другой) — постинг-листы и термы запроса не сойдутся, и D выпадет уже на L0. Это классический «обрыв провода» между офлайн- и онлайн-ветвью.
Шаг 4. Факторы документа считаются заранее (Модули 7, 8, 11, 17).
Часть сигналов не зависит от запроса и вычисляется офлайн и кладётся рядом с документом: статический авторитет из ссылочного графа (PageRank-подобный, Модуль 7), агрегированные поведенческие признаки (Модуль 11), метки свежести/timestamp (Модуль 17), язык/гео (Модуль 18), сигналы качества/спама (Модуль 16).
  • Где сдвигается D: низкий статический авторитет (мало входящих ссылок) — D стартует с гандикапом; помечен как «возможный спам/низкое качество» — получит штраф позже.
Здесь офлайн-ветвь заканчивается. D лежит в индексе с набором заранее посчитанных факторов. Дальше — онлайн.

Шаг 5. Понимание запроса (Модуль 5).
Пришёл q = «как приготовить плов». Парсер запроса нормализует (тот же анализатор!), исправляет опечатки, снимает многозначность, расширяет синонимами, классифицирует интент (информационный → нужен рецепт/инструкция, а не магазин), определяет язык и регион.
  • Где сдвигается D: классификатор интента переключает формулу ранжирования под класс запроса (Модуль 12) — для «как приготовить» в топ полезут пошаговые инструкции, и рецепт-D выигрывает; для коммерческого интента — проиграл бы.
Шаг 6. L0 — отбор кандидатов (Модули 4, 10, 12).
Каскад начинается. По термам запроса (приготовить, плов; стоп-слово «как» может отсеяться) система пересекает/объединяет постинг-листы и/или делает ANN-поиск по эмбеддингам (Модуль 10). Из ∼10⁹ документов остаётся ∼10³–10⁵ кандидатов. D либо попал в кандидаты, либо нет.
  • Где теряется D: термов запроса нет в его постинг-листах (см. Шаг 3); векторный отбор не дотянулся. Потеря recall на L0 необратима — ни одна последующая стадия документ не вернёт.
SEO-врезка. Попасть в кандидаты L0 — необходимое условие ранжирования. Никакая оптимизация заголовков и ссылок не поможет, если документ не извлекается на L0. Сначала проверяйте «индексируется и находится по слову», потом — позицию.
Шаг 7. L1 — быстрые факторы (Модули 6, 12).
На ∼10³–10⁵ кандидатах считается дешёвый скор: BM25 (Модуль 6) по зонам, совпадение фраз, простые статические факторы из Шага 4. Кандидаты сортируются, до следующей стадии доходят ∼10²–10³.
  • Где сдвигается D: слабый BM25 (редкие вхождения термов, длинный документ — нормировка длины), нет фразового совпадения. Если выпал из топ-n L1 — до умной модели не дойдёт.
Шаг 8. L2 — главная модель (Модули 8, 9, 10, 11).
На ∼сотнях кандидатов работает обучаемая модель ранжирования (learning-to-rank, Модуль 9) или нейромодель (Модуль 10). Она объединяет десятки/сотни факторов из таксономии (Модуль 8): текстовые, ссылочные (Модуль 7), поведенческие (Модуль 11), свежесть (Модуль 17), гео/перс (Модуль 18). Выдаёт точный скор.
  • Где сдвигается D: модель обучена на разметке, где для «как приготовить» инструкции ценнее; D с хорошим поведенческим сигналом (досматривают рецепт) поднимается. Дрейф клик-модели (Модуль 11) меняет позицию со временем.
Шаг 9. L3 — реранк (Модуль 12).
На горстке топ-документов работает самая дорогая модель/cross-encoder, уточняя порядок верхушки.
  • Где сдвигается D: тонкая разница смысла; здесь решаются «фотофиниши» за 1–3 позиции.
Шаг 10. Метапоиск и федерация (Модуль 14).
К органической выдаче подмешиваются вертикали (картинки, видео, карты, свежие новости) — движок федерации решает, вставлять ли блок и на какое место. Веб-результат D может быть сдвинут вниз вставленным блоком.
  • Где сдвигается D: над ним встал блок видео-рецептов; его «позиция 3» теперь визуально ниже.
Шаг 11. Группировка, схлопывание, разнообразие (Модуль 15).
Несколько страниц одного сайта схлопываются (host collapsing); выдача диверсифицируется, чтобы покрыть разные интенты («рецепт», «видео», «калорийность»).
  • Где сдвигается D: с того же домена уже есть результат выше — D схлопнут под него; или выдаче «не хватало разнообразия», и D подняли как другой поджанр.
Шаг 12. Постранжирование и антиспам (Модуль 16).
Финальные правила: штрафы за спам/накрутку, бусты/деусты по политике качества, фильтры безопасного поиска.
  • Где сдвигается D: словил штраф из Шага 4 (помечен низкокачественным) — упал; либо, наоборот, чистый и поднялся относительно зашумлённых соседей.
Шаг 13. Свежесть и реалтайм (Модуль 17), Локализация/персонализация (Модуль 18).
Если запрос чувствителен к свежести — свежие документы получают буст; гео/язык/история пользователя корректируют порядок под конкретного человека и регион.
  • Где сдвигается D: для пользователя из другого региона/на другом языке D мог бы и не попасть в топ — позиция персональна.
Шаг 14. Страница выдачи.
Собирается SERP. D занимает, скажем, позицию 3 в 14:32 для пользователя из заданного региона. Эта позиция — равнодействующая всех 13 шагов, а не свойство документа.
Заблуждение. «У документа есть позиция.» Нет: позиция существует только для пары (запрос, пользователь, момент, регион, устройство) и есть результат прохождения всего конвейера. Завтра при том же запросе она может быть другой (свежесть, переобучение L2, новый конкурент в индексе).
«Путь запроса» как инструмент отладки

Сила приёма в том, что он превращает диагностику в последовательную проверку звеньев. Симптом → подозреваемое звено:

Код: Выделить всё

Симптом                                     |  Первый подозреваемый шаг
--------------------------------------------+---------------------------------------------------------------------
Документа вообще нет в выдаче               |  Шаг 1–3 (обход/каноникал/индексация) или Шаг 6 (L0 recall)
Показывается другая версия страницы         |  Шаг 2 (выбор canonical)
Находится по точной фразе, но не по смыслу  |  Шаг 6 (только лексический L0, нет векторного)
Низкая позиция при наличии слов             |  Шаг 7–8 (BM25/факторы/модель)
Был высоко, упал за ночь                    |  Шаг 8 (переобучение/дрейф), Шаг 12 (новый штраф), Шаг 13 (свежесть)
Виден коллеге, не виден мне                 |  Шаг 13 (персонализация/гео)
Над ним «чужой блок»                        |  Шаг 10 (федерация вертикали)
Инженерная заметка. Чтобы такая отладка была возможна на реальной системе, нужна сквозная наблюдаемость: лог решения по каждому документу-кандидату на каждой стадии («дошёл до L1 со скором X, отсеян на L2 порогом Y, оштрафован правилом Z»). В мини-поисковике (глава 22.2) это требование вынесено в явный критерий приёмки — «трассируемость пути запроса».
Частые заблуждения
Заблуждение. «Если документ в индексе — он будет в выдаче.» Между «в индексе» и «в выдаче» лежат L0-отбор (recall) и весь каскад. Документ может быть проиндексирован, но не извлечён на L0 (рассинхрон анализаторов, нет термов), и тогда наверху его нет.
Заблуждение. «Ранжирование — это одна формула.» Это конвейер из стадий (L0–L3) плюс постобработка (федерация, разнообразие, антиспам, персонализация). Итоговая позиция — суперпозиция, а не выход одной функции.
Заблуждение. «Чтобы понять, почему документ низко, достаточно посмотреть на факторы документа.» Нужно знать, на каком шаге он отсеялся/просел. Хорошие факторы бесполезны, если потеря произошла раньше (на L0) или позже (штраф постранжирования).
Лаба / практика

Возьмите реальный публичный запрос и любую страницу из топа (или используйте свой стенд из 22.2). Постройте таблицу-трассировку из 14 шагов: для каждого шага запишите (а) что происходит с документом, (б) ответственный модуль курса, (в) гипотезу «где здесь документ мог бы потеряться/просесть». Затем для трёх симптомов из таблицы отладки сформулируйте конкретный диагностический эксперимент (что измерить/проверить, чтобы подтвердить или опровергнуть гипотезу).
Время ~90 мин. Критерий «сделано»: пройдены все 14 шагов без пропусков, каждый привязан к модулю; для трёх симптомов предложены проверяемые эксперименты, а не общие слова.

Контрольные вопросы
  1. В какой точке встречаются офлайн- и онлайн-ветви конвейера и почему именно там?
  2. Почему потеря документа на L0 необратима, а просадка на L2 — нет?
  3. Приведите два разных звена, на каждом из которых документ может «исчезнуть» из выдачи, и объясните разницу симптомов.
  4. Почему «позиция документа» — не свойство документа? Перечислите минимум четыре переменные, от которых она зависит.
  5. Как рассинхрон анализаторов запроса и документа проявится на маршруте и на каком шаге?
  6. Пользователь видит документ на позиции 5, коллега из другого города — не видит вовсе. Какой шаг проверять первым?
  7. Документ находится по точной фразе, но пропадает при перефразировке. Что это говорит об устройстве L0?
  8. Как сквозная наблюдаемость («лог пути») меняет процесс отладки по сравнению с осмотром только факторов документа?
Глава 22.2. Проект: учебный мини-поисковик (стенд) (продвинутый)

Цели обучения

После главы студент сможет:
  • Спроектировать и реализовать сквозной поиск из независимых этапов, каждый с явным контрактом вход/выход.
  • Превратить теорию модулей 2–19 в работающий код на ограниченном корпусе.
  • Сформулировать и проверить критерии приёмки для каждого этапа (а не «вроде работает»).
  • Построить офлайн-оценку качества и измерять эффект изменений (Модуль 19).
  • Обеспечить воспроизводимость и трассируемость пути запроса.
Конспект

Стенд — это намеренно уменьшенная, но полная по структуре копия конвейера. Масштаб корпуса — от тысяч до десятков тысяч документов (хватает локальной машины), но все звенья присутствуют, пусть и в упрощённом виде. Язык-агностично; ориентир — Python + любой простой стор (файлы/SQLite). Ниже — поэтапное ТЗ. Каждый этап: цель → вход → выход → что делаем → критерий приёмки → отсылка к модулю. Этапы строятся друг на друге; рекомендуется делать строго по порядку и не переходить дальше, пока критерий приёмки текущего не выполнен.
Инженерная заметка. Сквозной принцип всего стенда: контракты между этапами стабильны, реализации — заменяемы. Этап 5 (LTR) должен уметь встать на место этапа 3 (BM25) без переписывания краулера. Поэтому фиксируйте форматы артефактов (что лежит в индексе, какой JSON у кандидата, какие поля у фактора) с самого начала.
Общие требования (применяются ко всем этапам)
  • Воспроизводимость: фиксированный seed, фиксированный корпус, команда «прогнать всё с нуля» работает на чистой машине.
  • Трассируемость (см. 22.1): по флагу --trace система печатает путь конкретного документа по стадиям (дошёл/отсеян/скор/штраф).
  • Конфиг, не магические числа: параметры (k1, b, веса факторов, размеры топов стадий) — в конфиге.
  • Офлайн-оценка с этапа 1: даже до ранжирования держите файл с эталонной разметкой (запрос → релевантные документы), он понадобится на каждом следующем этапе.
Этап 1. Краулер (Модуль 2, 3)
  • Цель: собрать локальный корпус документов и их метаданные.
  • Вход: список стартовых URL (или готовый дамп — допустимо, чтобы не зависеть от сети) и правила обхода.
  • Выход: хранилище сырых документов: doc_id, исходный URL, канонический URL, HTML/текст, метки времени, исходящие ссылки.
  • Что делаем: обход по ссылкам с ограничением глубины и вежливым темпом; соблюдение robots; каноникализация URL и отсев точных дублей по хешу контента (упрощённый Модуль 3).
  • Критерий приёмки: ≥ N документов собрано; повторный запуск не плодит дубли (идемпотентность каноникализации); граф исходящих ссылок сохранён (нужен этапу 4); лог «обойдено/пропущено/запрещено robots».
Этап 2. Индекс (Модуль 4, 5)
  • Цель: построить обратный индекс и документ-стор.
  • Вход: корпус из этапа 1.
  • Выход: обратный индекс терм → постинг-лист (doc_id, tf, позиции, зона); прямой стор для сниппетов; словарь статистик (df, длины документов, avgdl).
  • Что делаем: единый анализатор (токенизация, нижний регистр, нормализация/стемминг, стоп-слова) — тот же модуль применяется и к документам, и позже к запросам; разметка зон (title/h1/body/anchor).
  • Критерий приёмки: по слову из документа он находится в постинг-листе; статистики (df, avgdl) считаются; анализатор вынесен в общую функцию (доказать, что запрос и документ проходят один код); boolean-поиск «И/ИЛИ» по термам возвращает корректное множество.
Внимание. Критерий «общий анализатор» — не формальность: это страховка от самого частого сквозного бага (Шаг 3/6 в 22.1).
Этап 3. BM25 (Модуль 6)
  • Цель: дать первый осмысленный ранжирующий скор.
  • Вход: индекс и статистики из этапа 2; запрос.
  • Выход: список (doc_id, bm25_score), отсортированный.
  • Что делаем: реализовать BM25 с параметрами k1, b из конфига; зонирование (вес title выше body) — опционально как BM25F.
  • Критерий приёмки: на мини-корпусе порядок совпадает с ручным эталоном из лабы Модуля 6; изменение b от 0 до 1 даёт ожидаемый эффект нормировки длины (проверить на длинном и коротком документе); прогон по эталонной разметке даёт ненулевые nDCG/MAP (базовая точка отсчёта для всех следующих этапов).
Этап 4. Простые факторы (Модуль 7, 8, 17)
  • Цель: добавить запросо-независимые сигналы.
  • Вход: граф ссылок (этап 1), метки времени, BM25 (этап 3).
  • Выход: для каждого документа — вектор факторов: bm25, статический авторитет (итеративный PageRank-подобный по сохранённому графу, Модуль 7), freshness (Модуль 17), длина/зоны, простые признаки качества.
  • Что делаем: посчитать офлайн запросо-независимые факторы; собрать комбинированный скор-заглушку как взвешенную сумму (веса — в конфиге). Это «ручной LTR» перед настоящим.
  • Критерий приёмки: PageRank-подобный вектор сходится (норма стабилизируется), сумма ≈ 1; авторитетные узлы (много входящих) получают больший вес; взвешенная сумма факторов измеримо двигает выдачу относительно чистого BM25 (показать на эталоне, лучше/хуже — обе ситуации обсудить).
Этап 5. LTR (Модуль 8, 9)
  • Цель: заменить ручные веса обучаемой моделью ранжирования.
  • Вход: вектор факторов (этап 4) + эталонная разметка (запрос, документ, метка релевантности).
  • Выход: обученная модель + функция score(features) → real, встроенная в каскад на место заглушки этапа 4.
  • Что делаем: сформировать обучающую выборку (фичи на парах запрос–документ), обучить pointwise- или pairwise-модель (Модуль 9), строго разделить train/test (Модуль 19), сравнить с бейзлайном BM25 и ручной суммы.
  • Критерий приёмки: на отложенном тесте nDCG/MAP не хуже ручной суммы (этап 4) и BM25 (этап 3); нет утечки (train и test по разным запросам); важность факторов выведена и осмыслена («что модель ценит»).
Этап 6. Метапоиск / федерация (Модуль 14)
  • Цель: показать сборку выдачи из нескольких источников.
  • Вход: основной органический ранкер (этап 5) + ≥1 «вертикаль» (например, отдельный индекс свежих документов или картинок-заглушек).
  • Выход: объединённый список с возможной вставкой блока вертикали на позицию.
  • Что делаем: простое слияние с нормировкой скоров источников; правило «вставлять ли блок вертикали и куда» (триггер по интенту из Модуля 5).
  • Критерий приёмки: скоры разных источников нормированы к сравнимой шкале; блок вертикали появляется только при заданном триггере; органические результаты не теряются, лишь сдвигаются (трассировка показывает сдвиг).
Этап 7. Постранжирование (Модуль 15, 16)
  • Цель: довести список до «человеческой» выдачи.
  • Вход: объединённый список (этап 6).
  • Выход: финальный SERP топ-k.
  • Что делаем: схлопывание по хосту (host collapsing, Модуль 15), простое разнообразие (не более M результатов одного поджанра/домена подряд), антиспам-штраф по простому правилу (Модуль 16, например за переспам ключевого слова — связь с заблуждением из Модуля 6).
  • Критерий приёмки: один домен не занимает весь топ; документ, искусственно «переспамленный» в тесте, получает штраф и опускается; каждое правило логируется в трассировке (какой документ за что сдвинут).
Этап 8. Оценка (Модуль 19)
  • Цель: измерять качество и эффект изменений — а не верить на глаз.
  • Вход: эталонная разметка (запрос → релевантность) и любой ранкер из этапов 3/4/5/7.
  • Выход: отчёт с метриками (Precision@k, nDCG@k, MAP) по каждому этапу-ранкеру и сравнительная таблица «эволюция качества».
  • Что делаем: реализовать метрики (Модуль 19), прогнать все версии ранкера на одной разметке, построить таблицу «BM25 → +факторы → LTR → +постранжирование», обсудить, где прирост, где регресс и почему; (бонус) макет A/B-сравнения двух конфигов.
  • Критерий приёмки: метрики реализованы корректно (проверены на игрушечном примере с известным ответом); таблица эволюции построена; для каждого перехода между этапами дан причинно-следственный комментарий со ссылкой на соответствующий модуль.

Код: Выделить всё

Сводный конвейер стенда (этапы ↔ модули):
1 Краулер ───────── M2,M3
2 Индекс ────────── M4,M5
3 BM25 ──────────── M6
4 Факторы ───────── M7,M8,M17
5 LTR ───────────── M8,M9
6 Метапоиск ─────── M14
7 Постранжирование  M15,M16
8 Оценка ────────── M19      (пронизывает все этапы)
Сквозное: трассировка (22.1) + воспроизводимость + конфиг
Заблуждение. «Сначала напишу весь поиск, потом прикручу оценку.» Тогда вы не узнаете, какое изменение что улучшило. Оценка (этап 8) и эталонная разметка нужны с этапа 1: каждый последующий этап обязан показывать дельту метрики.
Частые заблуждения
Заблуждение. «Стенд маленький, можно срезать каноникализацию/анализатор/трассировку.» Именно эти «скучные» звенья дают самые частые сквозные баги (см. 22.1). Их отсутствие делает проект неотлаживаемым.
Заблуждение. «LTR без разметки — обучим на кликах сами себе.» На учебном стенде кликов нет; нужна явная эталонная разметка с разделением train/test, иначе метрика лжёт (утечка).
Лаба / практика

Реализуйте стенд до этапа 5 включительно (краулер → индекс → BM25 → факторы → LTR) на корпусе ≥ 2–5 тыс. документов и подготовьте эталонную разметку на ≥ 20 запросов. Постройте таблицу метрик для трёх ранкеров (BM25 / ручная сумма / LTR) на отложенном тесте. Включите режим --trace для одного запроса.
Время ~6–8 ч (распределённо). Критерий «сделано»: все четыре этапа проходят свои критерии приёмки; LTR на тесте не хуже бейзлайнов; трассировка печатает путь документа по стадиям; всё запускается одной командой с чистого состояния.

Контрольные вопросы
  1. Почему контракты между этапами фиксируют раньше реализаций?
  2. Зачем эталонная разметка нужна уже на этапе 1, а не на этапе 8?
  3. Какой единственный общий компонент обязаны делить этапы 2 и 5-онлайн, и почему?
  4. Как доказать, что в LTR нет утечки между train и test?
  5. Чем «ручная взвешенная сумма» (этап 4) полезна как ступень перед настоящим LTR?
  6. Что должна показывать трассировка --trace, чтобы быть полезной для отладки?
  7. Почему host collapsing и разнообразие относятся к постранжированию, а не к L2-модели?
  8. Какой минимальный набор метрик нужен, чтобы заявить «новая версия лучше»?
Глава 22.3. Защита проекта, разбор кейсов и рубрика оценивания (средний)

Цели обучения

После главы студент сможет:
  • Подготовить и провести защиту сквозного проекта: демо + объяснение решений.
  • Объяснить любое наблюдаемое поведение выдачи через причинно-следственную трассировку (22.1).
  • Самостоятельно оценить проект по прозрачной рубрике и понять, чего не хватает.
  • Разобрать типовые кейсы-инциденты и локализовать причину в конвейере.
Конспект

Формат защиты

Защита проверяет не «запускается ли код», а понимание связей. Структура (≈20–30 мин):
  1. Демо (5–7 мин): живой прогон запроса от и до; показать выдачу и сразу — --trace для одного документа.
  2. Архитектура (5 мин): карта этапов ↔ модулей, контракты между этапами.
  3. Эволюция качества (5 мин): таблица метрик BM25 → факторы → LTR → постранжирование, с объяснением каждого перехода.
  4. Защита решений (Q&A): проверяющий задаёт «что будет, если…» и кейсы (ниже). Главный навык — отвечать через путь запроса, называя звено.
Инженерная заметка. Сильная защита звучит не «я добавил PageRank», а «freshness-фактор поднял свежие документы по чувствительным запросам на +X nDCG, но просадил вечнозелёные — поэтому я ограничил буст триггером интента из Модуля 5; вот трассировка». Связь решение → эффект → измерение → модуль.
Типовые кейсы для разбора (инциденты)

Проверяющий даёт симптом, студент локализует звено и предлагает проверку:
  • Кейс A. «Документ есть в корпусе, но не находится по очевидному слову». Подозрение: рассинхрон анализаторов (этап 2) или потеря на L0. Проверка: прогнать слово через анализатор запроса и документа, заглянуть в постинг-лист.
  • Кейс B. «По запросу весь топ — с одного сайта». Подозрение: не работает host collapsing (этап 7). Проверка: трассировка правил постранжирования.
  • Кейс C. «После добавления LTR метрика упала». Подозрение: утечка/переобучение или плохие фичи (этап 5). Проверка: разделение train/test, важность факторов, сравнение с бейзлайном.
  • Кейс D. «Свежая страница не обгоняет старую по новостному запросу». Подозрение: freshness не подключён к формуле или не триггерится интентом (этапы 4/6, Модули 17/5).
  • Кейс E. «Переспамленная страница в топе». Подозрение: нет антиспам-штрафа (этап 7, Модуль 16); напоминание про насыщение BM25 (Модуль 6).
  • Кейс F. «У двух проверяющих разная выдача». Подозрение: персонализация/гео (Модуль 18) или невоспроизводимость (нет фиксированного seed/конфига).
Пример. Кейс C на защите: студент показывает, что nDCG на train рос, а на test падал; делит запросы train/test без пересечения, переобучает — регресс исчезает. Это идеальный ответ: симптом → гипотеза (утечка) → проверка → исправление → измерение.
Рубрика оценивания

Сумма 100 баллов; порог зачёта — обычно 60. Каждый критерий оценивается по факту (демо + код + ответы).

Код: Выделить всё

#  |  Критерий                   |  Что проверяется                                                                    |  Баллы
---+-----------------------------+-------------------------------------------------------------------------------------+-------
1  |  Полнота конвейера          |  Присутствуют все 8 этапов (хотя бы минимально); ни одно звено не выпало            |  20
2  |  Корректность ядра          |  Индекс/анализатор согласованы; BM25 верен; PageRank сходится; метрики верны        |  20
3  |  LTR и измерение            |  Модель обучена без утечки; на тесте не хуже бейзлайнов; таблица эволюции качества  |  15
4  |  Постобработка выдачи       |  Федерация/схлопывание/разнообразие/антиспам работают и логируются                  |  10
5  |  Трассируемость             |  --trace показывает путь документа по стадиям; помогает отладке                     |  10
6  |  Воспроизводимость          |  Запуск с нуля одной командой; seed/конфиг; нет магических чисел                    |  10
7  |  Понимание связей (защита)  |  Студент объясняет поведение через «путь запроса», решает кейсы A–F                 |  15
Внимание. Критерии 5–7 (трассируемость, воспроизводимость, понимание) часто недооценивают студенты — а это 40 баллов. «Работает на моей машине без объяснения почему» — это не сданный capstone.
Уровни выполнения (для самопроверки)
  • Базовый (60–74): этапы 1–5 и 8 работают, метрики честные, защита по трассировке проходит.
  • Уверенный (75–89): + этапы 6–7, чистое измерение без утечек, осмысленная важность факторов, решены большинство кейсов.
  • Отличный (90–100): + полная трассируемость и воспроизводимость, аккуратный разбор регрессов, обоснование каждого решения связкой эффект↔модуль, бонусы (BM25F, макет A/B, векторный L0).
Частые заблуждения
Заблуждение. «Главное — чтобы поиск красиво выдавал результаты на демо.» Демо без объяснения и без измерения не доказывает понимания. Рубрика отдаёт 40 баллов за то, чего на красивой выдаче не видно: трассировку, воспроизводимость и разбор кейсов.
Заблуждение. «Если метрика выросла — этап точно полезен.» Рост на train при падении на test — это переобучение, а не польза. Capstone требует мерить на отложенном тесте и уметь это объяснить.
Лаба / практика

Проведите взаимную защиту в паре: один играет автора, второй — проверяющего по рубрике и кейсам A–F. Заполните таблицу-рубрику на 100 баллов с конкретными замечаниями по каждому критерию, затем поменяйтесь ролями. Для двух самых слабых критериев сформулируйте план доработки.
Время ~60 мин. Критерий «сделано»: рубрика заполнена с обоснованием каждого балла; разобраны минимум четыре кейса из A–F; составлен план доработки слабых мест.

Контрольные вопросы
  1. Почему на защите ценится объяснение «через путь запроса», а не перечисление сделанных функций?
  2. В кейсе «весь топ с одного сайта» — какое звено и какой этап стенда проверять первым?
  3. Как на защите доказать, что прирост метрики от LTR реален, а не переобучение?
  4. Почему трассируемость и воспроизводимость весят в рубрике столько же, сколько ядро алгоритмов?
  5. Студент показал растущий nDCG только на train. Какой вердикт и почему?
  6. Сформулируйте, чем отличается ответ «отличного» уровня от «базового» на одном и том же кейсе.
  7. Какие два критерия рубрики чаще всего недооценивают и почему это дорого стоит?
  8. Какой минимальный набор артефактов нужно показать на демо, чтобы закрыть критерий «полнота конвейера»?
Итоги модуля
  • Поиск — это единый конвейер из двух ветвей (офлайн: обход→индекс→факторы; онлайн: запрос→каскад→выдача), сходящихся в индексе; позиция документа — равнодействующая всех звеньев, а не его свойство.
  • Приём «путь одного запроса» — главный инструмент и обучения, и отладки: он привязывает каждый симптом к конкретному звену-причине.
  • Потеря на L0 (recall) необратима; просадки на поздних стадиях — поправимы. Сначала «находится ли», потом «на каком месте».
  • Самый частый сквозной баг — рассинхрон анализаторов запроса и документа; общий код анализатора — обязательная страховка.
  • Учебный стенд должен быть полным по структуре (все 8 этапов), пусть и маленьким по корпусу; контракты между этапами важнее конкретных реализаций.
  • Оценка не пристёгивается в конце — эталонная разметка и метрики живут с первого этапа, каждый шаг доказывается дельтой качества на отложенном тесте.
  • На защите оценивается понимание связей, трассируемость и воспроизводимость — 40 баллов рубрики за то, чего «красивая выдача» не показывает.
  • LTR полезен, только если он измеримо не хуже бейзлайнов на тесте без утечки; рост на train ничего не доказывает.
Глоссарий модуля
  • Путь одного запроса — сквозная трассировка пары (документ, запрос) через все звенья конвейера от обхода до позиции в выдаче.
  • Офлайн-ветвь — часть конвейера, выполняемая заранее: обход, каноникализация, индексация, расчёт запросо-независимых факторов.
  • Онлайн-ветвь — часть конвейера в момент запроса: понимание запроса, каскад L0–L3, постобработка, сборка выдачи.
  • Стенд (учебный мини-поисковик) — уменьшенная, но структурно полная реализация конвейера для учебных целей.
  • Контракт этапа — фиксированный формат входа/выхода между этапами, позволяющий менять реализацию без переписывания соседей.
  • Трассируемость пути запроса — способность системы по запросу показать судьбу конкретного документа на каждой стадии (дошёл/отсеян/скор/штраф).
  • Эволюция качества — сравнительная таблица метрик по версиям ранкера (BM25 → факторы → LTR → постранжирование).
  • Рубрика — прозрачная шкала оценивания проекта по взвешенным критериям.
Связи с другими модулями
  • Опирается на весь курс. Офлайн-ветвь: Модули 2 (краулинг), 3 (каноникализация), 4 (индексирование), 5 (анализатор/понимание), 7 (граф), 17 (свежесть). Онлайн-ветвь и ранжирование: 5 (интент), 6 (BM25), 8 (факторы), 9 (LTR), 10 (нейропоиск), 11 (клики), 12 (каскад L0–L3). Выдача: 14 (федерация), 15 (разнообразие), 16 (антиспам/постранжирование), 18 (персонализация). Измерение: 19. Прикладной взгляд: 20 (SEO). Ответственность: 21.
  • Куда дальше. Capstone — финал курса. Дальнейший рост — углубление в выбранный трек: инженеру — Модули 12–13 (serving, инфраструктура) на проде; исследователю — 9–10 (LTR/нейро); SEO — 8, 16, 20 в связке с трассировкой из 22.1.
Материалы для углубления
  • Классические обзоры по архитектуре веб-поисковых систем и сквозному конвейеру (end-to-end IR pipelines).
  • Учебные руководства по построению поисковых стендов на открытых корпусах и стандартных коллекциях для оценки.
  • Работы и обзоры по офлайн-оценке ранжирования (nDCG/MAP, train/test-протоколы) — для корректного измерения эволюции качества.
  • Методические материалы по проектному оцениванию инженерных capstone-проектов (рубрики, защита, разбор инцидентов).
👍3 ❤️1 🔥 😄 🤔5
Аватара пользователя
rjcrem
Сообщения: 1
Зарегистрирован: 17 май 2026, 11:57

Re: Capstone: сквозной проект

Сообщение rjcrem »

ага, вот теперь сложилась вся картина зачем в начале курса так долго мучили с каноникализацией. без дедупликации на этапе индекса у меня в выдаче капстона лезли по три копии одной страницы, и никакое ранжирование это уже не чинило
👍 ❤️1 🔥2 😄 🤔1
Аватара пользователя
grisha7
Сообщения: 1
Зарегистрирован: 12 май 2026, 13:57

Re: Capstone: сквозной проект

Сообщение grisha7 »

вопрос по capstone: на каком этапе конвейера обход-индекс-ранжирование вы советуете рвать на сервисы? мы пробовали собрать всё монолитом и инвертированный индекс с ранжированием в одном процессе - на 2 млн документов всё легло по памяти, пришлось выносить индекс отдельно
👍2 ❤️ 🔥2 😄 🤔
Аватара пользователя
rhachis
Сообщения: 1
Зарегистрирован: 31 май 2026, 05:46

Re: Capstone: сквозной проект

Сообщение rhachis »

собрал сквозной проект на выходных, и самым больным местом оказалась не математика BM25 и не PageRank, а постобработка и сборка страницы. пока не сделал нормальный кэш на этап ранжирования, latency на запрос был под секунду. звено измерение реально открывает глаза где затыки
👍1 ❤️1 🔥1 😄 🤔1
Ответить
← Предыдущая глава
Этика, приватность и борьба со злоупотреблениями

Все главы курса «Поисковые системы: индексирование, факторы ранжирования и формирование выдачи»

Поделиться темой: ✈ Telegram VK

Вернуться в «Поисковые системы: индекс, факторы, выдача»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость