Оценка промптов в Anthropic Workbench

Урок 2 из 9 курса «Оценка качества промптов»: официальный курс Anthropic Academy (Антропик) на русском языке. Этот урок бесплатный.

Оценка в Anthropic Workbench

Оценка в Anthropic Workbench

Этот урок покажет вам, как использовать Anthropic Workbench для проведения собственных оценок с участием людей. Это чрезвычайно простой в использовании и наглядный интерфейс для быстрого прототипирования prompt'ов и проведения оценок с участием людей. Хотя мы обычно рекомендуем использовать более масштабируемый подход для оценок в продакшене, Anthropic Workbench — отличное место для начала работы с оценками, выполняемыми людьми, прежде чем переходить к более строгим оценкам, выполняемым кодом или моделью.

В этом уроке мы увидим, как использовать Workbench для тестирования prompt'ов, проведения простых оценок и сравнения версий prompt'ов.


Anthropic Workbench

Workbench от Anthropic — отличное место для быстрого прототипирования prompt'ов и проведения оценок с участием людей. Вот как выглядит Workbench при первой загрузке:

empty_workbench.png

С левой стороны мы можем ввести prompt. Представим, что мы работаем над приложением для перевода кода и хотим написать наилучший prompt, чтобы использовать Anthropic API для перевода кода с любого языка программирования на Python. Вот первая попытка создания prompt'а:

You are a skilled programmer tasked with translating code from one programming language to Python. Your goal is to produce an accurate and idiomatic Python translation of the provided source code.

Here is the source code to translate:

<source_code>
{{SOURCE_CODE}}
</source_code>

The source code is written in the following language:

<source_language>
{{SOURCE_LANGUAGE}}
</source_language>

Please translate this code to Python

Обратите внимание на переменные {{SOURCE_CODE}} и {{SOURCE_LANGUAGE}}, которые мы позже заменим динамическими значениями.

Мы можем поместить этот prompt в левую часть Workbench:

workbench_with_prompt.png

Далее мы можем установить тестовые значения для наших переменных, нажав на кнопку переменных ({ }):

variables_button.png

Это откроет диалоговое окно, предлагающее ввести значения для переменных {{SOURCE_CODE}} и {{SOURCE_LANGUAGE}}:

adding_variables.png

Затем мы можем нажать кнопку «Выполнить» и увидеть полученный вывод от модели:

first_output.png


Оценки в Workbench

Тестирование нашего prompt'а с одним набором переменных за раз — хорошее начало, но Workbench также поставляется со встроенным инструментом оценки, который помогает нам запускать prompt'ы с несколькими входными данными. Чтобы переключиться на вид оценки, нажмите переключатель «Evaluate» вверху:

evaluate_button.png

Это открывает вид оценки с уже заполненным нашим первоначальным результатом:

evaluate1.png

Далее мы можем нажать кнопку «Add Row», чтобы добавить новые тестовые случаи. Добавим два новых тестовых случая: код на Ruby и код на C#:

evaluate2.png

Затем мы можем либо нажать отдельные кнопки «Run» рядом с каждым тестовым случаем, либо нажать оранжевую кнопку «Run Remaining», чтобы запустить все оставшиеся непроверенные тестовые случаи:

run_remaining.png

Давайте нажмем кнопку «Run Remaining» и посмотрим на ответы нашей модели:

Вот результаты, которые мы получили:

evaluate3.png


Оценка человеком

Теперь пришло время внимательно изучить выводы модели и выставить им оценки. В правом столбце у нас есть возможность присвоить оценку каждому выводу:

score.png

Давайте подробнее рассмотрим некоторые выводы.

Результаты тестового случая JavaScript

Это результат нашего тестового случая перевода JavaScript:

Here's the Python translation of the provided JavaScript code:

chicken_count = 99


In Python:
1. We don't use the `const` keyword to declare constants. By convention, constants in Python are typically written in all uppercase, but this isn't enforced by the language.
2. We don't need to use any keyword (like `let` or `var` in JavaScript) to declare variables.
3. The variable name uses snake_case, which is already consistent with Python naming conventions.

