На карте видно, что в середине недели наибольшая нагрузка на ревьюеров
Разработчику достаточно в любом PR оставить комментарий ai_review. После этого сгенерируется событие, которое отправится в Data Bus, и уже оттуда его вычитает Go-сервис
End-to-End поток запроса. В конце генерируются итоговые комментарии, которые уходят в Go-сервис и публикуются на Stash
Процесс по шагам
1. Запуск ревью из Stash. Пользователь оставляет комментарий ai_review, после чего генерируется Data Bus событие. Go-сервис получает его и парсит команду.
2. Подготовка данных. Go-сервис получает diff и такие метаданные, как структура репозитория и существующие комментарии. Далее кладёт ревью в базу со статусом STATE_REQUESTED. После этого отправляет RPC в ML-сервис.
3. Вызов ML-сервиса (RPC). Поскольку генерация может длиться долго, ML-сервис немедленно отвечает 200 OK, чтобы не блокировать Go-сервис и долго не держать соединение. После этого ревью переходит в статус BackgroundTaskRunner.
Лидерборд моделей MERA-RuCodeReviewer: мы выбрали Qwen3-Coder-30B-Instruct-FP8 и она занимает второе место
Две причины селф-хостинга
Безопасность. Важно, чтобы весь код оставался во внутреннем контуре и не передавался во внешние системы через API.
Экономика. По нагрузке генерации получаются токеноёмкими: для небольших PR это около 2 000 токенов, а для крупных — до 10 000. При таких объёмах использование API становится дорогим, тогда как собственные ресурсы у нас уже есть. По сравнению с API-моделью селф-хостинг позволяет снизить стоимость без потери качества.
…
@@ -45,7 +45,9 @@ def process_data(data):
if data is None:
- return None
+ raise ValueError ("Data cannot be None")
……
@@ -45,7 +45,9 @@ def process_data(data):
[unchanged] if data is None:
[deleted or pre-modified @46 in old code] - return
None
[added or post-modified @46 in new code] + raise
ValueError ("Data cannot be None")
…Детальный ML-пайплайн, на котором описаны все этапы
Производительность решения. На демо-репозиториях мы собираем усредненный diff. Пул-реквесты условно делим на малые — до 3 файлов и большие — 10+ файлов. Малые пул-реквесты обрабатываются за 10–20 секунд. Большие — примерно за 60 секунд.
Для стабильной работы мы ограничиваем количество параллельных ревью до 650 штук. Это число получили из анализа нагрузки, и специально дополнительно завысили, чтобы оставить ресурс на расширение.
Пример генерации. В одном из пул-реквестов неправильно указали диапазон времени — не по московскому времени. Модель предложила исправить диапазон, и разработчик поставил лайк
Высокая оценка DS-специалиста
Outdated rate можно разделить по категориям репозиториев. Например, в Infra и DevOps метрика достигает 60%, что даже для человеческих комментариев считается высоким результатом
Больше про DS и ML рассказываем в нашем телеграм-канале «Доска AI-объявлений». Пишем про ИИ, делимся вакансиями и анонсируем интересные мероприятия.
→ Заглянуть