AI-система предсказания дефектов в коде (Defect Prediction)
Дефекты в коде не случайны. Файлы с высокой цикломатической сложностью, большим количеством авторов и частыми изменениями статистически содержат в 3–5 раз больше багов, чем стабильные модули. Defect Prediction — это ML-модель, которая анализирует статические метрики кода, историю изменений и паттерны коммитов, чтобы заранее указать на зоны риска — до того как баг попадёт в продакшен.
Признаки для модели
Качество предсказания определяется набором признаков. Используем три группы:
Метрики кода (статический анализ):
- Цикломатическая сложность (McCabe complexity)
- LOC, LLOC, количество методов на класс
- Глубина наследования (DIT), связанность (CBO) для OOP
- Количество параметров методов
- Halstead Volume, Maintainability Index
Git-метрики (history-based):
- Количество коммитов за 30/90/365 дней (change frequency)
- Количество уникальных авторов
- Возраст файла (days since creation)
- Количество merge conflicts в истории
- Code churn:
(lines_added + lines_deleted) / LOC
Process-метрики:
- Количество связанных issues/tickets
- Время жизни PR до merge
- Количество review iterations
- Количество revert-коммитов
import pandas as pd
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.pipeline import Pipeline
def build_defect_predictor(train_df: pd.DataFrame):
feature_cols = [
'cyclomatic_complexity', 'loc', 'num_authors',
'change_frequency_90d', 'code_churn', 'avg_pr_iterations',
'dit', 'cbo', 'halstead_volume'
]
pipeline = Pipeline([
('clf', GradientBoostingClassifier(
n_estimators=300,
max_depth=5,
learning_rate=0.05,
subsample=0.8,
random_state=42
))
])
pipeline.fit(train_df[feature_cols], train_df['has_defect_90d'])
return pipeline
Сбор и разметка данных
Разметка — ключевой этап. Определяем «дефектный» файл: файл, к которому привязан хотя бы один commit с сообщением, содержащим fix, bug, defect, hotfix за период наблюдения. Дополнительно — ручная разметка от команды по серьёзным инцидентам.
Для формирования датасета используем PyDriller для извлечения git-метрик и radon для Python-метрик, lizard — универсальный анализатор для Python, Java, Go, C++, JavaScript.
# Сбор метрик через radon и lizard
radon cc src/ -j -a > complexity_metrics.json
lizard src/ --csv > code_metrics.csv
Интеграция в Code Review процесс
Модель запускается при открытии Pull Request. В комментарии к PR добавляется предупреждение для файлов с defect_probability > 0.7:
⚠️ High defect risk detected in `src/payment/processor.py`
Predicted defect probability: 83%
Risk factors: high cyclomatic complexity (18), 5 authors,
changed 12 times in last 30 days
Recommendation: mandatory 2 reviewers, add integration tests
Дополнительно система формирует еженедельный отчёт «Технический долг по риску» — топ-20 файлов, требующих рефакторинга или усиленного тестирования.
Метрики качества на реальных проектах
| Метрика | Значение |
|---|---|
| AUC-ROC | 0.82–0.89 |
| Precision (top 20% risky files) | 0.71–0.78 |
| Recall (известные дефекты) | 0.74–0.82 |
| Предсказания за 14+ дней до бага | 68% случаев |
Поддерживаемые языки и репозитории
Java, Python, Go, TypeScript/JavaScript, C++, C#, PHP. Репозитории: GitHub, GitLab, Bitbucket — через API или локальный клон.
| Размер кодовой базы | Срок внедрения |
|---|---|
| До 50k строк | 2–3 недели |
| 50k–500k строк | 3–5 недель |
| Более 500k строк | 5–8 недель |







