Рецепты в этом хранилище с тех пор перенесены в Prodigy и там поддерживаются. Вскоре они даже получат обновление с появлением поддержки Spacy-LLM, которая имеет лучшие подсказки и несколько поставщиков LLM. Вот почему мы решили архивировать это репо, чтобы мы могли сосредоточиться на поддержании этих рецептов как часть Spacy и Prodigy напрямую.
Вы можете узнать больше, проверив раздел «Большие языковые модели» на документах.
Этот репозиторий содержит пример кода о том, как объединить нулевые и несколько выстрелов с небольшими усилиями по аннотации для получения высококачественного набора данных с максимальной эффективностью . В частности, мы используем большие языковые модели, доступные от OpenAI, чтобы предоставить нам первоначальный набор прогнозов, а затем раскрываем экземпляр вундеркиндов на нашей локальной машине, чтобы пройти через эти прогнозы и курировать их. Это позволяет нам довольно быстро получить набор данных по золотому стандарту и обучать меньшую контролируемую модель, которая соответствует нашим точным потребностям и варианту использования.

Обязательно установите вундеркинд, а также несколько дополнительных зависимостей с питоном:
python -m pip install prodigy -f https://[email protected]
python -m pip install -r requirements.txt С XXXX-XXXX-XXXX-XXXX -ваш лицензионный лицензионный ключ для вундеркиндов.
Затем создайте новый ключ API с OpenAI.com или принесите существующий. Запишите секретный ключ, а также ключ организации и убедитесь, что они доступны в качестве переменных окружающей среды. Например, установите их в файле .env в корневом каталоге:
OPENAI_ORG = "org-..."
OPENAI_KEY = "sk-..."
ner.openai.correct : ner-аннотация с нулевым или несколькими выстрелами обучения Этот рецепт отмечает предсказания сущности, полученные из большой языковой модели, и позволяет вам помечать их как правильные или вручную курировать их. Это позволяет быстро собирать набор данных по стандарту золота с помощью нулевого выстрела или нескольких выстрелов. Это очень похоже на использование стандартного рецепта ner.correct в Prodi.gy, но мы используем GPT-3 в качестве модели бэкэнд для прогнозирования.
python -m prodigy ner.openai.correct dataset filepath labels [--options] -F ./recipes/openai_ner.py| Аргумент | Тип | Описание | По умолчанию |
|---|---|---|---|
dataset | стр | Набор данных вундеркинда для сохранения аннотаций. | |
filepath | Путь | Путь к данным .jsonl для аннотации. Данные должны, по крайней мере, содержать поле "text" . | |
labels | стр | Список с запятой, определяющий метки NER, которые модель должна предсказать. | |
--lang , -l | стр | Язык входных данных - будет использоваться для получения соответствующего токенизатора. | "en" |
--segment , -S | буль | Флаг, чтобы установить, когда примеры должны быть разделены на предложения. По умолчанию показана полная входная статья. | False |
--model , -m | стр | Модель GPT-3 для использования для первоначальных прогнозов. | "text-davinci-003" |
--prompt_path , -p | Путь | Путь к шаблону приглашения .jinja2 . | ./templates/ner_prompt.jinja2 |
--examples-path , -e | Путь | Путь к примерам, чтобы помочь определить задачу. Файл может быть .yml, .yaml или .json. Если None установлено, применяется обучение с нулевым выстрелом. | None |
--max-examples , -n | инт | Максимальное количество примеров включить в подсказку на OpenaI. Если установлено на 0, всегда применяется обучение с нулевым выстрелом, даже когда доступны примеры. | 2 |
--batch-size , -b | инт | Размер партии запросов для отправки в API OpenAI. | 10 |
--verbose , -v | буль | Флаг для печати дополнительной информации в терминал. | False |
Допустим, мы хотим распознать посуду, ингредиенты и оборудование для приготовления пищи из некоторого текста, который мы получили из кулинарного субреддите. Мы отправим текст в GPT-3, размещенный OpenAI, и предоставим подсказку аннотации, чтобы объяснить языковую модель тип прогнозов, которые мы хотим. Что -то вроде:
From the text below, extract the following entities in the following format:
dish: <comma delimited list of strings>
ingredient: <comma delimited list of strings>
equipment: <comma delimited list of strings>
Text:
...
Мы определяем определение этой подсказки в файле .jinja2, который также описывает, как добавить примеры для нескольких выстрелов. Вы можете создать свой собственный шаблон и предоставить его рецепту с опцией --prompt-path или -p . Кроме того, с помощью --examples-path или -e вы можете установить путь файла файла .y (a) ml или .json, который содержит дополнительные примеры:
python -m prodigy ner.openai.correct my_ner_data ./data/reddit_r_cooking_sample.jsonl " dish,ingredient,equipment " -p ./templates/ner_prompt.jinja2 -e ./examples/ner.yaml -n 2 -F ./recipes/openai_ner.pyПолучив результаты от API OpenaI, рецепт Prodigy превращает прогнозы в задачу аннотации, которая может быть представлена с помощью Prodigy. Задача даже показывает исходную подсказку, а также необработанный ответ, который мы получили из языковой модели.