If you want to emphasize that this is intended to be a constant (i.e., a value that shouldn't be changed), you could use the all-uppercase convention:


CHICKEN_COUNT = 99


Both versions are valid Python code, with the uppercase version signaling to other developers that this value is intended to be constant.

Результаты тестового случая Ruby

Это результат нашего тестового случая перевода Ruby:

Certainly! Here's the Python translation of the provided Ruby code:


class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def birthday(self):
        self.age += 1

    def introduce(self):
        print(f"Hello, I'm {self.name} and I'm {self.age} years old.")

    @classmethod
    def create_family(cls, members):
        return [cls(name, age) for name, age in members]

# Create a family
family = Person.create_family([
    ["Alice", 35],
    ["Bob", 40],
    ["Charlie", 12]
])

# Introduce family members
for person in family:
    person.introduce()

# Celebrate Charlie's birthday
charlie = next(person for person in family if person.name == "Charlie")
charlie.birthday()
charlie.introduce()


Here are key changes and explanations:

1. In Python, we don't need to explicitly declare attribute readers. The attributes are accessible by default.

2. The `initialize` method in Ruby becomes `__init__` in Python.

3. The `birthday!` method is renamed to `birthday` in Python, as the exclamation mark is not typically used in Python method names.

4. The `self.` prefix is used explicitly in Python method definitions and when accessing instance attributes.

5. String interpolation uses f-strings in Python (e.g., `f"Hello, I'm {self.name}"`).

6. The `create_family` class method is defined using the `@classmethod` decorator in Python.

7. List comprehension is used instead of `map` for creating the family members.

8. The `each` method with `&:introduce` is replaced by a simple `for` loop in Python.

9. The `find` method is replaced with `next()` and a generator expression to find Charlie.

This Python code maintains the functionality of the original Ruby code while adhering to Python's syntax and conventions.

Оценка prompt'ов

Все наши текущие выводы достаточно хорошо справляются с переводом кода, однако есть несколько ключевых проблем:

  • Нам не нужны надоедливые преамбулы вроде "Certainly! Here's the Python translation of the provided Ruby code." Это просто трата выходных token'ов!
  • Текущий формат очень сложно анализировать программно. Как бы мы написали код для отдельного извлечения переведенного кода Python?
  • Нам не нужны длинные объяснения в конце вывода. Для нашего варианта использования нам нужен только переведенный код.

Давайте приступим к оценке выводов. Мы присвоим каждому из них оценку 3 из 5.


Обновление prompt'а

Следующий шаг — внести изменения в наш prompt и снова запустить оценку! Давайте обновим наш prompt, чтобы отразить ранее выявленные проблемы.

You are a skilled programmer tasked with translating code from one programming language to Python. Your goal is to produce an accurate and idiomatic Python translation of the provided source code.

Here is the source code to translate:

<source_code>
{{SOURCE_CODE}}
</source_code>

The source code is written in the following language:

<source_language>
{{SOURCE_LANGUAGE}}
</source_language>

Please translate this code to Python.
Format your response as follows:

<python_code>
Your Python translation here
</python_code>

Only output the <python_code> tags without any other text content

Если мы переключимся обратно в режим «Prompt», мы сможем обновить prompt в интерфейсе:

updated_prompt.png

Выделенный зеленым цветом текст демонстрирует дополнение, которое мы внесли в prompt

Затем мы нажимаем оранжевую кнопку «Run», чтобы протестировать наш новый prompt. Вот новый результат:

updated_response.png

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


Повторный запуск оценки

Затем мы можем переключиться обратно в режим оценки:

evaluate4.png

Обратите внимание, в левом верхнем углу мы видим «v2», что указывает на вторую версию нашего prompt'а. Давайте нажмем «Run Remaining» и посмотрим на выводы для других тестовых случаев:

evaluate5.png

Новые выводы выглядят отлично! Все они пропускают любые преамбулы и пояснительный текст, а также содержат только теги <python_code>, которые включают переведенный код Python. Давайте отметим, что все они получили 5/5!

evaluate6.png


Сравнение результатов

Теперь, когда мы попробовали два разных prompt'а, мы можем сравнить результаты бок о бок. Мы можем нажать кнопку «+ Add Comparison» в правом верхнем углу и выбрать предыдущую версию нашего prompt'а (v1), чтобы сравнить с ней наши результаты v2. Это покажет выводы модели и оценки, сделанные человеком, для обоих prompt'ов бок о бок:

comparison.png

Очевидно, что наш prompt v2 работает значительно лучше для нашего конкретного варианта использования!

Workbench и его инструмент оценки — отличное место для быстрого прототипирования prompt'ов и сравнения результатов бок о бок. Это идеальная среда для начала работы с оценками, прежде чем переходить к более надежному решению. В следующих уроках мы узнаем, как автоматизировать крупномасштабные уроки с оценками, выполняемыми кодом и моделью.

Полезные гиды