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

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

Видео 10:01 и текст урока

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

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

Смотреть урок на Skilljar Model based grading · 10:01

В процессе оценки промптов системы оценки (грейдеры) дают объективный сигнал о качестве результата. Грейдер принимает ответ модели и возвращает измеримую обратную связь — обычно число от 1 до 10, где 10 означает высокое качество, а 1 — низкое.

Типы грейдеров

Сравнение грейдеров: код, модель и человек; модель и человек умеют ещё и сравнивать две версии ответа.
Грейдеры на основе кода, модели и человека. Модель и человек умеют ещё и сравнивать две версии ответа.

Есть три основных подхода к оценке ответов модели:

Грейдеры на коде

Грейдер на коде позволяет реализовать любую программную проверку, какую только можно придумать. Типичные применения:

Единственное требование — код должен вернуть пригодный сигнал, обычно число от 1 до 10.

Грейдеры на модели

Грейдер на модели отправляет исходный ответ в ещё один вызов API для оценки. Такой подход даёт огромную гибкость в оценке:

Люди-оценщики

Люди дают наибольшую гибкость, но это долго и утомительно. Они полезны для оценки:

Критерии оценки

Вопрос «Как узнать, что промпт даёт хорошие ответы?» и три критерия.
«Как узнать, что промпт даёт хорошие ответы?» — три критерия ниже.

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

Format и Valid Syntax объединены под грейдером на коде, Task Following — под грейдером на модели.
«Format» и «Valid Syntax» проверяет грейдер на коде, «Task Following» — грейдер на модели.

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

Пишем грейдер на модели

Вот как построить функцию-грейдер на основе модели:

def grade_by_model(test_case, output):
    # Create evaluation prompt
    eval_prompt = """
    You are an expert code reviewer. Evaluate this AI-generated solution.

    Task: {task}
    Solution: {solution}

    Provide your evaluation as a structured JSON object with:
    - "strengths": An array of 1-3 key strengths
    - "weaknesses": An array of 1-3 key areas for improvement
    - "reasoning": A concise explanation of your assessment
    - "score": A number between 1-10
    """

    messages = []
    add_user_message(messages, eval_prompt)
    add_assistant_message(messages, "```json")

    eval_text = chat(messages, stop_sequences=["```"])
    return json.loads(eval_text)

Ключевая идея — просить вместе с баллом сильные стороны, слабые стороны и обоснование. Без этого контекста модели склонны ставить средние оценки — около 6.

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

Обновите функцию прогона тестового случая, чтобы она вызывала грейдер:

def run_test_case(test_case):
    output = run_prompt(test_case)

    # Grade the output
    model_grade = grade_by_model(test_case, output)
    score = model_grade["score"]
    reasoning = model_grade["reasoning"]

    return {
        "output": output,
        "test_case": test_case,
        "score": score,
        "reasoning": reasoning
    }

Наконец, посчитайте средний балл по всем тестовым случаям:

from statistics import mean

def run_eval(dataset):
    results = []

    for test_case in dataset:
        result = run_test_case(test_case)
        results.append(result)

    average_score = mean([result["score"] for result in results])
    print(f"Average score: {average_score}")

    return results

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

Дальше

Следующий урок добавляет грейдер на коде — для формата и синтаксиса — и объединяет его балл с оценкой модели.

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