Модели генерации текста OpenAI (часто называемые генеративными предварительно обученными трансформерами или большими языковыми моделями) были обучены пониманию естественного языка, кода и изображений. Модели предоставляют текстовые выводы в ответ на их входные данные. Входы в эти модели также называются "prompts". Разработка prompt фактически является способом "программирования" большой языковой модели, обычно путем предоставления инструкций или некоторых примеров того, как успешно выполнить задачу.
Используя модели генерации текста OpenAI, вы можете создавать приложения для:
- Создания документов
- Написания компьютерного кода
- Ответов на вопросы по базе знаний
- Анализа текстов
- Предоставления программному обеспечению интерфейса на естественном языке
- Обучения в различных предметных областях
- Перевода языков
- Симуляции персонажей для игр
С выпуском gpt-4-vision-preview
теперь вы можете построить системы, которые также обрабатывают и понимают изображения.
Чтобы использовать одну из этих моделей через Справочник API OpenAI, вы отправите запрос, содержащий входные данные и ключ API, и получите ответ, содержащий выходные данные модели. Наши последние модели, gpt-4
и gpt-3.5-turbo
, доступны через конечную точку API завершения чата.
Семейства моделей | Конечная точка API | |
---|---|---|
Более новые модели (2023–) | gpt-4, gpt-4 turbo, gpt-3.5-turbo | https://api.openai.com/v1/chat/completions |
Обновленные устаревшие модели (2023) | gpt-3.5-turbo-instruct, babbage-002, davinci-002 | https://api.openai.com/v1/completions |
Модели чата принимают список сообщений на входе и возвращают сгенерированное моделью сообщение на выходе. Хотя формат чата разработан для упрощения диалогов, которые состоят из нескольких ходов, он также полезен для задач с однократным обращением без какого-либо разговора.
Пример вызова Chat Completions API выглядит следующим образом:
1curl https://api.openai.com/v1/chat/completions
2 -H "Content-Type: application/json"
3 -H "Authorization: Bearer $OPENAI_API_KEY"
4 -d '{
5 "model": "gpt-3.5-turbo",
6 "messages": [
7 {
8 "role": "system",
9 "content": "You are a helpful assistant."
10 },
11 {
12 "role": "user",
13 "content": "Who won the world series in 2020?"
14 },
15 {
16 "role": "assistant",
17 "content": "The Los Angeles Dodgers won the World Series in 2020."
18 },
19 {
20 "role": "user",
21 "content": "Where was it played?"
22 }
23 ]
24 }'
Чтобы узнать больше, вы можете ознакомиться с полным Справочник API для Chat API.
Основным входным параметром является параметр сообщений. Сообщения должны быть массивом объектов сообщений, где каждый объект имеет роль (либо "system", либо "user", либо "assistant") и содержание. Диалоги могут быть как короткими, из одного сообщения, так и многократными переходами туда-сюда.
Обычно диалог форматируется сначала системным сообщением, за которым следуют чередующиеся сообщения пользователя и ассистента.
Системное сообщение помогает задать поведение ассистента. Например, вы можете изменить личность ассистента или предоставить конкретные инструкции о том, как он должен вести себя в течение диалога. Однако обратите внимание, что системное сообщение не является обязательным, и поведение модели без системного сообщения, скорее всего, будет аналогичным использованию общего сообщения, такого как "Вы - полезный ассистент".
Сообщения пользователя содержат запросы или комментарии для ассистента. Сообщения ассистента хранят предыдущие ответы ассистента, но их также можно написать вами, чтобы дать примеры желаемого поведения.
Включение истории диалога важно, когда инструкции пользователя относятся к предыдущим сообщениям. В приведенном выше примере последний вопрос пользователя "Где это было сыграно?" имеет смысл только в контексте предыдущих сообщений о Всемирной серии 2020 года. Поскольку модели не имеют памяти о прошлых запросах, всю соответствующую информацию необходимо предоставить как часть истории диалога в каждом запросе. Если разговор не укладывается в лимит токенов модели, его потребуется каким-то образом сократить.
Чтобы воспроизвести эффект, наблюдаемый в ChatGPT, где текст возвращается итеративно, установите параметр stream в значение true.
Пример ответа API Chat Completions выглядит следующим образом:
1{
2 "choices": [
3 {
4 "finish_reason": "stop",
5 "index": 0,
6 "message": {
7 "content": "Чемпионат мира 2020 года по бейсболу проходил в Техасе на стадионе Globe Life Field в Арлингтоне.",
8 "role": "assistant"
9 },
10 "logprobs": null
11 }
12 ],
13 "created": 1677664795,
14 "id": "chatcmpl-7QyqpwdfhqwajicIEznoc6Q47XAyW",
15 "model": "gpt-3.5-turbo-0613",
16 "object": "chat.completion",
17 "usage": {
18 "completion_tokens": 17,
19 "prompt_tokens": 57,
20 "total_tokens": 74
21 }
22}
Ответ помощника можно извлечь с помощью:
completion.choices[0].message.content
Каждый ответ будет включать finish_reason
. Возможные значения для finish_reason
:
stop
: API вернул полное сообщение, или сообщение завершено одной из последовательностей остановки, предоставленных через параметр stoplength
: Неполный вывод модели из-за параметраmax_tokens
или лимита токеновfunction_call
: Модель решила вызвать функциюcontent_filter
: Контент пропущен из-за флага наших фильтров содержимогоnull
: Ответ API все еще выполняется или неполный
В зависимости от входных параметров, ответ модели может включать различную информацию.
Обычный способ использования Chat Completions - указать модели всегда возвращать объект JSON, который имеет смысл для вашего случая использования, определив это в системном сообщении. Хотя это работает в некоторых случаях, иногда модели могут генерировать вывод, который не преобразуется в допустимые объекты JSON.
Для предотвращения этих ошибок и улучшения производительности модели, при вызове gpt-4-1106-preview
или gpt-3.5-turbo-1106
, вы можете установить response_format в { "type": "json_object" }
, чтобы включить режим JSON. Когда режим JSON включен, модель ограничена генерацией только строк, которые преобразуются в допустимые объекты JSON.
Важные заметки:
- При использовании режима JSON всегда инструктируйте модель генерировать JSON через какое-либо сообщение в разговоре, например, через ваше системное сообщение. Если вы не включите явную инструкцию для генерации JSON, модель может генерировать нескончаемый поток пробелов, и запрос может продолжаться до тех пор, пока не будет достигнут лимит токенов. Чтобы помочь вам не забыть, API выдаст ошибку, если строка
"JSON"
не появится где-то в контексте. - JSON в сообщении, которое возвращает модель, может быть частичным (т.е. обрезанным), если
finish_reason
указано какlength
, что означает, что генерация превысилаmax_tokens
или разговор превысил лимит токенов. Чтобы защититься от этого, проверяйтеfinish_reason
перед обработкой ответа. - Режим JSON не гарантирует, что вывод соответствует какой-либо конкретной схеме, только то, что он действителен и анализируется без ошибок.
1curl https://api.openai.com/v1/chat/completions
2 -H "Content-Type: application/json"
3 -H "Authorization: Bearer $OPENAI_API_KEY"
4 -d '{
5 "model": "gpt-3.5-turbo-1106",
6 "response_format": { "type": "json_object" },
7 "messages": [
8 {
9 "role": "system",
10 "content": "You are a helpful assistant designed to output JSON."
11 },
12 {
13 "role": "user",
14 "content": "Who won the world series in 2020?"
15 }
16 ]
17 }'
В этом примере ответ включает объект JSON, который выглядит примерно следующим образом:
"content": "{\"winner\": \"Los Angeles Dodgers\"}"
Обратите внимание, что режим JSON всегда включен, когда модель генерирует аргументы как часть вызова функции.
По умолчанию ответы Chat Completions недетерминированы (это означает, что результаты модели могут отличаться от запроса к запросу). Тем не менее, мы предлагаем некоторый контроль над детерминированными результатами, предоставляя вам доступ к параметру seed и полю ответа system_fingerprint.
Чтобы получать (в основном) детерминированные результаты в разных вызовах API, вы можете:
- Установить параметр seed на любое целое число на ваш выбор и использовать то же значение для запросов, для которых вы хотите получить детерминированные результаты.
- Убедиться, что все другие параметры (например,
prompt
илиtemperature
) точно такие же во всех запросах.
Иногда детерминизм может быть затронут из-за необходимых изменений в конфигурации модели с нашей стороны. Чтобы помочь вам отслеживать эти изменения, мы предоставляем поле system_fingerprint. Если это значение отличается, вы можете увидеть разные результаты из-за изменений, которые мы внесли в наши системы.
Языковые модели читают и пишут текст блоками, называемыми токенами. В английском языке токен может быть коротким как один символ или длинным как одно слово (например, a
или apple
), и в некоторых языках токены могут быть еще короче одного символа или даже длиннее одного слова.
Например, строка "ChatGPT is great!"
кодируется в шесть токенов: ["Chat", "G", "PT", " is", " great", "!"]
.
Общее количество токенов в вызове API влияет на:
- Сколько стоит ваш вызов API, так как вы платите за токен
- Сколько времени занимает ваш вызов API, так как написание большего количества токенов требует больше времени
- Будет ли ваш вызов API работать вообще, так как общее количество токенов должно быть ниже максимального предела модели (4097 токенов для
gpt-3.5-turbo
)
Как входные, так и выходные токены учитываются в этих количествах. Например, если ваш вызов API использовал 10 токенов во входящем сообщении и вы получили 20 токенов в исходящем сообщении, вам будет выставлен счет на 30 токенов. Однако стоит заметить, что для некоторых моделей цена за токен отличается для токенов на входе и на выходе.
Чтобы узнать, сколько токенов используется в вызове API, проверьте поле usage
в ответе API (например, response['usage']['total_tokens']
).
Модели для чата, такие как gpt-3.5-turbo
и gpt-4
, используют токены так же, как и модели, доступные в API выполнений, но из-за их формата сообщений сложнее подсчитать, сколько токенов будет использовано в разговоре.
Чтобы увидеть, сколько токенов в строке текста, не делая вызова API, используйте библиотеку Python tiktoken от OpenAI.
Каждое сообщение, переданное в API, потребляет количество токенов в содержании, роли и других полях, плюс несколько лишних для форматирования за кулисами. Это может немного измениться в будущем.
Если разговор содержит слишком много токенов, чтобы уместиться в максимальный лимит модели (например, более 4097 токенов для gpt-3.5-turbo), вам придется усекать, опускать или иным образом уменьшать ваш текст, пока он не поместится. Имейте в виду, что если сообщение удаляется из входных данных сообщений, модель потеряет о нем всякое знание.
Обратите внимание, что в очень длинных разговорах ответы скорее всего будут неполными. Например, разговор в gpt-3.5-turbo, который состоит из 4090 токенов, будет обрезан после всего лишь 6 токенов.
Штрафы за частоту и присутствие, которые можно найти в Chat Completions API, могут быть использованы для снижения вероятности повторения одинаковых последовательностей токенов.
Разумные значения для коэффициентов штрафа колеблются от 0.1 до 1, если цель состоит в том, чтобы лишь немного уменьшить повторения. Если цель состоит в том, чтобы сильно подавить повторение, то можно увеличить коэффициенты до 2, но это может заметно снизить качество выборок. Отрицательные значения могут быть использованы для увеличения вероятности повторения.
Параметр logprobs, найденный в Chat Completions API, когда запрашивается, предоставляет логарифмические вероятности каждого выходного токена и ограниченное количество наиболее вероятных токенов на каждой позиции токена вместе с их логарифмическими вероятностями. Это может быть полезно в некоторых случаях для оценки уверенности модели в ее выводе или для изучения альтернативных ответов, которые модель могла бы дать.
Конечная точка Completions API получила свое последнее обновление в июле 2023 года и имеет другой интерфейс, чем новая конечная точка chat completions. Вместо того чтобы ввод был списком сообщений, вводом является свободная текстовая строка, называемая prompt
.
Пример вызова старого Completions API выглядит следующим образом:
1from openai import OpenAI
2client = OpenAI()
3
4response = client.completions.create(
5 model="gpt-3.5-turbo-instruct",
6 prompt="Write a tagline for an ice cream shop."
7)
Смотрите полный Справочник API, чтобы узнать больше.
Конечная точка completions также поддерживает вставку текста, предоставляя suffix в дополнение к стандартному prompt, который рассматривается как префикс. Эта потребность естественным образом возникает при написании длинных текстов, переходе между абзацами, следовании каркасу или направлении модели к завершению. Это также работает с кодом и может быть использовано для вставки в середину функции или файла.
Пример ответа API на завершения выглядит следующим образом:
1{
2 "choices": [
3 {
4 "finish_reason": "length",
5 "index": 0,
6 "logprobs": null,
7 "text": "Let Your Sweet Tooth Run Wild at Our Creamy Ice Cream Shack"
8 }
9 ],
10 "created": 1683130927,
11 "id": "cmpl-7C9Wxi9Du4j1lQjdjhxBlO22M61LD",
12 "model": "gpt-3.5-turbo-instruct",
13 "object": "text_completion",
14 "usage": {
15 "completion_tokens": 16,
16 "prompt_tokens": 10,
17 "total_tokens": 26
18 }
19}
В Python, результат может быть извлечен с response['choices'][0]['text']
.
Формат ответа аналогичен формату ответа API Chat Completions.
Формат Chat Completions можно сделать аналогичным формату completions, создав запрос с использованием одного сообщения пользователя. Например, можно перевести с английского на французский с использованием следующего завершающего prompt:
Translate the following English text to French: "{text}"
И эквивалентный чатовый prompt будет выглядеть следующим образом:
[{"role": "user", "content": 'Translate the following English text to French: "{text}"'}]
Разница между этими API заключается в базовых моделях, которые доступны в каждом из них. API завершения диалогов - это интерфейс к нашей наиболее мощной модели (gpt-4
) и нашей наиболее экономичной модели (gpt-3.5-turbo
).
Мы, в общем, рекомендуем использовать либо gpt-4
, либо gpt-3.5-turbo
. Выбор зависит от сложности задач, для которых вы используете модели. gpt-4
в целом показывает лучшие результаты в широком спектре оценок. В частности, gpt-4
лучше справляется с точным следованием сложным инструкциям. В то время как gpt-3.5-turbo
скорее всего будет следовать только одной части из сложной многочастной инструкции. gpt-4
менее склонен, чем gpt-3.5-turbo
, к выдумыванию информации, поведение, известное как "галлюцинация". gpt-4
также имеет большее окно контекста с максимальным размером в 8,192 токена по сравнению с 4,096 токенами для gpt-3.5-turbo
. Тем не менее, gpt-3.5-turbo
возвращает результаты с меньшей задержкой и стоит гораздо меньше за токен.
Осведомленность о лучших практиках работы с моделями OpenAI может значительно улучшить производительность приложения. Режимы сбоя, которые каждая модель может показать, и способы работы с этими сбоями или их исправления не всегда интуитивно понятны. Существует целое направление, связанное с работой с языковыми моделями, которое стало известно как "prompt engineering", но по мере развития этой области ее область применения выросла за пределы простого инжиниринга prompt в инжиниринг систем, использующих запросы модели в качестве компонентов. Чтобы узнать больше, прочитайте наш руководство по prompt engineering, которое охватывает методы улучшения рассуждений модели, уменьшения вероятности галлюцинаций модели и многое другое.
Более низкие значения температуры приводят к более последовательным результатам (например, 0.2), в то время как более высокие значения генерируют более разнообразные и творческие результаты (например, 1.0). Выберите значение температуры исходя из желаемого компромисса между согласованностью и творчеством для вашего конкретного применения. Диапазон температуры — от 0 до 2.