Модерация Telegram-сообщества звучит как решённая задача — пока вы не начнёте вести его сами. Группа из десяти тысяч человек генерирует шквал сообщений, и в нём прячутся спамеры, которые годами учились обходить любой наивный фильтр, какой вы могли бы написать. Они смешивают алфавиты, вставляют символы нулевой ширины, переводят свой заход на тридцать языков и меняют формулировки быстрее, чем за ними успевает блоклист.

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

Слой первый: движок правил

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

Эффективным его делают две вещи — широта и скорость.

  • Он нормализует текст перед сопоставлением: сводит похожие по виду Unicode-символы, вырезает пробелы нулевой ширины, схлопывает трюки с гомоглифами, которые превращают «invest» в строку, выглядящую идентично, но таковой не являющуюся. Спамеры рассчитывают на то, что ваш regex видит не то, что видит человеческий глаз; нормализация закрывает этот зазор.
  • Он покрывает более 30 языков, потому что правило, знающее только английский, слепо к большей части мирового спама.
  • Он отрабатывает менее чем за 10 миллисекунд. Именно это число позволяет Telm удалить сообщение до того, как комната его толком увидела, а не после того, как урон уже нанесён.

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

Слой второй: AI-классификатор

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

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

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

message ──▶ normalize ──▶ rule engine  (<10ms, 200+ patterns)
                              │ uncertain
                              ▼
                        fingerprint cache ──hit──▶ verdict
                              │ miss
                              ▼
                        AI classifier ──▶ verdict + cache write

Слой третий: семантическая память

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

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

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

Блоклист CAS

Не каждую защиту нужно вычислять локально. Telm интегрирует блоклист Combot Anti-Spam (CAS) — глобальный, поддерживаемый сообществом реестр аккаунтов, уже подтверждённых как спамеры по всей экосистеме Telegram.

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

Режим наблюдения: действовать, только когда вы доверяете

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

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

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

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