Искусственный интеллект
January 19

Как правильно общаться с искусственным интеллектом: советы от создателей ChatGPT

Время прочтения — 30 минут.

О чем поговорим сегодня?

Короткой строкой: советы от разрабов ИИ

  1. Пишите четкие и понятные инструкции
  2. Предоставляйте справочный текст
  3. Декомпозируйте сложные запросы на более мелкие подзадачи
  4. Дайте модели время «подумать»
  5. Используйте связку инструментов
  6. Систематически оценивайте изменения инструкций

Об авторах:

OpenAI в представлении не нуждаются. Но на всякий случай: это те самые разработчики ChatGPT и DALL-E.

Ссылка на оригинал статьи: https://platform.openai.com/docs/guides/prompt-engineering


Далее текст авторов

6 стратегий и много тактик, которые сделают ваш промпт эффективным

Стратегия 1: пишите четкие и понятные инструкции

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

Тактика 1. Наполняйте деталями ваш запрос для более точного ответа

Убедитесь, что ваш запрос включает в себя достаточно много деталей. Иначе нейросеть будет догадываться — а нам это не нужно.

Плохо:

  • Как суммировать числа в Excel?
  • Кто президент?
  • Напиши код для вычисления последовательности Фибоначчи.
  • Резюмируй записи о встрече.

Уже лучше:

  • Как сложить строки с суммами в рублях в Excel? Я хочу сделать это автоматически для целого листа строк со всеми итогами, заканчивающимися справа в столбце под названием «Итого».
  • Кто был президентом Мексики в 2021 году и как часто проводятся выборы?
  • Напишите функцию TypeScript для эффективного вычисления последовательности Фибоначчи. Обильно комментируй код, чтобы объяснить, что делает каждый элемент и почему он написан именно так.
  • Резюмируй записи встречи в одном абзаце. Затем напиши в формате markdown список выступавших и каждый из их ключевых моментов. И наконец, перечисли следующие шаги или пункты действий, предложенные докладчиками, если таковые имеются.

Тактика 2. Попросите модель вести себя по-человечески (или даже конкретно по-человечески)

В условии можно прописать требования к модели вести себя более по-человечески:

Условие:

Когда я попрошу помочь мне что-то написать, ответь сообщением, в котором в каждом абзаце будет как минимум одна шутка или шутливый комментарий.

Запрос:

Напишите благодарность моему поставщику стальных болтов за своевременную и оперативную поставку. Это позволило нам выполнить важный заказ в срок.

Тактика 3. Используйте разделители, чтобы задать структуру вашему запросу.

