Расстройство дискурса

:warning: Эта функция теперь входит в состав Discourse AI. Этот плагин устарел.

:discourse2: Краткое описание Disorder помогает модераторам, автоматически помечая потенциально токсичный контент на вашем форуме Discourse.
:hammer_and_wrench: Ссылка на репозиторий https://github.com/xfalcox/disorder
:open_book: Руководство по установке Как установить плагины в Discourse

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

Токсичность

Как отметил @hawk в Dealing with Toxicity in Online Communities, управление токсичностью в вашем сообществе имеет фундаментальное значение.

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

Плагин

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

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

Возможности

Фоновая маркировка

Это основной режим работы Disorder, так как он полностью прозрачен для ваших пользователей, которые не заметят никаких изменений.

При создании нового сообщения (или сообщения в чате с использованием Discourse Chat) оно асинхронно помещается в очередь классификации. Если результат классификации превышает настраиваемый порог, сообщение/сообщение в чате помечается, чтобы предупредить вашу команду модераторов, и они могут принять окончательное решение по этому флагу.

Вмешательство при создании нового сообщения

Если вы считаете, что профилактика — лучшее лекарство, вам может заинтересовать этот более активный вариант.

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

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

Как это работает?

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

Мы предоставляем простой образ, который обеспечивает тонкий HTTP-API, к которому Discourse обращается для выполнения классификации контента. Этот образ можно запустить как на том же сервере, где работает Discourse, так и на совершенно другом сервере.

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

Настройки

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

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

  • unbiased (по умолчанию): модель, которая пытается снизить непреднамеренную предвзятость модели при классификации токсичности.

  • multilingual: модель, способная классифицировать итальянский, французский, русский, португальский, испанский и турецкий языки.

  • original: самая простая модель.

Вы также можете настроить, будет ли плагин:

  • автоматически помечать контент
  • включать синхронное вмешательство с предупреждением для токсичных сообщений (экспериментально)
  • включать синхронное вмешательство для токсичных сообщений (не рекомендуется)

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

  • токсичность
  • severe_toxicity (сильная токсичность)
  • identity_attack (атака на идентичность)
  • insult (оскорбление)
  • threat (угроза)
  • sexual_explicit (сексуально откровенный контент)

Вы можете настроить каждый из порогов классификации для автоматических действий.

Служба классификации

Плагин поставляется с предварительно настроенной работой из коробки. Для этого он обращается к службе, запущенной Discourse (CDCK), для классификации пользовательского контента. Этот сервис API классификатора имеет открытый исходный код, и при необходимости вы можете запустить собственную копию службы.

39 лайков

Просто из любопытства, в чем разница между «Disorder» и реализацией API Google Perspective в Discourse?

7 лайков

С точки зрения кода это совершенно разные плагины.

С высоты десяти футов они закрывают одни и те же потребности, но спроектированы по-разному:

  • Disorder работает с чатом и постами, Perspective — только с постами.

  • Perspective полагается на проприетарный и сторонний API, что влечёт за собой все связанные с этим вопросы конфиденциальности, надёжности и прозрачности.

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

  • Самостоятельно размещаемый API Disorder обеспечивает гибкость и освобождает от платы за каждый вызов API и ограничений по частоте запросов.

  • Поверхность фронтенда Disorder значительно меньше, поэтому она должна быть более устойчивой к обновлениям Discourse.

16 лайков

Круто. Где и как нам это сделать?

5 лайков

Напишите нам на почту team@discourse.org :slight_smile:

6 лайков

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

9 лайков

Правильно ли я понимаю, что экземпляр API Disorder должен быть запущен для работы в паре с плагином? В настройках уже заполнено поле disorder inference service api endpoint со значением https://disorder-testing.demo-by-discourse.com. Однако поле disorder inference service api key по умолчанию пустое.

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

Можно ли использовать какой-либо готовый endpoint для тестирования? Честно предупреждаем: у нас около 150 тыс. просмотров страниц в день, и это может перегрузить неподготовленные серверы.

Мы работаем в режиме standalone.

4 лайка

Хотя вы можете запустить свой собственный сервер API, плагин уже настроен по умолчанию и указывает на https://disorder-testing.demo-by-discourse.com/, поэтому он работает сразу после установки.

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

Настройка api key является необязательной и требуется только в том случае, если на вашем сервере API включена аутентификация. Публичный экземпляр по адресу https://disorder-testing.demo-by-discourse.com/ не имеет её включённой.

6 лайков

Спасибо! Звучит отлично, попробую в ближайшие дни :heart:

4 лайка

Планируются ли другие приложения ML на будущее?

2 лайка

Я пробовал это в течение недели, и система была несоразмерно агрессивной в помечании постов. Рекомендую использовать её только если у вас огромный сайт и недостаточно модераторов. Надеюсь, ИИ станет лучше, но пока до этого ещё далеко.

6 лайков

Отличная обратная связь! Не могли бы вы поделиться некоторыми данными отладки, чтобы помочь мне точно понять, что произошло?

Например, результат запроса:

SELECT
  pcf.value,
  p.raw
FROM
  post_custom_fields AS pcf
INNER JOIN
  posts AS p ON p.id = pcf.post_id
WHERE
  pcf.name = 'disorder'

отправленный сюда или в личные сообщения, был бы крайне полезен.

5 лайков

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

1 лайк

