Применение LLM-модели для ревью кода

Главная > Блог >Применение LLM-модели для ревью кода

Содержание

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

Проблема

Классическое ревью кода нередко страдает от нескольких типичных проблем:
— Оно может быть субъективным и даже токсичным. Автору бывает непросто восприни-мать замечания, особенно если они звучат жёстко.
— Разработчики не всегда готовы тратить время на разбор чужого кода, ведь у всех свои за-дачи и дедлайны.
— Корпоративные стандарты есть, но вспоминают о них обычно только тогда, когда ревью уже завершено.

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

Решение

С ростом возможностей больших языковых моделей становится возможным делегировать им рутину. Мы собрали экспериментальную систему, где LLM выступает как независимый эксперт по ревью кода. Она анализирует изменения, сверяет их с корпоративными правила-ми и предлагает корректировки в понятной форме — без субъективных оценок и эмоций.

В основе проекта — несколько модулей. Каждый из них выполняет конкретную задачу: от общения с моделью до интеграции с GitLab.

Модуль gpt.py
Этот класс отвечает за взаимодействие с моделью YandexGPT. Через него формируются за-просы, отправляются на сервер и возвращаются ответы. Фактически — это интерфейс меж-ду разработчиком и LLM.

```python

from yandex_cloud_ml_sdk import YCloudML
from yandex_cloud_ml_sdk._models.completions.model import GPTModel
from yandex_cloud_ml_sdk._models.completions.result import GPTModelResult



class GptModel:
def __init__(
self,
yc_folder_id: str,
yc_auth_token: str,
model: str = "yandexgpt",
temperature: float = 0.1,
):
self.gpt = YCloudML(
folder_id=yc_folder_id,
auth=yc_auth_token,
)
self.model = self.gpt.models.completions(model)
self.model = self.model.configure(temperature=temperature)


def _send_request(self, text):
response = self.model.run(text)
return response

def _parse_response(self, response: GPTModelResult):
return response

def query(self, query: str) -> GPTModelQueryResult:
response = self._send_request(query)
result = response.alternatives[0].text
return result
```

По умолчанию используется модель YandexGPT PRO с температурой 0.1, что позволяет по-лучать стабильные и предсказуемые результаты. ID папки и токен берутся из настроек Ян-декс Облака.

Модуль reviewer.py
Класс CodeReview выполняет саму проверку кода. Он формирует запрос к модели, добавляет к нему описание правил из style guide и передаёт код на анализ. Результат — структуриро-ванный отчёт с найденными проблемами, рекомендациями и примерами исправлений.

```python

from yandex_cloud_ml_sdk import YCloudML

from reviewer.gpt import GptModel


class CodeReview:
def __init__(self, yc_folder_id: str, yc_auth_token: str, review_filename: str | None = None):
self.gpt = GptModel(yc_folder_id, yc_auth_token)

def review_diffs(self, file_name: str, code: str, params: dict):
result = dict()

with open("templates/python/style-guide.md", 'r') as f:
code_guide = f.readlines()
code_guide = "".join(code_guide)
if len(code) > 0:
query = f"""
Ты опытный разработчик-программист, специализирующийся на ревью изменений в репозиториях на языке python проекта. \n
Есть правила написания кода на Python, которые мы используем. Вот их описание:\n
{code_guide} \n

Нужно провести ревью изменений: найти логические ошибки, уязвимости, проблемы со стилем наших правил выше по тексту, предложить улучшения и тесты. Резюмировать результаты в следующем фор-мате: Проблема - Рекомендации по исправлению с примерами.

Код из файла {file_name}:\n
```{code}```
"""

review_result = self.gpt.query(query)

return review_result

```

Класс выполняет непосредственно ревью полученных изменений из мердж реквеста в мето-де review_diffs и формирует выводы, которые затем можно будет добавить в gitlab.
Пример базового style guide:

PEP8 Стремимся к соблюдению PEP8, за исключением длины строки. У нас граница - 120 символов.
Кавычки используем двойные.
Все логи пишем на английском языке.
Все публичные фукнции, классы и модули должны иметь docstring.
Короткий способ написать докстринг, который помещается на одной строке. Переносить не надо, заканчивать точкой обязательно.

