К содержанию
Yottis yottis.ru · план работ · сентябрь 2026

Поисковая система, а не обёртка над чужим API

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

Пять чисел, при одновременном выполнении которых продукт считается состоявшимся. Это единственный критерий приёмки; всё остальное вторично.

pFound@10 по оценкам асессоров
0.62
Запросов без единого релевантного результата
<3%
Задержка выдачи, p99
300 мс
Покрытие топ-3 конкурента
95%
Новость крупного СМИ в индексе
10 мин

01Тезис

Поисковая система существует, только если у неё есть три собственных актива. Метапоиск в духе SearXNG исключён сознательно: он не даёт контроля над качеством, умирает при отключении доноров и не создаёт актива.

АктивЧто означаетПочему нельзя одолжить
Свой обход Сами ходим по вебу, сами решаем, что и как часто перечитывать Чужой обход — чужие приоритеты и чужая свежесть
Свой индекс Храним и умеем искать по собственной копии веба Без него нельзя ни считать признаки, ни отвечать за полноту
Своё ранжирование Формула порядка результатов принадлежит нам Это и есть продукт: всё остальное — витрина над ним
Ставка

Глубина по рунету раньше, чем ширина по миру. Попытка «сразу как Google» — это 50–500 ПБ хранения и сотни миллионов долларов в год, и она гарантированно провалится по качеству: 100 млн документов с хорошим ранжированием лучше, чем 10 млрд с плохим.

Главный урок из разбора конкурентов

Google публично перечисляет действующие системы ранжирования — и отдельно указывает, что Panda (2011, качество), Penguin (2012, ссылочный спам), Hummingbird (2013, семантика) и система полезного контента (влита в 2024) больше не выделяются: они встроены в ядро.

Вывод для нас прямой: не строить эти механизмы отдельными подсистемами. Сразу закладывать признаки качества и антиспама внутрь единой ML-формулы, а не поверх неё фильтрами. Это экономит цикл рефакторинга, который Google проходил тринадцать лет.

Второй урок — из утечки кода Яндекса 2023 года. Она вскрыла около 1 922 именованных фактора ранжирования, из которых больше трети оказались неиспользуемыми или устаревшими. Ценность не в списке факторов, а в порядке величины: промышленное ранжирование — это тысячи признаков, треть которых мертва в любой момент. Значит, нужен реестр признаков с владельцем, версией, тестами и датой протухания, а не просто «побольше фичей».

02Что берём с GitHub

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

ПроектЛицензияРоль
Tantivy
quickwit-oss/tantivy
MIT Ядро индекса. Библиотека сегментного инвертированного индекса на Rust, примерно вдвое быстрее Lucene. Именно библиотека — шардирование, репликация и ранжирование остаются нашими
CatBoost
catboost/catboost
Apache-2.0 Основная модель L2. Открытый наследник MatrixNet от самого Яндекса, с listwise-функцией потерь YetiRank, спроектированной под поисковое ранжирование
DiskANN
microsoft/DiskANN
MIT Векторный индекс на NVMe: ~5000 QPS при recall@1 выше 95% и задержке менее 5 мс на миллиарде векторов, одна машина, 64 ГБ RAM
Rspamd
rspamd/rspamd
Apache-2.0 Антиспам почты: байес, нейросети, нечёткие хеши, 60+ модулей. Примерно в 10 раз быстрее SpamAssassin на тех же правилах
Mox
mjl-/mox
MIT Почтовый сервер: MTA-STS и DANE из коробки, упор на корректность. MIT позволяет заимствовать код напрямую
Trafilatura / Resiliparse Apache-2.0 Извлечение текста. Resiliparse на всём корпусе (быстрее, полнее), Trafilatura на кандидатах (точнее, F1 0.859)
ClickHouse, Kafka, PostgreSQL, etcd Apache-2.0 Данные и координация. ClickHouse — буквально «склад кликстрима», 10⁴–10⁵ событий/с
Natasha, pymorphy3, SymSpell MIT Русская морфология и исправление опечаток за O(1)
Marginalia, Stract AGPL-3.0 Не линкуем — читаем. Две работающие независимые поисковые системы с полностью открытым кодом. Лучший существующий источник по тому, как это делается малой командой
Quickwit Apache-2.0 Модель сплитов на объектном хранилище — для холодного слоя. Их замер: 1 млрд страниц = 6.8 ТБ на S3, но задержка 1–2 с, что для SERP неприемлемо
Elasticsearch, Nutch, Heritrix, Manticore разные Не берём: спроектированы под другую задачу — логи, архивирование, пакетный обход
Холодный старт

