В этой главе
• Установка библиотеки OpenAI.
• Вызов моделей GPT с помощью Python.
• Параметры конфигурации.
В предыдущей главе мы работали с моделями GPT через веб-интерфейс компании OpenAI. Такой способ эффективен, если мы просто пытаемся вести диалог с чат-ботом или классифицировать и кратко излагать содержание отдельных отзывов. Однако представьте, что требуется классифицировать сотни отзывов. В этом случае использовать веб-интерфейс вручную для каждого отзыва очень трудоемко (мягко говоря).
Кроме того, возможно, нам потребуется применить языковую модель в сочетании с другими инструментами. Например, нужно будет с помощью модели GPT перевести вопросы в формальные запросы, а затем беспрепятственно запустить их выполнение в соответствующем инструменте (чтобы не копировать вручную запросы из одного интерфейса в другой). Для всех подобных сценариев нам потребуется другой интерфейс.
В этой главе мы обсудим библиотеку для Python от компании OpenAI, позволяющую вызывать языковые модели OpenAI напрямую из кода Python. Благодаря этому вызовы языковых моделей можно интегрировать в свой код как подфункцию. Мы будем работать с этой библиотекой в большинстве глав книги. Поэтому рекомендую прочесть эту главу (хотя бы бегло), прежде чем переходить к следующим.
Глава посвящена библиотеке для Python от OpenAI, но библиотеки, предлагаемые другими поставщиками языковых моделей (такими как Anthropic, Cohere и Google), схожи с ней.
Сначала вам нужно убедиться, что у вас есть среда, подходящая для работы с библиотекой Python от компании OpenAI. Мы будем использовать язык программирования Python, поэтому убедитесь, что он установлен. Для этого откройте терминал и введите следующую команду (она должна работать в терминалах Linux, macOS и Windows):
python --version
Если после ввода команды появится сообщение об ошибке, то попробуйте заменить в ней python на python3 и запустить снова. Если Python в вашей системе установлен, то в ответе должен отобразиться номер версии (например, Python 3.10.13). В противном случае будет выведено сообщение об ошибке. Для следующих примеров вам потребуется как минимум версия Python 3.9 (или более поздняя). Если Python не установлен в вашей системе или его версия ниже требуемой, то перейдите на сайт www.python.org, нажмите кнопку Downloads (Скачивания) и следуйте инструкциям по установке Python. Возможно, вы также захотите установить интегрированную среду разработки (integrated development environment, IDE). PyDev (www.pydev.org) и PyCharm (www.jetbrains.com/pycharm) — две из множества IDE, доступных для Python.
Наряду с самим языком Python вам понадобится pip — система управления пакетами, используемая для установки пакетов Python (библиотека OpenAI поставляется в форме такого пакета). В последних версиях языка (которые вам в любом случае понадобятся) эта программа установлена по умолчанию. Тем не менее не помешает убедиться:
pip --version
Опять же, если все установлено правильно, должен отобразиться номер версии. Давайте убедимся, что система pip обновлена. Следующая команда должна работать в операционных системах Linux, macOS и Windows:
python -m pip install--upgrade pip
Вот и все! Ваша система готова к установке клиента OpenAI для Python.
Что делать, если что-то из вышеописанного не работает
Не паникуйте! Если какое-либо из перечисленных действий завершится неудачей, то, скорее всего, вам не удастся выполнить рассматриваемый далее код на своем локальном компьютере. Но если у вас есть доступ в Интернет, то вы можете использовать облачную платформу. Например, платформа Google Colab, доступная по адресу https://colab.research.google.com, позволяет создавать блокноты, в которых выполняются все примеры кода, которые будут приводиться ниже. На рис. 3.1 показан интерфейс после создания ячейки, устанавливающей библиотеку OpenAI (верхняя ячейка), и начала соответствующей программы на языке Python (нижняя ячейка). Установку и использование библиотеки мы обсудим в следующих разделах.