Разделители, например, тройные кавычки ("""), теги XML, разделители секций и т. д., могут помочь разделить, например, условие и саму задачу.

Запрос:

Резюмируй текст, заключенный в тройные кавычки, с помощью хайку.

"""Вставьте текст сюда"""

Условие:

Тебе будет предоставлена пара статей (разделенных XML-тегами) на одну и ту же тему. Сначала кратко изложи аргументы каждой статьи. Затем укажи, какая из них лучше, и объясни почему.

Запрос:
<Статья> вставьте сюда первую статью </Статья>

<Статья> вставьте вторую статью сюда </Статья>

Условие:

Тебе будет предоставлен автореферат диссертации и предложенное название для нее. Название диссертации должно дать читателю представление о теме диссертации, но при этом должно привлекать внимание. Если название не соответствует этим критериям, предложите 5 альтернативных вариантов.

Запрос:

Аннотация: вставить аннотацию здесь

Название: вставить название здесь

Для таких простых запросов эффект разделителей может быть не таким очевидным, как для более сложных задач. Поэкспериментируйте сами, и вы увидите разницу.

Тактика 4. Уточните, какие шаги нужно сделать, чтобы выполнить вашу задачу

Некоторые задачи лучше всего задавать в виде последовательности шагов. Записывая шаги в явном виде, модели легче следовать им.

Условие:

Используй следующие пошаговые инструкции для ответа на пользовательский ввод.

Шаг 1. Пользователь предоставит тебе текст в тройных кавычках. Резюмируй этот текст в одном предложении с префиксом "Резюме: ".

Шаг 2 - Переведи резюме из Шага 1 на английский язык с префиксом "Перевод: ".

Запрос:

"""вставьте текст сюда"""

Тактика 5. Приведите пример

Предоставление общих инструкций, применимых ко всем примерам, обычно более эффективно, чем демонстрация всех вариантов выполнения задачи на примере, но в некоторых случаях предоставление примеров может быть проще. Например, если вы хотите, чтобы модель копировала определенный стиль ответа на запросы пользователя, который сложно описать в явном виде. Эта тактика также носит название «few-shot prompting»

Условие:

Отвечай в едином стиле.

Запрос:

Расскажи мне про терпение

Модель:

Река, прорезающая самую глубокую долину, вытекает из скромного источника; самая великая симфония начинается с одной ноты; самый замысловатый гобелен начинается с одинокой нити.

Запрос:

Расскажи мне об океане.

Тактика 6. Уточните желаемую длину ответа

Вы можете уточнить желаемую длину для ответа. Причем сделать это вы можете любым удобным для вас способом: ограничив количества слов, предложений, параграфов, буллитов и так далее. Обратите внимание, что задание модели генерировать определенное количество слов не дает высокой точности. Модель может более надежно генерировать выходные данные с определенным количеством абзацев или пунктов.

Запрос:

Резюмируй текст, заключенный в тройные кавычки, примерно в 50 словах.

"""Вставьте текст сюда"""

Запрос:

Резюмируй текст, заключенный в тройные кавычки, в 2 абзаца.

"""вставьте текст сюда"""

Запрос:

Резюмируй текст, заключенный в тройные кавычки, в 3 буллита.

"""вставьте текст сюда"""

Стратегия 2: если можете, предоставьте модели справочный текст

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

Тактика 1. Предложите модели ответить, основываясь на справочном тексте

Если мы можем предоставить достоверную информацию модели для формирования нашего запроса, значит, мы можем дать ей достоверную информацию для формулирования ответа.

Условие:

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

Запрос:

<вставьте статьи, каждая из которых заключена в тройные кавычки>

Вопрос: <вставьте вопрос здесь>

Учитывая, что все модели имеют ограниченное контекстное окно, нам нужен способ динамического поиска информации, относящейся к заданному вопросу. Для реализации эффективного поиска знаний можно использовать вставки. Более подробно о том, как это реализовать, читайте в тактике «Использование поиска на основе вставок для реализации эффективного поиска знаний».

Тактика 2. Попросите модель отвечать цитатами из справочного текста

Если наш справочный текст содержит в себе все необходимые нам ответы, мы можем попросить модель отвечать буквальными цитатами из текста. Обратите внимание, что в данном случае правильность ответа можно оценить программно: с помощью сопоставления цитат из первоначального текста и ответа модели.

Условие:

Тебе будет предоставлен документ, разделенный тройными кавычками, и вопрос. Твоя задача — ответить на вопрос, используя только предоставленный документ, и процитировать отрывок(и) из документа, использованный для ответа на вопрос. Если документ не содержит информации, необходимой для ответа на вопрос, просто напиши: "Недостаточно информации". Если ответ на вопрос дан, он должен быть снабжен ссылкой. Используйте следующий формат для цитирования соответствующих отрывков ({"цитата": ...}).

Запрос:

"""<вставьте документ здесь>"""

Вопрос: <вставьте вопрос здесь>

Стратегия 3. Декомпозируйте сложную задачу на более мелкие подзадачи

Как и в жизни любую сложную задачу можно (и нужно!) разделять на мелкие подзадачи. Модель с менее комплексными задачами справляется куда лучше. Более того, в общении с ИИ комплексные задачи можно часто переопределить через поток простых задач, каждая из которых использует информацию из предыдущей.

Тактика 1. Используйте классификатор намерений, чтобы определить наиболее вероятные инструкции по запросу пользователя.

Для задач, в которых требуется множество независимых наборов инструкций для обработки различных случаев, может быть полезно сначала классифицировать тип запроса и использовать эту классификацию для определения необходимых инструкций. Этого можно достичь путем определения фиксированных категорий и инструкций, необходимых для обработки задач в данной категории. Этот процесс также может быть применен рекурсивно для декомпозиции задачи на последовательность этапов.

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

Условие:

Тебе будут предложены запросы на обслуживание клиентов. Классифицируй каждый запрос на первичную и вторичную категории. Предоставь результат в формате json с ключами: первичный и вторичный.

Первичные категории: Биллинг, Техническая поддержка, Управление счетом или Общий запрос.

Вторичные категории биллинга:
— Отказ от подписки или обновление
— Добавить способ оплаты
— Объяснение списания средств
— Оспорить списание

Техническая поддержка вторичные категории:
— Устранение неполадок
— Совместимость устройств
— Обновление программного обеспечения

Управление учетной записью вторичные категории:
— Сброс пароля
— Обновление личной информации
— Закрытие учетной записи
— Безопасность учетной записи

Общие сведения вторичные категории:
— Информация о продукте
— Ценообразование
— Обратная связь
— Поговорить с человеком

Запрос:

Мне нужно, чтобы мой интернет снова заработал.

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

Условие:
Тебе предстоит работать с запросами клиентов, требующими устранения неполадок в контексте технической поддержки. Помоги пользователю, по примеру:

— Попроси проверить, подключены ли все кабели к маршрутизатору/от него. Обрати внимание, что обычно кабели со временем отсоединяются.
— Если все кабели подключены, а проблема сохраняется, спроси, какую модель маршрутизатора они используют.
— Теперь скажи, как перезагрузить устройство:
— Если номер модели MTD-327J, посоветуй им нажать красную кнопку и удерживать ее в течение 5 секунд, а затем подождать 5 минут, прежде чем проверять соединение.
— Если номер модели MTD-327S, посоветуй отключить и подключить устройство, а затем подождать 5 минут, прежде чем проверять соединение.
— Если после перезапуска устройства и 5 минут ожидания проблема клиента не исчезла, соедини его с ИТ-поддержкой, выведя {"Запрошена ИТ-поддержка"}.
— Если пользователь начинает задавать вопросы, не относящиеся к данной теме, подтверди, что он хочет завершить текущий чат об устранении неполадок, и классифицируй его запрос в соответствии со следующей схемой:

<вставьте схему первичной/вторичной классификации из приведенной выше>.

Запрос:

Мне нужно, чтобы мой интернет снова заработал.

Обратите внимание, что мы сформировали запрос, который меняет состояние разговора. Это позволяет нам превратить модель в систему состояний, где в зависимости от запроса мы определяем, как себя будет вести модель. Кстати, именно так работают чат-боты: модель считывает классификатор нашего запроса, а затем выводить нужные инструкции и реализует их.

Тактика 2. Для диалоговых приложений, требующих очень длинных разговоров, подытожьте предыдущие сообщения диалога

Поскольку модель имеет фиксированную длину, наш с ней диалог не может длиться бесконечно. Существует много разных обходных путей для решения этой проблемы. Один из них — это резюмирование предыдущего разговора. Когда размер входных данных достигает пороговых значений, это может провоцировать запрос, который обобщает часть разговора. Представьте, если бы так можно было бы делать в жизни? Красота.

Альтернативным решением является динамический выбор предыдущих частей разговора, которые наиболее релевантны текущему запросу. См. тактику «Использование поиска на основе вставок для реализации эффективного поиска знаний».

Тактика 3. Обобщение длинного документа по частям и рекурсивное построение полного резюме

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

Чтобы обобщить очень длинный документ, например, книгу, мы можем использовать последовательность запросов для обобщения каждого раздела документа. Резюме разделов можно объединить и просуммировать, получив «резюме резюме».

Этот процесс может продолжаться рекурсивно, пока не будет обобщен весь документ. Если для понимания смысла последующих разделов необходимо использовать информацию о предыдущих разделах, то полезным приемом может стать включение в книгу беглого резюме текста, который предшествует какому-либо определенному моменту в книге, при кратком изложении содержания в этом моменте.

Стратегия 4. Дайте модели время «подумать»

Если вас попросить перемножить 17 и 28, возможно, сразу вы не сможете дать ответ: вам нужно время подумать. Также и с моделями: если просить ее дать ответ «здесь и сейчас», это может спровоцировать ошибку. Такой подход еще называется «Chains-of-thought (CoT)».

Тактика 1. Попросите модель решить задачу самостоятельно, прежде чем делать какие-то выводы

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

Условие:

Определите, правильно ли решение ученика или нет.

Запрос:

Постановка задачи: Я строю солнечную электростанцию, и мне нужна помощь в составлении финансовой отчетности.
— Земля стоит $100 / квадратный метр
— Я могу купить солнечные панели за 250 долларов за квадратный метр.
— Я заключил контракт на техническое обслуживание, которое обойдется мне в 100 тысяч долларов в год и еще 10 долларов за квадратный метр.
Какова общая стоимость первого года работы в зависимости от количества квадратных метров.

Решение студента: Пусть x — размер установки в квадратных метрах.
1. Стоимость земли: 100x
2. Стоимость солнечной батареи: 250x
3. Стоимость обслуживания: 100 000 + 100x
Общая стоимость: 100x + 250x + 100,000 + 100x = 450x + 100,000

Модель:

Решение студента верное.

Но ведь это не так! Решение студента неправильное! Но мы можем исправить выводы модели.

Условие:

Сначала разработай собственное решение задачи. Затем сравни свое решение с решением ученика и оцени, верно ли решение ученика или нет. Не делай выводов, правильно ли решение ученика, пока не решишь задачу сам.

Запрос:

Постановка задачи: Я строю солнечную электростанцию, и мне нужна помощь в составлении финансовой отчетности.
— Земля стоит $100 / квадратный метр
— Я могу купить солнечные панели за 250 долларов за квадратный метр.
— Я заключил контракт на техническое обслуживание, которое обойдется мне в 100 тысяч долларов в год и еще 10 долларов за квадратный метр.
Какова общая стоимость первого года работы в зависимости от количества квадратных метров.

Решение студента: Пусть x — размер установки в квадратных метрах.
1. Стоимость земли: 100x
2. Стоимость солнечной батареи: 250x
3. Стоимость обслуживания: 100 000 + 100x
Общая стоимость: 100x + 250x + 100,000 + 100x = 450x + 100,000

Модель:

Пусть x — размер установки в квадратных метрах.
1. Стоимость земли: 100x
2. Стоимость солнечной батареи: 250x
3. Стоимость обслуживания: 100 000 + 10x
Общая стоимость: 100x + 250x + 100,000 + 10x = 360x + 100,000

Решение студента неверно. Он допустил ошибку в расчете стоимости обслуживания, использовав 100x вместо 10x. Правильная общая стоимость для первого года работы равна 360x + 100 000.

Тактика 2. Используйте «внутренний монолог» или последовательность запросов, чтобы скрыть процесс рассуждения модели

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

Внутренний монолог — это тактика, которая может быть использована для смягчения этой проблемы. Идея внутреннего монолога заключается в том, чтобы дать модели указание поместить части вывода, которые должны быть скрыты от пользователя, в структурированный формат, облегчающий их разбор. Затем, перед тем как представить вывод пользователю, он разбирается, и только часть вывода становится видимой.

Условие:

Выполни следующие шаги, чтобы ответить на вопросы пользователей.

Шаг 1. Сначала разработай собственное решение проблемы. Не полагайся на решение студента, так как оно может быть неверным. Заключи все свои наработки для этого шага в тройные кавычки (""").