Common Crawl отдаёт более 2 млрд страниц в каждом месячном обходе бесплатно — около 250 ТБ на срез. Это снимает примерно год работы на первичном наполнении индекса. Данные бесплатны, обработка — нет: считаем её в том же облаке, где они лежат.

03Архитектура

Два независимо масштабируемых контура. Единственная точка соединения — публикация новой версии индекса. Разделение принципиально: офлайн может лежать час, и пользователь не заметит; онлайн лежать не может вообще.

ОФЛАЙН — НАПОЛНЕНИЕ ИНДЕКСА ОНЛАЙН — ОБСЛУЖИВАНИЕ ЗАПРОСА Фронтир приоритет + вежливость Загрузка WARC, robots.txt Экстракция текст, язык, дубли Граф PageRank, TrustRank Индексация сегменты, векторы Публикация версия в etcd новая версия индекса → шарды Запрос edge, TLS Понимание опечатки, намерение Смеситель веер по шардам Шарды × N L0 + L1 Ранжирование L2 + L3 Выдача сниппеты, HTML

Цветом выделен критический путь. Всё остальное — колдунщики, генеративный «Ответ», нейро-реранкер — отбрасывается по таймауту без отказа: пользователь всегда получает выдачу.

Шардирование — по хосту, а не по URL

Ключ hash(host) mod N даёт три выигрыша сразу: правило «не более двух результатов с сайта» применяется локально в шарде; хостовые признаки грузятся один раз; дедупликация внутри сайта не требует сети. Плата — перекос по крупным сайтам, который лечится вторичным расщеплением.

Три слоя индекса

СлойСодержимоеНосительОбновлениеДоля ответов
ГорячийТоп ~2% по трафику и авторитету + всё свежее за 48 ч RAM + NVMeминуты~85%
ТёплыйОсновной корпус NVMe1–3 суток~14%
ХолодныйДлинный хвост, архив Объектное хранилищенеделя~1%

04Ранжирование

Воронка: на каждом уровне кандидатов меньше, а модель дороже. Схема повторяет то, к чему независимо пришли Google (PageRank+IR → RankBrain → BERT) и Яндекс (базовый поиск → MatrixNet → YATI).

L0 Отбор кандидатов BM25F + BlockMax WAND, параллельно ANN по векторам и SPLADE, слияние через RRF млрд → 10 тыс.
L1 Предранжирование Линейная модель на ~40 дешёвых признаках, в шарде 10 тыс. → 1 тыс.
L2 Основная формула CatBoost YetiRank, ~600 признаков, семейство моделей по классам запроса 1 тыс. → 50
L3 Нейро-реранк Кросс-энкодер по парам запрос×пассаж, ONNX int8 50 → 30
L4 Пост-обработка Дедупликация, разнообразие сайтов, вертикали, колдунщики 30 → 10

Гибридный поиск строится сразу целиком, а не «сначала BM25, потом когда-нибудь векторы»: ретроспективное добавление второго ретривера ломает всю калибровку L2. Публичные замеры: только плотный поиск даёт recall@10 ≈ 78%, только BM25 ≈ 65%, гибрид ≈ 91%.

Метрика — pFound, а не NDCG

pFound моделирует реальное поведение: человек читает выдачу сверху вниз, пока не найдёт ответ или не устанет. Вероятность прерывания принимается 0.15, оценки асессоров отображаются в вероятность релевантности от 1.0 (витальная) до 0 (мусор). NDCG считаем тоже — для сопоставимости с литературой.

Как не закрепить собственные ошибки

Ранжирование обучается на кликах по собственной выдаче, а документ, который никогда не показывали, никогда не получит кликов. Поэтому с фазы 3 обязательны 1–2% exploration-трафика со случайным документом из позиций 11–50 — это единственный источник несмещённых данных — и counterfactual-обучение на нём.

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

05Бюджет задержек

Цель: p50 ≤ 120 мс, p99 ≤ 300 мс от прихода запроса до последнего байта HTML. Бюджет распределён заранее, и каждое новое включение в критический путь требует отдельного архитектурного решения — это защита от медленного сползания.

Edge + TLS 12 мс Понимание запроса 18 мс Шарды L0+L1 90 мс Слияние 25 мс L2 CatBoost 25 мс L3 нейро-реранк 70 мс Сниппеты 35 мс Сборка HTML 18 мс

Самый дорогой сегмент — нейро-реранкер, и он же первый кандидат на отбрасывание при перегрузке: без L3 качество падает, выдача остаётся.