Затем формируется базовый промт, который описывает модели ее роль, что нужно сделать и добавляет в пром стилистику кода и сам код. Промт отправляется в модель и полученный результат возвращается из функции review_diffs.

Это позволяет разработчику сразу увидеть, где нарушены правила или логика, и как это можно улучшить.

Модуль gitlab.py
Для интеграции с GitLab создаётся отдельный класс GitlabApi. Он получает список измене-ний из merge request и публикует комментарии с результатами ревью. Таким образом, весь процесс выглядит естественно — модель просто становится ещё одним участником коман-ды, оставляющим объективные комментарии под MR.

```python
import requests

class GitlabApi:
def __init__(self, base_url: str, token: str):
self.base_url = base_url
self.auth_headers = {
"PRIVATE-TOKEN": token
}

def get_diffs(self, project_id: int, mr_id: int) -> list[dict]:
url = f"{self.base_url}projects/{project_id}/merge_requests/{mr_id}/changes"
response = requests.get(url, headers=self.auth_headers)
body = response.json()
return body.get("changes", [])


def post_review(self, project_id: int, mr_id: int, message: str):
url = f"{self.base_url}projects/{project_id}/merge_requests/{mr_id}/notes"
response = requests.post(url, headers=self.auth_headers, params={"body": message})
return response.status_code

Токен для доступа к API GitLab можно получить через настройки профиля.

Скрипт main.py
Этот файл объединяет все части проекта. Он получает идентификаторы проекта и merge request, запускает проверку и отправляет результаты обратно в GitLab. Фактически — это точка входа всей системы. После запуска LLM анализирует каждое изменение и публикует комментарии так, будто это сделал живой ревьюер.

```python
import os
import sys

from reviewer.gitlab import GitlabApi
from reviewer.reviewer import CodeReview

if __name__ == "__main__":
project_id = sys.argv[1]
merge_request_id = sys.argv[2]

YC_FOLDER_ID = os.getenv("YC_FOLDER_ID")
YC_AUTH_TOKEN = os.getenv("YC_AUTH_TOKEN")
code_review = CodeReview(YC_FOLDER_ID, YC_AUTH_TOKEN)

BASE_URL = os.getenv("BASE_URL")
PRIVATE_TOKEN = os.getenv("PRIVATE_TOKEN")
api = GitlabApi(BASE_URL, PRIVATE_TOKEN)

diffs = api.get_diffs(project_id, merge_request_id)
for diff in diffs:
path = diff.get("new_path")
code = diff.get("diff")
result = code_review.review_diffs(path, code, params={})
api.post_review(project_id, merge_request_id, result)

Скрипт получает изменения из merge request, отправляет их модели на ревью и
добавляет результаты как комментарии в GitLab.

Запуск
Перед запуском нужно задать переменные окружения:

```shell
export YC_FOLDER_ID=<id папки в яндекс облаке>
export YC_AUTH_TOKEN=<токен авторизации в Яндекс облаке>
export BASE_URL= «https://<базовый url gitlab>/api/v4/»
export PRIVATE_TOKEN=<токен доступа к проекту gitlab>

python main.py 100 1516

После выполнения модель проведёт ревью и опубликует комментарии прямо в merge request.

Результат
Получившийся инструмент автоматизирует типовые проверки, снижает нагрузку на коман-ду и помогает сделать процесс ревью спокойным и прозрачным.
LLM не заменяет человека, но берёт на себя рутину — поиск стилистических и логических несоответствий, анализ оформления и подсказки по улучшению тестов. А команда может сосредоточиться на сути — архитектуре и логике приложения.

Дальнейшие шаги очевидны: можно тестировать разные модели (Qwen, DeepSeek, OpenAI), играть с параметрами температуры и формата ответов, а также добавить автоматический запуск ревью через GitLab CI/CD. Таким образом, ревью превращается не в обязанность, а в умный инструмент, который помогает писать лучший код.