Рис. 3.1. Для запуска следующих примеров можно использовать платформу Google Colab
Пора начинать профессионально работать с GPT! Веб-интерфейс модели ChatGPT, который был представлен в главе 2, полезен для ведения диалогов и тестирования новых запросов, однако непригоден для реализации сложных конвейеров обработки данных. Для этой цели гораздо лучше подходит библиотека Python от OpenAI, поскольку позволяет вызывать языковые модели напрямую из кода Python. Сначала установим эту библиотеку. Введите в терминале следующую команду:
pip install openai==1.29
Можно ли использовать другую версию библиотеки
Полагаю, вы заметили ссылку на конкретную версию (1.29) библиотеки от OpenAI. Код, представленный в текущей и следующих главах, был протестирован в этой версии. В разных версиях библиотеки синтаксис немного различается, так что если вы не хотите адаптировать код, то установите именно эту версию.
При каждом использовании библиотеки OpenAI требуется предоставлять ключ, дающий доступ к моделям OpenAI (это необходимо для выставления счетов). Если вы еще не создали учетную запись OpenAI, то перейдите по адресу https://platform.openai.com, нажмите кнопку Sign Up (Зарегистрироваться) и следуйте инструкциям. Если у вас есть учетная запись, но вы в данный момент не вошли в систему, то введите свои учетные данные. Обязательно добавьте способ оплаты в разделе Billing (Платежи) и пополните счет несколькими долларами. Теперь самое время сгенерировать секретный ключ, если вы еще этого не сделали.
Перейдите по адресу https://platform.openai.com/account/api-keys. Должен отобразиться сайт, показанный на рис. 3.2.

Рис. 3.2. Управление секретными ключами для доступа к учетной записи API OpenAI
Нажмите кнопку Create New Secret Key (Создать новый секретный ключ). В интерфейсе появится текстовая строка, представляющая собой ключ. Обязательно скопируйте и сохраните его! После закрытия этого окна вы не сможете повторно получить полный ключ.
Всякий раз при использовании библиотеки Python необходимо предоставлять секретный ключ, чтобы связать запросы с соответствующей учетной записью. Самый простой способ сделать это — сохранить секретный ключ в переменной окружения OPENAI_API_KEY. При наличии такой переменной OpenAI автоматически извлечет из нее ключ. Конкретная команда, используемая для установки переменных окружения, зависит от операционной системы. Например, следующая команда работает в операционных системах Linux и macOS (вместо трех точек укажите свой ключ):
export OPENAI_API_KEY=...
Другой способ — задавать ключ для каждого вызова, присваивая соответствующие значения переменной перед вызовами Python. Например, используйте такую команду, чтобы вызвать листинг кода, представленный в следующем разделе, одновременно задавая ключ (опять же, укажите вместо трех точек свой ключ):
OPENAI_API_KEY=... python listing1.py
Наконец, если никакой другой вариант на сработает, можно указать ключ доступа напрямую в коде Python. Точнее, сразу после импорта библиотеки Python от компании OpenAI можно передать ключ доступа к API как параметр при создании объекта клиента (который мы подробно обсудим позже):
import openai
client = openai.OpenAI(api_key='...')
Как и раньше, вместо трех точек укажите свой ключ доступа OpenAI. В приведенных ниже примерах кода предполагается, что ключ доступа указан в переменной окружения, поэтому в них этот параметр опущен. Если переменные окружения у вас не работают, то измените коды, передав ключ доступа как параметр.
ПРЕДУПРЕЖДЕНИЕ Никогда не публикуйте свой код, если он содержит ключ доступа OpenAI. Помимо прочего, наличие вашего ключа позволит другим вызывать модели OpenAI, а вам придется за это платить.
Итак, вы указали ключ доступа тем или иным способом. Теперь мы готовы начать вызывать модели GPT с помощью библиотеки OpenAI для Python.
Обратимся к библиотеке Python для получения списка доступных моделей OpenAI. В листинге 3.1 показан соответствующий код на Python. (Этот код и все последующие доступны по ссылкам, размещенным на сайте книги, в разделе дополнительных материалов.)
Листинг 3.1. Список доступных моделей OpenAI

Сначала импортируем библиотеку OpenAI ❶. Затем создадим объект клиента, позволяющий обращаться к функциям библиотеки ❷. Далее запросим все доступные модели OpenAI ❸ и выведем результат ❹, который должен быть похож на приведенный ниже:

Каждая модель имеет идентификатор (ID) (например, GPT-4o ❶). Мы будем использовать его, чтобы указывать OpenAI, какую модель использовать для обработки наших запросов. Помимо идентификатора, каждая модель содержит временную метку создания и информацию о владельце модели (поле owned_by). В большинстве случаев модели принадлежат компании OpenAI (помечены, например, как system или openai-internal). Однако иногда модели принадлежат trummerlab ❷ — это имя учетной записи, которую использует автор этой книги. Такие модели не являются общедоступными, они принадлежат владельцу учетной записи. Вы не увидите их, если будете выполнять код с использованием своей записи. Они создаются из общедоступных базовых моделей в ходе процесса, называемого дообучением.
Что такое дообучение, или тонкая настройка (fine-tuning)
По умолчанию языковые модели, такие как GPT-4o, обучаются быть универсальными, то есть способными выполнять любую задачу (теоретически). Но иногда нам нужна не универсальная модель, а та, которая будет очень хорошо справляться с одной конкретной задачей. Дообучение позволяет специально настроить модель для решения интересующей нас задачи. Более подробно дообучение мы обсудим в главе 9.
Почти везде в нашем коде используется одна и та же функция библиотеки Python от OpenAI: генерация ответов в диалоге, или диалоговый режим (chat completion). При этом модель генерирует ответ на основе предыдущего диалога. Входные данные могут быть различных типов, например текстом и изображениями. Мы используем эти возможности в следующих главах, но пока ограничимся текстом. Генерация ответов в диалоге выполняется и в фоновом режиме веб-интерфейса ChatGPT от OpenAI. При использовании в качестве входных данных истории диалога (в которую входит последнее сообщение, а также предыдущие, возможно содержащие релевантный контекст) модель генерирует наиболее подходящий ответ.
Чтобы использовать возможность генерации ответов в диалоге из кода Python, сначала вам потребуется формат для описания истории чата. Это часть входных данных, предоставляемых для общения с моделью. В библиотеке Python от OpenAI чаты представлены в виде списка сообщений. Каждое из них, в свою очередь, представлено в виде словаря Python, который задает значения для нескольких важных свойств сообщения. Для каждого сообщения необходимо указать как минимум два важных атрибута:
• role, определяющий источник сообщения;
• content, содержащий текст сообщения.
Начнем с обсуждения атрибута role. Как вы знаете из предыдущей главы, чат с моделями GPT — это обмен множественными сообщениями между пользователем и моделью. Соответственно, мы можем указать значение user для атрибута role, чтобы идентифицировать сообщение как написанное пользователем. Как вариант, можно указать значение assistant, чтобы пометить сообщение как сгенерированное языковой моделью. Третье возможное значение для атрибута role — system. Такие сообщения обычно используются в начале истории чата. Они предназначены для передачи общих указаний модели, независимо от конкретных задач, поставленных пользователями. Например, типичное системное сообщение может иметь содержание «Ты полезный помощник», но возможны и более специализированные варианты (например, «Ты — помощник, который переводит вопросы о наборах данных в SQL-запросы»). В этой книге системные сообщения не используются, но вы можете поэкспериментировать и добавить собственные системные сообщения, чтобы выяснить, повлияют ли они на вывод модели.
Атрибут content указывает содержание сообщения. В этой главе мы ограничимся текстовым содержанием, а в следующих обсудим, как использовать языковые модели для обработки более разнообразных типов контента. В приведенных ниже примерах кода нужно будет указать в истории чата только одно сообщение. Оно содержит инструкции, описывающие задачу, которую должна решить языковая модель, а также релевантную контекстную информацию. Например, вот такая история чата побуждает модель сочинить для нас историю:

В списке сообщений содержится только одно сообщение. Оно помечено как исходящее от пользователя ❶, и в его содержании описывается упомянутая ранее задача ❷. В ответ мы ожидаем, что модель сгенерирует историю, следуя инструкциям.
Как вызвать модель для генерации ответов в диалоге? Для этого можно использовать всего несколько строк кода на Python. Прежде всего необходимо импортировать библиотеку Python от OpenAI ❶ и создать объект клиента ❷:

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

С помощью функции client.chat.completions.create создадим новый запрос. Параметр model ❶ содержит название модели, которую необходимо использовать для диалога. В нашем случае мы выбираем модель GPT-4o компании OpenAI, способную обрабатывать мультимодальные данные. Мы будем использовать ее для большинства примеров кода в книге. Далее в качестве входных данных укажем историю чата, добавив параметр messages ❷. Это уже обсуждавшаяся ранее история чата, которая дает модели указание сочинить историю.
Теперь объединим все вместе. В листинге 3.2 модель GPT-4o используется для создания истории. (Файл с кодом доступен по ссылке Listing 2, которую можно найти на сайте книги, в разделе дополнительных материалов к этой главе.)
Листинг 3.2. Использование модели GPT-4o для генерации ответов в диалоге

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