06Всемирный поиск

Требование — искать по сайтам всего мира, быстро и качественно. Расширяться сразу на все языки — верный способ получить плохое качество везде, поэтому порядок захвата определяется двумя вещами: сколько это стоит и сколько с этого пользы.

ВолнаЯзыкиДокументов ФазаПочему в этой очереди
1Русский0.3 млрд1–2 Домашний сегмент конечен: здесь достижимо «не хуже Яндекса»
2Английский8 млрд3 Нужен всем, включая русскоязычных: технические и научные ответы
3de, fr, es, pt, it6 млрд4 Латиница, схожая морфология — переиспользуется обработка волны 2
4tr, pl, uk, kk, uz2 млрд4 Соседние рынки, где Яндекс присутствует слабо
5zh, ja, ko8 млрд5 Самая дорогая волна: нет пробелов между словами — нужна сегментация, свои модели и отдельная команда
6ar, hi, id, vi…6 млрд5–6 По мере появления спроса

Ключевое архитектурное решение

Расхожий совет «один индекс на язык» верен для коллекций до миллиона документов и вреден для веба: многоязычные страницы попадают не туда, кросс-языковые запросы не работают, а число индексов растёт вместе с числом языков. Google не случайно держит единый индекс.

Наше решение промежуточное: шардирование по паре hash(языковой кластер, хост). Кластеров шесть, а не сорок языков — cyr, lat-w, lat-e, cjk, rtl, ind, — и добавление языка внутрь кластера почти бесплатно. Языковой фильтр отсекает шарды целиком, а внутри кластера сохраняется хостовая локальность.

Правило маршрутизации

Запрос идёт в свой кластер плюс lat-w. Неочевидно и важно: русскоязычный пользователь на технический запрос почти всегда хочет видеть и англоязычные результаты. Отсекать их по языку — потерять лучший ответ.

Семь механизмов скорости

«Быстро и качественно» на тридцати миллиардах документов — не одна оптимизация, а семь механизмов, каждый со своим порядком выигрыша.

МеханизмВыигрышЧто делает
Отсечение шардов по языку и региону×4–6 Читаются только релевантные кластеры. Самый дешёвый выигрыш из всех
BlockMax WAND×10–50 Блок, не способный дать документ в топ, пропускается без декодирования
Трёхслойный индекс85% Столько запросов не касается медленных носителей вообще
Кэш выдачи25–40% Распределение запросов степенное; это самые дешёвые ответы в системе
Ранний выход по таймауту Неполный ответ за 300 мс лучше полного за 2 секунды
Приближённый векторный поиск×100 Сознательно теряем проценты полноты ради двух порядков скорости
Каскад с сужающейся воронкой Нейро-реранкер на всех кандидатах занял бы часы на один запрос

Без этих механизмов отбор кандидатов на 30 млрд документов занял бы около 40 секунд, ранжирование — минуты. С ними p99 держится в 290 мс.

Геораспределение

Скорость — это ещё и физика: сигнал из Москвы в Сан-Паулу и обратно идёт около 230 мс только по кабелю. DNS с геопривязкой выбирает ближайший регион, anycast маршрутизирует внутри него. Региональный ДЦ хранит горячий и тёплый слои только тех языковых кластеров, которые в его регионе спрашивают — Франкфурту не нужен полный cjk на NVMe.

07Хранилища данных

Вопрос «на какой базе работает проект» имеет неожиданный ответ: ни на какой одной. Все, кто дошёл до веб-масштаба, пришли к разделению на специализированные хранилища.

СистемаСтек хранения
Google Colossus (файловая система, метаданные в Bigtable) + Spanner — более 2 млрд запросов в секунду на пике, свыше 6 ЭБ под управлением + Percolator для инкрементальной индексации. Три разных системы, а не одна
Яндекс YTsaurus — платформа хранения экзабайтного масштаба, открыта в 2023; ClickHouse — колоночная аналитика; YDB — транзакционная. Тот же вывод

У поисковой системы восемь классов хранилищ, и требования классов 1, 3, 5 и 6 взаимно исключающие: одна база не может быть одновременно оптимальной для случайного чтения на NVMe, потоковой записи ста тысяч ключей в секунду, аналитических сканов и ACID-транзакций.