Шаг 2. Сравни свое решение с решением ученика и оцени, верно ли решение ученика. Заключи всю свою работу для этого шага в тройные кавычки (""").

Шаг 3 - Если ученик допустил ошибку, определи, какую подсказку ты мог бы дать ученику, не выдавая ответа. Заключи всю свою работу на этом шаге в тройные кавычки (""").

Шаг 4 - Если ученик допустил ошибку, дай ему подсказку из предыдущего шага (вне тройных кавычек). Вместо "Шаг 4 - ..." напиши "Подсказка:".

Запрос:

Постановка задачи: <вставьте формулировку проблемы>.

Решение ученика: <вставьте решение студента>

Как вариант, этого можно добиться с помощью последовательности запросов, в которых все результаты, кроме последнего, скрыты от конечного пользователя.

Сначала мы можем попросить модель решить задачу самостоятельно. Поскольку этот начальный запрос не требует решения ученика, его можно опустить. Это дает дополнительное преимущество: нет вероятности, что решение модели будет искажено попыткой студента решить задачу.

Запрос:

<Вставьте формулировку задачи>.

Далее мы можем заставить модель использовать всю доступную информацию для оценки правильности решения ученика.

Условие:

Сравни свое решение с решением студента и оцени, правильно ли решение студента или нет.

