Почему мы создали собственный алгоритм ранжирования

Курация контента в социальных сетях — самый важный алгоритм, о котором никто не говорит. Вот почему Lotusia отказалась принять статус-кво и что мы построили вм…

·

Почему мы создали собственный алгоритм ранжирования hero image

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

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

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

Фундаментальное ограничение

Lotusia работает в безразрешительной среде. Любой может создать кошелёк. Нет верификации личности, нет доказательства человечности, нет доверенного социального графа. Это налагает непререкаемое ограничение на алгоритм ранжирования:

Алгоритм ранжирования должен учитывать ТОЛЬКО совокупные объёмы сжигания. Количество кошельков не должно напрямую влиять на ранжирование контента.

Это исключает целые семейства механизмов противодействия китам. Субли­нейные преобразования на уровне голосующих, такие как квадратичное голосование, стимулируют дробление кошельков — кит, сжигающий 100 000 сатоши через 100 кошельков, получает в десять раз больше влияния, чем при сжигании с одного кошелька. Бонусы за разнообразие голосующих напрямую поощряют создание Sybil-атак. Штрафы за концентрацию на контенте тривиально обходятся дроблением кошельков.

Решение — сдержанность. Каждая функция ранжирования оперирует исключительно совокупными объёмами сжигания: общее количество Lotus, сожжённых положительно, и сожжённых отрицательно. Разделение одного и того же общего сжигания на любое количество кошельков даёт одинаковую оценку. Это принцип нейтральности к Sybil-атакам. Компромисс честен — алгоритм не может отличить тысячу настоящих голосующих от одного кита с тысячей кошельков — но его нельзя обмануть созданием кошельков. В системе, открытой для Sybil-атак, это правильный компромисс.

Ончейн-базис

Ончейн-формула ранжирования намеренно проста:

ranking = satsPositive - satsNegative

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

R62: Агрегированное логарифмическое затухание

Наиболее очевидная уязвимость линейного ранжирования в том, что расходы и влияние строго пропорциональны. Кит, сжигающий 100 000 сатоши, имеет ровно в 100 раз больше влияния, чем тот, кто сжигает 1 000 сатоши.

R62 применяет логарифмическое затухание к совокупным положительным и отрицательным сжиганиям независимо:

feedScore = log₂(1 + B_pos / BASE) - log₂(1 + B_neg / BASE)

Где B_pos и B_neg — общие положительные и отрицательные сжигания на единице контента, а BASE — настраиваемая константа, установленная на 1 000 сатоши. Логарифм создаёт убывающую отдачу от расходов:

Total Burn Linear Score Dampened Score Marginal Gain per 1K
1,000 sats 1,000 1.00 1.00
10,000 sats 10,000 3.46 0.27
100,000 sats 100,000 6.66 0.036
1,000,000 sats 1,000,000 10.0 0.0037

Кит, сжигающий 100 000 сатоши, получает оценку ленты 6.66 — значимую, но не в 100 раз превышающую влияние сжигания в 1 000 сатоши. Чтобы удвоить влияние с 6.66 до 13.32, ему потребовалось бы сжечь более 10 миллионов сатоши. Логарифм не предотвращает влияние китов; он делает каждую дополнительную единицу влияния экспоненциально дороже.

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

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

R63: Межконтентное ограничение Z-оценки

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

Алгоритм вычисляет среднее и стандартное отклонение всех оценок ленты, затем преобразует каждую оценку в z-оценку:

μ = mean(scores)
σ = sqrt(variance(scores))
zScore = (score - μ) / σ
cappedScore = min(zScore, Z_MAX)

Порог z-оценки по умолчанию Z_MAX = 3.0. Это означает, что ни одна единица контента не может набрать более трёх стандартных отклонений выше среднего, независимо от абсолютного объёма сжигания.

Рассмотрим ленту из 100 единиц с оценками от 1.0 до 5.0 (среднее 3.0, стандартное отклонение 1.0). Одна единица, доминируемая китом, набирает 15.0. Без ограничения она доминирует в ленте, в 5 раз превышая среднее. С ограничением z-оценки:

zScore = (15.0 - 3.0) / 1.0 = 12.0 → capped at 3.0

Единица кита по-прежнему ранжируется выше всех, но её преимущество перед верхней органической единицей (z-оценка 2.0) сжимается с 3× до 1.5×. Ни одна единица контента не может монополизировать ленту.

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

R64: Темпоральное накопление убеждённости