Здесь мы видим, что модель способна правильно распознавать посуду, ингредиенты и оборудование для приготовления пищи с самого начала!
Рецепт также предлагает опцию --verbose или -v , которая включает в себя точную подсказку и ответ на терминал по мере получения трафика. Обратите внимание, что, поскольку запросы на API пакеты, вам, возможно, придется немного прокрутить назад, чтобы найти текущую подсказку.
В какой -то момент вы можете заметить ошибку в прогнозах модели языка Openai. Например, в этом примере мы заметили ошибку в распознавании оборудования для приготовления пищи:

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

После того, как вы нажимаете Accement на интерфейсе Prodigic, отмеченный пример будет автоматически поднять и добавить в примеры, которые отправляются в API OpenAI в рамках подсказки.
Примечание
Поскольку вундеркиндные партии эти запросы, подсказка будет обновлена с небольшой задержкой, после того, как следующая партия подсказок будет отправлена в OpenAI. Вы можете экспериментировать с тем, чтобы сделать размер партии (--batch-sizeили-b) меньше, чтобы изменение вступило бы в силу раньше, но это может отрицательно повлиять на скорость рабочего процесса аннотации.
ner.openai.fetch : примеры примеры ner.openai.correct рецепт приводит примеры от Openai во время аннотирования, но мы также включили рецепт, который может принести большую партию примеров заранее.
python -m prodigy ner.openai.fetch input_data.jsonl predictions.jsonl " dish,ingredient,equipment " -F ./recipes/ner.py Это создаст файл predictions.jsonl ner.manual
Обратите внимание, что API OpenAI может вернуть ошибки «429 Слишком много запросов» при запросе слишком большого количества данных одновременно - в этом случае лучше всего запрашивать только 100 или около того примеров за раз.
После того, как вы курировали набор прогнозов, вы можете экспортировать результаты с db-out :
python -m prodigy db-out my_ner_data > ner_data.jsonlФормат экспортируемых аннотаций содержит все данные, необходимые для обучения меньшей модели вниз по течению. Каждый пример в наборе данных содержит исходный текст, токены, пролетные аннотации, обозначающие объекты и т. Д.
Вы также можете экспортировать данные в двоичный формат Spacy, используя data-to-spacy . Этот формат позволяет загружать в аннотации как объекты Spacy Doc , что может быть удобным для дальнейшего преобразования. Команда data-to-spacy также позволяет легко обучить модель NER с Spacy. Сначала вы экспортируете данные, указав данные поезда как 20% от общего числа:
python -m prodigy data-to-spacy ./data/annotations/ --ner my_ner_data -es 0.2Тогда вы можете тренировать модель со спейциной или вундеркиндом:
python -m spacy train ./data/annotations/config.cfg --paths.train ./data/annotations/train.spacy --paths.dev ./data/annotations/dev.spacy -o ner-model Это сохранит модель в ner-model/ Directory.
Мы также включили экспериментальный сценарий для загрузки в двоичном формате .spacy и обучение модели с библиотекой transformers HuggingFace. Вы можете использовать те же данные, которые вы только что экспортировали, и запустить сценарий так:
# First you need to install the HuggingFace library and requirements
pip install -r requirements_train.txt
python ./scripts/train_hf_ner.py ./data/annotations/train.spacy ./data/annotations/dev.spacy -o hf-ner-model Полученная модель будет сохранена в каталоге hf-ner-model/ .
textcat.openai.correct : аннотация TextCat с нулевым или несколькими выстрелами обученияЭтот рецепт позволяет нам классифицировать тексты быстрее с помощью большой языковой модели. Это также дает «причину» объяснить, почему был выбран конкретный ярлык.
python -m prodigy textcat.openai.correct dataset filepath labels [--options] -F ./recipes/openai_textcat.py| Аргумент | Тип | Описание | По умолчанию |
|---|---|---|---|
dataset | стр | Набор данных вундеркинда для сохранения аннотаций. | |
filepath | Путь | Путь к данным .jsonl для аннотации. Данные должны, по крайней мере, содержать поле "text" . | |
labels | стр | Список с запятой, определяющий этикетки категоризации текста. Модель должна предсказать. | |
--lang , -l | стр | Язык входных данных - будет использоваться для получения соответствующего токенизатора. | "en" |
--segment , -S | буль | Флаг, чтобы установить, когда примеры должны быть разделены на предложения. По умолчанию показана полная входная статья. | False |
--model , -m | стр | Модель GPT-3 для использования для первоначальных прогнозов. | "text-davinci-003" |
--prompt-path , -p | Путь | Путь к шаблону приглашения .jinja2 . | ./templates/textcat_prompt.jinja2 |
--examples-path , -e | Путь | Путь к примерам, чтобы помочь определить задачу. Файл может быть .yml, .yaml или .json. Если None установлено, применяется обучение с нулевым выстрелом. | None |
--max-examples , -n | инт | Максимальное количество примеров включить в подсказку на OpenaI. Если установлено на 0, всегда применяется обучение с нулевым выстрелом, даже когда доступны примеры. | 2 |
--batch-size , -b | инт | Размер партии запросов для отправки в API OpenAI. | 10 |
--exclusive-classes , -E | буль | Флаг, чтобы сделать задачу классификации эксклюзивным. | False |
--verbose , -v | буль | Флаг для печати дополнительной информации в терминал. | False |
Рецепты textcat могут использоваться для категоризации бинарного, мультиклассного и мультилетного текста. Вы можете установить это, передавая соответствующее количество метков в параметре --labels ; Например, передача одной метки превращает его в бинарную классификацию и так далее. Мы поговорим о каждом из разделах.
Предположим, мы хотим знать, говорит ли конкретный комментарий Reddit о рецепте еды. Мы отправим текст в GPT-3 и предоставим подсказку, которая инструктирует желаемые прогнозы.
From the text below, determine wheter or not it contains a recipe. If it is a
recipe, answer "accept." If it is not a recipe, answer "reject."
Your answer should only be in the following format:
answer: <string>
reason: <string>
Text:
Для бинарной классификации мы хотим, чтобы GPT-3 вернул «принять», если данный текст-это пищевой рецепт, и в противном случае «отвергнуть». Предложение GPT-3 затем отображается в пользовательском интерфейсе. Мы можем нажать кнопку «Принять» (отметка), чтобы включить текст в качестве положительного примера или нажать кнопку «Отказаться» (поперечная марка), если это отрицательный пример.
python -m prodigy textcat.openai.correct my_binary_textcat_data data/reddit_r_cooking_sample.jsonl --labels recipe -F recipes/openai_textcat.py
Теперь предположим, что мы хотим классифицировать комментарии Reddit как рецепт, обратную связь или вопрос. Мы можем написать следующую подсказку:
Classify the text below to any of the following labels: recipe, feedback, question.
The task is exclusive, so only choose one label from what I provided.
Your answer should only be in the following format:
answer: <string>
reason: <string>
Text:
Затем мы можем использовать этот рецепт для обработки мультилетных и мультиклассных чехлов, передавая три метки в параметр --labels . Мы также должны установить флаг- --exclusive-classes , чтобы отобразить пользовательский интерфейс:
python -m prodigy textcat.openai.correct my_multi_textcat_data data/reddit_r_cooking_sample.jsonl
--labels recipe,feedback,question
--exclusive-classes
-F recipes/openai_textcat.py
Мы пишем эти подсказки как шаблон .jinja2, который также может принять примеры для нескольких выстрелов. Вы можете создать свой собственный шаблон и предоставить его рецепту с опцией --prompt-path или -p . Кроме того, с помощью --examples-path или -e вы можете установить путь файла файла .y (a) ml или .json, который содержит дополнительные примеры. Вы также можете добавить контекст в этих примерах, когда мы наблюдали его для улучшения вывода:
python -m prodigy textcat.openai.correct my_binary_textcat_data
./data/reddit_r_cooking_sample.jsonl
--labels recipe
--prompt-path ./templates/textcat_prompt.jinja2
--examples-path ./examples/textcat_binary.yaml -n 2
-F ./recipes/openai_textcat.py Подобно рецепту NER, этот рецепт также преобразует прогнозы в задачу аннотации, которая может быть сделана с помощью вундеркинда. Для бинарной классификации мы используем интерфейс classification с пользовательскими HTML -элементами, в то время как для категоризации текста MultiLabel или Multiclass мы используем интерфейс аннотации choice . Обратите внимание, что мы включим первоначальную подсказку и ответ OpenaI в пользовательский интерфейс.
Наконец, вы можете использовать флаг --verbose или -v чтобы показать точную подсказку и ответ на терминале. Обратите внимание, что, поскольку запросы на API пакеты, вам, возможно, придется немного прокрутить назад, чтобы найти текущую подсказку.
Подобно рецептам NER, вы также можете управлять прогнозами в правильном направлении, исправляя пример, а затем выбрав маленький значок «флаг» в правом верхнем правом правом правом верхнем правом управлении:

После того, как вы нажмете кнопку «Принять» на интерфейсе Producky, отмеченный пример будет поднят и добавлен к нескольким примерам, отправленным в API OpenAI в рамках подсказки.
Примечание
Поскольку вундеркиндные партии эти запросы, подсказка будет обновлена с небольшой задержкой, после того, как следующая партия подсказок будет отправлена в OpenAI. Вы можете экспериментировать с тем, чтобы сделать размер партии (--batch-sizeили-b) меньше, чтобы изменение вступило бы в силу раньше, но это может отрицательно повлиять на скорость рабочего процесса аннотации.
textcat.openai.fetch : примеры категоризации текста Рецепт textcat.openai.fetch . Это полезно, когда вы имеете очень имбалансированные данные и заинтересованы только в редких примерах.
python -m prodigy textcat.openai.fetch input_data.jsonl predictions.jsonl --labels Recipe -F ./recipes/openai_textcat.py Это создаст файл predictions.jsonl textcat.manual
Обратите внимание, что API OpenAI может вернуть ошибки «429 Слишком много запросов» при запросе слишком большого количества данных одновременно - в этом случае лучше, чтобы вы запрашивали только 100 или около того примеров за раз и взглянуть на пределы ставки API.
Рецепт textcat.openai.fetch подходит для работы с наборами данных, где существует серьезный дисбаланс класса. Обычно вы хотите найти примеры редкого класса, а не аннотировать случайную выборку. Оттуда вы хотите поднять их, чтобы тренировать приличную модель и так далее.
Именно здесь могут помочь крупные языковые модели, такие как OpenAI.
Используя набор данных Reddit R/Cooking, мы побудили OpenAI искать комментарии, которые напоминают рецепт питания. Вместо того, чтобы аннотировать 10 000 примеров, мы запустили textcat.openai.fetch и получили 145 положительных классов. Из этих 145 примеров 114 оказались настоящими положительными (точностью 79%). Затем мы проверили 1000 отрицательных примеров и обнаружили 12 ложных отрицательных случаев (отзыв 98%).
В идеале, как только мы полностью аннотировали набор данных, мы можем обучить контролируемую модель, которая лучше использовать, чем полагаться на нулевые прогнозы для производства. Стоимость бега низкая, и им легче управлять.
После того, как вы курировали набор прогнозов, вы можете экспортировать результаты с db-out :
python -m prodigy db-out my_textcat_data > textcat_data.jsonlФормат экспортируемых аннотаций содержит все данные, необходимые для обучения меньшей модели вниз по течению. Каждый пример в наборе данных содержит исходный текст, токены, пролетные аннотации, обозначающие объекты и т. Д.
Вы также можете экспортировать данные в двоичный формат Spacy, используя data-to-spacy . Этот формат позволяет загружать в аннотации как объекты Spacy Doc , что может быть удобным для дальнейшего преобразования. Команда data-to-spacy также позволяет легко обучить модель категоризации текста с Spacy. Сначала вы экспортируете данные, указав данные поезда как 20% от общего числа:
# For binary textcat
python -m prodigy data-to-spacy ./data/annotations/ --textcat my_textcat_data -es 0.2
# For multilabel textcat
python -m prodigy data-to-spacy ./data/annotations/ --textcat-multilabel my_textcat_data -es 0.2Тогда вы можете тренировать модель со спейциной или вундеркиндом:
python -m spacy train ./data/annotations/config.cfg --paths.train ./data/annotations/train.spacy --paths.dev ./data/annotations/dev.spacy -o textcat-model Это сохранит модель в каталог textcat-model/ .
terms.openai.fetch .Этот рецепт генерирует термины и фразы, полученные из большой языковой модели. Эти термины могут быть курированы и превращены в файлы шаблонов, которые могут помочь с задачами аннотации нижестоящих направлений.
python -m prodigy terms.openai.fetch query filepath [--options] -F ./recipes/openai_terms.py| Аргумент | Тип | Описание | По умолчанию |
|---|---|---|---|
query | стр | Запрос отправить в OpenAI | |
output_path | Путь | Путь к сохранению вывода | |
--seeds , -s | стр | Одна или несколько разделившихся запятых семян. | "" |
--n , -n | инт | Минимальное количество элементов для генерации | 100 |
--model , -m | стр | Модель GPT-3 для завершения | "text-davinci-003" |
--prompt-path , -p | Путь | Path to Jinja2 Шаблон | templates/terms_prompt.jinja2 |
--verbose , -v | буль | Распечатайте дополнительную информацию на терминал | False |
--resume , -r | буль | Возобновить, загрузив в текстовые примеры из выходного файла | False |
--progress , -pb | буль | Печать прогресс рецепта. | False |
--temperature , -t | плавать | Openai Tempert Param | 1.0 |
--top-p , --tp | плавать | Openai top_p param | 1.0 |
--best-of , -bo | инт | Openai best_of param " | 10 |
--n-batch , -nb | инт | Openai parath size param | 10 |
--max-tokens , -mt | инт | Max Tokens для генерации за вызов | 100 |
Предположим, что вы заинтересованы в обнаружении трюков скейтборда в тексте, тогда вы можете начать с терминного списка известных трюков. Вы можете начать со следующего запроса:
# Base behavior, fetch at least 100 terms/phrases
python -m prodigy terms.openai.fetch " skateboard tricks " tricks.jsonl --n 100 --prompt-path templates/terms_prompt.jinja2 -F recipes/openai_terms.pyЭто создаст подсказку на Openai, в которой просит попытаться создать как минимум 100 примеров «трюков скейтборда». Существует верхний предел до количества токенов, которые могут быть сгенерированы OpenAI, но этот рецепт попытается продолжать собирать термины, пока не достигнет указанной суммы.
Вы можете сделать запрос более сложным, если вы хотите попытаться быть более точным, но вы можете альтернативно также выбрать добавление некоторых семян -терминов с помощью --seeds . Они будут действовать как начальные примеры, которые помогут направить Openai в правильном направлении.
# Base behavior but with seeds
python -m prodigy terms.openai.fetch " skateboard tricks " tricks.jsonl --n 100 --seeds " kickflip,ollie " --prompt-path templates/terms_prompt.jinja2 -F recipes/openai_terms.py Сбор многих примеров может занять некоторое время, поэтому может быть полезно показать прогресс через --progress по мере отправки запросов.
# Adding progress output as we wait for 500 examples
python -m prodigy terms.openai.fetch " skateboard tricks " tricks.jsonl --n 500 --progress --seeds " kickflip,ollie " --prompt-path templates/terms_prompt.jinja2 -F recipes/openai_terms.pyПосле сбора нескольких примеров вы можете создать больше. Вы можете продолжить продолжение из предыдущего выходного файла. Это будет эффективно повторно использовать эти примеры в качестве семян для подсказки на открытие.
# Use the `--resume` flag to re-use previous examples
python -m prodigy terms.openai.fetch " skateboard tricks " tricks.jsonl --n 50 --resume --prompt-path templates/terms_prompt.jinja2 -F recipes/openai_terms.py Когда рецепт будет готов, у вас будет файл tricks.jsonl .
{ "text" : " pop shove it " , "meta" :{ "openai_query" : " skateboard tricks " }}
{ "text" : " switch flip " , "meta" :{ "openai_query" : " skateboard tricks " }}
{ "text" : " nose slides " , "meta" :{ "openai_query" : " skateboard tricks " }}
{ "text" : " lazerflip " , "meta" :{ "openai_query" : " skateboard tricks " }}
{ "text" : " lipslide " , "meta" :{ "openai_query" : " skateboard tricks " }}
... Теперь у вас есть файл tricks.jsonl . Следующим шагом будет просмотр терминов, и вы можете использовать textcat.manual Рецепт, который поставляется с вундеркиндом для этого.
# The tricks.jsonl was fetched from OpenAI beforehand
python -m prodigy textcat.manual skateboard-tricks-list tricks.jsonl --label skateboard-tricksЭто генерирует интерфейс, который выглядит так:

Вы можете вручную принять или отклонить каждый пример, и когда вы закончите аннотировать, вы можете экспортировать аннотированный текст в файл шаблонов через рецепт terms.to-patterns .
# Generate a `patterns.jsonl` file.
python -m prodigy terms.to-patterns skateboard-tricks-list patterns.jsonl --label skateboard-tricks --spacy-model blank:en Когда рецепт будет выполнен, у вас будет файл с patterns.jsonl .
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " pop " },{ "lower" : " shove " },{ "lower" : " it " }]}
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " switch " },{ "lower" : " flip " }]}
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " nose " },{ "lower" : " slides " }]}
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " lazerflip " }]}
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " lipslide " }]}
...OpenAI имеет жесткий ограничение на быстрый размер. Вы не можете иметь приглашение больше 4079 жетонов. К сожалению, это означает, что существует предел размера списков терминов, которые вы можете генерировать. Рецепт сообщит об ошибке, когда это произойдет, но хорошо знать об этом ограничении.
ab.openai.prompts : a/b оценка подсказокЦель этого рецепта состоит в том, чтобы быстро позволить кому -то сравнить качество выходов из двух подсказок в количественной и слепой стороне.
python -m prodigy ab.openai.prompts dataset inputs_path display_template_path prompt1_template_path prompt2_template_path [--options] -F ./recipes/openai_ab.py| Аргумент | Тип | Описание | По умолчанию |
|---|---|---|---|
dataset | стр | Набор данных вутобности, чтобы сохранить ответы в | |
inputs_path | Путь | Путь к входы JSONL | |
display_template_path | Путь | Шаблон для суммирования аргументов | |
prompt1_template_path | Путь | Путь к первому шаблону приглашения Jinja2 | |
prompt2_template_path | Путь | Путь ко второму шаблону приглашения Jinja2 | |
--model , -m | стр | Модель GPT-3 для завершения | "text-davinci-003" |
--batch-size , -b | инт | Размер партии для отправки в API OpenAI | 10 |
--verbose , -v | буль | Распечатайте дополнительную информацию на терминал | False |
--no-random , -NR | буль | Не рандомизируйте, какая аннотация показана как правильная | False |
--repeat , -r | инт | Как часто отправлять такую же подсказку в Openai | 1 |
Например, давайте попробуем генерировать юмористический хайкус. Для этого нам сначала нужно построить два файла Jinja, которые представляют подсказку для отправки в OpenAI.
templates/ab/prompt1.jinja2 Write a haiku about {{topic}}.
templates/ab/prompt2.jinja2 Write an incredibly hilarious haiku about {{topic}}. So funny!
Вы можете предоставить переменные для этих подсказок, построив файл .jsonl с необходимыми параметрами. В этом случае нам нужно убедиться, что {{topic}} учитывается.
Вот пример файла .jsonl , который может работать.
data/ab_example.jsonl{ "id" : 0 , "prompt_args" : { "topic" : " star wars " }}
{ "id" : 0 , "prompt_args" : { "topic" : " kittens " }}
{ "id" : 0 , "prompt_args" : { "topic" : " the python programming language " }}
{ "id" : 0 , "prompt_args" : { "topic" : " maths " }}Примечание
Все аргументы в соответствии с
prompt_argsбудут переданы для визуализации шаблонов джинджи.idявляется обязательным и может использоваться для выявления групп в последующем анализе.
Мы почти готовы оценить, но этот рецепт требует окончательного шаблона Jinja2. Этот не будет использован для генерации подсказки, но он будет генерировать полезный заголовок, который напоминает аннотатор текущей задачи. Вот пример такого шаблона.
templates/ab/input.jinja2 A haiku about {{topic}}.
Когда вы собираете все эти шаблоны, вы можете начать аннотировать. Приведенная ниже команда запускает интерфейс аннотации, а также использует опцию --repeat 4 . Это гарантирует, что каждая тема будет использована для генерации подсказки не менее 4 раза.
python -m prodigy ab.openai.prompts haiku data/ab_example.jsonl templates/ab/input.jinja2 templates/ab/prompt1.jinja2 templates/ab/prompt2.jinja2 --repeat 5 -F recipes/openai_ab.py
Вот как выглядит интерфейс аннотации:

Когда вы посмотрите на этот интерфейс, вы заметите, что шаблон заголовка отображается и что вы можете выбрать из двух вариантов. Оба варианта являются ответами от OpenAI, которые были сгенерированы двумя шаблонами быстрого приглашения. Вы также можете увидеть prompt_args , отображаемые в правом нижнем углу меню «Выбор».
Отсюда вы можете аннотировать свои любимые примеры и собрать данные, которые могут помочь вам определить, какая подсказка лучше.
Как только вы закончите аннотировать, вам будет представлен обзор результатов.
=========================== Evaluation results ===========================
✔ You preferred prompt1.jinja2
prompt1.jinja2 11
prompt2.jinja2 5
Но вы также можете получить необработанные аннотации из базы данных для дальнейшего анализа.
python -m prodigy db-out haiku
Есть много интересных последующих экспериментов в этом, и множество способов адаптировать основную идею к различным задачам или наборам данных. Нам также интересно попробовать разные подсказки. Неясно, сколько формата, в которых просят аннотации, могут изменить прогнозы модели, или есть более короткая подсказка, которая может работать так же хорошо. Мы также хотим провести несколько сквозных экспериментов.