КлассОбъёмФазы 1–2Фазы 3–5
Индекс600 ТБTantivy + NVMe+ сплиты на S3
Документы и WARC730 ТБSeaweedFSSeaweedFS / Ceph
CrawlDB (URL → состояние)30 млрд ключей RocksDB в шардеScyllaDB
Веб-граф22 ТБСвой компактный формат — не база
Аналитика и кликстрим400 ТБClickHouse
Транзакционное2 ТБPostgreSQL + Patroni+ шардирование / YDB
Кэш и сессии500 ГБValkey
Координациямегабайтыetcd
Два решения, которые часто делают неправильно

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

Инвертированный индекс не кладут в базу. Слой абстракции убивает то, ради чего индекс существует. Сегменты лежат файлами на NVMe и читаются через mmap.

08Структура под ИИ

Требование — заранее заложить возможность ИИ-функционала во все модули, не пользуясь им сейчас. Добавить модель в готовую систему технически несложно. Сложно другое:

Что ломается при позднем добавленииПочему
Бюджет задержекИИ-функция съедает 50–150 мс. Без резерва её добавление означает пересмотр всей архитектуры обслуживания
Схема документаВекторы и оценки моделей — это поля. Добавление поля в индекс на 10 млрд документов = полная переиндексация, недели работы
Контракты между сервисамиЕсли в ответе шарда нет места под оценку модели, её добавление ломает всех потребителей
Приватность и правоОтправка пользовательских данных в модель без заранее описанной политики — юридический инцидент, а не техническая задача
СтоимостьБез учёта в бюджете инференс внезапно оказывается крупнейшей статьёй расходов

Отсюда правило: структура закладывается сразу, реализация — по мере надобности. Заглушка, возвращающая «функция выключена», стоит день работы. Пересмотр архитектуры — квартал.

Единый шлюз и три обязательных свойства

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

1 Отбрасываемость Ни одна ИИ-функция не в критическом пути. Модель недоступна или ответила за пределами срока — система работает дальше с деградированным результатом deadline_ms
2 Наблюдаемость Каждый вызов пишется: функция, модель, версия, время, стоимость, уверенность, факт деградации. Без этого модель неотлаживаема журнал
3 Обратимость Каждая функция за флагом с долей трафика. Функция, которую нельзя выключить за минуту, в продакшн не выкатывается флаг

Точки закладки размечены в каждом модуле — от оценки ценности URL во фронтире до слота суммаризации в почте. Двадцать три точки, из которых в фазах 1–2 работают три; остальные существуют как поля в схемах, флаги со значением off и зарезервированные миллисекунды в бюджете.

Красная линия по данным

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

09Регион и админ-часть

Откуда пришёл человек

Регион — один из самых сильных сигналов в поиске и обязательная часть аналитики. Определяется пятью источниками со строгим приоритетом: явный выбор пользователя, оператор в запросе, геолокация браузера, база GeoIP, язык и домен как запасной вариант.

Честная оговорка о точности

Потолок точности на уровне города — около 85%, и это ограничение самих данных, а не конкретного поставщика. Поэтому регион всегда виден пользователю и меняется одним кликом, а ранжирование не ломается при неверном регионе: региональный признак влияет, но не отсекает.

Ключевая метрика качества здесь — доля ручных смен региона. Если в каком-то городе пользователи массово меняют определённый регион, GeoIP там врёт, и это видно раньше, чем поступят жалобы. Цель — не более 4%.

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

Админ-часть

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

ПринципПочему
Каждое действие в журналеИзменение, которого нет в журнале, считается инцидентом безопасности
Доступ по ролям, а не «админ ко всему»Модератору не нужен доступ к персональным данным; аналитику не нужны санкции
Опасные действия — со вторым подтверждающимПросмотр истории пользователя, санкция, изменение реестра скрытия, смена ролей
Роль «Аудитор»Видит только журнал — включая действия администратора — и не может ничего менять. Роль существует, чтобы за администратором тоже наблюдали

Чего админ-часть не делает: не показывает содержимое писем (тайна связи), не даёт читать историю поиска «просто посмотреть» и не позволяет вручную поднять сайт в выдаче. Последнее принципиально: такая возможность рано или поздно превращается в товар, поэтому технически её не существует.

10Фазы работ

Отсчёт от сентября 2026. 386 задач в восьми фазах, каждая описана одинаково: зачем, что делаем, критерий готовности, зависимости, исполнители, оценка, способ проверки, риск. На выходе из каждой фазы — числовые ворота; не пройдены — фаза продлевается, а не закрывается.

Три правила планирования

Фазу закрывают ворота, а не календарь. Переход дальше «потому что по плану пора» запрещён: в поиске накопленный долг по качеству не отдаётся, он умножается на следующей фазе.