Ончейн-формула ранжирования одинаково оценивает сжигание тридцатидневной давности и сжигание тридцатисекундной давности. R64 вводит экспоненциальное затухание на основе возраста голосовой активности, опираясь на голосование убеждённостью, разработанное Commons Stack и развёрнутое 1Hive Gardens.

Сжигания группируются по часовым периодам. Чистая затухшая оценка каждого периода (из R62) взвешивается коэффициентом затухания на основе его возраста:

decay = (1/2)^(ageHours / halfLife)
convictionScore = Σ [periodScore_t × decay(age_t)]

Период полураспада по умолчанию составляет 72 часа, что соответствует естественному жизненному циклу релевантности контента в социальных сетях:

Age Decay Factor Contribution
Today 1.00 100%
3 days ago 0.50 50%
6 days ago 0.25 25%
9 days ago 0.125 12.5%

Это обеспечивает значимую устойчивость к флеш-атакам. Кит, сбрасывающий 100 000 сатоши в одном блоке, получает немедленный подъём оценки, но этот подъём уменьшается вдвое каждые три дня. Тем временем органические сжигания, добавляющие меньшие суммы каждый час, накапливают убеждённость, которая сохраняется.

В рабочем примере: кит сжигает 100 000 сатоши в момент t=0, а органические сжигания добавляют 1 000 сатоши в час. С периодом полураспада 72 часа и BASE=1 000:

Time Whale (decayed) Organic (accumulated) Whale %
t=0 6.66 0 100%
t=24h 5.30 3.28 62%
t=48h 4.22 5.37 44%
t=72h 3.36 6.72 33%
t=96h 2.67 7.59 26%

Органический сигнал обгоняет кита в течение 48 часов. К пятому дню влияние кита снижается до 21 процента от общего.

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

R65: Интеграция двунаправленного сигнала

RANK поддерживает как положительные, так и отрицательные сжигания. Взаимосвязь между этими двумя совокупными сигналами даёт информацию о качестве контента, которую чистая величина не может передать. R65 извлекает три метрики из этих двунаправленных данных.

Коэффициент сентимента измеряет, какая доля общих сжиганий является положительной:

sentimentRatio = B_pos / (B_pos + B_neg)

Коэффициент 1.0 означает единогласно положительный. Коэффициент 0.5 — равномерно оспариваемый. Коэффициент 0.0 — единогласно отрицательный.

Оценка спорности измеряет, насколько равномерно оспариваются сжигания:

controversyScore = min(B_pos, B_neg) / max(B_pos, B_neg)

Оценка около 1.0 означает почти равные положительные и отрицательные сжигания. Оценка около 0.0 означает, что одно направление доминирует. Когда оценка спорности превышает настраиваемый порог 0.4, контент помечается как спорный для обработки в интерфейсе.

Общая вовлечённость применяет логарифмическое затухание к сумме всех сжиганий:

totalEngagement = log₂(1 + (B_pos + B_neg) / BASE)

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

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

Оценка спорности также обеспечивает работу ленты спорного контента, которая использует составную формулу, вдохновлённую подходом Reddit «величина × баланс»:

controversySortScore = controversyScore × totalEngagement

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

R66: Затухание всплесков скорости сжигания

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

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

velocityRatio = currentWindowBurns / rollingMedianBurns
dampening = 1 / (1 + e^(k × (velocityRatio - threshold)))

Параметры по умолчанию: порог скорости 10× от медианной скорости и крутизна сигмоиды 0.5. Контент, получающий сжигания с нормальной скоростью, не затрагивается (затухание ≈ 1.0). Контент, получающий сжигания со скоростью 100× от медианы, получает штрафной коэффициент приблизительно 0.011 — почти полное затухание.

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

Алгоритм нейтрален к Sybil-атакам по конструкции. Скорость вычисляется из совокупных сжиганий за временное окно, а не по кошелькам. Разделение сжигания 100 000 сатоши между 100 кошельками в одном временном окне создаёт такой же всплеск скорости и такое же затухание.

Составная оценка

Эти пять алгоритмов объединяются в единую составную оценку ленты. Процесс выполняется последовательно:

  1. R62 вычисляет базовую логарифмически затухшую оценку из совокупных сжиганий
  2. R64 применяет темпоральное затухание на основе возраста голосовой активности
  3. R66 применяет затухание по скорости, если накопление сжиганий подозрительно быстрое
  4. R65 вычисляет двунаправленные сигналы для вторичной сортировки и флагов спорности
  5. R63 применяет ограничение z-оценки на уровне отображения ленты

