Prompt engineering
Улучшение результатов с помощью приёмов проектирования запросов
Это руководство делится стратегиями и тактиками для получения более качественных результатов от крупных языковых моделей (иногда упоминаемых как GPT
модели), таких как GPT-4
. Описываемые здесь методы могут использоваться в сочетании для достижения большего эффекта. Мы поощряем эксперименты для выявления наиболее эффективных методов для вас.
Вы также можете изучить примеры запросов, демонстрирующие возможности наших моделей:
Примеры запросов
Изучите примеры запросов, чтобы понять, на что способны GPT модели
Шесть стратегий для получения лучших результатов
Напишите четкие инструкции
Эти модели не могут читать ваши мысли. Если выходные данные слишком длинные, попросите краткие ответы. Если они слишком просты, попросите писательство на уровне эксперта. Если вам не нравится формат, покажите желаемый формат. Чем меньше модель будет гадать, что вам нужно, тем больше вероятности, что вы это получите.
Тактики:
- Включите детали в ваш запрос, чтобы получить более релевантные ответы
- Попросите модель принять определённую персону
- Используйте разделители для чёткого обозначения различных частей ввода
- Укажите шаги, необходимые для выполнения задачи
- Предоставьте примеры
- Укажите желаемую длину выхода
Предоставьте справочный текст
Языковые модели могут уверенно изобретать вымышленные ответы, особенно при вопросах на необычные темы или для цитирования и URL. Так же, как лист заметок может помочь студенту лучше сдать тест, предоставление справочного текста этим моделям может помочь в ответах с меньшими искажениями.
Тактики:
- Укажите модели отвечать, используя справочный текст
- Укажите модели отвечать с цитатами из справочного текста
Разделите сложные задачи на более простые подзадачи
Как и в программной инженерии, где сложная система распадается на модульные компоненты, это же верно и для задач, поданных языковой модели. Сложные задачи, как правило, имеют более высокую степень ошибок, чем простые. Более того, сложные задачи часто можно переопределить как последовательность простых задач, где результаты ранних задач используются для создания входных данных для последующих.
Тактики:
- Используйте классификацию намерений для идентификации наиболее релевантных инструкций для запроса пользователя
- Для диалоговых приложений, требующих длительных разговоров, резюмируйте или фильтруйте предыдущие диалоги
- Резюмирайте длинные документы частями и создавайте полное резюме рекурсивно
Дайте модели время "подумать"
Если вас спросят, сколько будет 17 умножить на 28, вы можете не знать это сразу, но все же можете решить с временем. Аналогично, модели совершают больше ошибок в рассуждениях, когда стараются ответить сразу, чем если бы взяли время на обдумывание ответа. Просьба сначала составить "цепочку мыслей" перед ответом может помочь модели более надёжно дойти до правильных ответов.
Тактики:
- Укажите модели сначала проработать собственное решение, прежде чем спешить к заключению
- Используйте внутренний монолог или последовательность запросов для скрытия процесса рассуждения модели
- Спросите модель, не пропустила ли она что-то на предыдущих подходах
Используйте внешние инструменты
Компенсируйте недостатки модели, предоставляя ей результаты работы других инструментов. Например, система поиска текстов (иногда называемая RAG или retrieval augmented generation) может рассказать модели о релевантных документах. Движок выполнения кода, как OpenAI Code Interpreter, может помочь модели выполнять вычисления и запускать код. Если задача может быть выполнена более надёжно или эффективно инструментом, а не языковой моделью, передавайте её для достижения наилучших результатов от обоих.
Тактики:
- Используйте поиск на основе вложений для внедрения эффективного поиска знаний
- Используйте выполнение кода для проведения более точных вычислений или вызова внешних API
- Дайте модели доступ к специфичным функциям
Систематично тестируйте изменения
Улучшение производительности проще, если вы можете её измерить. В некоторых случаях модификация запроса достигает лучшей производительности на нескольких изолированных примерах, но приводит к ухудшению общей производительности на более представительном наборе примеров. Поэтому, чтобы быть уверенными, что изменение имеет положительный чистый эффект на производительность, может потребоваться определить комплексный набор тестов (также известный как "eval").
Тактика:
- Оценивайте результаты модели с отсылкой на эталонные ответы
Тактики
Каждая из перечисленных выше стратегий может быть реализована с помощью специфичных тактик. Эти тактики предназначены для предоставления идей для экспериментов. Они ни в коем случае не являются полностью исчерпывающими, и вы можете свободно пробовать творческие идеи, не представленные здесь.
Стратегия: Напишите четкие инструкции
Тактика: Включите детали в ваш запрос, чтобы получить более релевантные ответы
Чтобы получить высоко релевантный ответ, убедитесь, что запрос предоставляет все важные детали или контекст. В противном случае вы оставляете модели гадать, что вы имеете в виду.
Хуже | Лучше |
---|---|
Как сложить числа в Excel? | Как сложить строку долларовых значений в Excel? Я хочу делать это автоматически для всего листа строк с итоговыми суммами в столбце справа под названием "Total". |
Кто президент? | Кто был президентом Мексики в 2021 году, и как часто проводятся выборы? |
Напишите код для вычисления последовательности Фибоначчи. | Напишите функцию на TypeScript для эффективного вычисления последовательности Фибоначчи. Комментируйте код, чтобы объяснить, что делает каждая часть и почему она написана таким образом. |
Резюмируйте заметки с собрания. | Резюмируйте заметки с собрания в одном абзаце. Затем составьте список выступающих и их ключевые моменты. Наконец, укажите следующие шаги или действия, предложенные выступающими, если таковые имеются. |
Тактика: Попросите модель принять определённую персону
Системное сообщение может использоваться для указания персонажа, используемого моделью в её ответах.
SYSTEM | USER |
---|---|
Когда я попрошу помочь написать что-то, вы ответите документом, содержащим хотя бы одну шутку или игривый комментарий в каждом параграфе. | Напишите благодарственное письмо моему поставщику стальных болтов за своевременную доставку и в короткие сроки. Это позволило нам выполнить важный заказ. |
Тактика: Используйте разделители для чёткого обозначения различных частей ввода
Разделители, такие как тройные кавычки, теги XML, заголовки разделов и т. д., могут помочь обозначить разделы текста для особого обращения.
USER | SYSTEM |
---|---|
"Вставьте текст сюда" | Вы получите пару статей (разграниченных тегами XML) о той же теме. Сначала резюмируйте аргументы каждой статьи. Затем укажите, какая из них делает лучший аргумент и объясните почему. |
Вы получите тезисный абстракт и предложенный заголовок для него. Заголовок тезиса должен давать читателю хорошее представление о теме тезиса, но также должен быть привлекательным. Если заголовок не соответствует этим критериям, предложите 5 альтернатив. |
Для простых задач использование разделителей может не влиять на качество выхода. Однако чем сложнее задача, тем важнее уточнять её детали. Не заставляйте модель бороться за понимание того, что вы от неё просите.
Тактика: Укажите шаги, необходимые для завершения задачи
Некоторые задачи лучше всего указывать как последовательность шагов. Явное описание шагов может облегчить модели их следование.
SYSTEM | USER |
---|---|
Используйте следующие пошаговые инструкции для ответа на пользовательские запросы. | "Вставьте текст сюда" |
| Шаг 1 - Пользователь предоставит текст в тройных кавычках. Резюмируйте этот текст в одном предложении с префиксом "Резюме: ". | | | Шаг 2 - Переведите резюме из Шага 1 на испанский язык с префиксом "Перевод: ". | |
Тактика: Предоставьте примеры
Предоставление общих инструкций, применимых ко всем примерам, обычно более эффективно, чем демонстрация всех вариантов задачи на примере, но в некоторых случаях предоставление примеров может быть легче. Например, если вы хотите, чтобы модель подражала определенному стилю ответа на пользовательские запросы, который сложно описать явно. Это известно как "few-shot" prompting.
SYSTEM | USER |
---|---|
Ответьте в едином стиле. | Научи меня о терпении. |
ASSISTANT | USER |
---|---|
Река, вырезающая самое глубокое ущелье, течёт из скромного источника; величайшая симфония начинается с одной нотки; самый замысловатый гобелен начинается с одиночной нити. | Научи меня о океане. |
Тактика: Укажите желаемую длину выхода
Вы можете попросить модель создать выход, который будет определённой целевой длины. Целевая длина вывода может быть указана в терминах количества слов, предложений, параграфов, пунктов списка и т. д. Однако стоит отметить, что инструкция для модели сгенерировать определённое количество слов не работает с высокой точностью. Модель может более надёжно создавать выход с определённым количеством параграфов или пунктов списка.
USER | USER | USER |
---|---|---|
Резюмируйте текст, выделенный тройными кавычками, в 50 словах. | Резюмируйте текст, выделенный трижды кавычками, в 2 параграфах. | Резюмируйте текст, выделенный трижды кавычками, в 3 пунктах списка. |
"Вставьте текст сюда" | "Вставьте текст сюда" | "Вставьте текст сюда" |
Стратегия: Предоставьте справочный текст
Тактика: Укажите модели отвечать, используя справочный текст
Если мы можем предоставить модели проверенную информацию, релевантную текущему запросу, мы можем указать модели использовать предоставленную информацию для составления ответа.
SYSTEM | USER |
---|---|
Используйте предоставленные статьи, разграниченные тройными кавычками, чтобы отвечать на вопросы. Если ответ не может быть найден в статьях, напишите "Я не нашёл ответ". | <Вставьте статьи, каждую сграниченную тройными кавычками> |
Ввиду того, что все модели имеют ограниченные контекстные окна, нам нужен способ динамически извлекать информацию, относящуюся к задаваемому вопросу. Вложения могут быть использованы для реализации эффективного поиска знаний. Смотрите тактику "Используйте поиск на основе вложений для реализации эффективного поиска знаний" для более детальных инструкций по реализации.
Тактика: Укажите модели отвечать с цитатами из справочного текста
Если ввод был дополнен релевантными знаниями, легко запросить, чтобы модель добавила цитаты в свои ответы, ссылаясь на отрывки из предоставленных документов. Обратите внимание, что цитаты в выходных данных затем могут быть проверены программно с помощью строкового соответствия в предоставленных документах.
SYSTEM | USER |
---|---|
Вы получите документ, разграниченный тройными кавычками, и вопрос. Ваше задание - ответить на вопрос, используя только предоставленный документ и цитировать отрывок(и) документа, использованного для ответа на вопрос. Если в документе нет информации, необходимой для ответа на этот вопрос, просто напишите: "Недостаточно информации". Если на вопрос дан ответ, он должен быть аннотирован с цитированием. Используйте следующий формат для цитирования соответствующих отрывков ({"citation": …}). | """<вставьте документ сюда>""" |
Стратегия: Разделите сложные задачи на более простые подзадачи
Тактика: Используйте классификацию намерений для идентификации наиболее релевантных инструкций для запроса пользователя
Для задач, в которых требуется множество независимых наборов инструкций для обработки различных случаев, полезно сначала классифицировать тип запроса и использовать эту классификацию для определения, какие инструкции необходимы. Это может быть достигнуто путём определения фиксированных категорий и хардкодированной инструкций, релевантных для выполнения задач в данной категории. Этот процесс может также применяться рекурсивно для разложения задачи на последовательность этапов. Преимущество этого подхода заключается в том, что каждый запрос будет содержать только те инструкции, которые необходимы для выполнения следующего этапа задачи, что может привести к меньшей степени ошибок по сравнению с использованием одного запроса для выполнения всей задачи. Это также может привести к снижению затрат, поскольку выполнение больших запросов обходится дороже (см. информацию о ценах).
Предположим, например, что для приложения обслуживания клиентов, запросы можно полезно классифицировать следующим образом:
SYSTEM | USER |
---|---|
Вам будут предоставлены запросы на обслуживание клиентов. Классифицируйте каждый запрос в первичную категорию и вторичную категорию. Предоставьте свой вывод в формате json с ключами: primary и secondary. | Мне нужно снова подключить интернет. |
| Основные категории: Биллинг, Техническая поддержка, Управление учётной записью или Общий запрос. | | Вторичные категории для биллинга: - Отказ от подписки или улучшение - Добавление способа оплаты - Объяснение начисления - Оспаривание начисления | | Вторичные категории для технической поддержки: - Устранение неполадок - Совместимость устройств - Обновления программного обеспечения | | Вторичные категории для управления учётной записью: - Сброс пароля - Обновление личной информации - Закрытие учётной записи - Безопасность учётной записи | | Вторичные категории для общего запроса: - Информация о продукте - Цены - Отзывы - Общение с человеком |
На основании классификации запроса клиента, можно предоставить набор более специфичных инструкций модели для выполнения следующих шагов. Например, предположим, что клиенту требуется помощь с "устранением неполадок".
SYSTEM | USER |
---|---|
Вам предоставляются запросы на обслуживание клиентов, требующие устранения неполадок в контексте технической поддержки. Помогите пользователю: | Мне нужно снова подключить интернет. |
- Попросите его убедиться, что все кабели подключены к/от маршрутизатора. Обратите внимание, что кабели могут со временем разъединяться.
- Если все кабели подключены, и проблема сохраняется, спросите их, какую модель маршрутизатора они используют
- Теперь вы подскажете им, как перезагрузить свое устройство:
- Если номер модели MTD-327J, посоветуйте нажать красную кнопку и удерживать её в течение 5 секунд, затем подождать 5 минут перед тестированием соединения.
- Если номер модели MTD-327S, посоветуйте отключить и подключить его, затем подождать 5 минут перед тестированием соединения.
- Если проблема клиента сохраняется после перезагрузки устройства и ожидания 5 минут, подключите его к IT поддержке, выведя {"IT support requested"}.
- Если пользователь начинает задавать вопросы, не относящиеся к этой теме, подтвердите, хочет ли он завершить текущий чат о устранении неполадок, и классифицируйте его запрос по следующей схеме:
<вставьте схему первичной/вторичной классификации выше>
Обратите внимание, что модель была наставлена на излучение специальных строк для обозначения изменения состояния разговора. Это позволяет превратить нашу систему в автомата состояний, где состояние определяет, какие инструкции вводятся. Отслеживая состояние, какие инструкции актуальны в этом состоянии, и также, опционально, какие переходы состояния разрешены из этого состояния, мы можем установить ограждения вокруг пользовательского опыта, которые было бы трудно достичь с менее структурированным подходом.
Тактика: Для диалоговых приложений, требующих длительных разговоров, резюмируйте или фильтруйте предыдущие диалоги
Поскольку модели имеют фиксированную длину контекста, диалог между пользователем и помощником, в котором весь разговор включён в контекстное окно, не может продолжаться бесконечно.
Существует множество обходных путей этой проблемы, один из которых заключается в резюмировании предыдущих ходов разговора. Когда размер ввода достигает заранее определённого порогового значения длины, это может привести к запросу на резюме части разговора, и резюме предыдущего разговора может быть включено как часть системного сообщения. Альтернативно, предыдущий разговор может резюмироваться асинхронно на заднем плане в течение всего разговора.
Альтернативное решение заключается в динамическом выборе предыдущих частей разговора, наиболее релевантных текущему запросу. Смотрите тактику "Используйте поиск на основе вложений для реализации эффективного поиска знаний".
Тактика: Резюмируйте длинные документы частями и создавайте полное резюме рекурсивно
Поскольку модели имеют фиксированную длину контекста, их нельзя использовать для резюме текста больше, чем контекстная длина минус длина созданного резюме в одном запросе.
Чтобы резюмировать очень длинный документ, например, книгу, мы можем использовать последовательность запросов для резюме каждой части документа. Резюме разделов можно объединить и резюмировать, создавая резюме резюме. Этот процесс может затем продолжаться рекурсивно, пока не будет резюмирован весь документ. Если необходимо использовать информацию о более ранних разделах, чтобы понять более поздние разделы, то полезной может быть дополнительная хитрость - включение текущего резюме текста, которое предшествует любой данной точке в книге, при резюмировании содержания в этой точке. Эффективность этой процедуры для резюмирования книг была изучена в предыдущих исследованиях OpenAI с использованием вариантов GPT-3
.
Стратегия: Дайте модели время "подумать"
Тактика: Укажите модели сначала проработать собственное решение, прежде чем спешить к заключению
Иногда мы получаем лучшие результаты, когда явно указываем модели рассуждать от первых принципов, прежде чем прийти к заключению. Предположим, например, мы хотим, чтобы модель оценила решение студента для математической задачи. Наиболее очевидный способ подойти к этому – просто спросить модель, правильно ли решение студента.
SYSTEM | USER |
---|---|
Определите, правильное ли решение у студента. | Задание: Я строю солнечную электростанцию и мне нужна помощь в расчете финансов. - Земля стоит $100 за квадратный фут - Я могу купить солнечные панели за $250 за квадратный фут - Я договорился о контракте на обслуживание, который будет стоить мне фиксированную сумму $100k в год, а также $10 за квадратный фут Какова общая стоимость первого года эксплуатации в зависимости от количества квадратных футов. Решение студента: Пусть x будет размером установки в квадратных футах. 1. Стоимость земли: 100x 2. Стоимость солнечных панелей: 250x 3. Стоимость обслуживания: 100,000 + 100x Общая стоимость: 100x + 250x + 100,000 + 100x = 450x + 100,000 |
ASSISTANT | Ответ студента правильный. |
Но ответ студента на самом деле неверный! Мы можем заставить модель успешно заметить это, предлагая модели сначала решить задачу самостоятельно.
SYSTEM | USER |
---|---|
Сначала решите задачу самостоятельно. Затем сравните своё решение с решением студента и оцените, правильно ли оно. Не решайте, правильно ли решение студента, пока вы сами не выполните задачу. | Задание: Я строю солнечную электростанцию и мне нужна помощь в расчете финансов. - Земля стоит $100 за квадратный фут - Я могу купить солнечные панели за $250 за квадратный фут - Я договорился о контракте на обслуживание, который будет стоить мне фиксированную сумму $100k в год, а также $10 за квадратный фут Какова общая стоимость первого года эксплуатации в зависимости от количества квадратных футов. Решение студента: Пусть x будет размером установки в квадратных футах. 1. Стоимость земли: 100x 2. Стоимость солнечных панелей: 250x 3. Стоимость обслуживания: 100,000 + 100x Общая стоимость: 100x + 250x + 100,000 + 100x = 450x + 100,000 |
ASSISTANT | |
---|---|
Пусть x будет размером установки в квадратных футах. 1. Стоимость земли: 100x 2. Стоимость солнечных панелей: 250x 3. Стоимость обслуживания: 100,000 + 10x Общая стоимость: 100x + 250x + 100,000 + 10x = 360x + 100,000 Решение студента неверное. Они допустил ошибку в расчете стоимости обслуживания, используя 100x вместо 10x. Правильная общая стоимость первого года эксплуатации составляет 360x + 100,000. |
Тактика: Используйте внутренний монолог или последовательность запросов для скрытия процесса рассуждения модели
Предыдущая тактика демонстрирует, что иногда важно, чтобы модель подробно рассуждала о задаче, прежде чем ответить на конкретный вопрос. Для некоторых приложений процесс рассуждения, который использует модель, чтобы прийти к окончательному ответу, был бы неуместен для совместного использования с пользователем. Например, в учебных приложениях мы можем хотеть поощрять студентов работать над собственными ответами, но процесс рассуждения модели о решении студента может обнаружить ответ студенту.
Внутренний монолог – это тактика, которая может быть использована для смягчения этой проблемы. Идея внутреннего монолога заключается в том, чтобы наставить модель помещать части вывода, которые предназначены для скрытия от пользователя, в структурированный формат, который упрощает их парсинг. Затем, перед представлением вывода пользователю, вывод парсируется, и только часть вывода отображается.
USER | SYSTEM |
---|---|
Проблема : <вставьте формулировку проблемы> | Следуйте этим шагам для ответа на запросы пользователя. |
### Шаг 1: | |
Сначала самостоятельно решите задачу. Не полагайтесь на решение ученика, поскольку оно может быть неверным. Заключите всю свою работу для этого шага в тройные кавычки ("""). | |
### Шаг 2: | |
Сравните своё решение с решением студента и оцените его правильность. Заключите свою работу для этого шага в тройные кавычки ("""). | |
### Шаг 3: | |
Если ученик допустил ошибку, определите, какой намёк вы могли бы дать, не выдавая ответа. Заключите работу для этого шага в тройные кавычки ("""). | |
### Шаг 4: | |
Если студент ошибся, предоставьте намёк из предыдущего шага (вне тройных кавычек). Вместо "Шаг 4 - ..." напишите "Подсказка:". | |
USER | SYSTEM |
Проблема : <вставьте формулировку проблемы> | Сравните ваше решение с решением ученика и оцените его правильность. |
Ваша задача : <вырезка из модели> | Вы являетесь репетитором по математике. Если ученик ошибся, предложите подсказку, не раскрывая ответа. |
Решение студента : <вырезка студента> | Если ошибки не было, предложите просто ободряющий комментарий. |
Проблема : <вставьте формулировку проблемы> | Вы можете писать и выполнять Python-код, заключая его в тройные косые кавычки. Используйте это для выполнения расчетов. |
Ваша задача : <вырезка из модели> | |
Решение студента : <вырезка студента> | |
Анализ : <вырезка из модели> |
Стратегия: Использование внешних инструментов
Тактика: Использование встраиваний для осуществления эффективного поиска информации
Модели могут задействовать внешние источники информации, если они предоставлены в качестве входных данных. Это может помочь моделям генерировать более обоснованные и актуальные ответы. Например, если пользователь задает вопрос о конкретном фильме, может быть полезно добавить в входные данные модели качественную информацию о фильме (например, актёры, режиссёр и т.д.). Встраивания можно использовать для осуществления эффективного поиска информации, так чтобы релевантная информация добавлялась в входные данные модели динамически во время выполнения запрошенной задачи.
Текстовое встраивание — это вектор, который может измерять взаимосвязанность между текстовыми строками. Похожие или релевантные строки будут находиться ближе друг к другу, чем несвязанные строки. Этот факт, наряду с существованием быстрых алгоритмов поиска векторов, позволяет использовать встраивания для осуществления эффективного поиска информации. В частности, текстовый корпус можно разбить на части, и каждая часть может быть встроена и сохранена. Затем заданный запрос может быть встроен, и поиск векторов может выполняться для нахождения встраиваемых фрагментов текста из корпуса, которые наиболее связаны с запросом (т.е. наиболее близко находятся в пространстве встраиваний).
Примеры реализации можно найти в OpenAI Cookbook. См. тактику "Руководство модели по использованию извлекаемых знаний для ответа на запросы" для примера по минимизации вероятности того, что модель придумает неверные факты.
Тактика: Использование выполнения кода для проведения более точных расчетов или вызова внешних API
Языковые модели не могут быть надежными для выполнения арифметики или длинных расчетов самостоятельно. В случаях, когда это необходимо, модель может быть инструктирована на написание и выполнение кода вместо самостоятельного совершения расчетов. В частности, модель может быть инструктацией помещать код, предназначенный для выполнения, в определенный формат, такой как тройные обратные кавычки. После генерации результата код может быть извлечен и выполнен. Наконец, при необходимости, результат выполнения кода (т.е. интерпретатор Python) может быть предоставлен в качестве входных данных для модели для следующего запроса.
Пример использования API:
Инфор\‐ мация | Методика |
---|---|
Пример вызова API: | python import message message.write(to="John", message="Hey, want to meetup after work?") |
Внимание | Выполнение кода, сгенерированного моделью, не является безопасным, и необходимо принять меры предосторожности для обеспечения его выполнения в безопасности. Для этого нужна защищенная среда выполнения кода для ограничения вреда, который может причинить ненадежный код. |
Техника: Предоставить модели доступ к определенным функциям
Chat Completions API позволяет передавать список описаний функций в запросах. Это позволяет моделям генерировать аргументы функций в соответствии с предоставленными схемами. Сгенерированные аргументы функций возвращаются API в формате JSON и могут быть использованы для вызова функций. Выходные данные, предоставленные вызовами функций, могут быть затем переданы обратно в модель в следующем запросе для замыкания цикла. Это рекомендуется для использования моделей OpenAI для вызова внешних функций. Для получения дополнительной информации смотрите раздел "Вызов функции" в нашем вводном руководстве по генерации текста и больше примеров вызова функций в OpenAI Cookbook.
Стратегия: Системная проверка изменений
Иногда бывает трудно определить, улучшает ли изменение — например, новая инструкция или новый дизайн — вашу систему или делает ее хуже. Просмотр нескольких примеров может намекнуть, какой из них лучше, но с небольшими размерами выборки трудно отличить настоящее улучшение от случайной удачи. Возможно, изменение помогает производительности на определенных входных данных, но на других мешает.
Процедуры оценки (или "оценки") полезны для оптимизации дизайна системы. Хорошие оценки характеризуются:
- Представительностью реального использования (или, по крайней мере, разнообразием).
- Содержанием множества тестовых случаев для большей статистической мощности (см. таблицу ниже для руководства).
- Легкостью автоматизации или повторения.
Разница для обнаружения | Требуемый размер выборки для доверия 95% |
---|---|
30% | примерно 10 |
10% | примерно 100 |
3% | примерно 1 000 |
1% | примерно 10 000 |
Оценка выходных данных может проводиться как компьютерами, так и людьми или их комбинацией. Компьютеры могут автоматизировать оценки с использованием объективных критериев (например, вопросы с единственным правильным ответом), а также некоторых субъективных или нечетких критериев, в которых выходные данные модели оцениваются другими запросами модели. OpenAI Evals — это открытый программный фреймворк, предоставляющий инструменты для создания автоматизированных оценок.
Методика: Оценка выводов модели в отношении ответов эталонного уровня
Предположим, что известно, что правильный ответ на вопрос должен ссылаться на конкретный набор известных фактов. Тогда мы можем использовать запрос модели для подсчета того, сколько из требуемых фактов содержится в ответе.
Пример:
SYSTEM: Вы получите текст, ограниченный тройными кавычками, который предназначен быть ответом на вопрос. Проверьте, содержатся ли в ответе следующие элементы информации:
- Нейл Армстронг был первым человеком, который ступил на Луну.
- Дата первого шага Нейла Армстронга на Луну - 21 июля 1969 года.
Для каждого из этих пунктов выполните следующие шаги:
- Переформулируйте пункт.
- Приведите цитату из ответа, которая наиболее близка к этому пункту.
- Подумайте, может ли кто-то, читающий цитату, без знания темы, непосредственно вывести этот пункт. Объясните, почему, прежде чем вы решите.
- Напишите "да", если ответ на пункт 3 был "да", в противном случае напишите "нет".
Наконец, дайте количество ответов "да". Предоставьте этот счет как {"count": <введите количество здесь>}
.
Пример входных данных, где оба пункта выполнены:
SYSTEM: <вставьте системное сообщение выше>
USER: """Нейл Армстронг известен как первый человек, ступивший на Луну. Это историческое событие произошло 21 июля 1969 года, во время миссии Аполлон-11."""
Пример входных данных, где лишь один пункт выполнен:
SYSTEM: <вставьте системное сообщение выше>
USER: """Нейл Армстронг вошел в историю, когда сошел с лунного модуля, став первым человеком, ступившим на Луну."""
Пример входных данных, где ни один пункт не выполнен:
SYSTEM: <вставьте системное сообщение выше>
USER: """В лето '69, вояж грандиозный, Аполлон-11, смелый, как рука легенды. Армстронг сделал шаг, история развернулась, 'Один маленький шаг', сказал он, к новому миру."""
Существуют многие возможные вариации этого типа оценки на базе модели. Рассмотрите следующую вариацию, которая отслеживает вид сопоставления между кандидатским ответом и эталонным ответом и также отслеживает, противоречит ли кандидатский ответ какой-либо части эталонного ответа.
SYSTEM: Используйте следующие шаги для ответа на вводы пользователей. Полностью переформулируйте каждый шаг перед продолжением. Здесь использован формат "Шаг 1: Рассмотрите...".
Шаг 1: Рассмотрите пошагово, является ли информация в предоставленном ответе по сравнению с экспертным ответом: несвязанной, равной, подмножеством, надмножеством или пересекаемой (т.е. есть пересечение, но не подмножество/надмножество).
Шаг 2: Рассмотрите пошагово, противоречит ли предоставленный ответ какой-либо части экспертного ответа.
Шаг 3: Выведите JSON-объект, структурированный следующим образом: {"тип_перекрытия": "несвязанное" или "равное" или "подмножество" или "надмножество" или "пересекающееся", "противоречие": истинно или ложно}
Пример входных данных с недостаточным ответом, который, тем не менее, не противоречит экспертному ответу:
SYSTEM: <вставьте системное сообщение выше>
USER: Вопрос: """Какое событие наиболее известно в связи с Нейлом Армстронгом и на какую дату оно произошло? Предположим время UTC.""" Ответ ученика: """Разве он не прошел по Луне или что-то в этом роде?"""
Экспертный ответ: """Нейл Армстронг наиболее известен как первый человек, ступивший на Луну. Это историческое событие произошло 21 июля 1969 года."""
Пример входных данных с ответом, который прямо противоречит экспертному ответу:
SYSTEM: <вставьте системное сообщение выше>
USER: Вопрос: """Какое событие наиболее известно в связи с Нейлом Армстронгом и на какую дату оно произошло? Предположим время UTC.""" Ответ ученика: """21 июля 1969 года, Нейл Армстронг стал вторым человеком, который ступил на Луну, следуя за Баззом Олдрином."""
Экспертный ответ: """Нейл Армстронг наиболее известен как первый человек, ступивший на Луну. Это историческое событие произошло 21 июля 1969 года."""
Пример входных данных с правильным ответом, который также предоставляет немного больше деталей, чем это необходимо:
SYSTEM: <вставьте системное сообщение выше>
USER: Вопрос: """Какое событие наиболее известно в связи с Нейлом Армстронгом и на какую дату оно произошло? Предположим время UTC.""" Ответ ученика: """Примерно в 02:56 UTC 21 июля 1969 года, Нейл Армстронг стал первым человеком, ступившим на поверхность Луны, отметив тем самым значительное достижение в истории человечества."""
Экспертный ответ: """Нейл Армстронг наиболее известен как первый человек, ступивший на Луну. Это историческое событие произошло 21 июля 1969 года."""