Сокращается объём, а не качество. Если фаза не укладывается, режется список возможностей, но не пороги качества, не тесты и не документация. Возможность можно добавить позже; репутацию поисковика, который «иногда ничего не находит», вернуть нельзя.

Детализация убывает с горизонтом. Фазы 0–3 расписаны с оценками по неделям, фазы 4–6 — полностью описаны, но оценки в них заметно менее точны и пересматриваются на выходе из фазы 2. Планировать сороковой месяц с точностью второго — самообман.

Фаза 0сен–ноя 2026
6 человек
23 задачи

Фундамент

Доказать, что связка обход → индекс → ранжирование сходится по качеству на малом масштабе. Всё написанное здесь будет переписано: цель — не код, а снятие неопределённости. Параллельно с первой недели — домен, площадка, страница о боте.

1 млн документовpFound ≥ 0.35 F1 извлечения ≥ 0.80страница /bot опубликована бэкап восстановлен
Фаза 1дек 2026 – июн 2027
14 человек
65 задач

Ядро

Распределённый индекс, непрерывный обход, кабинет вебмастера, аккаунты, закрытая альфа. Теперь код пишется надолго. Кабинет вебмастера включён в MVP: без него бот не будет принят вебом, а забаненный бот означает пустой индекс.

50 млн документовpFound ≥ 0.48 300 стр/с50 сайтов в кабинете 1000 пользователей
Фаза 2июл 2027 – янв 2028
26 человек
66 задач

Качество

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

300 млн документовpFound ≥ 0.58 антиспам: точность 0.95Метрика на 2000 сайтов 100 тыс. пользователей/мес
Фаза 3фев – окт 2028
45 человек
57 задач

Масштаб

Публичный запуск. Два миллиарда документов, английский сегмент, генеративный ответ, публичный интерфейс, дистрибуция, круглосуточное дежурство. Главная веха программы.

2 млрд документовpFound ≥ 0.62 p99 ≤ 300 мс при 1500 QPSдоступность 99.95% 10 000 оценок в неделю1 млн пользователей/мес
Фаза 4ноя 2028 – окт 2029
70 человек
27 задач

Полнота

Закрыть пробелы, из-за которых пользователь уходит даже при сопоставимом качестве веб-поиска: товары, локальный поиск на партнёрской картографии, мобильные приложения, одиннадцать языков, реклама.

10 млрд документовpFound ≥ 0.66 5 млн пользователей/месмобильных ≥ 50% 11 языков с измеренным качеством
Фаза 5ноя 2029 – окт 2030
100 человек
15 задач

Зрелость

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

30 млрд документовpFound ≥ 0.70 20 млн пользователей/месположительная юнит-экономика цикл гипотезы ≤ 3 недель
Фаза 6с ноя 2030
120+ человек
10 направлений

Развитие

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

цикл ≤ 3 недельдоступность 99.97% стоимость запроса снижаетсяантиспам не деградирует
Трек Mс фазы 2
8 → 22 человека
56 задач

Почта — параллельный трек

Отдельная команда, чтобы не конкурировать с поиском за людей. M0 — юридические ворота: требование хранить содержимое всех сообщений полгода даёт около 270 ТБ на миллион ящиков сверх пользовательского хранилища. Пока это не посчитано и не подтверждено юристом, писать код почтового сервера бессмысленно.

M0: решение записано M1: доставляемость ≥ 98%M1: ни одного потерянного письма M3: выручка покрывает расходы трека
Документы — единственный источник

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

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

11Что берём у Яндекса

Экосистема Яндекса — более 90 сервисов. Скопировать её нельзя и не нужно. Каждая возможность прошла три фильтра подряд: польза (улучшает качество поиска, даёт данные или дистрибуцию), достижимость (по силам команде из 14–45 человек за одну фазу), фокус (не превращает нас в компанию другого бизнеса).

Третий фильтр самый важный и самый нарушаемый. Яндекс может позволить себе такси, потому что у него уже есть поиск с долей рынка. У нас поиска ещё нет.

Три позиции, меняющие траекторию проекта

Из сорока разобранных возможностей тридцать семь — это работа по списку. Три — определяющие.