Запрос:

Постановка задачи: """<вставьте постановку задачи>"""

Ваше решение: """<вставьте сгенерированное моделью решение>"""

Решение студента: """<вставьте решение студента>"""

Наконец, мы можем позволить модели использовать свой собственный анализ для построения ответа в лице полезного наставника.

Условие:

Ты — репетитор по математике. Если ученик допустил ошибку, напиши ему подсказку так, чтобы не раскрыть ответ. Если ученик не сделал ошибки, просто напиши ему ободряющий комментарий.

Запрос:

Постановка задачи: """<вставьте постановку задачи>"""

Ваше решение: """<вставьте сгенерированное моделью решение>"""

Решение студента: """<вставьте решение студента>"""

Анализ: """<вставьте сгенерированный моделью анализ из предыдущего шага>"""

Тактика 3. Спросите модель, не пропустила ли она что-нибудь во время предыдущего диалога.

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

Условие:

Тебе будет предоставлен документ, разграниченный тройными кавычками. Твоя задача — выбрать фрагменты, которые относятся к следующему вопросу: "Какие значительные сдвиги произошли в истории искусственного интеллекта".

Убедись, что выдержки содержат весь контекст, необходимый для их интерпретации — другими словами, не извлекай небольшие фрагменты, в которых отсутствует важный контекст. Предоставь выходные данные в формате JSON следующим образом:

[{"фрагмент": "..."},
...
{"фрагмент": "..."}]

Запрос:

"""<вставьте документ здесь>"""

Модель:

[{"фрагмент": "модель пишет здесь отрывок"},
...
{"фрагмент": "модель пишет еще один отрывок здесь"}]

Запрос:

Есть ли еще подходящие выдержки? Следи за тем, чтобы не повторять отрывки. Также убедись, что выдержки содержат весь контекст, необходимый для их интерпретации — другими словами, не извлекайте небольшие фрагменты, в которых отсутствует важный контекст.

Стратегия 5. Используйте внешние инструменты

Компенсируйте слабые стороны модели, передавая ей результаты работы других инструментов. Например, система поиска текста (иногда называемая RAG или retrieval augmented generation) может рассказать модели о релевантных документах. Механизм выполнения кода, такой как OpenAI’s Code Interpreter, может помочь модели выполнять математические вычисления и запускать код. Если задача может быть выполнена более надежно или эффективно с помощью инструмента, а не языковой модели, разгрузите ее, чтобы получить лучшее из обоих вариантов.

Тактика 1. Использование поиска на основе вставок для эффективного поиска знаний

Модель может использовать внешние источники информации, если они предоставляются в качестве исходных данных. Это может помочь модели генерировать более обоснованные и актуальные ответы. Например, если пользователь задает вопрос о конкретном фильме, может быть полезно добавить на вход модели высококачественную информацию о фильме (например, актеры, режиссер и т. д.). Вставки могут быть использованы для эффективного поиска знаний, так что соответствующая информация может быть добавлена на вход модели динамически во время выполнения.

Встраивание текста — это вектор, который позволяет измерить степень связанности между текстовыми строками. Похожие или релевантные строки будут располагаться ближе друг к другу, чем несвязанные. Этот факт, а также существование быстрых алгоритмов векторного поиска означают, что вставки можно использовать для эффективного поиска знаний. В частности, корпус текстов может быть разбит на фрагменты, и каждый фрагмент может быть вложен и сохранен. Затем в него можно вложить заданный запрос и выполнить векторный поиск, чтобы найти вложенные фрагменты текста из корпуса, которые наиболее связаны с запросом (т. е. находятся ближе всего друг к другу в пространстве вложений).