Обсудим компоненты результата. Начнем с того, что у нас есть список альтернативных вариантов ответа ❶ (объекты Choice). В нашем случае в списке пока только одна запись. Такое поведение задано по умолчанию, хотя мы можем запросить несколько альтернативных вариантов, установив соответствующие параметры конфигурации (обсуждаются в следующем разделе). Параметр finish_reason ❷ указывает для каждого ответа условие остановки генерации ответа. Например, это может быть достижение лимита длины генерируемого текста. Значение stop указывает, что языковая модель смогла сгенерировать вывод полностью (а не достигла лимита длины). Фактическое содержание сообщения ❸ сокращено, и, скорее всего, вызвав код повторно, вы получите другую историю.
Помимо самих ответов, результат содержит метаданные и статистику использования ❹. Точнее, мы находим значения для следующих свойств:
• completion_tokens — количество сгенерированных токенов;
• prompt_tokens — количество токенов во входных данных;
• total_tokens — количество прочитанных и сгенерированных токенов.
Почему нужно учитывать количество токенов? Потому что в тарифах большинства моделей OpenAI учитывается количество прочитанных и сгенерированных токенов. Например, на момент написания книги использование модели GPT-4o стоило 5 долларов за миллион прочитанных токенов и 15 — за миллион сгенерированных. Обратите внимание на разницу в цене. Обычно, как в нашем случае, генерация токенов обходится дороже, чем их чтение. Цена зависит не только от количества токенов, но и от используемой модели. Например, замена модели GPT-4o на GPT-3.5 Turbo (чуть менее мощную версию GPT) снижает затраты в десять раз. Прежде чем анализировать большие объемы данных с помощью языковых моделей, выберите размер модели, подходящий под вашу задачу и кошелек.
Влиять на то, как модель отвечает на ваши входные данные, можно с помощью разных параметров. Их можно указать в дополнение к параметрам model и messages при вызове функции chat.completions.create. В этом разделе мы обсудим различные категории параметров, классифицируя их в зависимости от того, на что именно в поведении модели они влияют.
При вызове в диалоговом режиме модель продолжит генерировать вывод до тех пор, пока не будет выполнено условие остановки. Управлять моментом остановки генерации текста позволяют два параметра: max_tokens и stop.
Параметр max_tokens указывает максимальное количество токенов (то есть атомарных единиц, с помощью которых языковые модели представляют текст), генерируемых во время диалога. Токен соответствует примерно четырем символам, а в абзаце, как правило, содержится около 100 токенов. Максимально допустимое значение для этого параметра определяется используемой моделью. Например, ada, одна из самых маленьких версий модели GPT, позволяет использовать до 2049 токенов, а GPT-4o поддерживает до 128 000. Имейте в виду, что в максимальное количество токенов, поддерживаемое моделью, входят как прочитанные, так и сгенерированные токены. Параметр max_tokens относится только к количеству сгенерированных токенов, поэтому не следует задавать его значение выше, чем максимальное количество токенов, поддерживаемое используемой моделью, минус количество токенов в промпте.
Как правило, почти всегда рекомендуется задавать для параметра max_tokens разумное значение. В конце концов, мы платим за каждый сгенерированный токен, и установка ограничения на их количество позволяет контролировать расходы на один вызов модели.
В некоторых сценариях определенные шаблонные выражения обозначают конец желаемого вывода. Например, при генерации кода это может быть строка, характерная для соответствующего языка программирования и указывающая на конец программы. С другой стороны, если модель сочиняет историю, это может быть строка «и жили они долго и счастливо!». В таких сценариях можно использовать параметр stop, чтобы настроить библиотеку OpenAI на прекращение генерации вывода всякий раз при появлении определенной последовательности токенов. В некоторых случаях только одна последовательность токенов указывает на остановку. В таких сценариях можно напрямую присвоить параметру stop соответствующее строковое значение. В других сценариях есть несколько последовательностей, потенциально указывающих на остановку. Тогда параметру stop можно задать список, содержащий до четырех последовательностей. Генерация текста будет прекращаться при появлении любой из них.
Обратите внимание: параметры max_tokens и stop можно использовать вместе. В таких случаях генерация вывода будет прекращаться при достижении лимита длины или появлении одной из стоп-последовательностей (в зависимости от того, что произойдет раньше).
Параметры, которые мы обсуждали в предыдущем подразделе, позволяют выбирать условие остановки вывода. Но как повлиять на результаты вывода, генерируемые до самого момента остановки? Компания OpenAI предоставляет несколько параметров, с помощью которых можно смещать вероятности выбора токенов при генерации текста моделями GPT.
Некоторые параметры позволяют влиять на то, насколько «повторяющимся» должен быть генерируемый вывод. Точнее, с помощью этих параметров можно указать, желательно ли многократное повторение одних и тех же токенов.
Параметр presence_penalty позволяет вам штрафовать модель за повторное использование в сгенерированном ответе одних и тех же токенов. Штраф может принимать значения в диапазоне от –2 до +2 (со значением по умолчанию 0). Положительное значение штрафа побуждает модель избегать повторного использования одних и тех же токенов. При отрицательном значении модель, напротив, стремится многократно их использовать. Чем выше абсолютное значение, тем сильнее соответствующий эффект.
Параметр frequency_penalty связан с предыдущим параметром, но позволяет использовать более детализированную схему штрафов. Параметр presence_penalty учитывает сам факт наличия токена. То есть нет разницы, сколько раз повторяется токен: дважды или сотни раз. Штраф за частоту использования принимается как коэффициент, умножающий количество предыдущих появлений токена при суммировании его оценки (которая определяет, должен ли токен появиться следующим). Следовательно, чем чаще токен использовался ранее, тем меньше вероятность, что он появится снова. Как и у параметра presence_penalty, значения параметра frequency_penalty варьируются в диапазоне от –2 до +2 с заданным по умолчанию значением 0. Положительное значение штрафа побуждает модель GPT избегать повторения одного и того же токена, тогда как отрицательное значение способствует его повторам.
Иногда нас интересует только один элемент из ограниченного набора допустимых токенов. Например, при классификации текста набор классов обычно определяется заранее. Если так, то сообщим об этом модели! Параметр logit_bias позволяет сопоставлять идентификаторы токенов с коэффициентом смещения. Высокий коэффициент смещения побуждает модель рассматривать соответствующий токен как вывод. Если установить достаточно низкое смещение, то модель практически перестанет использовать такой токен. Достаточно высокий показатель практически гарантирует, что соответствующий токен появится в выводе.
Использование параметра logit_bias позволяет избежать генерации бесполезных результатов вывода в ситуациях, когда можно сузить набор логично применяемых токенов. Значение этого параметра представляет собой словарь Python, который сопоставляет идентификаторы токенов со значениями в диапазоне от –100 до +100. Более типичны значения в интервале от –1 до +1, которые позволяют модели учитывать токены с низким весом (или избегать токенов с высокими значениями). Но как найти идентификаторы токенов, связанные с релевантными словами? Для этого можно воспользоваться инструментом токенизатора GPT, который доступен по адресу https://platform.openai.com/tokenizer?view=bpe. Просто введите слова, использование которых хотите поощрить (или запретить), — и отобразятся связанные с ними идентификаторы токенов. Обратите внимание, что доступно несколько вариантов токенизатора для разных моделей. Выберите подходящий для своей модели (иначе идентификаторы токенов могут быть некорректными).
Как модели GPT выбирают следующий выходной токен? Если говорить упрощенно, то мы вычисляем оценки для всех возможных выходных токенов, а затем на основе этих оценок выбираем токен. У токенов с более высокими оценками, как правило, больше шансов быть выбранными, однако нам не всегда требуется токен с максимальной оценкой. Например, вспомните, как в главе 2 можно было заново генерировать ответы на одни и те же входные данные, что потенциально приводило к разным результатам. Это полезно, когда первый вывод не совсем удовлетворяет нашим требованиям. Если всегда выбирать токены с наивысшими оценками, то при повторной генерации ответа вывод вряд ли изменится. Следовательно, чтобы пользователи могли получать разные ответы, необходимо ввести определенную степень рандомизации при преобразовании оценок в токены вывода.
Конечно, в результате слишком сильного отрыва вывода от оценок токенов — то есть чрезмерной рандомизации — вывод может оказаться бесполезным (в крайнем случае не связанным с входными данными и не соответствующим нашим инструкциям). С другой стороны, слишком малая рандомизация может привести к тому, что выводы будут менее разнообразны, чем нам хотелось бы. Пожалуй, чтобы выбрать верную степень рандомизации для конкретного сценария, придется поэкспериментировать. В каждом случае OpenAI предлагает несколько параметров, позволяющих дообучить модель тонкостям преобразования оценок токенов в выходные токены. Давайте обсудим эти параметры.
Один из наиболее часто используемых параметров для настройки рандомизации — temperature. Повышение значений температуры увеличивает степень рандомизации, а понижение — уменьшает ее. При низкой степени рандомизации, скорее всего, будет выбран токен с наивысшей оценкой. При очень высокой степени рандомизации токены выбираются (почти) с равной вероятностью, независимо от оценок, присвоенных моделью. Параметр temperature позволяет найти золотую середину между этими двумя крайностями. Его значения выбираются в диапазоне от 0 до 2, но по умолчанию задано 1.
Температура — один из вариантов выбора степени рандомизации. Альтернативный подход — использовать параметр top_p. (Не рекомендуется в одном вызове языковой модели изменять одновременно параметры temperature и top_p.) По этим оценкам можно рассчитать, какова вероятность того, что тот или иной токен окажется «правильным». Теперь представьте, что мы сортируем токены в порядке убывания вероятности. Можно уменьшить степень рандомизации и сосредоточиться только на первых нескольких токенах, но тогда мы пренебрегаем токенами с меньшей вероятностью. Сколько токенов следует рассматривать? Вместо того чтобы напрямую фиксировать количество допустимых токенов, параметр top_p показывает суммарную вероятность этих токенов. Другими словами, токены добавляются в набор допустимых в порядке убывания их вероятности. Всякий раз, когда сумма значений вероятности всех выбранных токенов (суммарная вероятность) превышает значение top_p, добавление токенов прекращается. В итоге следующий выходной токен выбирается из этих допустимых токенов.
Поскольку параметр top_p описывает вероятность, то его значения берутся из интервала от 0 до 1. Как и в случае с температурой, выбор более высокого значения приводит к большей рандомизации (ведь допустимыми становятся даже токены с меньшей вероятностью).
При наличии ненулевой рандомизации целесообразно запрашивать несколько ответов на один и тот же входной промпт. После этого можно выбрать предпочтительный ответ с помощью последующей обработки. Например, предположим, что мы генерируем несколько SQL-запросов для одного и того же входного промпта. Чтобы выбрать предпочтительный ответ, можно попробовать выполнить их в целевой базе данных и отбросить запросы, которые приводят к сообщению об ошибке синтаксиса. Конечно, можно просто несколько раз вызывать языковую модель, вводя один и тот же промпт. Однако эффективнее вызвать модель один раз и настроить количество генерируемых ответов. Параметр n определяет это количество. По умолчанию данный параметр установлен в значение 1 (то есть генерируется только один ответ). Для получения большего количества ответов можно выбрать большее значение. Обратите внимание: чем выше значение этого параметра, тем дороже обходится вызов модели (ведь вы платите за каждый сгенерированный токен, учитывая токены в разных ответах).
Применим некоторые параметры в коде. В листинге 3.3 мы даем модели GPT-4o задание написать историю, причем на этот раз используем некоторые из описанных выше параметров для настройки диалогового режима.
Сначала, чтобы история не получилась слишком длинной, зададим максимальное количество токенов равным 512 ❶. Этого должно хватить на несколько абзацев текста. Чтобы избежать генерации более длинного контента, чем необходимо, мы также определяем стоп-последовательность: «долго и счастливо» ❷. Мы делаем это в надежде, что любая логичная история, конечно же, закончится популярным выражением «и жили они долго и счастливо». Разумеется, это допущение.
Листинг 3.3. Использование модели GPT-4o для генерации ответов в диалоге с применением пользовательских настроек параметров

