Слогер Создать блог
Разработка

Почему фильтр для коммитов ИИ удаляет полезные строки: разбор ошибки с подстрокой «llm»

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

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

Суть проблемы

Когда ИИ генерирует commit message, он иногда добавляет строки вида Co-Authored-By: Claude или Generated by OpenAI. Это нежелательно, если вы не хотите приписывать авторство машине. Один из способов борьбы — детерминированный фильтр: после генерации вы отбрасываете строки, содержащие определённые подстроки.

Именно такой фильтр использовал автор. Список подстрок включал: co-author, co-authored, generated by, claude, anthropic, openai, llm, ai:. Логика простая: если в строке есть любое из этих сочетаний — строка удаляется.

Что пошло не так

Фильтр сработал. Строки «Co-Authored-By: Claude» исчезли. Но через некоторое время автор заметил странное поведение: некоторые коммиты возвращали пустое сообщение. Проверив на реальных примерах, он увидел, что любая строка, содержащая сочетание символов «llm», удаляется целиком. Например:

  • fix: retry llm calls on 429 with backoff → пусто
  • feat: add llm-based tag scoring for trending posts → пусто
  • docs: explain how generate_commit_message calls the llm subprocess → пусто

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

Почему так вышло

Подстрока llm — не то же самое, что словосочетание «как ИИ» или «сгенерировано ИИ». Она встречается в обычных технических текстах, особенно если коммит описывает код, который использует большие языковые модели. То же самое с ai: — если в сообщении есть слово, оканчивающееся на «ai:» (например, «retry:»), оно тоже попадёт под фильтр.

Разница между двумя типами багов:

Тип Что происходит Пример
Недофильтрация ИИ добавляет нежелательные строки, фильтр их не ловит Co-Authored-By: Claude остаётся в коммите
Оверфильтрация Фильтр удаляет строки, которые удалять не следовало fix: retry llm calls становится пустым

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

Как исправить

Вместо llm и ai: нужно использовать более точные атрибутивные фразы, которые модель действительно пишет, когда начинает рассуждать о себе. Например, as an ai или llm-generated. Или использовать регулярные выражения с границами слов: \bllm\b будет находить только отдельное слово «llm», а не «llm-based» или «llm-process».

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

Чек-лист для безопасной фильтрации

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

Вывод

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

По материалам: ai. Текст переработан редакцией Слогера.

← На главную

Рекламное место — Конец поста
Реклама · Слогер

Комментарии (1)

Войдите, чтобы комментировать.

Md Shamiul Ali Suzan 01.09.2026 09:33 0
Очень интересный материал! Особенно понравилось, что автор не просто описывает проблему, а показывает её с понятной и практической стороны. После прочтения действительно остаётся несколько полезных мыслей, которые хочется применить на практике. Спасибо за качественный и содержательный материал!