Инженерия персонала

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

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

Советы: Этот учебник является переводом официального руководства OpenAI по инженерии советов. В учебнике объясняется стратегия/тактика написания советов и то, как указать LLM возвратить желаемый результат через надпись.

Шесть стратегий для получения лучших результатов

Напишите четкие инструкции

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

Тактики:

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

Предоставьте ссылочный текст

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

Тактики:

  • Указать модели отвечать с использованием ссылочного текста.
  • Поручить модели отвечать с цитатами из ссылочного текста.

Разделите сложные задачи на более простые подзадачи

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

Тактики:

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

Дайте модели время "подумать"

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

Тактики:

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

Используйте внешние инструменты

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

Тактики:

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

Систематически тестируйте изменения

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

Тактика:

  • Оценить результаты модели согласно золотому стандарту ответов.

Тактики

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

Описание примера слов-подсказок

Все мы знаем, что у API модели чата, вызывающей OpenAI, есть три типа сообщений: SYSTEM, USER и ASSISTANT, и функции этих трех сообщений следующие:

Тип сообщения (соответствует параметру роли api) Описание
SYSTEM Системное сообщение помогает настроить поведение ассистента. Например, вы можете изменить личность ассистента или предоставить конкретные инструкции о том, как он должен вести себя во время разговора. Однако обратите внимание, что системное сообщение является необязательным, и поведение модели без системного сообщения скорее всего будет аналогичным использованию общего сообщения, такого как "Вы - полезный ассистент".
USER Сообщение пользователя - это вопрос или комментарий пользователя.
ASSISTANT Сообщения ассистента представляют то, что возвращает модель GPT.

Примеры слов-подсказок в этом руководстве будут объяснены в следующем формате:

// SYSTEM Message
Здесь показано, как установить слово-подсказку для системного сообщения.

// USER Message
Здесь показано, как установить слово-подсказку для сообщения пользователя.

// ASSISTANT Message
Это демонстрирует, что может вернуть GPT.

Стратегия: Написание четких инструкций

Тактика: Включение деталей в запрос для получения более подходящих ответов

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

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

Тактика: Просьба модели принять определенный характер

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

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

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

Тактика: Использование разделителей для ясного обозначения отдельных частей ввода

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

// USER Message
Суммируйте текст, ограниченный тройными кавычками, хайку.

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

// USER Message
<article> вставьте сюда первую статью </article>
<article> вставьте сюда вторую статью </article>
// SYSTEM Message
Вам будет предоставлен аннотации диссертации и предложенное название к ней. Название диссертации должно дать читателю хорошее представление о теме диссертации, но также должно быть привлекательным. Если название не соответствует этим критериям, предложите 5 альтернатив.

// USER Message

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

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

Тактика: Указать шаги, необходимые для выполнения задачи

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

// Системное сообщение

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

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

Шаг 2 - Переведите сводку из шага 1 на испанский язык, используя префикс "Перевод: ".

// Пользовательское сообщение
"""вставьте здесь текст"""

Тактика: Предоставление примеров

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

// Системное сообщение
Отвечайте в одном стиле.

// Пользовательское сообщение
Научи меня терпению.

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

// Пользовательское сообщение
Научи меня об океане.

Тактика: Указание желаемой длины вывода

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

// Пользовательское сообщение

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

"""вставьте здесь текст"""
// Пользовательское сообщение

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

"""вставьте здесь текст"""
// Пользовательское сообщение

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

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

Стратегия: Предоставление ссылочного текста

Тактика: Поручение модели отвечать с использованием ссылочного текста

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

// Системное сообщение
Для ответов на вопросы используйте предоставленные статьи, заключенные в тройные кавычки. Если ответ нельзя найти в статьях, напишите "Не удалось найти ответ".

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

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

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

Тактика: Поручение модели отвечать с ссылками на текст из справочного материала

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

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

// Пользовательское сообщение

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

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

Тактика: Использование классификации намерений для определения наиболее подходящих инструкций для пользовательского запроса

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

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

// Сообщение СИСТЕМЫ
Вам будут предоставлены запросы обслуживания клиентов. Классифицируйте каждый запрос в основную и вторичную категории. Предоставьте вывод в формате JSON с ключами: основная и вторичная.

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

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

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

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

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

// Сообщение ПОЛЬЗОВАТЕЛЯ
Мне нужно снова настроить интернет.

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

// Сообщение СИСТЕМЫ
Вам будут предоставлены запросы обслуживания клиентов, требующие устранения неисправностей в контексте технической поддержки. Помогите пользователю, выполняя следующие действия:

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

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

// Сообщение ПОЛЬЗОВАТЕЛЯ
Мне нужно снова настроить интернет.

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

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

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

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

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

Тактика: Резюмирование длинных документов частями и построение полного резюме рекурсивно

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

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

