Разработчик, использующий ИИ для генерации коммитов, столкнулся с забавной и поучительной проблемой. Его скрипт, который должен был удалять из коммит-сообщений строки с упоминанием ИИ, начал удалять вообще все сообщения, где встречалось слово «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: если после фильтрации остаётся пустое сообщение, должно быть понятно, что это — ошибка фильтра, а не намеренное удаление.
Вывод
История с багом наглядно показывает: детерминированные фильтры, которые лечат проблему с ИИ, сами могут стать источником новых проблем. Недостаточно написать фильтр, который решает одну конкретную проблему. Нужно задать вопрос: а не заденет ли он что-то ещё? В случае с подстроками ответ почти всегда — заденет. Используйте более точные паттерны и всегда проверяйте на реальной истории изменений. Это займёт десять минут, но сэкономит часы разбора пустых коммитов.
Комментарии (1)
Войдите, чтобы комментировать.