Вы пользуетесь чатом? Все ли раздражающие флаги в сообщениях и личных переписках?

Мы действительно используем чат, но я почти уверен, что все флаги были в постах и личных сообщениях.

1 лайк

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

Теперь о моих выводах!

За эту неделю у вас появилось 1942 новых поста от пользователей, не являющихся сотрудниками. Довольно активное сообщество! Однако я бы не сказал, что ИИ «абсурдно агрессивно помечает посты», поскольку было помечено только 7 постов.

Тем не менее, из этих семи половина — это явные ложные срабатывания, вызванные слишком низкими пороговыми значениями по умолчанию. Другая половина сложнее для ИИ из-за необходимости понимать контекст (например, называть собеседника «негодяем» против рассказа о том, как кто-то плохо обошёлся с вами сегодня, пока вы были в магазине). Один случай, на мой взгляд, является верным срабатыванием.

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

8 лайков

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

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

4 лайка

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

Также есть ещё одна настройка, позволяющая добавлять группы в список исключений. Например, вы можете исключить посты пользователей с уровнем TL4/3 от классификации. Это тоже может помочь.

Уважаемый @Falco,

Мы начали тестирование Disorder. Общая обратная связь положительная — плагин действительно выявляет неуместный контент, хотя и помечает множество сообщений, которые наше сообщество считает приемлемыми. В силу специфики форума, где мы тестируем этот плагин (для взрослых), коммуникация включает несколько аспектов, из-за чего Disorder помечает очень много постов. Ваш SQL-запрос действительно помогает определить, какие пороги нужно скорректировать, но не могли бы вы добавить эти данные в таблицу оценок Reviewable для каждого помеченного поста?

Пример

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

Пример оценки Disorder
  • Токсичность 65% [1]
  • Оскорбление 73% [2]
  • Угроза 12% [3]
  • Сексуальный контент 2% [4]

Если нужно, я могу предоставить вам результаты SQL-запросов. Мы ещё далеко не закончили проверку очереди флагов..
Мы используем многоязычную модель и пока не пробовали другие. Решили начать с неё, учитывая, что у нас есть пользователи, предпочитающие публиковать сообщения на своём родном языке.


  1. превышение, красный шрифт ↩︎

  2. превышение, красный шрифт ↩︎

  3. норма, обычный шрифт ↩︎

  4. норма, обычный шрифт ↩︎

1 лайк

Привет снова,

Хотел сообщить, что в логах появляются ошибки, связанные с Disorder при использовании модели “original”. Я только что переключил обратно на multilingual, чтобы посмотреть, поможет ли это.

Исключение в задаче: undefined method `>=’ for nil:NilClass @classification[label] >= SiteSetting.send(“disorder_flag_threshold_#{label}”) ^^

Подробности

/var/www/discourse/plugins/disorder/lib/classifier.rb:39:in `block in consider_flagging’

/var/www/discourse/plugins/disorder/lib/classifier.rb:38:in `filter’

/var/www/discourse/plugins/disorder/lib/classifier.rb:38:in `consider_flagging’

/var/www/discourse/plugins/disorder/lib/classifier.rb:25:in `classify!’

/var/www/discourse/plugins/disorder/app/jobs/regular/classify_post.rb:14:in `execute’

/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform’

rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in with_connection' /var/www/discourse/app/jobs/base.rb:236:in block in perform’

/var/www/discourse/app/jobs/base.rb:232:in `each’

/var/www/discourse/app/jobs/base.rb:232:in `perform’

sidekiq-6.5.8/lib/sidekiq/processor.rb:202:in `execute_job’

sidekiq-6.5.8/lib/sidekiq/processor.rb:170:in `block (2 levels) in process’

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:177:in `block in invoke’

/var/www/discourse/lib/sidekiq/pausable.rb:134:in `call’

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:179:in `block in invoke’

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:182:in `invoke’

sidekiq-6.5.8/lib/sidekiq/processor.rb:169:in `block in process’

sidekiq-6.5.8/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_retry.rb:113:in `local’

sidekiq-6.5.8/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq.rb:44:in `block in module:Sidekiq

sidekiq-6.5.8/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/processor.rb:263:in `stats’

sidekiq-6.5.8/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_logger.rb:13:in `call’

sidekiq-6.5.8/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_retry.rb:80:in `global’

sidekiq-6.5.8/lib/sidekiq/processor.rb:124:in `block in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_logger.rb:39:in `prepare’

sidekiq-6.5.8/lib/sidekiq/processor.rb:123:in `dispatch’

sidekiq-6.5.8/lib/sidekiq/processor.rb:168:in `process’

sidekiq-6.5.8/lib/sidekiq/processor.rb:78:in `process_one’

sidekiq-6.5.8/lib/sidekiq/processor.rb:68:in `run’

sidekiq-6.5.8/lib/sidekiq/component.rb:8:in `watchdog’

sidekiq-6.5.8/lib/sidekiq/component.rb:17:in `block in safe_thread’

Подробности 2
hostname
process_id 65460
application_version 2f8ad17aed81bbfa2fd20b6cc9210be92779bd74
current_db default
current_hostname
job Jobs::ClassifyPost
problem_db default
time 13:52
opts
post_id 604063
current_site_id default

P.S. Да, режим multilingual не вызывает этих ошибок. Модель Unbiased также не вызывает ошибок.

1 лайк