В современном мире программирование становится все более тесно интегрированным с искусственным интеллектом. AI-кодовые ассистенты существенно облегчают жизнь разработчиков, беря на себя часть рутинных задач и позволяя сосредоточиться на решении более сложных инженерных проблем. Однако одним из ключевых вызовов остается оценка качества и эффективности таких AI-помощников именно в специфических условиях и уникальных рабочих процессах каждой команды или отдельного инженера. Традиционные бенчмарки для больших языковых моделей (LLM) зачастую не отражают реальную пользу инструментов в конкретных сценариях разработки. Как же определить, насколько эффективно AI способствует улучшению кода именно в вашем проекте? Решение этой непростой задачи предлагает методика автоматической оценки, основанная на анализе данных из каждого коммита в Git.
В основе данной концепции лежит идея использования уже существующих в работе разработчика процессах – контроля версий. Каждый разработчик сохраняет в репозитории Git структурированную запись изменений, которые считает достаточно важными и готовыми к интеграции в проект. Если можно связать каждое из этих сохранений (коммитов) с выводами и подсказками AI-помощника, возникает возможность построить непрерывный цикл обратной связи, позволяющий измерять влияние моделей на конечный результат. Одним из сложных аспектов является то, что в одном коммите могут объединяться изменения, созданные как человеком, так и при помощи AI. Причем часть изменений может быть только косвенно связана с подсказками ассистента — например, изменения в планировании кода или в командной оболочке, а не прямом генерации кода.
При этом код может меняться в нескольких частях, и эти правки могут иметь различную семантическую значимость. Для оценки качества нужно учитывать особенности конкретного языка программирования, поскольку одни и те же буквальные изменения в тексте могут либо кардинально менять логику программы, либо оставаться практически нейтральными. Применение простых текстовых метрик, таких как расстояние Левенштейна, на практике оказывается недостаточным. Такая метрика измеряет разницу между строками по количеству вставок, удалений и замен символов, не учитывая смысловое изменение кода. К примеру, в Python изменение порядка выполнения операций с нулями и скобками может выглядеть как небольшие изменения текста, но значительно изменить поведение программы.
В то же время, в языках, подобных Rust, изменения могут быть огромными с точки зрения количества символов, но не затрагивать логику. Чтобы справиться с этой проблемой, исследователи обратились к анализу кода с использованием деревьев синтаксического разбора с помощью библиотеки tree-sitter. Этот инструмент преобразует исходный код в структурированное дерево, где каждый узел представляет семантическую единицу – функцию, переменную, оператор и прочее. В отличие от простого текста, такое деревообразное представление отражает реальную структуру программы на уровне языка. Сопоставление изменений в виде деревьев требует своей собственной метрики для оценки сходства.
Общим выбором стала метрика редактирования дерева (Tree Edit Distance или TED), которая определяет минимальное количество операций по вставке, удалению и переименованию узлов, необходимых для превращения одного дерева в другое. Расчет TED основан на алгоритме Чжан-Шаша, который использует динамическое программирование для эффективного выполнения вычислений, несмотря на кубическую по размеру дерева сложность. Однако в реальных условиях один AI-инференс (ответ) может содержать не один, а несколько отдельных фрагментов кода, как и коммит может представлять множество обособленных изменений. Поэтому в задачу оценки входит не просто сравнение двух деревьев, а сопоставление множества деревообразных фрагментов из AI-инференса с поддеревьями, найденными в деревьях, которые составляют коммит – своего рода поиск наилучшего совпадения по деревьям. Для каждой пары вычисляется нормализованное значение TED и, на основе среднего значения для всех фрагментов, формируется интегральная оценка качества «вознаграждения», где 1 означает идеальное совпадение, а значения ближе к нулю – плохое соответствие.
Реализация такой комплексной оценки невозможна без автоматизации. По этой причине была создана специализированная утилита на Rust, запускаемая в качестве post-commit hook в Git. После каждого коммита она автоматически извлекает хунки – участки кода, добавленные или изменённые в коммите, получает релевантные инференсы AI с помощью системы хранения данных ClickHouse, парсит их с использованием tree-sitter и рассчитывает описанную метрику TED для оценки вклада каждого AI-ответа в итоговый код. Высокая вычислительная нагрузка решается с помощью параллельных вычислений с использованием библиотеки Rayon, что позволяет обрабатывать множество фрагментов и инференсов быстро и без заметного замедления в инженерском цикле. Таким образом, формируется большая база данных, содержащая не только сами подсказки AI, но и количественную оценку их полезности в реальной работе.
Это дает ценнейшую обратную связь для настройки моделей, выбора оптимальных промптов и гиперпараметров, а также экспериментов с разными архитектурами и версиями языковых моделей. По мере накопления данных можно будет проводить углубленные исследования того, как эффективность ассистентов зависит от выбранного языка программирования, специфики каждого инженера или даже свойства моделей из разных регионов. Ранние эксперименты показали, что в рамках индивидуальных паттернов работы одного из руководителей TensorZero некоторые модели, например GPT-4.1, показывали меньшую эффективность по сравнению с альтернативами, такими как Claude 3.7 Sonnet или Gemini 2.
5 Pro. Это подчеркивает важность гибкой локальной оценки, поскольку универсальных лидеров нет – каждый разработчик и проект уникальны. Параллельно с оценкой моделей, данный подход дает возможности для реализации комплексного процесса оптимизации LLM-подсказок с использованием техник многоруких бандитов – алгоритмов, которые в режиме реального времени перенаправляют поток запросов на наиболее успешные варианты. Это способствует непрерывному улучшению ассистентов и умному распределению ресурсов команды разработки. Перспективы развития подобных систем выглядят весьма многообещающими.
Можно представить, что в будущем будет осуществляться прямая оптимизация моделей с использованием данных из реальной работы, полученных с помощью такого рода инструментов. Вопросы, касающиеся необходимости дообучения модели либо применения динамического контекстного обучения, остаются открытыми и будут предметом исследований. Кроме программирования, сходные методы могут быть применены к другим этапам жизненного цикла разработки, например для автоматизации составления отчетов об изменениях в коде или систем контроля качества. Более того, открытая структура данного решения и использование стандартных инструментов – Git, tree-sitter, ClickHouse – делают его доступным для широкого применения в различных проектах. В конечном итоге, интеграция интеллектуальной оценки AI-помощников в привычный процесс коммитов создает мощный обратный цикл, который превращает каждый коммит в источник данных для непрерывного обучения и совершенствования моделей.