Давайте подключимся к ChatGPT через PHP и посмотрим, что это реально может нам дать. Ниже мы сразу погружаемся в тему. Мы постараемся сделать все максимально понятным и разделим детали от "простого решения задачи".

Для начала вам понадобится аккаунт OpenAI и привязанный к нему способ оплаты. Это необходимо, так как API не является бесплатным, и за его использование взимается небольшая плата (0,002 доллара за 1000 токенов - подробнее об этом позже).
Получение API-ключа OpenAI
Ниже приведены шаги для получения API-ключа OpenAI с экранными снимками. Это страница OpenAI, на которой нужно получить ключ.
- Перейдите на страницу API-ключей.
- Нажмите на "Create new secret key" и дайте ключу любое имя.
- Скопируйте ключ и сохраните его в надежном месте. Все ключи API OpenAI начинаются с "sk-", что означает "секретный ключ".
Получение API-ключа на сервисах, принимающих оплату в рублях
Chad AI

Chat01.ai

Простой PHP-клиент для ChatGPT
Ниже приведена реализация очень простого PHP-клиента, с помощью которого можно подключиться к ChatGPT. Если вы хотите узнать, действительно ли ChatGPT — это один единственный API-эндпоинт, то да, это так.
<?php
class ChatGPTSimpleClient {
// Получите ваш API-ключ здесь: https://platform.openai.com/account/api-keys
private static $open_ai_key = 'your-openaipt-api-key-goes-here';
private static $open_ai_url = 'https://api.openai.com/v1'; // текущая версия API
/**
* Документация: https://platform.openai.com/docs/api-reference/chat/create
* @param array $messages (каждый элемент должен содержать "role" и "content" — это весь разговор)
* @param int $maxTokens максимальное количество токенов для ответа ChatGPT (1000 — предел для gpt-3.5-turbo)
* @param string $model допустимые варианты: "gpt-3.5-turbo", "gpt-4" и, возможно, "gpt-5" в будущем
* @param int $responseVariants количество вариантов ответа (обычно нам нужно всего один)
* @param float $frequencyPenalty штраф за частоту использования токенов в ответе
* @param int $presencePenalty штраф за использование уже встречавшихся токенов в разговоре
* @param int $temperature по умолчанию 1, от 0 до 2, чем выше значение, тем более случайным будет ответ
* @param string $user если у вас есть уникальные пользователи, можно передать их ID, чтобы предотвратить злоупотребления
*/
public static function chat($messages = [], $maxTokens=2000, $model='gpt-4', $responseVariants=1, $frequencyPenalty=0, $presencePenalty=0, $temperature=1, $user='') {
$message = new stdClass();
$message -> messages = $messages;
$message -> model = $model;
$message -> n = $responseVariants;
$message -> frequency_penalty = $frequencyPenalty;
$message -> presence_penalty = $presencePenalty;
$message -> temperature = $temperature;
if($user) {
$message -> user = $user;
}
$result = self::_sendMessage('/chat/completions', json_encode($message));
return $result;
}
private static function _sendMessage($endpoint, $data = '', $method = 'post') {
$apiEndpoint = self::$open_ai_url.$endpoint;
$curl = curl_init();
if($method == 'post') {
$params = array(
CURLOPT_URL => $apiEndpoint,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 90,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_NOBODY => false,
CURLOPT_HTTPHEADER => array(
"content-type: application/json",
"accept: application/json",
"authorization: Bearer ".self::$open_ai_key
)
);
curl_setopt_array($curl, $params);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
} else if($method == 'get') {
$params = array(
CURLOPT_URL => $apiEndpoint . ($data!=''?('?'.$data):''),
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 90,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_NOBODY => false,
CURLOPT_HTTPHEADER => array(
"content-type: application/json",
"accept: application/json",
"authorization: Bearer ".self::$open_ai_key
)
);
curl_setopt_array($curl, $params);
}
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
if(!is_array($data)) return array();
return $data;
}
}
Пример отправки сообщения в ChatGPT
Далее, пример использования простого клиента:
<?php
include_once('./ChatGPTSimpleClient.php');
$response = ChatGPTSimpleClient::chat([
[
"role" => "system",
"content" => "You help companies add AI to their internal processes."
],
[
"role" => "user",
"content" => "How can AI help my company?"
],
[
"role" => "assistant",
"content" => "AI products such as ChatGPT, are able to act like virtual assistant, and support every employee with useful tips and information."
],
[
"role" => "user",
"content" => "Which common tasks can you help with?"
]
]);
print_r($response);
В этом примере видно, как важно предоставлять контекст для каждого запроса, иначе ответы могут быть бессмысленными. Обратите внимание на ответ от ChatGPT, где он использует всю историю разговора, а не только последний вопрос.
Ответ ChatGPT
Array
(
[id] => chatcmpl-8Gw5NvrwW7rvrT1vop7fWbigvkoFp
[object] => chat.completion
[created] => 1699047221
[model] => gpt-4-0613
[choices] => Array
(
[0] => Array
(
[index] => 0
[message] => Array
(
[role] => assistant
[content] => AI can help automate a wide range of tasks...
)
[finish_reason] => stop
)
)
[usage] => Array
(
[prompt_tokens] => 70
[completion_tokens] => 228
[total_tokens] => 298
)
)
Скорость отклика API ChatGPT
Ожидайте, что API ChatGPT не будет работать очень быстро. Например, этот запрос занял 22 секунды. Хотя производительность улучшается с новыми версиями, время отклика по-прежнему оставляет желать лучшего.
Стоимость запроса
Стоимость запроса составила 0,000596 доллара. Примерно 1678 таких запросов составят 1 доллар.
Токены ChatGPT и их ограничения
Токен ChatGPT — это строка из 4 символов. Теоретически, GPT-4 ограничен 2000 токенами на запрос и ответ, но на практике этот лимит может быть ниже, около 1000.
Объект "conversation" (беседа)
Этот объект представляет собой список вопросов и ответов, где каждый элемент имеет свою роль. Основные роли:
- system: здесь указываются контекст или предварительные условия беседы.
- assistant: это ChatGPT, искусственный интеллект, который помогает пользователю.
- user: конечный пользователь, задающий вопросы.
Обратите внимание, что в приведенном выше примере роль "system" используется для объяснения ChatGPT его текущей задачи — помогать компаниям использовать ИИ. Другие примеры могут быть такими:
- Вы анализируете данные о продажах в компаниях.
- Вы помогаете компаниям достигать маркетинговых целей.
- и т.д.
Далее, "содержимое" каждого элемента беседы представляет собой просто текстовое описание, запрос или ответ.
Вот что важно: объект conversation включает в себя всю беседу в виде цепочки. Он предоставляет ChatGPT полный контекст для использования в следующем ответе. После получения ответа вы, как разработчик, можете добавить его в цепочку и добавить следующий вопрос пользователя в конец, продолжая беседу. По мере продолжения беседы объект conversation будет расти, и ваши последующие вопросы станут более затратными. В конечном итоге, когда объект conversation достигнет определенной длины (около 2к токенов для GPT-4), вы получите ошибку от API.
Самые полезные параметры
Для нас наиболее полезными параметрами для изменения были следующие:
- model: "gpt-3.5-turbo", "gpt-4", и, возможно, в будущем "gpt-5".
- maxTokens: максимальное количество токенов, которое мы хотим получить в ответе от ChatGPT. 2000 токенов позволят LLM быть многословной, а меньшее количество заставит её быть более краткой.
- user: если ваше приложение имеет пользователей, хорошей идеей будет отправлять хэш пользователя сюда — OpenAI может заблокировать злоупотребления API от вашего имени (например, DDOS-атаки или некорректные запросы).
Все остальные параметры можно оставить по умолчанию. Но вы также можете изменять их и наблюдать, как меняется поведение ChatGPT.
Заключение
Этот туториал дает вам все необходимые шаги для подключения PHP к ChatGPT. Если вы дошли до этого места, возможно, вам стоит зарегистрироваться в OpenAI для создания плагинов для экосистемы.