Ф2 Yottis Метрика — счётчик веб-аналитики Разрывает круг «нет трафика → нет поведенческих данных → нет качества → нет трафика». Счётчик на чужих сайтах даёт данные о том, что человек делал после перехода, — то есть поведенческие признаки приходят раньше, чем появятся собственные пользователи. Самая недооценённая часть силы Яндекса критический
Ф3 Yottis Задания — краудсорсинг разметки Пропускная способность оценки качества — узкое место всего проекта с фазы 3: нужно 10–50 тыс. оценок в неделю, штатный пул в 150 асессоров столько не выдаёт. Где асессорам нужны дни, краудсорсингу нужны часы. Платформа — на базе Label Studio высокий
Ф3 Расширение для браузера Самый дешёвый канал дистрибуции: одна кодовая база на Chrome, Firefox и Edge. Без дистрибуции качество никто не увидит, а без пользователей не будет данных для его улучшения критический

Остальное — по фазам

Что берёмФазаЗачем
Региональность выдачи, справочник регионов1 Для рунета критично: «шиномонтаж» в Москве и Омске — разные запросы
Операторы, совместимые с яндексовскими1 Не переучивать пользователя
Проверка URL и анализатор robots.txt1 Публичные инструменты вебмастера — без них нас не пустят обходить сайты
Колдунщики: калькулятор, время, перевод → погода, курсы, определения 1–2Плотность колдунщиков — то, в чём Яндекс сильнее Google, и это реально экономит клики
Семейный поиск, детский режим с PIN2 Требование 436-ФЗ
Оригинальные тексты3 Автор отправляет текст до публикации, мы фиксируем время — сильнейший сигнал первоисточника против воровства контента
Yottis Радар: публичная статистика долей рынка3 Стоит копейки поверх данных Метрики, даёт постоянное цитирование
Поиск по сайту для вебмастеров3 Бесплатно для сайта; для нас — дистрибуция и данные о тематических запросах
Справочник организаций, отзывы, локальный поиск4 Рейтинг считается внутри категории — иначе кафе сравниваются с автосервисами
Явные отказы — записаны в план намеренно

Турбо-страницы не делаем. Google прошёл этот путь с AMP и свернул его, придя к простой мысли: лучшая ускоренная версия страницы — это сама страница, сделанная быстрой. Повторять чужую отменённую ошибку незачем, а цена — команда, годами поддерживающая формат, от которого отрасль отказалась.

Так же не делаем: собственный браузер (постоянная команда на безопасность Chromium), собственную картографию (отдельная компания стоимостью в наш пятилетний бюджет), такси, еду, музыку, маркетплейс, банк и голосового помощника как отдельный продукт. Отказы записаны в план явно, чтобы к ним не возвращались каждые полгода.

12Почта

Отдельный трек с отдельной командой, старт не раньше выхода из фазы 2: до этого весь ресурс уходит на качество поиска, и распыление убьёт оба продукта.

Зачем поисковику почта

Почта — якорь аккаунта: поисковик меняют за секунду, ящик — годами. Но главный довод технический: у нас уже есть то, что почте нужнее всего. Полнотекстовый поиск с русской морфологией — то же Tantivy-ядро. Классификаторы текста — те же. И самое ценное:

Преимущество, которого нет ни у кого

Mail.ru проверяет ссылки в письмах через внешний сервис репутации. У нас источник репутации собственный и на порядки полнее: мы сами обошли эти сайты и знаем их возраст, ссылочное окружение, hostRank, TrustRank и spamScore.

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

Целевые показатели и как мы делаем иначе

ПоказательЦельКомментарий
Полнота отсева спама≥ 95% Планка Mail.ru
Ложные срабатывания≤ 0.05% Главная метрика. Пропущенный спам раздражает; потерянное деловое письмо разрушает доверие навсегда. В функции потерь ложное срабатывание весит примерно в 200 раз больше пропуска
Доставляемость во «Входящие» Gmail≥ 98% Требует полного набора SPF, DKIM, DMARC, ARC, MTA-STS, DANE и восьминедельного прогрева IP до открытия
Поиск по ящику в 50 тыс. писем, p95≤ 200 мс То же ядро, что в вебе. Объективно сильнее, чем у Яндекса и Mail.ru, потому что для нас это побочный продукт уже построенного

Чего мы не делаем: рекламы в списке писем, сканирования содержимого для рекламных профилей, непрозрачной папки «Спам». По каждому письму в спаме показывается конкретная причина — не прошёл DKIM, ссылка ведёт на домен возрастом три дня, 4 812 одинаковых писем за час.

Фаза M0 — это ворота, а не формальность

Почтовый сервис в России подпадает под статью 10.1 149-ФЗ как организатор распространения информации: реестр Роскомнадзора, хранение содержимого всех сообщений полгода («пакет Яровой»), метаданных — год, СОРМ.