Далее мы задаем значение температуры 1.5 ❸, разрешая определенную степень рандомизации. Если в истории будет слишком много повторений, она будет скучной. Поэтому мы устанавливаем положительное значение штрафа за наличие токенов (presence_penalty=0.5) ❹, которое не позволит модели GPT-4o повторно использовать одни и те же токены. Наконец, нам не нужна страшная история (вдруг мы будем читать ее детям), поэтому мы штрафуем за слово «дракон» (получив соответствующий идентификатор токена, как было описано в подразделе 3.5.2) ❺.
Посмотрим на результат! Например, при одном из обращений к модели GPT-4o они сгенерировала такую историю.
Давным-давно в живописной деревушке, затерянной среди холмов и густых лесов, жила девочка по имени Элара. Любознательность и жажда приключений были ее отличительными чертами — они-то и заставляли ее то и дело исследовать самые дальние закоулки деревни. Однажды погожим осенним утром Элара решила отправиться в Шепчущий Лес, место, окутанное тайной и легендами. Жители деревни часто говорили, что в лесу живет магия, и никто не осмеливался заходить дальше окраины. Взяв свою любимую котомку и трепеща от предвкушения, Элара на рассвете отправилась в путь. Чем глубже она заходила в лес, тем сильнее, казалось, становится шелест листьев, словно приветствующих ее, и возникло странное чувство, будто все это ей знакомо. Она пробиралась сквозь заросли и перелезала через упавшие бревна, пока не наткнулась на уединенную рощицу, залитую мерцающим светом. В центре рощи стояло древнее дерево с серебристыми листьями, его ствол перекручивался, подобно струйкам дыма. Элара была очарована; оно не было похоже ни на одно дерево из когда-либо виденных ею. Девочка осторожно приблизилась к нему и заметила маленький, искусно украшенный сундучок, спрятавшийся среди корней. Сердце девочки забилось чаще. Элара открыла сундучок и обнаружила внутри изящный золотой кулон. Как только она его коснулась, лес будто ожил. Шепот стал громче, складываясь в слова, которые она могла понять. «Храброе сердце, ты нашла Кулон Этернии, — прошептал голос. — Он дарует носителю одно желание». В голове у Элары проносились разные возможности, но она знала, чего ее сердце желает больше всего: принести радость и процветание любимой деревне. Сжимая в руке кулон, Элара прошептала желание. В ту же секунду теплое сияние окутало девочку, и она почувствовала прилив энергии. Роща на мгновение замерцала, а затем снова стала безмятежно спокойной. Элара знала, что произошло нечто необычайное. Возвращаясь домой, она заметила небольшие изменения: урожай выглядел более обильным, животные здоровее, а сама деревня словно купалась в атмосфере покоя и довольства. Жители деревни радостно встретили ее возвращение, их лица светились счастьем. Элара никогда никому не раскрывала тайну Шепчущего Леса или Кулона Этернии. Она лишь улыбалась всякий раз, когда кто-то заговаривал о неожиданном процветании деревни. Девочка знала, что иногда величайшая магия заключается не в заметных действиях, а в мужестве следовать зову сердца. С той поры деревушка Элары зажила в довольстве и мире, превратившись в истинный символ радости и благополучия. Все потому, что одна храбрая девочка не побоялась прислушаться к шепоту леса. И она жила
Долго и счастливо! Оказывается, наша стоп-последовательность, выражение «долго и счастливо», действительно использовалась в конце сказки (и поэтому опущена в выводе, который вернула модель GPT-4o). Протестируйте модель на других настройках параметров и посмотрите, как будет меняться результат в зависимости от конфигурации.
Мы обсудили наиболее важные параметры для целей анализа данных. Их все можно указывать при обращении к моделям GPT от OpenAI для генерации ответа в режиме диалога. Однако, помимо упомянутых в главе, существуют и другие параметры. Они подробно описаны в справочной документации по API OpenAI (https://platform.openai.com/docs/api-reference/completions).
• Языковые модели OpenAI можно использовать через Python API. Другие поставщики предлагают похожие библиотеки для доступа к своим моделям.
• Чтобы использовать библиотеку OpenAI, создайте объект клиента.
• Модели OpenAI можно использовать для генерации ответов в режиме диалога. Для этого нужно передать историю переписки в виде списка сообщений.
• Каждое сообщение чата характеризуется содержанием (content) и ролью (role). Варианты ролей: user (пользователь), assistant (ассистент) или system (система).
• Для получения ответов в диалоговом режиме предназначена функция chat.completions.create.
• Модели можно настраивать, используя различные параметры:
• с помощью max_tokens можно ограничить количество генерируемых токенов;
• stop позволяет определять фразы, которые останавливают генерацию текста;
• с помощью logit_bias можно штрафовать или поощрять модель за использование определенных токенов;
• presence_penalty позволяет штрафовать модель за повторение токенов независимо от их частоты;
• с помощью frequency_penalty тоже можно штрафовать модель за повторение токенов, но уже пропорционально их частоте;
• temperature позволяет выбрать степень рандомизации;
• с помощью top_p можно определить количество рассматриваемых токенов вывода;
• n позволяет выбрать количество генерируемых ответов.