Тактика 2. Используйте выполнение кода для получения более точных вычислений

Нельзя полагаться на то, что языковые модели будут самостоятельно точно выполнять арифметические или длительные вычисления. В тех случаях, когда это необходимо, модели можно поручить написать и выполнить код вместо того, чтобы производить собственные вычисления. В частности, модели можно поручить поместить код, предназначенный для выполнения, в определенный формат, например, в тройные скобки. После получения выходных данных код может быть извлечен и запущен. Наконец, если необходимо, вывод механизма выполнения кода (т. е. интерпретатора Python) может быть предоставлен в качестве входных данных модели для следующего запроса.

Условие:

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

Запрос:

Найдите все вещественные корни следующего многочлена: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.

Еще один хороший вариант выполнения кода — вызов внешних API. Если модель проинструктировать о том, как правильно использовать API, она сможет написать код, использующий его. Модель можно проинструктировать о том, как использовать API, предоставив ей документацию и/или примеры кода, показывающие, как использовать API.

Условие:

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

`` python
import message
message.write(to="Джон", message="Привет, хочешь встретиться после работы?")

ПРЕДУПРЕЖДЕНИЕ: Выполнение кода, созданного моделью, не является безопасным по своей сути, поэтому в любом приложении, которое стремится это сделать, необходимо принимать меры предосторожности. В частности, для ограничения вреда, который может нанести неоднозначный код, необходима среда выполнения кода в виде изолированной среды.

Тактика 3. Предоставьте модели доступ к определенным функциям

API Chat Completions позволяет передавать в запросах список описаний функций. Это позволяет моделям генерировать аргументы функций в соответствии с предоставленными схемами. Сгенерированные аргументы функций возвращаются API в формате JSON и могут быть использованы для выполнения вызовов функций. Выходные данные, предоставленные вызовами функций, могут быть возвращены в модель в следующем запросе, чтобы замкнуть цикл. Это рекомендуемый способ использования моделей OpenAI для вызова внешних функций.

Стратегия 6. Систематически проверяйте изменения

Улучшить производительность общения с нейросетью проще, если вы можете ее измерить. В некоторых случаях модификация подсказки улучшит производительность на нескольких отдельных примерах, но приведет к ухудшению общей производительности на более представительном наборе примеров. Поэтому, чтобы убедиться в положительном влиянии изменения на производительность, может потребоваться определить комплексный набор тестов (также известный как «eval»).

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

Процедуры оценки (или «eval») полезны для оптимизации дизайна системы. Хорошими процедурами оценки являются:

  1. Репрезентативны для реального использования (или, по крайней мере, разнообразны)
  2. Содержат много тестовых примеров для повышения статистической мощности
  3. Легко автоматизируются или повторяются

Оценка результатов может выполняться компьютерами, людьми или теми и теми одновременно. Компьютеры могут автоматизировать оценку по объективным критериям (например, вопросы с единственным правильным ответом), а также по некоторым субъективным или нечетким критериям, при которых выходные данные модели оцениваются другими запросами к модели.

Оценки на основе моделей могут быть полезны, когда существует ряд возможных результатов, которые будут считаться одинаково качественными (например, для вопросов с длинными ответами). Граница между тем, что можно реально оценить с помощью модели, и тем, что требует оценки человека, нечеткая и постоянно меняется по мере того, как модели становятся все более способными. Мы рекомендуем экспериментировать, чтобы понять, насколько хорошо оценки на основе моделей могут работать в вашем случае.

Тактика 1. Оценивайте результаты модели, ориентируясь на золотые стандарты.

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

Например, используя следующее системное сообщение:

Условие:
Вам будет предоставлен текст, заключенный в тройные кавычки, который должен быть ответом на вопрос. Проверьте, содержатся ли следующие фрагменты информации непосредственно в ответе:

— Нил Армстронг был первым человеком, побывавшим на Луне.
— Дата, когда Нил Армстронг впервые вышел на Луну, — 21 июля 1969 года.

Для каждого из этих пунктов выполните следующие действия:

1 — Переформулируйте пункт.
2 — Приведите цитату из ответа, которая наиболее близка к этому пункту.
3 — Подумайте, сможет ли человек, читающий цитату и не разбирающийся в теме, сделать прямой вывод об этом пункте. Объясните, почему или почему нет, прежде чем принять решение.
4 — Напишите «да», если ответ на пункт 3 был положительным, в противном случае напишите «нет».

Наконец, подсчитайте количество ответов «да». Представьте этот подсчет в виде {"count»: <вставьте число здесь>}.

Вот пример ввода, в котором оба пункта удовлетворены:

Условие:

<вставьте системное сообщение выше>.

Запрос:

"Нил Армстронг известен тем, что стал первым человеком, ступившим на Луну. Это историческое событие произошло 21 июля 1969 года во время полета "Аполлона-11"."

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

Условие:

<вставьте системное сообщение выше>.

Запрос:

"Нил Армстронг вошел в историю, сойдя с лунного модуля и став первым человеком, побывавшим на Луне."""

Вот пример ввода, где ни один из них не удовлетворен:

Условие:

<вставьте системное сообщение выше>.

Запрос:

«Летом 69-го года — грандиозное путешествие,
Аполлон-11, смелый, как рука легенды.
Армстронг сделал шаг, и история развернулась,
„Один маленький шаг, — сказал он, — для нового мира“.

Существует множество возможных вариантов такого типа оценки на основе модели. Рассмотрим следующий вариант, который отслеживает, насколько совпадает ответ кандидата с ответом золотого стандарта, а также отслеживает, противоречит ли ответ кандидата какой-либо части ответа золотого стандарта.

Условие:
Используй следующие шаги для ответа на ввод пользователя. Полностью переформулируй каждый шаг, прежде чем продолжить. Например, "Шаг 1: Обоснование...".

Шаг 1: Пошагово объясни, является ли информация в представленном ответе по сравнению с ответом эксперта: непересекающейся, одинаковой, подмножеством, супермножеством или пересекающейся (т. е. пересекающейся, но не подмножеством/супермножеством).

Шаг 2: Пошагово объясни, противоречит ли представленный ответ какому-либо аспекту ответа эксперта.

Шаг 3: Выведи JSON-объекта, структурированного следующим образом: {"type_of_overlap": "disjoint" или "equal" или "subset" или "superset" или "overlapping", "contradiction": true или false}

Вот пример ввода с некачественным ответом, который, тем не менее, не противоречит ответу эксперта:

Условие:

<вставьте системное сообщение выше>.

Запрос:

Вопрос: """Какое событие и в какой день произошло с Нилом Армстронгом? Предположите время по Гринвичу."""

Ответ: """Разве он не ходил по Луне или что-то в этом роде?"""

Ответ эксперта: """"Нил Армстронг наиболее известен тем, что стал первым человеком, побывавшим на Луне. Это историческое событие произошло 21 июля 1969 года."""

Вот пример ввода с ответом, который прямо противоречит ответу эксперта:

Условие:

<вставьте системное сообщение выше>.

Запрос:

Вопрос: """Какое событие и в какой день произошло с Нилом Армстронгом? Предположите время по Гринвичу."""

Ответ: """21 июля 1969 года Нил Армстронг стал вторым человеком, побывавшим на Луне, после Базза Олдрина."""

Ответ эксперта: """Нил Армстронг наиболее известен тем, что стал первым человеком, прогулявшимся по Луне. Это историческое событие произошло 21 июля 1969 года."""

Вот пример ввода с правильным ответом, который также содержит немного больше деталей, чем нужно:

Условие:

<вставьте системное сообщение выше>.

Запрос:

Вопрос: """Какое событие и в какой день произошло с Нилом Армстронгом? Предположите время по Гринвичу."""

Ответ: """Примерно в 02:56 UTC 21 июля 1969 года Нил Армстронг стал первым человеком, ступившим на поверхность Луны, что стало монументальным достижением в истории человечества."""

Ответ эксперта: """Нил Армстронг наиболее известен тем, что стал первым человеком, ступившим на Луну. Это историческое событие произошло 21 июля 1969 года."""