Оценка с помощью кода

Чему научитесь

Видео 7:26 и текст урока

К концу урока вы сможете:

Видео и текст урока.

Смотреть урок на Skilljar Code based grading · 7:26

Когда вы оцениваете ИИ-модели, которые генерируют код, мало проверить, что ответ осмыслен. Нужно ещё убедиться, что сгенерированный код синтаксически корректен и имеет правильный формат. Для этого и нужна оценка с помощью кода.

Как работает оценка кодом

Оценка кодом проверяет две ключевые стороны ответа ИИ:

Format и Valid Syntax под грейдером на коде, Task Following под грейдером на модели.
«Format» и «Valid Syntax» — за грейдером на коде, «Task Following» — за грейдером на модели.

Первые два критерия проверяет грейдер на коде, а следование задаче оценивает грейдер на модели. Вместе они дают всестороннюю оценку.

Функции проверки синтаксиса

Чтобы проверить синтаксис сгенерированного кода, можно написать три вспомогательные функции, которые пытаются разобрать ответ:

Три валидатора: разбор как JSON, разбор в абстрактное синтаксическое дерево Python, компиляция как regex.
Три валидатора: разбор как JSON, разбор в синтаксическое дерево Python (AST) и компиляция как регулярного выражения.
def validate_json(text):
    try:
        json.loads(text.strip())
        return 10
    except json.JSONDecodeError:
        return 0

def validate_python(text):
    try:
        ast.parse(text.strip())
        return 10
    except SyntaxError:
        return 0

def validate_regex(text):
    try:
        re.compile(text.strip())
        return 10
    except re.error:
        return 0

Каждая функция пытается разобрать текст в своём формате. Если разбор удался, она возвращает высший балл 10. Если возникла ошибка — синтаксис неверный, и функция возвращает 0.

Требования к датасету

Чтобы грейдер на коде знал, какой валидатор применить, в тестовых случаях нужно указывать ожидаемый формат ответа:

{
    "task": "Create a Python function to validate an AWS IAM username",
    "format": "python"
}

Промпт генерации датасета можно обновить, чтобы поле format появлялось автоматически: достаточно добавить его в пример структуры вывода.

Делаем промпт яснее

Чтобы модель отвечала лучше, сделайте указания о формате ответа в промпте конкретнее:

* Respond only with Python, JSON, or a plain Regex
* Do not add any comments or commentary or explanation

Можно также предзаполнить сообщение ассистента блоком кода, чтобы модель возвращала только сам код:

add_assistant_message(messages, "```code")

Так Claude начнёт сразу с содержимого кода, и не придётся заранее указывать, будет ли это Python, JSON или Regex.

Объединяем баллы

Последний шаг — объединить балл грейдера на модели с баллом грейдера на коде. Простой способ — взять среднее:

model_grade = grade_by_model(test_case, output)
model_score = model_grade["score"]
syntax_score = grade_syntax(output, test_case)

score = (model_score + syntax_score) / 2

Так качество содержания и техническая корректность получают одинаковый вес. Веса можно менять в зависимости от того, что важнее в вашей задаче.

Проверяем реализацию

Добавив оценку кодом, запустите оценку и получите исходный балл. Сам по себе балл не хорош и не плох — важно, получится ли его улучшить, дорабатывая промпт. Это даёт количественный способ измерять прогресс в prompt engineering вместо субъективных впечатлений.

Дальше

В упражнении грейдеру на модели дают больше контекста — критерии хорошего решения для каждой задачи.

Оригинал урока: Code based grading.