Это около 270 ТБ на миллион ящиков сверх пользовательского хранилища, в отдельном контуре: пользователь удалил письмо — из его ящика оно исчезло, из контура хранения нет. Пока это не посчитано и не подтверждено юристом, писать код почтового сервера бессмысленно. Готовность отказаться от почты, потеряв только два месяца анализа, — часть плана.

13Продвижение

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

Круг, который надо разорвать

Нас не находят → нет вебмастеров → бот не принимают → индекс не наполняется → нет пользователей → нет кликов → нечему учить ранжирование → качество не растёт → нас не за что находить.

Что индексируем и что закрываем

Страницы выдачи закрыты жёстко — и в robots.txt, и мета-тегом noindex. Причина двойная: бесконечное пространство URL и дубли — раз; индексировать чужую выдачу не принято, и мы не создаём такой возможности у себя — два.

Открыто и приоритетно: документация, публичные инструменты вебмастера, правила для сайтов, отчёты о прозрачности, исследования, инженерный блог.

Наше несправедливое преимущество

Обычному сайту приходится придумывать, о чём писать. У нас другая ситуация: мы производим данные, которых нет ни у кого. Отчёты о прозрачности, статистика долей рынка, исследования веба на собственном индексе — «сколько сайтов рунета на HTTPS», «средний вес страницы», «доля мёртвых ссылок». Никто, кроме владельца индекса, такое не посчитает, и на такие данные принято ссылаться.

Ни один пункт не является «SEO-контентом» в дурном смысле — это побочные продукты того, что мы и так делаем.

Шесть скриптов

СкриптЧто делаетФаза
Генератор sitemaplastmod берётся из системы контроля версий, а не проставляется вручную; при изменениях — пуш через IndexNow1
Аудит SEO в CILighthouse, пороги скорости и размеров, валидация разметки, canonical и заголовки. Нарушение — сборка падает1
Пуш об измененияхIndexNow в Bing и Яндекс, URL Inspection API в Google1
Монитор индексацииСверка sitemap с панелями; отклонение > 5% — оповещение2
Монитор видимостиЯдро из 1 000 запросов по 5 регионам, только официальными методами2
Валидатор разметкиВнутренний в CI и публичный для вебмастеров — одна работа, два применения2
Чего не делаем никогда

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

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

14Домен и площадка

Инфраструктура — Timeweb Cloud, хостинг кода — Repobase (self-hosted Forgejo), CI/CD — Forgejo Actions. Работы идут с первой недели фазы 0 параллельно разработке: домен должен отстояться в DNS задолго до того, как понадобится.

ШагЧто делаемКогда
Доменыyottis.ru в Timeweb + защитные yottis.рф и yottis.com, автопродление, оформление на юрлицонед. 1
VPS4 vCPU / 8 ГБ / 80 ГБ NVMe: SSH по ключам, ufw, fail2ban, автообновления безопасностинед. 1–2
DNSNS Timeweb, записи A, AAAA, CNAME, CAA, SPF, DMARC. TTL 300 на боевых — переключение за 5 минут, а не за суткинед. 2
TLSNginx + Let's Encrypt на четыре имени, HTTP/2, HSTS, автопродлениенед. 2–3
Витринаyottis.ru и /demo с макетами нед. 3–4
Страница ботаyottis.ru/bot: описание YottisBot, диапазоны IP, как ограничить обход. Публикуется до первого внешнего запроса краулера нед. 3–4
Обратный DNSPTR для IP краулера, проверка в обе стороны — иначе вебмастер не отличит нас от подделки и забанитнед. 4–5
CI/CDВторой VPS под агент Forgejo Actions, выкатка по SSH с откатом через симлинкнед. 4–6
МониторингВнешняя проверка доступности у другого провайдера — иначе авария Timeweb гасит и сервис, и мониторинг нед. 5–6

VPS годится для витрины, демо и служебных сервисов; поисковый индекс на нём не живёт — ему нужны локальные NVMe и память без соседей по гипервизору. С фазы 1 поисковые узлы переезжают на выделенные серверы, VPS остаётся под фронт и API-шлюз.

15Ёмкость и деньги

Расчёт снизу вверх: около 6 КБ горячих данных на документ — инвертированный индекс, прямой индекс, вектор и признаки. Внешняя сверка совпала: Quickwit проиндексировал миллиард страниц Common Crawl в 6.8 ТБ.

