В этом руководстве представлены стратегии и тактики для получения лучших результатов от больших языковых моделей (иногда называемых GPT-моделями), таких как GPT-4. Описанные здесь методы иногда можно использовать в комбинации для достижения большего эффекта. Мы рекомендуем экспериментировать, чтобы найти методы, которые будут работать лучше всего.
Некоторые из приведенных здесь примеров в настоящее время работают только с нашей самой способной моделью, gpt-4. В общем, если вы обнаружили, что модель не справляется с задачей, а в наличии есть более способная модель, стоит попробовать еще раз с более способной моделью.
Шесть стратегий для получения лучших результатов
Пишите четкие инструкции
Эти модели не могут читать ваши мысли. Если вывод слишком длинный, просите давать краткие ответы. Если результаты слишком просты, попросите написать их на уровне эксперта. Если вам не нравится формат, покажите, какой формат вы хотели бы видеть. Чем меньше модели придется гадать, чего вы хотите, тем больше вероятность, что вы это получите.
Тактика:
- Включите детали в запрос, чтобы получить более релевантные ответы
- Попросите модель принять образ
- Используйте разделители, чтобы четко обозначить отдельные части входных данных
- Укажите шаги, необходимые для выполнения задачи
- Приведите примеры
- Укажите желаемую длину выходных данных
Предоставьте справочный текст
Языковые модели могут уверенно придумывать фальшивые ответы, особенно когда их спрашивают об эзотерических темах или о ссылках и URL-адресах. Подобно тому, как лист с заметками может помочь студенту лучше справиться с тестом, предоставление справочного текста для этих моделей может помочь ответить с меньшим количеством выдумок.
Тактика:
- Попросите модель ответить, используя справочный текст
- Попросите модель ответить, используя цитаты из справочного текста
Разделяйте сложные задачи на более простые подзадачи
Как в программной инженерии принято декомпозировать сложную систему на набор модульных компонентов, так и в задачах, поставленных перед языковой моделью. Сложные задачи, как правило, имеют более высокий процент ошибок, чем простые. Кроме того, сложные задачи часто могут быть переформулированы как последовательность более простых задач, в которой выходы предыдущих задач используются для создания входов последующих задач.
Тактика:
- Использование классификации намерений для определения наиболее релевантных инструкций для запроса пользователя
- Для диалоговых приложений, требующих очень длинных разговоров, обобщайте или фильтруйте предыдущие диалоги
- Резюмирование длинных документов по частям и рекурсивное построение полного резюме
Дайте модели время «подумать».
Если вас попросят умножить 17 на 28, вы, возможно, не сразу догадаетесь, но со временем сможете решить эту задачу. Аналогично, модели допускают больше ошибок в рассуждениях, когда пытаются ответить сразу, а не тратят время на обдумывание ответа. Если попросить модель продумать «цепочку мыслей» перед ответом, это поможет ей более надежно обосновать правильные ответы.
Тактика:
- Побуждайте модель к самостоятельному поиску решения, прежде чем спешить с выводом
- Используйте внутренний монолог или последовательность запросов, чтобы скрыть процесс рассуждений модели
- Спросите модель, не упустила ли она что-нибудь при предыдущих проходах
Используйте внешние инструменты
Компенсируйте слабые стороны модели, предоставляя ей результаты работы других инструментов. Например, система поиска текста (иногда называемая RAG или retrieval augmented generation) может сообщить модели о релевантных документах. Механизм выполнения кода, такой как OpenAI’s Code Interpreter, может помочь модели выполнять математические вычисления и запускать код. Если задача может быть выполнена более надежно или эффективно инструментом, а не языковой моделью, перегрузите ее, чтобы получить лучшее из обоих вариантов.
Тактика:
- Используйте поиск на основе вкраплений для эффективного поиска знаний.
- Используйте выполнение кода для выполнения более точных вычислений или вызова внешних API.
- Предоставьте модели доступ к определенным функциям
Систематически тестируйте изменения
Улучшить производительность проще, если вы можете ее измерить. В некоторых случаях модификация подсказки улучшит производительность на нескольких отдельных примерах, но приведет к ухудшению общей производительности на более представительном наборе примеров. Поэтому, чтобы убедиться в положительном влиянии изменения на производительность, может потребоваться определить комплексный набор тестов (также известный как «eval»).
Тактика:
- Оценивать результаты модели по отношению к золотым стандартам
Тактики
Каждая из перечисленных выше стратегий может быть реализована с помощью определенных тактик. Эти тактики предназначены для того, чтобы дать идеи, что можно попробовать. Они ни в коем случае не являются полностью исчерпывающими, и вы должны чувствовать себя свободно, пробуя творческие идеи, не представленные здесь.
Стратегия: Пишите четкие инструкции
Тактика: включайте детали в запрос, чтобы получить более релевантные ответы
Чтобы получить максимально релевантный ответ, убедитесь, что в запросе указаны все важные детали или контекст. В противном случае вы оставляете модель догадываться, что вы имеете в виду.
| Хуже | Лучше |
|---|---|
| Как сложить числа в Excel? | Как сложить строки с суммами в долларах в Excel? Я хочу сделать это автоматически для целого листа строк с итоговыми суммами, заканчивающимися справа в столбце под названием "Итого". |
| Кто будет президентом? | Кто был президентом Мексики в 2021 году и как часто проводятся выборы? |
| Напишите код для вычисления последовательности Фибоначчи | Напишите функцию TypeScript для эффективного вычисления последовательности Фибоначчи. Обильно комментируйте код, чтобы объяснить, что делает каждый элемент и почему он написан именно так |
| Резюмируйте заметки о встрече | Резюмируйте заметки о встрече в одном абзаце. Затем напишите в формате markdown список докладчиков и каждого из их ключевых моментов. Наконец, перечислите следующие шаги или пункты действий, предложенные докладчиками, если таковые имеются |
Тактика: Попросите модель принять персону
Системное сообщение можно использовать для указания персоны, которую модель использует в своих ответах.
| СИСТЕМА | Когда я попрошу помочь мне что-то написать, вы ответите документом, в котором в каждом абзаце будет как минимум одна шутка или шутливый комментарий. |
| ПОЛЬЗОВАТЕЛЬ | Напишите благодарность моему поставщику стальных болтов за своевременную и оперативную поставку. Это позволило нам выполнить важный заказ. |
Тактика: Используйте разделители для четкого обозначения отдельных частей вводимого текста
Разделители, такие как тройные кавычки, XML-теги, заголовки разделов и т. д., помогут разграничить части текста, которые должны обрабатываться по-разному.
| ПОЛЬЗОВАТЕЛЬ | Обобщите текст, заключенный в тройные кавычки |
| """вставьте текст сюда""" |
| СИСТЕМА | Вам будет предоставлена пара статей (разделенных XML-тегами) на одну и ту же тему. Сначала кратко изложите аргументы каждой статьи. Затем укажите, какая из них лучше и объясните почему. |
| ПОЛЬЗОВАТЕЛЬ | <Статья> вставьте первую статью сюда Статья> |
| <Статья> вставьте сюда вторую статью Статья> |
| СИСТЕМА | Вам будет предоставлен автореферат диссертации и предложенное название для нее. Название диссертации должно дать читателю представление о теме диссертации, но при этом должно привлекать внимание. Если название не соответствует этим критериям, предложите 5 альтернативных вариантов. |
| ПОЛЬЗОВАТЕЛЬ | Аннотация: вставьте аннотацию сюда |
| Название: вставьте название здесь |
Для таких простых задач, как эти, использование разделителей может не повлиять на качество вывода. Однако чем сложнее задача, тем важнее разграничивать детали задачи. Не заставляйте модель работать, чтобы понять, что именно вы от нее требуете.
Тактика: Укажите шаги, необходимые для выполнения задачи
Некоторые задачи лучше всего определять как последовательность шагов. Записывая шаги в явном виде, модели будет легче следовать им.
| СИСТЕМА | Используйте следующие пошаговые инструкции для реагирования на вводимые пользователем данные. |
| Шаг 1. Пользователь предоставит вам текст в тройных кавычках. Резюмируйте этот текст в одном предложении с префиксом "Резюме: ". | |
| Шаг 2 - Переведите резюме из Шага 1 на испанский язык с префиксом "Перевод: ". | |
| ПОЛЬЗОВАТЕЛЬ | "вставьте сюда текст" |
Тактика: Приводить примеры
Предоставление общих инструкций, применимых ко всем примерам, обычно более эффективно, чем демонстрация всех вариантов выполнения задачи на примере, но в некоторых случаях приводить примеры может быть проще. Например, если вы хотите, чтобы модель копировала определенный стиль ответа на запросы пользователя, который сложно описать в явном виде.
Это известно как подсказки «несколькими выстрелами».
| СИСТЕМА | Отвечайте в едином стиле |
| ПОЛЬЗОВАТЕЛЬ | Научите меня терпению |
| АССИСТЕНТ | Река, прорезающая самую глубокую долину, вытекает из скромного источника; самая великая симфония рождается из одной ноты; самый замысловатый гобелен начинается с одинокой нити |
| ПОЛЬЗОВАТЕЛЬ | Расскажите мне об океане |
Тактика: Укажите желаемую длину вывода
Вы можете попросить модель создавать выходные данные заданной длины. Целевая длина вывода может быть задана в виде количества слов, предложений, абзацев, пунктов и т. д. Обратите внимание, что задание модели генерировать определенное количество слов не дает высокой точности. Модель может более надежно генерировать выходные данные с определенным количеством абзацев или пунктов.
| ПОЛЬЗОВАТЕЛЬ | Резюмируйте текст, заключенный в тройные кавычки, примерно в 50 слов |
| """вставьте текст сюда""" | |
| ПОЛЬЗОВАТЕЛЬ | Изложите текст, заключенный в тройные кавычки, в 2 абзацах |
| """вставьте текст сюда""" | |
| ПОЛЬЗОВАТЕЛЬ | Обобщите текст, заключенный в тройные кавычки, в 3 абзаца |
| """вставьте текст сюда""" |
Стратегия: Предоставьте справочный текст
Тактика: поручите модели ответить, используя справочный текст
Если мы можем предоставить модели достоверную информацию, относящуюся к текущему запросу, то мы можем проинструктировать модель использовать предоставленную информацию для составления ответа.
| СИСТЕМА | Для ответов на вопросы используйте предоставленные статьи, заключенные в тройные кавычки. Если ответ не может быть найден в статьях, напишите "Я не нашел ответа" |
| ПОЛЬЗОВАТЕЛЬ | <вставьте статьи, каждая из которых заключена в тройные кавычки> |
| Вопрос: <вставьте вопрос здесь> |
Учитывая, что все модели имеют ограниченное контекстное окно, нам нужен способ динамического поиска информации, относящейся к заданному вопросу. Для реализации эффективного поиска знаний можно использовать вкрапления. Подробнее о том, как это реализовать, читайте в тактике «Использование поиска на основе вкраплений для реализации эффективного поиска знаний».
Тактика: поручите модели отвечать на вопросы, используя цитаты из справочного текста
Если входные данные были дополнены релевантными знаниями, можно запросить, чтобы модель добавляла в свои ответы цитаты, ссылаясь на отрывки из предоставленных документов. Обратите внимание, что ссылки в выходных данных могут быть проверены программно путем сопоставления строк в предоставленных документах.
| СИСТЕМА | Вам будет предоставлен документ, разделенный тройными кавычками, и вопрос. Ваша задача - ответить на вопрос, используя только предоставленный документ, и процитировать отрывок(и) из документа, использованный для ответа на вопрос. Если документ не содержит информации, необходимой для ответа на вопрос, просто напишите: "Недостаточно информации". Если ответ на вопрос дан, он должен быть снабжен ссылкой. Используйте следующий формат для цитирования соответствующих отрывков ({"citation": ...}) |
| ПОЛЬЗОВАТЕЛЬ | """<вставьте здесь документ>""" |
| Вопрос: <вставьте вопрос здесь> |
Стратегия: Разделить сложные задачи на более простые подзадачи
Тактика: Используйте классификацию намерений для определения наиболее релевантных инструкций для запроса пользователя
Для задач, в которых требуется множество независимых наборов инструкций для обработки различных случаев, может быть полезно сначала классифицировать тип запроса и использовать эту классификацию для определения необходимых инструкций. Этого можно достичь путем определения фиксированных категорий и жесткого кодирования инструкций, которые относятся к задачам данной категории. Этот процесс также может быть применен рекурсивно для декомпозиции задачи на последовательность этапов. Преимущество такого подхода заключается в том, что каждый запрос будет содержать только те инструкции, которые необходимы для выполнения следующего этапа задачи, что может привести к снижению количества ошибок по сравнению с использованием одного запроса для выполнения всей задачи. Это также может привести к снижению затрат, поскольку большие запросы требуют больших затрат на выполнение.
Предположим, например, что для приложения по обслуживанию клиентов запросы можно классифицировать следующим образом:
| СИСТЕМА | Вам будут предоставлены запросы на обслуживание клиентов. Классифицируйте каждый запрос на первичную и вторичную категории. Предоставьте результат в формате 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 | |
| АССИСТЕНТ | Решение студента верное |
Но решение ученика на самом деле неверно! Мы можем заставить модель успешно заметить это, попросив ее сначала сгенерировать свое собственное решение.
| СИСТЕМА | Сначала разработайте собственное решение задачи. Затем сравните свое решение с решением ученика и оцените, правильно ли решение ученика или нет. Не решайте, правильно ли решение ученика, пока не решите задачу сами |
| ПОЛЬЗОВАТЕЛЬ | Постановка задачи: Я строю солнечную электростанцию, и мне нужна помощь в решении финансовых вопросов. |
| - Земля стоит 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. |
Тактика: Используйте внутренний монолог или последовательность запросов, чтобы скрыть процесс рассуждений модели
Предыдущая тактика показывает, что иногда важно, чтобы модель подробно рассуждала о проблеме, прежде чем ответить на конкретный вопрос. Для некоторых приложений процесс рассуждений, который модель использует для получения окончательного ответа, было бы неуместно раскрывать пользователю. Например, в обучающих приложениях мы, возможно, захотим поощрять учеников к самостоятельному поиску ответов, но процесс рассуждений модели о решении ученика может раскрыть ответ ученику.
Внутренний монолог — это тактика, которая может быть использована для смягчения этой проблемы. Идея внутреннего монолога заключается в том, чтобы дать модели указание поместить части вывода, которые должны быть скрыты от пользователя, в структурированный формат, облегчающий их разбор. Затем, перед тем как представить вывод пользователю, он разбирается, и только часть вывода становится видимой.
| СИСТЕМА | Выполните следующие шаги, чтобы ответить на вопросы пользователей. |
| Шаг 1. Сначала разработайте собственное решение проблемы. Не полагайтесь на решение студента, так как оно может быть неверным. Заключите все свои наработки для этого шага в тройные кавычки ("""). | |
| Шаг 2. Сравните свое решение с решением ученика и оцените, верно ли решение ученика. Заключите всю свою работу для этого шага в тройные кавычки ("""). | |
| Шаг 3 - Если ученик допустил ошибку, определите, какую подсказку вы могли бы дать ученику, не выдавая ответа. Заключите всю свою работу на этом шаге в тройные кавычки ("""). | |
| Шаг 4 - Если ученик допустил ошибку, дайте ему подсказку из предыдущего шага (вне тройных кавычек). Вместо "Шаг 4 - ..." напишите "Подсказка:". | |
| ПОЛЬЗОВАТЕЛЬ | Постановка проблемы: <вставьте формулировку проблемы>. |
| Решение ученика: <вставьте решение ученика> |
Как вариант, этого можно добиться с помощью последовательности запросов, в которых все результаты, кроме последнего, скрыты от конечного пользователя.
Сначала мы можем попросить модель решить задачу самостоятельно. Поскольку этот начальный запрос не требует решения ученика, его можно опустить. Это дает дополнительное преимущество: нет вероятности, что решение модели будет искажено попыткой студента решить задачу.
| ПОЛЬЗОВАТЕЛЬ | <вставьте формулировку проблемы> |
Далее мы можем заставить модель использовать всю доступную информацию для оценки правильности решения ученика.
| СИСТЕМА | Сравните свое решение с решением студента и оцените, правильно ли решение студента или нет |
| ПОЛЬЗОВАТЕЛЬ | Постановка задачи: """<вставьте постановку задачи>""" |
| Ваше решение: """<вставьте сгенерированное моделью решение>""" | |
| Решение студента: """<вставьте решение студента>""" |
Наконец, мы можем позволить модели использовать свой собственный анализ для построения ответа в лице полезного наставника.
| СИСТЕМА | Вы - репетитор по математике. Если ученик допустил ошибку, предложите ему подсказку так, чтобы не раскрыть ответ. Если ученик не сделал ошибки, просто предложите ему ободряющий комментарий |
| ПОЛЬЗОВАТЕЛЬ | Постановка проблемы: """<вставьте формулировку проблемы>""" |
| Ваше решение: """<вставьте сгенерированное моделью решение>""" | |
| Решение студента: """<вставьте решение студента>""" |
Тактика: спросите модель, не пропустила ли она что-нибудь при предыдущих проходах.
Предположим, что мы используем модель для составления списка выдержек из источника, которые относятся к определенному вопросу. После перечисления каждого отрывка модель должна определить, следует ли ей начать писать другой или остановиться. Если исходный документ большой, то модель может остановиться слишком рано и не успеть перечислить все релевантные выдержки. В этом случае более высокую производительность можно получить, предложив модели выполнять последующие запросы, чтобы найти все отрывки, пропущенные при предыдущем проходе.
| СИСТЕМА | Вам будет предоставлен документ, разграниченный тройными кавычками. Ваша задача - выбрать фрагменты, которые относятся к следующему вопросу: "Какие значительные смены парадигм произошли в истории искусственного интеллекта". |
| Убедитесь, что выдержки содержат весь контекст, необходимый для их интерпретации - другими словами, не извлекайте небольшие фрагменты, в которых отсутствует важный контекст. Предоставьте выходные данные в формате JSON следующим образом: | |
| [{"excerpt": "..."}, | |
| ... | |
| {"excerpt": "..."}] | |
| ПОЛЬЗОВАТЕЛЬ | """<вставьте документ здесь>""" |
| АССИСТЕНТ | [{"excerpt": "модель пишет здесь отрывок"}, |
| ... | |
| {"excerpt": "модель пишет здесь еще один отрывок"}] | |
| ПОЛЬЗОВАТЕЛЬ | Есть ли еще подходящие отрывки? Следите за тем, чтобы отрывки не повторялись. Также убедитесь, что отрывки содержат весь релевантный контекст, необходимый для их интерпретации - другими словами, не извлекайте небольшие фрагменты, в которых отсутствует важный контекст |
Стратегия: Использовать внешние инструменты
Тактика: используйте поиск на основе вкраплений для эффективного извлечения знаний
Модель может использовать внешние источники информации, если они предоставляются ей в качестве входных данных. Это может помочь модели генерировать более обоснованные и актуальные ответы. Например, если пользователь задает вопрос о конкретном фильме, может быть полезно добавить на вход модели высококачественную информацию о фильме (например, актеры, режиссер и т. д.). Вкрапления могут быть использованы для эффективного поиска знаний, так что соответствующая информация может быть добавлена на вход модели динамически во время выполнения.
Встраивание текста — это вектор, который может измерять степень связанности между текстовыми строками. Похожие или релевантные строки будут располагаться ближе друг к другу, чем несвязанные. Этот факт, а также существование быстрых алгоритмов векторного поиска означает, что вкрапления можно использовать для эффективного поиска знаний. В частности, корпус текстов может быть разбит на фрагменты, и каждый фрагмент может быть вложен и сохранен. Затем в него можно вложить заданный запрос и выполнить векторный поиск, чтобы найти вложенные фрагменты текста из корпуса, которые наиболее связаны с запросом (т. е. наиболее близки друг к другу в пространстве вложений).
Примеры реализации можно найти на OpenAI. Пример того, как использовать поиск знаний для минимизации вероятности того, что модель будет придумывать неверные факты, см. в тактике «Приучить модель использовать полученные знания для ответа на запросы».
Тактика: Используйте выполнение кода для выполнения более точных вычислений или вызова внешних API
Нельзя полагаться на то, что языковые модели сами по себе будут точно выполнять арифметические или длительные вычисления. В тех случаях, когда это необходимо, модели можно поручить написать и выполнить код вместо того, чтобы производить собственные вычисления. В частности, модели можно поручить поместить код, предназначенный для выполнения, в определенный формат, например тройной бэкстич. После получения выходных данных код может быть извлечен и запущен. Наконец, если необходимо, вывод механизма выполнения кода (т. е. интерпретатора Python) может быть предоставлен в качестве входных данных модели для следующего запроса.
| СИСТЕМА | Вы можете писать и выполнять код Python, заключая его в тройные обратные знаки, например, ``код идет сюда``. Используйте это для выполнения вычислений |
| ПОЛЬЗОВАТЕЛЬ | Найдите все вещественные корни следующего многочлена: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10 |
Еще один хороший вариант использования выполнения кода — вызов внешних API. Если модель проинструктировать о том, как правильно использовать API, она сможет написать код, использующий его. Модель можно проинструктировать о том, как использовать API, предоставив ей документацию и/или примеры кода, показывающие, как использовать API.
| СИСТЕМА | Вы можете писать и выполнять код Python, заключая его в тройные обратные знаки. Также обратите внимание, что у вас есть доступ к следующему модулю, который поможет пользователям отправлять сообщения своим друзьям: |
| """python | |
| импорт сообщения | |
| message.write(to="Джон", message="Привет, хочешь встретиться после работы?")""" |
ПРЕДУПРЕЖДЕНИЕ: Выполнение кода, созданного моделью, не является безопасным по своей сути, поэтому в любом приложении, которое стремится это сделать, необходимо принимать меры предосторожности. В частности, для ограничения вреда, который может нанести недоверенный код, необходима среда выполнения кода в виде песочницы.
Тактика: Предоставьте модели доступ к определенным функциям
API Chat Completions позволяет передавать в запросах список описаний функций. Это позволяет моделям генерировать аргументы функций в соответствии с предоставленными схемами. Сгенерированные аргументы функций возвращаются API в формате JSON и могут быть использованы для выполнения вызовов функций. Выходные данные, предоставленные вызовами функций, могут быть возвращены в модель в следующем запросе, чтобы замкнуть цикл. Это рекомендуемый способ использования моделей OpenAI для вызова внешних функций. Чтобы узнать больше, смотрите раздел «Вызов функций» в нашем вводном руководстве по созданию текстов и примеры вызовов функций в OpenAI Cookbook.
Стратегия: Систематически тестируйте изменения
Иногда бывает сложно определить, улучшает или ухудшает вашу систему то или иное изменение — например, новая инструкция или новый дизайн. Просмотр нескольких примеров может подсказать, что лучше, но при малом объеме выборки бывает сложно отличить истинное улучшение от случайного везения. Возможно, изменения улучшают производительность на одних входах, но ухудшают на других.
Оценочные процедуры (или «evals») полезны для оптимизации дизайна системы. Хорошие оценки:
- Репрезентативны для реального использования (или, по крайней мере, разнообразны)
- Содержат много тестовых примеров для повышения статистической мощности (см. таблицу ниже для рекомендаций)
- Легко автоматизируются или повторяются
| РАЗНИЦА ДЛЯ ОБНАРУЖЕНИЯ | РАЗМЕР ВЫБОРКИ, НЕОБХОДИМЫЙ ДЛЯ 95% УВЕРЕННОСТИ |
| 30% | ~10 |
| 10% | ~100 |
| 3% | ~1000 |
| 1% | ~10000 |
Оценка результатов может выполняться компьютерами, людьми или смешанно. Компьютеры могут автоматизировать проверки с объективными критериями (например, вопросы с единственным правильным ответом), а также с некоторыми субъективными или нечеткими критериями, в которых результаты модели оцениваются другими запросами модели. 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} |
Вот пример ввода с некачественным ответом, который, тем не менее, не противоречит ответу эксперта:
| СИСТЕМА | <вставьте системное сообщение выше> |
| ПОЛЬЗОВАТЕЛЬ | Вопрос: """Какое событие и в какой день произошло с Нилом Армстронгом? Предположите время по Гринвичу.""" |
| Ответ пользователя: """Разве он не ходил по Луне или что-то в этом роде?""" | |
| Ответ эксперта: """Нил Армстронг наиболее известен тем, что стал первым человеком, который прошел по Луне. Это историческое событие произошло 21 июля 1969 года.""" |
Вот пример ввода с ответом, который прямо противоречит ответу эксперта:
| СИСТЕМА | <вставьте системное сообщение выше> |
| ПОЛЬЗОВАТЕЛЬ | Вопрос: """Какое событие и в какой день произошло с Нилом Армстронгом? Предположите время по Гринвичу.""" |
| Ответ пользователя: """21 июля 1969 года Нил Армстронг стал вторым человеком, побывавшим на Луне, после Базза Олдрина.""" | |
| Ответ эксперта: """Нил Армстронг наиболее известен тем, что стал первым человеком, прогулявшимся по Луне. Это историческое событие произошло 21 июля 1969 года.""" |
Вот пример ввода с правильным ответом, который также содержит немного больше деталей, чем нужно:
| СИСТЕМА | <вставьте системное сообщение выше> |
| ПОЛЬЗОВАТЕЛЬ | Вопрос: """Какое событие и в какой день произошло с Нилом Армстронгом? Предположите время по Гринвичу.""" |
| Ответ пользователя: """Примерно в 02:56 UTC 21 июля 1969 года Нил Армстронг стал первым человеком, ступившим на поверхность Луны, что стало монументальным достижением в истории человечества.""" | |
| Ответ эксперта: """Нил Армстронг наиболее известен тем, что стал первым человеком, ступившим на Луну. Это историческое событие произошло 21 июля 1969 года.""" |