Современные корпоративные чаты стали неотъемлемой частью бизнес-коммуникаций, но вместе с удобством они приносят и новые риски: утечки конфиденциальных данных, нарушения корпоративной этики и даже юридические угрозы. Традиционные методы модерации, основанные на ручном контроле или простых фильтрах, уже давно ,не справляются с объемами сообщений и сложностью контекста.
Цель данной публикации - объективно оценить потенциал LLM-моделей
для решения задачи автоматической модерации чата, выявить ключевые преимущества и ограничения.
Бизнес-задача
Итак у нас есть задача по модерации сообщений корпоративного чата, проверяются следующие требования:
соблюдение конфиденциальной информации компании,
нераспространение персональных данных сотрудников,
недопустимость негативной информации, влияющей на репутацию компании
Ожидаемая бизнес-выгода:
снижение затрат за счет сокращения объемов ручной модерации,
сокращение времени реакции на инциденты,
повышение осведомленности сотрудников о правилах компании.
Входные требования:
никаких запросов к внешним API: LLM-модель должна быть развернута во внутреннем контуре компании,
преимущество отдается готовым предобученным моделям, так как нет ресурсов на их дообучение.
Общая схема решения

Исходя из требований, будем проверять гипотезу: Доступные в свободном доступе предобученные LLM-модели способны эффективно решать задачу модерации сообщений без дополнительного обучения.
Для проверки гипотезы нам потребуется:
выбрать одну или несколько моделей для тестирования,
сформулировать требования задачи на языке, понятном LLM-модели и заложить их в промпт-запрос,
подготовить набор тестовых сообщений для передачи модели для анализа,
оценить эффективность работы тестируемых моделей
Выбираем LLM-модели для тестирования
В качестве инструмента для работы с моделями был выбран фреймворк Ollama - он позволяет получить и обработать результаты для набора тестовых данных в несколько строк кода на Python и поддерживает работу с десятками LLM-моделей.
В качестве моделей для тестирования гипотезы были выбраны: deepseek-r1:latest
и qwen3:8b
- модели имеют относительно небольшой размер и при предварительном тестировании показали неплохие результаты.
Переводим задачу бизнеса на язык LLM-модели
LLM-моделям нужно передать для анализа не только текст сообщения в чат, но и правила, по которым это сообщение будет проверяться. Нам не известно, что модели понимают под терминами конфиденциальная информация, персональные данные, негативная информация, влияющая на репутацию компании. Поэтому, чтобы получить понятный результат, эти термины нужно объяснить модели. В итоге были приняты следующие соглашения:
конфиденциальная информации компании - это финансовая информация компании, к которой относятся - стоимость договоров, заключенных компанией, заработная плата сотрудников компании, размер выручки или убытка, размер расходов компании на операционную деятельность,
персональные данные - к персональным данным относятся 1) одна или несколько составляющих, идентифицирующих персону - имя, фамилия, должность в компании И 2) одна или несколько характеристик персональных данных - место проживания, паспортные данные, личный номер мобильного телефона,
негативная информация, влияющая на репутацию компании - высказывания, дающие негативную оценку деятельности компании или высказывания в негативной тональности, объектом которых является компания.
Конечно, при необходимости эти определения можно доработать под конкретный кейс. Как, собственно и список правил, по которым будет проверяться сообщение в корпоративном чате.
На основании данных определений составим промпт - запрос модели на естественном языке для проверки сообщения на соответствие правилам бизнеса. От составленного промпта целиком и полностью будет зависеть результат работы модели.
На первом шаге проверки гипотезы было составлено более десяти различных вариантом промпта. Наиболее удачный оказался таким:
Промпт
Ты -модератор корпоративного чата компании "Ромашка"
Твоя задача - блокировать сообщения чата сотрудников компании "Ромашка", если они удовлетворяют одному или нескольким правилам
Правила:
1. текст сообщения содержит негативные высказывания о деятельности компании "Ромашка"
2. текст сообщения содержит персональные данные сотрудников компании "Ромашка". К персональным данным относятся 1) одна или несколько составляющих идентифицирующих персону сотрудника компании "Ромашка" - имя, фамилия, должность в компании И 2) одна или несколько характеристик персональных данных сотрудника компании "Ромашка" - место проживания, паспортные данные, личный номер мобильного телефона
3. текст сообщения содержит финансовую информацию компании "Ромашка". К финансовой информации относятся - стоимость договоров, заключенных компанией "Ромашка", заработная плата сотрудников компании "Ромашка", размер выручки или убытка компании "Ромашка", размер расходов компании "Ромашка" на операционную деятельность.
Проанализируй текст сообщения ниже и выполни одно из условий:
- если сообщение удовлетворяет одному или нескольким правилам, то:
1. запомни номера всех правил, которому удовлетворяет сообщение,
2. сгенерируй json следующего формата {"is_blocked": 1, "rules_number": [номера правил]}
- если сообщение не удовлетворяет не одному из правил - сгенерируй json следующего формата {"is_blocked": 0, "rules_number": []}
Текст сообщения
<сюда подставляется текст анализируемого сообщения>
Как будет показано ниже, по некоторым типам тестовых сообщений данный промпт давал неудовлетворительную оценку, что потребовало его доработки.
Подготавливаем набор тестовых сообщений для проверки
Решение "самому придумать варианты тестовых сообщений" было отклонено сразу. Ведь в нашем распоряжении есть LLM-модели, главное назначение которых - генерация текста. Для чистоты эксперимента задача генерации тестовых сообщений чата была поручена другой модели - chatgpt-4o
. Данная модель не поддерживается Ollama, но использовать ею без регистрации и смс можно на сайте LMArena
Для каждого бизнес-правила было сгенерировано по 20 тестовых сообщений. Дополнительно к генерации текста модели была поставлена задача указать флаг - соответствует сообщение правилам или нет. Это потребуется нам при оценке результатов работы тестируемых моделей.
После этого из списка были исключены однотипные сообщения и те, которые не соответствуют поставленной задаче. Итоговый датасет составил 42 тестовых сообщения.
Оценка эффективности тестируемых моделей
Оценка эффективности тестируемых моделей выполнялась вручную путем сравнения результатов работы моделей с флагами сгенерированных сообщений.
Для удобства оценки был написан python-скрипт , который: последовательно передает моделям сообщения из датасета и сохраняет результаты работы в csv-файл
run_
test.py
from my.prompts import PROMPT_1 as PROMPT
from my.input_text import MESSAGE_LIST_1 as MESSAGES
from ollama import generate, GenerateResponse
import json
MODELS = ['deepseek-r1:latest', 'qwen3:8b']
def check_message(msg:str, model:str) -> dict:
prompt = f'{PROMPT}\n"{msg}"'
result: GenerateResponse = generate(model, prompt, think=False, format='json')
try:
res = json.loads(result['response'])
res = {f'{k}_{model}':v for k,v in res.items()}
except:
res = {f'{i}_{model}':'---' for i in ['is_blocked', 'rules_number']}
return res
if __name__ == '__main__':
header_is_print = False
fdw = open('result.csv', 'w')
counter = 0
for msg in MESSAGES:
result = {}
for model in MODELS:
res = check_message(msg["message"], model)
result |= res
result |= msg
if not header_is_print:
fdw.write('\t'.join(result.keys())+ '\n')
header_is_print = True
fdw.write('\t'.join([str(v) for v in result.values()])+'\n')
counter += 1
print (f'Обработано сообщений: {counter}')
Файл prompts.py
содержит экспериментальные варианты промптов, передаваемых в модель. Формат хранения промптов
PROMPT_1 = 'Тект первого промпта'
PROMPT_2 = 'Текст второго промпта'
...
Перед запуском run_
test.py
достаточно в строке 1 указать переменную нужного промпта
Файл input_
text.py
содержит датасеты исходных сообщений для проверки моделью. Формат датасета:
input_
text.py
MESSAGE_LIST_1 = [
{
"message": "Текст сообщения",
"flag": 1 # 0
},
...
]
Можно подготовить несколько датасетов и передавать для тестирования в модель нужный. Для этого в строке 2 скрипта run_
test.py
нужно указать нужную переменную.
По итогу работы скрипта были получены следующие результаты
-
всего сообщений - 42, в т.ч.
-
сообщения с нарушениями правил - 23
deepseek верно определил - 22
qwen верно определил - 21
-
сообщений без нарушения правил - 19
deepseek верно определил - 3
qwen верно определил - 9
-
Таким образом, обе тестируемые модели ('deepseek-r1:latest', 'qwen3:8b') показали хороший результат идентификации сообщений, нарушающих одно или несколько правил корпоративного чата, и одновременно показали высокий процент ложных срабатываний - для сообщений в которых нет нарушения бизнес-правил ошибка 'deepseek-r1:latest' составила 85%, для 'qwen3:8b' - 53%.
Сообщения, по которым модели показали ложное срабатывание были разбиты на три типа:
упоминание конфиденциальной информации, не относящейся к компании, пример сообщения: "Вчера общался с другом из 'ТехноМир' — у них у сеньоров зп от 250 тысяч! Вот это, конечно, цифры. У нас всё как-то скромнее"
упоминание характеристики персональных данных без привязки к персоне, пример сообщения "В столовой забыли телефон: iPhone 12, номер +7(903)111-22-33. Лежит у охраны"
упоминание персоны без раскрытия ее персональных данных, пример сообщения "Алексей Дмитриевич Морозов, менеджер по продажам, переехал в новый офис на ул. Тверская, 10"
Для уменьшения доли ложных срабатываний для сообщений каждого типа была предпринята попытка доработать промпт-запрос, Так, например, правило, которое описывает требования к нераспространению персональных данных сотрудников компании (ложное срабатывание 2-го типа) было переписано следующим образом:
2.1. текст сообщения содержит имя, фамилию, должность сотрудника компании "Ромашка" И содержит номер личного мобильного телефона сотрудника компании "Ромашка".
2.2. текст сообщения содержит имя, фамилию, должность сотрудника компании "Ромашка" И содержит место проживания сотрудника компании "Ромашка".
Новая формулировка позволила устранить ошибки ложного срабатывания при использовании модели 'qwen3:8b' ('deepseek-r1:latest' продолжал давать неверные результаты)
Выводы
Результаты работы модели воспроизводимы: передавая модели на вход один и тот же датасет сообщений и один и тот же промпт мы будем получать одинаковые результаты. Для тех кто не работал с LLM-моделями вывод может показаться очевидным. Дело в том, что у LLM-моделей существует эффект "галлюцинаций" - для некоторого класса задач модель начинает "фантазировать" и выдавать разные результаты при одинаковых входных данных. Чтобы избежать этого эффекта часто требуется проводить дополнительные эксперименты со значениями входных параметров модели. В данной задаче этого не требуется
Наша гипотеза об эффективности LLM-моделей для модерации сообщений подтвердилась. Результат - более 90% идентификации сообщений с нарушением правил модерации можно считать удовлетворительным
Рассмотренный кейс может быть использован на практике без значительных накладных расходов. Его реализация сводится к написанию наилучшего промпта под требования бизнеса и выбору подходящей модели для модерации текстов сообщений
За рамками данной публикации осталось рассмотрение такого важного вопроса, как проектирование архитектурного решения, обеспечивающего приемлемую скорость модерации сообщений и его встройка в работу корпоративного чата. Но это уже другая история.
Комментарии (2)
definitelyRealPerson
19.07.2025 17:34Статья напоминает попытку найти волшебную таблетку для корпоративных чатов, но упускает важный момент: любая автоматизация работает лишь настолько хорошо, насколько чётко заданы правила. Без этого даже самые крутые LLM превращаются в болтливых секретарей. Нужна ещё архитектура, которая защитит от «галлюцинаций» моделей.
Kamil_GR
Могу предложить вам свежий пример, нечаянно попал на собеседование с нейрокадровиком...
Скрытый текст