ФазаДокументовХранение СерверовИнфраструктура, ₽/мес Стоимость фазы
01 млн2 VPS ~50 тыс.~7.4 млн
150 млн~3 ТБ39 ~2 млн~56 млн
2300 млн~16 ТБ120 ~6 млн~119 млн
32 млрд~110 ТБ370 ~22 млн~369 млн
410 млрд~550 ТБ~900 ~55 млн~1.0 млрд
530 млрд~1.7 ПБ~2000 ~110 млн~1.8 млрд

Полезное правило, выведенное из расчётов: на каждый миллиард документов в горячем индексе нужно примерно 20 машин с 512 ГБ RAM, чтобы держать p99 в 300 мс при тысяче запросов в секунду.

Что финансировать в первую очередь

Порядок общих вложений до паритета качества — 3–3.5 млрд ₽ за пять лет. Но фазы 0–2 (полтора года, около 180 млн ₽) — это та часть, которая доказывает жизнеспособность. Её и нужно финансировать, не принимая обязательств по остальным.

16Риски

РискВероятностьВлияниеСмягчение
Крупные сайты блокируют бота высокаявысокое Публикация политики обхода и страницы /bot до первого запроса, кабинет вебмастера в MVP, безупречная вежливость, договорённости с топ-1000
Не набирается качество ранжирования средняякритическое Замер pFound с фазы 0, жёсткие числовые ворота, готовность продлить фазу вместо перехода дальше
Нет пользователей → нет кликов → нечему учиться высокаявысокое Асессоры как основной источник до фазы 3, exploration-трафик, закупка трафика на бету
Почта: обязанности ОРИ делают её убыточной высокаякритическое Фаза M0 как ворота: считаем и получаем заключение до написания кода
Почта: письма не доходят до Gmail высокаявысокое Прогрев IP за два месяца, полный набор аутентификации, раздельные пулы для транзакционных писем и рассылок
Стоимость инфраструктуры выше плана средняявысокое Фазовый рост, холодный слой на объектном хранилище, жёсткая квота на рендеринг JavaScript
Спамеры адаптируются быстрее нас высокаясреднее Антиспам как ML внутри ядра, а не набор правил; теневой режим на 7 дней перед применением; быстрый цикл переобучения
Генеративный «Ответ» подрывает трафик сайтов средняявысокое Не более 60 слов, обязательные ссылки, не более 25 слов подряд из одного источника, возможность отключить навсегда

17Что в репозитории

Двадцать один документ, детальный план из 386 задач по каждой фазе и десять интерактивных макетов в ~/Yottis. Макет выдачи — не картинка: в нём работает настоящий инвертированный индекс с BM25F, стеммером Портера для русского, разбором операторов, исправлением опечаток с бюджетом правок по длине слова и генерацией сниппетов под запрос.

docs/01…05 Видение, разбор открытых исходников, архитектура, обход и индексация, ранжирование и антиспам
docs/06…09 Продукт и выдача, Yottis ID и приватность, кабинет вебмастера и API, дизайн-система
docs/10…13 Инфраструктура и ёмкость, право и комплаенс, мастер-план, развёртывание на Timeweb с доменом yottis.ru
docs/14…15 Почтовая служба; разбор функционала Яндекса — 40 возможностей с вердиктом «берём / не берём»
docs/16…18 Всемирный поиск и языковые кластеры; определение региона посетителя; админ-часть с географией и журналом действий
docs/19…21 Структура под ИИ; выбор хранилищ данных; продвижение проекта в Яндексе и Google
docs/plan/*.md 386 задач по фазам 0–6 и треку «Почта». Каждая: зачем, что делаем, критерий готовности, зависимости, исполнители, оценка, способ проверки, риск. Плюс команда, найм и бюджет по статьям
tools/build-plan-data.mjs Собирает данные обозревателя плана из документации и проверяет её: задача без критерия готовности или с битой зависимостью не проходит сборку
mockups/roadmap.html Обозреватель плана: 8 фаз → 386 задач → карточка. Фильтр по направлениям и критическому пути, переходы по зависимостям, ссылка на конкретную задачу
mockups/serp.html Выдача с живым BM25-поиском, панелью «как ранжировано», колдунщиками, генеративным «Ответом» и плашкой региона
mockups/admin.html Админ-часть: география посетителей с картой и источниками определения региона, запросы, сайты, обращения по 149-ФЗ, журнал действий
mockups/mail.html Почта с объяснением, почему письмо попало в спам, включая репутацию ссылок из веб-индекса
mockups/*.html Главная, Yottis ID, кабинет вебмастера, операционный пульт, интерактивная схема архитектуры