Использование ChatGPT в PHP с примерами GPT-4

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

Использование ChatGPT в PHP с примерами GPT-4

Для начала вам понадобится аккаунт OpenAI и привязанный к нему способ оплаты. Это необходимо, так как API не является бесплатным, и за его использование взимается небольшая плата (0,002 доллара за 1000 токенов - подробнее об этом позже).

Получение API-ключа OpenAI

Ниже приведены шаги для получения API-ключа OpenAI с экранными снимками. Это страница OpenAI, на которой нужно получить ключ.

  1. Перейдите на страницу API-ключей.

  2. Нажмите на "Create new secret key" и дайте ключу любое имя.

  3. Скопируйте ключ и сохраните его в надежном месте. Все ключи 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 для создания плагинов для экосистемы.


Теги:  ChatGPT, PHP, API, GPT-4, искусственный интеллект, веб-разработка

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Разработка корпоративного сайта

от 7 дней

от 40 000 рублей

Разработка сайта без системы оплаты заказов через корзину

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Участие в проекте

привлечение в проект на part-time основе

от 20 000 рублей / неделя

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

* сумма фиксированная