Поисковая система, а не обёртка над чужим 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-проекты читаем как инженерный источник, но не линкуем.
| Проект | Лицензия | Роль |
|---|---|---|
Tantivyquickwit-oss/tantivy |
MIT | Ядро индекса. Библиотека сегментного инвертированного индекса на Rust, примерно вдвое быстрее Lucene. Именно библиотека — шардирование, репликация и ранжирование остаются нашими |
CatBoostcatboost/catboost |
Apache-2.0 | Основная модель L2. Открытый наследник MatrixNet от самого
Яндекса, с listwise-функцией потерь YetiRank, спроектированной
под поисковое ранжирование |
DiskANNmicrosoft/DiskANN |
MIT | Векторный индекс на NVMe: ~5000 QPS при recall@1 выше 95% и задержке менее 5 мс на миллиарде векторов, одна машина, 64 ГБ RAM |
Rspamdrspamd/rspamd |
Apache-2.0 | Антиспам почты: байес, нейросети, нечёткие хеши, 60+ модулей. Примерно в 10 раз быстрее SpamAssassin на тех же правилах |
Moxmjl-/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Архитектура
Два независимо масштабируемых контура. Единственная точка соединения — публикация новой версии индекса. Разделение принципиально: офлайн может лежать час, и пользователь не заметит; онлайн лежать не может вообще.
Цветом выделен критический путь. Всё остальное — колдунщики, генеративный «Ответ», нейро-реранкер — отбрасывается по таймауту без отказа: пользователь всегда получает выдачу.
Шардирование — по хосту, а не по URL
Ключ hash(host) mod N даёт три выигрыша сразу: правило
«не более двух результатов с сайта» применяется локально в шарде; хостовые
признаки грузятся один раз; дедупликация внутри сайта не требует сети.
Плата — перекос по крупным сайтам, который лечится вторичным расщеплением.
Три слоя индекса
| Слой | Содержимое | Носитель | Обновление | Доля ответов |
|---|---|---|---|---|
| Горячий | Топ ~2% по трафику и авторитету + всё свежее за 48 ч | RAM + NVMe | минуты | ~85% |
| Тёплый | Основной корпус | NVMe | 1–3 суток | ~14% |
| Холодный | Длинный хвост, архив | Объектное хранилище | неделя | ~1% |
04Ранжирование
Воронка: на каждом уровне кандидатов меньше, а модель дороже. Схема повторяет то, к чему независимо пришли Google (PageRank+IR → RankBrain → BERT) и Яндекс (базовый поиск → MatrixNet → YATI).
Гибридный поиск строится сразу целиком, а не «сначала 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. Бюджет распределён заранее, и каждое новое включение в критический путь требует отдельного архитектурного решения — это защита от медленного сползания.
Самый дорогой сегмент — нейро-реранкер, и он же первый кандидат на отбрасывание при перегрузке: без L3 качество падает, выдача остаётся.
06Всемирный поиск
Требование — искать по сайтам всего мира, быстро и качественно. Расширяться сразу на все языки — верный способ получить плохое качество везде, поэтому порядок захвата определяется двумя вещами: сколько это стоит и сколько с этого пользы.
| Волна | Языки | Документов | Фаза | Почему в этой очереди |
|---|---|---|---|---|
| 1 | Русский | 0.3 млрд | 1–2 | Домашний сегмент конечен: здесь достижимо «не хуже Яндекса» |
| 2 | Английский | 8 млрд | 3 | Нужен всем, включая русскоязычных: технические и научные ответы |
| 3 | de, fr, es, pt, it | 6 млрд | 4 | Латиница, схожая морфология — переиспользуется обработка волны 2 |
| 4 | tr, pl, uk, kk, uz | 2 млрд | 4 | Соседние рынки, где Яндекс присутствует слабо |
| 5 | zh, ja, ko | 8 млрд | 5 | Самая дорогая волна: нет пробелов между словами — нужна сегментация, свои модели и отдельная команда |
| 6 | ar, 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Хранилища данных
Вопрос «на какой базе работает проект» имеет неожиданный ответ: ни на какой одной. Все, кто дошёл до веб-масштаба, пришли к разделению на специализированные хранилища.
| Система | Стек хранения |
|---|---|
| Colossus (файловая система, метаданные в Bigtable) + Spanner — более 2 млрд запросов в секунду на пике, свыше 6 ЭБ под управлением + Percolator для инкрементальной индексации. Три разных системы, а не одна | |
| Яндекс | YTsaurus — платформа хранения экзабайтного масштаба, открыта в 2023; ClickHouse — колоночная аналитика; YDB — транзакционная. Тот же вывод |
У поисковой системы восемь классов хранилищ, и требования классов 1, 3, 5 и 6 взаимно исключающие: одна база не может быть одновременно оптимальной для случайного чтения на NVMe, потоковой записи ста тысяч ключей в секунду, аналитических сканов и ACID-транзакций.
| Класс | Объём | Фазы 1–2 | Фазы 3–5 |
|---|---|---|---|
| Индекс | 600 ТБ | Tantivy + NVMe | + сплиты на S3 |
| Документы и WARC | 730 ТБ | SeaweedFS | SeaweedFS / Ceph |
| CrawlDB (URL → состояние) | 30 млрд ключей | RocksDB в шарде | ScyllaDB |
| Веб-граф | 22 ТБ | Свой компактный формат — не база | |
| Аналитика и кликстрим | 400 ТБ | ClickHouse | |
| Транзакционное | 2 ТБ | PostgreSQL + Patroni | + шардирование / YDB |
| Кэш и сессии | 500 ГБ | Valkey | |
| Координация | мегабайты | etcd | |
Векторы живут внутри тех же шардов, что и постинги. Вынесение их в отдельную БД добавляет сетевое обращение на каждый запрос и делает невозможным совместное отсечение — а нам нужно уметь сказать «дай топ по векторам среди документов, прошедших фильтр по региону».
Инвертированный индекс не кладут в базу. Слой абстракции убивает то, ради чего индекс существует. Сегменты лежат файлами на NVMe и читаются через mmap.
08Структура под ИИ
Требование — заранее заложить возможность ИИ-функционала во все модули, не пользуясь им сейчас. Добавить модель в готовую систему технически несложно. Сложно другое:
| Что ломается при позднем добавлении | Почему |
|---|---|
| Бюджет задержек | ИИ-функция съедает 50–150 мс. Без резерва её добавление означает пересмотр всей архитектуры обслуживания |
| Схема документа | Векторы и оценки моделей — это поля. Добавление поля в индекс на 10 млрд документов = полная переиндексация, недели работы |
| Контракты между сервисами | Если в ответе шарда нет места под оценку модели, её добавление ломает всех потребителей |
| Приватность и право | Отправка пользовательских данных в модель без заранее описанной политики — юридический инцидент, а не техническая задача |
| Стоимость | Без учёта в бюджете инференс внезапно оказывается крупнейшей статьёй расходов |
Отсюда правило: структура закладывается сразу, реализация — по мере надобности. Заглушка, возвращающая «функция выключена», стоит день работы. Пересмотр архитектуры — квартал.
Единый шлюз и три обязательных свойства
Все обращения к моделям идут через yotti-ai. Прямых вызовов из других
сервисов нет ни одного — это даёт единое журналирование, единую политику данных,
единый учёт стоимости, возможность подменить модель без изменения потребителей
и единую точку выключения.
Точки закладки размечены в каждом модуле — от оценки ценности URL во фронтире
до слота суммаризации в почте. Двадцать три точки, из которых в фазах 1–2
работают три; остальные существуют как поля в схемах, флаги со значением
off и зарезервированные миллисекунды в бюджете.
Содержимое писем передаётся только локальным моделям и никогда не покидает почтовый контур. Персональные данные не передаются моделям ни при каких условиях. Класс данных проверяется шлюзом, и нарушение — отказ, а не предупреждение: юридический риск закрывается технически, а не регламентом.
09Регион и админ-часть
Откуда пришёл человек
Регион — один из самых сильных сигналов в поиске и обязательная часть аналитики. Определяется пятью источниками со строгим приоритетом: явный выбор пользователя, оператор в запросе, геолокация браузера, база GeoIP, язык и домен как запасной вариант.
Потолок точности на уровне города — около 85%, и это ограничение самих данных, а не конкретного поставщика. Поэтому регион всегда виден пользователю и меняется одним кликом, а ранжирование не ломается при неверном регионе: региональный признак влияет, но не отсекает.
Ключевая метрика качества здесь — доля ручных смен региона. Если в каком-то городе пользователи массово меняют определённый регион, GeoIP там врёт, и это видно раньше, чем поступят жалобы. Цель — не более 4%.
Регион показывается плашкой рядом со строкой поиска на главной и в панели инструментов на выдаче. Скрывать его нельзя: пользователь, получивший результаты не своего города и не понимающий почему, уходит и не возвращается.
Админ-часть
Не «страница со статистикой», а рабочее место: пользователи, сайты, индекс, качество, модерация, право, эксперименты. Отдельно от операционного пульта — у них разные задачи и разные дежурные.
| Принцип | Почему |
|---|---|
| Каждое действие в журнале | Изменение, которого нет в журнале, считается инцидентом безопасности |
| Доступ по ролям, а не «админ ко всему» | Модератору не нужен доступ к персональным данным; аналитику не нужны санкции |
| Опасные действия — со вторым подтверждающим | Просмотр истории пользователя, санкция, изменение реестра скрытия, смена ролей |
| Роль «Аудитор» | Видит только журнал — включая действия администратора — и не может ничего менять. Роль существует, чтобы за администратором тоже наблюдали |
Чего админ-часть не делает: не показывает содержимое писем (тайна связи), не даёт читать историю поиска «просто посмотреть» и не позволяет вручную поднять сайт в выдаче. Последнее принципиально: такая возможность рано или поздно превращается в товар, поэтому технически её не существует.
10Фазы работ
Отсчёт от сентября 2026. 386 задач в восьми фазах, каждая описана одинаково: зачем, что делаем, критерий готовности, зависимости, исполнители, оценка, способ проверки, риск. На выходе из каждой фазы — числовые ворота; не пройдены — фаза продлевается, а не закрывается.
Фазу закрывают ворота, а не календарь. Переход дальше «потому что по плану пора» запрещён: в поиске накопленный долг по качеству не отдаётся, он умножается на следующей фазе.
Сокращается объём, а не качество. Если фаза не укладывается, режется список возможностей, но не пороги качества, не тесты и не документация. Возможность можно добавить позже; репутацию поисковика, который «иногда ничего не находит», вернуть нельзя.
Детализация убывает с горизонтом. Фазы 0–3 расписаны с оценками по неделям, фазы 4–6 — полностью описаны, но оценки в них заметно менее точны и пересматриваются на выходе из фазы 2. Планировать сороковой месяц с точностью второго — самообман.
6 человек
23 задачи
Фундамент
Доказать, что связка обход → индекс → ранжирование сходится по качеству на малом масштабе. Всё написанное здесь будет переписано: цель — не код, а снятие неопределённости. Параллельно с первой недели — домен, площадка, страница о боте.
14 человек
65 задач
Ядро
Распределённый индекс, непрерывный обход, кабинет вебмастера, аккаунты, закрытая альфа. Теперь код пишется надолго. Кабинет вебмастера включён в MVP: без него бот не будет принят вебом, а забаненный бот означает пустой индекс.
26 человек
66 задач
Качество
Переход от эвристик к машинному обучению: градиентный бустинг, векторы, обучаемая разреженность, нейросетевой реранкер, антиспам, интерливинг. Вертикали. Открытая бета. Определяющая задача — счётчик аналитики на чужих сайтах.
45 человек
57 задач
Масштаб
Публичный запуск. Два миллиарда документов, английский сегмент, генеративный ответ, публичный интерфейс, дистрибуция, круглосуточное дежурство. Главная веха программы.
70 человек
27 задач
Полнота
Закрыть пробелы, из-за которых пользователь уходит даже при сопоставимом качестве веб-поиска: товары, локальный поиск на партнёрской картографии, мобильные приложения, одиннадцать языков, реклама.
100 человек
15 задач
Зрелость
Паритет качества и выход за пределы домашнего рынка. Иероглифические языки — отдельный проект с отдельной командой: там нет пробелов между словами, сегментация неоднозначна, нужны свои модели и свои асессоры.
120+ человек
10 направлений
Развитие
Единственная фаза без ворот выхода: выходить некуда, есть только поддержание и улучшение. Признак зрелости организации — не размер индекса, а время от гипотезы до выката не более трёх недель. Конкурент, проверяющий шесть гипотез за квартал против одной, выигрывает независимо от качества инженеров.
8 → 22 человека
56 задач
Почта — параллельный трек
Отдельная команда, чтобы не конкурировать с поиском за людей. M0 — юридические ворота: требование хранить содержимое всех сообщений полгода даёт около 270 ТБ на миллион ящиков сверх пользовательского хранилища. Пока это не посчитано и не подтверждено юристом, писать код почтового сервера бессмысленно.
Задачи описаны один раз, в файлах плана. Интерактивный обозреватель строится из них скриптом, поэтому документ и макет не могут разойтись. Скрипт же и проверяет план: задача без критерия готовности, без строки признаков или со ссылкой на несуществующую зависимость не проходит сборку.
Это дешёвая защита от плана, который выглядит подробным, но содержит задачи без конца — самая частая болезнь больших планов.
11Что берём у Яндекса
Экосистема Яндекса — более 90 сервисов. Скопировать её нельзя и не нужно. Каждая возможность прошла три фильтра подряд: польза (улучшает качество поиска, даёт данные или дистрибуцию), достижимость (по силам команде из 14–45 человек за одну фазу), фокус (не превращает нас в компанию другого бизнеса).
Третий фильтр самый важный и самый нарушаемый. Яндекс может позволить себе такси, потому что у него уже есть поиск с долей рынка. У нас поиска ещё нет.
Три позиции, меняющие траекторию проекта
Из сорока разобранных возможностей тридцать семь — это работа по списку. Три — определяющие.
Остальное — по фазам
| Что берём | Фаза | Зачем |
|---|---|---|
| Региональность выдачи, справочник регионов | 1 | Для рунета критично: «шиномонтаж» в Москве и Омске — разные запросы |
| Операторы, совместимые с яндексовскими | 1 | Не переучивать пользователя |
| Проверка URL и анализатор robots.txt | 1 | Публичные инструменты вебмастера — без них нас не пустят обходить сайты |
| Колдунщики: калькулятор, время, перевод → погода, курсы, определения | 1–2 | Плотность колдунщиков — то, в чём Яндекс сильнее Google, и это реально экономит клики |
| Семейный поиск, детский режим с PIN | 2 | Требование 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 одинаковых писем за час.
Почтовый сервис в России подпадает под статью 10.1 149-ФЗ как организатор распространения информации: реестр Роскомнадзора, хранение содержимого всех сообщений полгода («пакет Яровой»), метаданных — год, СОРМ.
Это около 270 ТБ на миллион ящиков сверх пользовательского хранилища, в отдельном контуре: пользователь удалил письмо — из его ящика оно исчезло, из контура хранения нет. Пока это не посчитано и не подтверждено юристом, писать код почтового сервера бессмысленно. Готовность отказаться от почты, потеряв только два месяца анализа, — часть плана.
13Продвижение
Парадокс, с которого начинается работа: новую поисковую систему находят через старые. Пока нет своей аудитории, единственный канал первых пользователей, вебмастеров и кандидатов — выдача конкурентов.
Нас не находят → нет вебмастеров → бот не принимают → индекс не наполняется → нет пользователей → нет кликов → нечему учить ранжирование → качество не растёт → нас не за что находить.
Что индексируем и что закрываем
Страницы выдачи закрыты жёстко — и в robots.txt,
и мета-тегом noindex. Причина двойная: бесконечное пространство URL
и дубли — раз; индексировать чужую выдачу не принято, и мы не создаём такой
возможности у себя — два.
Открыто и приоритетно: документация, публичные инструменты вебмастера, правила для сайтов, отчёты о прозрачности, исследования, инженерный блог.
Наше несправедливое преимущество
Обычному сайту приходится придумывать, о чём писать. У нас другая ситуация: мы производим данные, которых нет ни у кого. Отчёты о прозрачности, статистика долей рынка, исследования веба на собственном индексе — «сколько сайтов рунета на HTTPS», «средний вес страницы», «доля мёртвых ссылок». Никто, кроме владельца индекса, такое не посчитает, и на такие данные принято ссылаться.
Ни один пункт не является «SEO-контентом» в дурном смысле — это побочные продукты того, что мы и так делаем.
Шесть скриптов
| Скрипт | Что делает | Фаза |
|---|---|---|
| Генератор sitemap | lastmod берётся из системы контроля
версий, а не проставляется вручную; при изменениях — пуш через IndexNow | 1 |
| Аудит SEO в CI | Lighthouse, пороги скорости и размеров, валидация разметки, canonical и заголовки. Нарушение — сборка падает | 1 |
| Пуш об изменениях | IndexNow в Bing и Яндекс, URL Inspection API в Google | 1 |
| Монитор индексации | Сверка 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 |
| VPS | 4 vCPU / 8 ГБ / 80 ГБ NVMe: SSH по ключам, ufw, fail2ban, автообновления безопасности | нед. 1–2 |
| DNS | NS Timeweb, записи A, AAAA,
CNAME, CAA, SPF, DMARC.
TTL 300 на боевых — переключение за 5 минут, а не за сутки | нед. 2 |
| TLS | Nginx + Let's Encrypt на четыре имени, HTTP/2, HSTS, автопродление | нед. 2–3 |
| Витрина | yottis.ru и /demo с макетами |
нед. 3–4 |
| Страница бота | yottis.ru/bot:
описание YottisBot, диапазоны IP, как ограничить обход.
Публикуется до первого внешнего запроса краулера |
нед. 3–4 |
| Обратный DNS | PTR для 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 ТБ.
| Фаза | Документов | Хранение | Серверов | Инфраструктура, ₽/мес | Стоимость фазы |
|---|---|---|---|---|---|
| 0 | 1 млн | — | 2 VPS | ~50 тыс. | ~7.4 млн |
| 1 | 50 млн | ~3 ТБ | 39 | ~2 млн | ~56 млн |
| 2 | 300 млн | ~16 ТБ | 120 | ~6 млн | ~119 млн |
| 3 | 2 млрд | ~110 ТБ | 370 | ~22 млн | ~369 млн |
| 4 | 10 млрд | ~550 ТБ | ~900 | ~55 млн | ~1.0 млрд |
| 5 | 30 млрд | ~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.rudocs/14…15
Почтовая служба; разбор функционала Яндекса — 40 возможностей
с вердиктом «берём / не берём»docs/16…18
Всемирный поиск и языковые кластеры; определение региона посетителя;
админ-часть с географией и журналом действийdocs/19…21
Структура под ИИ; выбор хранилищ данных; продвижение проекта
в Яндексе и Googledocs/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, кабинет вебмастера, операционный пульт,
интерактивная схема архитектуры