Стратегия: Дайте моделям время "подумать"

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

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

// Сообщение СИСТЕМЫ
Определите, правильное ли решение студента или нет.

// Сообщение ПОЛЬЗОВАТЕЛЯ
Условие задачи: Я строю солнечную электростанцию и мне нужна помощь в финансовом планировании.
- Стоимость земли - $100 за квадратный фут
- Я могу купить солнечные панели за $250 за квадратный фут
- Я подписал контракт на обслуживание, которое будет стоить мне фиксированные $100 тыс. в год, а также дополнительно $10 за квадратный фут
Какова общая стоимость первого года эксплуатации в зависимости от количества квадратных футов.

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

// Сообщение ПОМОЩНИКА
Решение студента верное.

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

// Сообщение СИСТЕМЫ
Сначала разработайте собственное решение задачи. Затем сравните свое решение с решением студента и оцените, правильное ли решение студента или нет. Не принимайте решение о том, правильное ли решение студента, пока не решите эту задачу самостоятельно.

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

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

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

Решение студента неверное. В их расчетах стоимости обслуживания ошибка, использовано 100x вместо 10x. Правильная общая стоимость первого года эксплуатации - 360x + 100,000.
#### Тактика: Использование внутреннего монолога или последовательности запросов для скрытия процесса рассуждения модели

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

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

```python
// Сообщение СИСТЕМЫ
Следуйте этим шагам, чтобы ответить на запросы пользователя.

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

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

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

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

// Сообщение ПОЛЬЗОВАТЕЛЯ
Условие задачи: <вставьте условие задачи>

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

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

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

// Сообщение ПОЛЬЗОВАТЕЛЯ
<вставьте условие задачи>

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

// Сообщение СИСТЕМЫ
Сравните свое решение со студенческим и оцените, правильно ли решение студента.

// Сообщение ПОЛЬЗОВАТЕЛЯ
Условие задачи: """<вставьте условие задачи>"""

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

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

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

// Сообщение СИСТЕМЫ

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

// Сообщение ПОЛЬЗОВАТЕЛЯ

Условие задачи: """<вставьте условие задачи>"""

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

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

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

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

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

// Сообщение СИСТЕМЫ
Вам будет предоставлен документ, разделенный тройными кавычками. Ваша задача - выбрать отрывки, относящиеся к следующему вопросу: "Какие значительные парадигмальные сдвиги произошли в истории искусственного интеллекта."

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

[{"отрывок": "..."},
...
{"отрывок": "..."}]

// Сообщение ПОЛЬЗОВАТЕЛЯ
"""<вставьте сюда документ>"""

// Сообщение ПОМОЩНИКА
[{"отрывок": "модель пишет здесь отрывок"},
...
{"отрывок": "модель пишет здесь другой отрывок"}]

// Сообщение ПОЛЬЗОВАТЕЛЯ
Есть ли еще соответствующие отрывки? Обратите внимание, чтобы не повторять отрывки. Также убедитесь, что отрывки содержат всю соответствующую контекстную информацию, необходимую для их интерпретации - другими словами, не извлекайте маленькие фрагменты, лишенные важного контекста.

Стратегия: Использование внешних инструментов

Тактика: Использование поиска на основе вложений для реализации эффективного извлечения знаний

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

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

Тактика: Использование выполнения кода для более точных вычислений или вызова внешних API

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

``` // Системное сообщение

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

// Пользовательское сообщение

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

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

``` // Системное сообщение

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

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

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

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

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

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

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

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

  • Представительны для использования в реальном мире (или по крайней мере, разнообразны)
  • Содержат много тестовых случаев для большей статистической мощности (см. таблицу ниже для рекомендаций)
  • Легко автоматизировать или повторять
Разница для обнаружения Размер выборки для 95% уверенности
30% ~10
10% ~100
3% ~1,000
1% ~10,000

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

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

Тактика: Оценка выводов модели по сравнению с эталонными ответами

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

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

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

- Нил Армстронг был первым человеком, ступившим на Луну.
- Дата первой посадки Нила Армстронга на Луну - 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}

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

// Системное сообщение

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

// Пользовательское сообщение

Вопрос: """За какое событие Нил Армстронг наиболее известен и на какую дату это произошло? Предположим, что время указано в UTC."""

Представленный ответ: """Разве он не ступил на Луну или что-то подобное?"""

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

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

// Системное сообщение

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

// Пользовательское сообщение
Вопрос: """За какое событие Нил Армстронг наиболее известен и на какую дату это произошло? Предположим, что время указано в UTC."""

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

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

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

// СИСТЕМНОЕ Сообщение
<вставьте системное сообщение выше>

// Сообщение ПОЛЬЗОВАТЕЛЯ

Вопрос: """За какое событие Нил Армстронг наиболее известен и в какую дату оно произошло? Предположим, время в формате UTC."""

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

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