Если описывать схематично, наш алгоритм работает так:
- Мы непрерывно выгружаем из телеграма новости из более чем 700 телеграм-каналов, включая оппозиционные, провластные и региональные медиа России, а также каналы губернаторов и госструктур и украинские медиа.
- Каждый пост проверяется искусственным интеллектом, и если он описывает военный инцидент, то ИИ извлекает из него тип инцидента и место происшествия.
- Посты об одних и тех же действиях, произошедших в одном месте, группируются и считаются одним событием.
Военные инциденты отбираются с помощью языковой модели. На первом этапе модель определяет, описывает ли сообщение конкретное произошедшее военное событие на территории России или аннексированного Крыма (другие оккупированные территории мы не включали). К военным инцидентам относятся только фактические боевые действия (атаки БПЛА с попаданием в цель, ракетные удары, перехваты средствами ПВО, артиллерийские обстрелы, воздушные удары, наземные операции, военно-морские атаки), при этом исключаются воздушные тревоги без последствий, предупреждения об угрозах и так далее.
На втором этапе с помощью той же языковой модели мы извлекаем структурированную информацию: конкретное место происшествия, регион, категорию и краткое описание. Если в одном сообщении упоминается несколько локаций или типов атак, они выделяются в отдельные события.
Мы учитываем настолько точную локацию, насколько это возможно из контекста новости. Например, если в новостях указан только город, все посты об атаках беспилотников в этом городе в этот день будут считаться одной атакой, а если в новостях писали о прилетах в конкретные районы города, такие точки отметятся на карте отдельно.
Потом модель проверяет каждое выделенное событие на корректность: модель подтверждает, что категория военного инцидента и регион действительно упоминаются в исходном тексте, и определяет давность события.
Отбрасываются события, произошедшие более одного дня назад от момента публикации поста. Мы проверяли посты на этот критерий путем проверки наличия определенных ключевых слов («неделю назад», «месяц назад» и т. д.), а также с помощью той же языковой модели Gemini.
После выделения постов о военных инцидентах с помощью отдельного алгоритма дедупликации мы объединяем посты об одних и тех же событиях. Посты считаются описывающими одно событие, если совпадают тип военного действия и локация, а временная разница между публикациями не превышает 24 часов.
Если у обоих постов указана локация, проверяется их близость на карте с помощью API Google Maps (локация считается одной и той же, если между точками меньше трех километров), а также похожесть названий локаций (если они звучат похоже, например, «Шебекино» и «Щебекино», мы считаем, что имелось в виду одно место, даже если API Google Maps геолоцировал в разные точки).
Если у какого-то события локация не указана, а указан только регион, то мы проверяем эмбеддинги описаний событий — векторные представления текстов, созданные с помощью API OpenAI. Если они близки, то мы считаем, что тексты описывают одно и то же событие.
Несмотря на сложный алгоритм объединения событий и удаления дублей, нам не удалось полностью от них избавиться. Мы проверили количество дублей военных событий одной недели в октября 2024-го и 2025-го года, а также в январе 2026. Суммарно за эти даты модель выделила 806 событий после алгоритма дедупликации. При ручной проверке оказалось, что из них 95% были реальными уникальными событиями, а не дублями других событий. Также мы заметили, что около 5% событий содержат ошибки в описании или локации — от них полностью избавиться тоже не удалось.