/
Вопросы и ответы
/
Промт-инжиниринг
/

LLM для code review: как настроить

LLM для code review: как настроить

9 часов назад

Никита Вихров

Ответы

0

LLM для code review: как настроить

ИИ-ревью не заменяет человека, но закрывает рутину: опечатки, стиль, очевидные баги, отсутствие обработки ошибок. Человек смотрит архитектуру и бизнес-логику. ИИ — механику.


Базовый ревьюер

from anthropic import Anthropic
import subprocess

client = Anthropic()

CODE_REVIEW_SYSTEM = """Ты — строгий senior code reviewer.

Проверяй код на:
1. Баги и логические ошибки
2. Необработанные исключения и граничные случаи
3. Проблемы с безопасностью (инъекции, утечки данных)
4. Нарушения принципов SOLID и чистого кода
5. Отсутствие или неполные тесты

Формат каждого замечания:
[CRITICAL/WARNING/SUGGESTION] Строка X: описание проблемы
Почему: объяснение
Исправление: конкретный пример кода

В конце: общая оценка и можно ли мёрджить (YES/NO/NEEDS_WORK)."""


def review_file(filepath: str) -> str:
    with open(filepath) as f:
        code = f.read()

    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=2048,
        system=CODE_REVIEW_SYSTEM,
        messages=[{
            "role": "user",
            "content": f"Файл: {filepath}\n\n```\n{code}\n```"
        }]
    )
    return response.content[0].text

Ревью только изменений — как на настоящем PR

Не нужно ревьюить весь файл. Только что изменилось:

def get_git_diff(base_branch: str = "main") -> str:
    result = subprocess.run(
        ["git", "diff", base_branch, "--unified=5"],
        capture_output=True, text=True
    )
    return result.stdout


def review_pr(base_branch: str = "main") -> str:
    diff = get_git_diff(base_branch)

    if not diff:
        return "Нет изменений для ревью"

    # Считаем токены — diff может быть большим
    token_count = client.messages.count_tokens(
        model="claude-opus-4-5",
        messages=[{"role": "user", "content": diff}]
    )

    if token_count.input_tokens > 100_000:
        return "Diff слишком большой. Разбей PR на части."

    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=3000,
        system=CODE_REVIEW_SYSTEM,
        messages=[{
            "role": "user",
            "content": f"Проверь этот git diff:\n\n```diff\n{diff}\n```"
        }]
    )
    return response.content[0].text

Ревью с контекстом проекта

Без контекста ревьюер не знает твои соглашения. Передай их:

PROJECT_CONTEXT = """
Стек: Python 3.11, FastAPI, SQLAlchemy 2.0, PostgreSQL
Соглашения:
- async/await везде, нет синхронных вызовов к БД
- Кастомные исключения из app/exceptions.py, не стандартные HTTPException
- Type hints обязательны для всех публичных функций
- Тесты обязательны для бизнес-логики, coverage > 80%
- Секреты только через переменные окружения, не хардкодить
"""

CODE_REVIEW_SYSTEM_WITH_CONTEXT = CODE_REVIEW_SYSTEM + f"""

Контекст проекта:
{PROJECT_CONTEXT}

Проверяй соответствие этим соглашениям как отдельную категорию."""

Автоматический ревью в pre-commit

# .pre-commit-config.yaml
repos:
  - repo: local
    hooks:
      - id: ai-review
        name: AI Code Review
        entry: python scripts/ai_review.py
        language: python
        pass_filenames: true
        types: [python]

Что ИИ находит хорошо и плохо

Находит хорошо: очевидные баги, отсутствие обработки ошибок, SQL injection и XSS, нарушения стиля, дублирование кода.

Находит плохо: архитектурные проблемы на уровне системы, соответствие бизнес-требованиям, производительность без профилирования, проблемы конкурентности в сложных сценариях.

ИИ-ревью — первый фильтр, а не последний.


На курсе «ИИ для разработчиков» на Хекслете разбирают практическое применение ИИ в рабочем процессе разработчика: ревью, дебаг, рефакторинг, работа с документацией.

9 часов назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845