Результат:

feedScore = [log₂(1 + B_pos/BASE) - log₂(1 + B_neg/BASE)]
            × decay(ageHours / 72h)
            × velocityDampening(velocityRatio)

С ограничением z-оценки, применяемым к итоговому распределению. Кит должен сжигать экспоненциально больше для каждой маржинальной единицы ранжирующего влияния, поддерживать эти расходы в течение времени, конкурировать со всем распределением контента и избегать всплесков скорости. Экономика смещается от «сжечь в десять раз больше, чтобы получить в десять раз больше влияния» к чему-то ближе к «сжечь в 100 раз больше, чтобы получить в три раза больше влияния, которое затухнет за три дня».

Почему это было необходимо

Проблемы, которые решают эти алгоритмы, являются задокументированными режимами отказа каждой крупной контентной платформы.

Эхо-камеры формируются через социальный конформизм и информационные каскады. Эксперименты Аша по конформизму показали, что примерно 37 процентов людей подчиняются очевидно неправильному ответу большинства. Видимые подсчёты голосов создают такое же давление в социальных сетях. Lotusia решает это через Vote-to-Reveal: результаты голосования скрыты от любого пользователя, который ещё не проголосовал. Вы должны отдать свой собственный голос, прежде чем увидите, как проголосовали другие. Это постоянно и индивидуально, а не основано на временном слепом периоде, который истекает. Исследование Мучника и др. зафиксировало 25-процентный эффект положительного стадного поведения от одного видимого голоса «за». Vote-to-Reveal полностью устраняет этот вектор.

Координированные манипуляции — это проблема злоумышленника с повесткой. Политические оперативники, корпоративные PR-команды и идеологические группы готовы тратить деньги на управление настроениями — сжигание является оружием, а соотношение потерь 10:1, убивающее экономический фарминг, для них нерелевантно. Алгоритмы ранжирования ленты делают это дорогим, и они дополняются обнаружением координированных манипуляций, мониторящим временные кластеры голосования, сети поведенческого сходства и аномалии демографии голосующих. При обнаружении координации алгоритмическое продвижение затронутого контента снижается. Ончейн-данные остаются постоянными и доступными. Затрагивается только усиление.

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

Режим отказа Steemit — это то, что происходит, когда вы объединяете объём участия с оценкой качества. Steemit использовал единую метрику — Steem Power — для влияния при голосовании, вознаграждений за контент и управленческих полномочий. Результатом стали торговля голосами, доминирование китов, падение качества и 90-процентное снижение числа активных пользователей. Lotusia разделяет Очки вовлечённости и репутацию RANK. Пользователь может быть высокоактивным, но низкокачественным, или избирательно активным, но высококачественным. Оба измерения видимы. Ни одно не подменяет другое.

Философский фундамент

Эти алгоритмы — выражение философии Lotus. Основополагающий принцип Lotus — обобщённая взаимность: дарить Lotus как знак признательности, верить, что взаимность последует, и позволять токену течь, а не накапливаться. Оригинальный сайт givelotus.org описывал Lotus как «бесценный — знак признательности — обладающий сентиментальной ценностью».

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

Это честный ответ на проблему Sybil: вы не можете устранить влияние китов в безразрешительной системе. Достаточно богатый актор всегда может доминировать. Но вы можете сделать это прогрессивно дороже, пока соотношение затрат и выгод не станет невыгодным. И даже тогда темпоральное затухание гарантирует, что их влияние угаснет.

Что будет дальше

Алгоритмы ранжирования ленты реализованы и работают в сервисе rank-backend-ts. Они вычисляют составные оценки для каждого поста в единой ленте, интегрируясь с Vote-to-Reveal, флагом спорности и обнаружением координированных манипуляций.

Продолжают развиваться дополнительные системы. Реферальная система обеспечивает устойчивый к Sybil-атакам онбординг через социальное доверие, а не proof-of-work. Система очков вовлечённости вознаграждает устойчивое участие по множеству измерений — голоса, рефералы, комментарии, сжигания, серии и возраст аккаунта. Мониторинг концентрации голосующих отслеживает индекс Герфиндаля-Хиршмана для обнаружения опасной концентрации голосующей силы.

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

Изучите ранжированные профили на Социальных профилях Lotusia. Узнайте больше о том, кто построил Lotusia.