ChatGPT набирает все большую популярность, ведь он может помочь человеку или даже заменить его в ряде задач. С ним можно взаимодействовать не только через графический интерфейс, но и по API. Таким образом его можно встраивать в свои системы, чтобы решать практические задачи бизнеса. Сейчас реализую подобный проект. Решил написать статью, где подробно и пошагово описываю, как настроить сервер Linux (Ubuntu) для интеграции по API с данной нейросетью, на примере Python (Flask) и Node.js (Next.js). Опять же, вы можете использовать не Ubuntu, не Flask и не Next.js, просто адаптировав примеры под себя.

В данной статье описано, как развернуть демо проект от OpenAI (описание здесь: Build your application), а затем доработать его, чтобы задавать свои собственные произвольные вопросы, в том числе и на русском. Также в конце статьи скажу немного про параметры API запросов и модели. Все команды и действия будут из консоли.

Статья состоит из следующих разделов:

  1. Предварительная настройка Linux. То есть вы можете взять чистый Linux и настроить только то что нужно для данного проекта.

  2. Проект для Python. Описание того, как развернуть демо проект для Python (Flask). А затем как его доработать для своих запросов.

  3. Проект для Node.js. Соответственно, описание по развертыванию демо проекта уже для Node.js (Next.js). И затем также доработка под произвольные запросы.

  4. Параметры API запросов и моделей. Полезная информация, которая нужна для практического использования ChatGPT, при интеграции с ним по API.

  5. Благодарности тем кто дочитал. Мои контакты, если хотите задать вопрос.

Чтобы начать работать с ChatGPT, нужно зарегистрироваться на сайте OpenAI. При регистрации придет подтверждение по смс. OpenAI не работает в России, поэтому вам понадобится VPN и телефон с номером вне РФ. Цель текущей статью - описать именно процесс подключения по API, поэтому я не буду подробно расписывать, как решить вопрос с регистрацией. Есть много статей, как сделать VPN, можно даже сделать свой (например, см. статью Делаем свой VPN-сервер). С телефоном сложнее. Либо у вас есть возможность зарегистрировать номер в другой стране, или попросить знакомых за границей использовать их номер. В крайнем случае, для тестирования (не промышленной эксплуатации) можно арендовать номер (пример в статье Как получить доступ к ChatGPT в России).

После регистрации, вам нужно зайти в ваш аккаунт и получить OPENAI_API_KEY. Для этого авторизуйтесь на сайте OpenAI, зайдите в раздел меню “View API keys”.

Затем создайте и скопируйте ключ. Ключ выглядит примерно так: 

sk-n0123456789buNKlMOOs1AEnIPQgUuoYeL0s9a1PG8mKe3xN

Также для разворачивания проекта нам нужен сервер (облачный, выделенный, или свой), где мы и будем все делать. При написании данной статьи использовалась версия "Ubuntu 22.04.2 LTS". Взял облачный сервер на Timeweb. Причин две: там можно выбрать сервер в Европе (тем самым исключить проблему необходимости VPN), и за этот сервер можно платить рублями (то есть не нужна иностранная карточка). Я знаю что есть и другие провайдеры, которые предоставляют такие же услуги (если знаете вариант лучше Timeweb, пожалуйста, напишите в комментариях).

Итак, начнем.

Предварительная настройка Linux

Зайдем на сервер (для вашего сервера данный пункт может отличаться).

ssh root@123.444.555.666 -p 22

Обновим все программные пакеты для apt.

apt update && apt upgrade -y

И для apt-get.

apt-get update && apt-get upgrade -y

Настроим веб-сервер Nginx. Проверим, что он установлен (отобразится его версия).

nginx -v

Если он не установлен, то необходимо это сделать.

apt install nginx -y

Проверим, что он работает.

systemctl status nginx

Должно отобразиться: Active: active (running).

Откроем в браузере http://123.444.555.666/ Должно отобразиться:

Проект для Python (Flask)

Если вам нужен Node.js (Next.js), то можете сразу пропустить текущий раздел про Python (Flask).

Проверим, что Python установлен. Отобразиться его версия (у меня 3.10.6).

python3 --version

Если не установлен - сделаем это.

apt install python3 -y

Проверим, что установлен pip.

pip --version

Если не установлен:

apt install python3-pip -y

Установим модуль venv (работа в виртуальной среде).

apt install python3-venv -y

Создадим проект в папке /home. Перейдем в эту папку.

cd /home

Копируем демо проект.

git clone https://github.com/openai/openai-quickstart-python.git

Переходим в папку проекта.

cd openai-quickstart-python

Создаем виртуальную среду.

python -m venv venvopenai

Активируем ее.

. venvopenai/bin/activate

В командной строке отобразиться (venvopenai).

Устанавливаем пакеты.

pip install -r requirements.txt

Создаем файл, куда вставим OPENAI_API_KEY

cp .env.example .env

Открываем его.

nano .env

Внутри него будет:

FLASK_APP=app
FLASK_ENV=development

# Once you add your API key below, make sure to not share it with anyone! The API key should remain private.
OPENAI_API_KEY=

Вставляем OPENAI_API_KEY

FLASK_APP=app
FLASK_ENV=development

# Once you add your API key below, make sure to not share it with anyone! The API key should remain private.
OPENAI_API_KEY=sk-n0123456789buNKlMOOs1AEnIPQgUuoYeL0s9a1PG8mKe3xN

Сохраняем: F2 -> Y -> Enter

Указываем IP и порт для запуска. Открываем файл приложения.

nano app.py

Добавляем в конце файла следующий код:

…

if __name__ == "__main__":
    app.run(host='123.444.555.666', port=5000)

Сохраняем: F2 -> Y -> Enter

Запускаем сервис.

python app.py

Открываем в браузере http://123.444.555.666:5000

Появляется окно демонстрационного проекта:

Суть демо проекта: мы вводим имя животного (на английском) и система предлагает нам варианты героических имен для него.



Останавливаем сервис и выходим из него, нажав в консоле CTRL+C.

Далее рассмотрим, как доработать демо проект, чтобы иметь возможность вводить произвольные вопросы.

Открываем файл с html шаблоном.

nano templates/index.html

Находим блок:

  <img src="{{ url_for('static', filename='dog.png') }}" class="icon" />
  <h3>Name my pet</h3>
  <form action="/" method="post">
    <input type="text" name="animal" placeholder="Enter an animal" required />
    <input type="submit" value="Generate names" />
  </form>

Удаляем его. Вставляем вместо него:

  <h3>Введите текст</h3>
  <form action="/" method="post">
    <textarea rows="20" cols="200" name="animal" placeholder="Введите текст" required></textarea>
    <input type="submit" value="Generate" />
  </form>

Сохраняем: F2 -> Y -> Enter

Открываем файл с приложением.

nano app.py

Находим блок:

        response = openai.Completion.create(
            model="text-davinci-003",
            prompt=generate_prompt(animal),
            temperature=0.6,
        )

Вставляем в него строку: max_tokens=4000,

        response = openai.Completion.create(
            model="text-davinci-003",
            prompt=generate_prompt(animal),
            temperature=0.6,
            max_tokens=4000,
        )

В этом же файле находим функцию:

def generate_prompt(animal):
    return """Suggest three names for an animal that is a superhero.

Animal: Cat
Names: Captain Sharpclaw, Agent Fluffball, The Incredible Feline
Animal: Dog
Names: Ruff the Protector, Wonder Canine, Sir Barks-a-Lot
Animal: {}
Names:""".format(
        animal.capitalize()
    )

Удаляем ее. Вместо неё вставляем:

def generate_prompt(animal):
    return """{}
""".format(
        animal.capitalize()
    )

Сохраняем: F2 -> Y -> Enter

Запускаем сервис.

python app.py

Открываем в браузере http://123.444.555.666:5000

Видим окно проекта, но с возможностью ввода произвольного текста:

Вводим вопрос и получаем ответ:

Чтобы остановить сервис и выйти, нажимаем CTRL+C.

Чтобы выйти из виртуальной среды вводим:

deactivate

Теперь мы можем отправлять запросы в ChatGPT по API, и встраивать данный функционал в приложения на Python.

Далее развернем такой же проект для Node.js. После этого я немного подробнее расскажу про параметры API запросов и моделей (если Node.js вам не нужен, то сразу переходите к разделу про параметры).

Проект для Node.js (Next.js)

Для данного проекта нам нужна Node.js с версией >= 14.6.0.

Проверим, установлен ли node.

node -v

И установлен ли npm.

npm -v

Далее инструкция, как установить Node.js версии 18.

Добавим репозиторий NodeSource.

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -

Установим node и npm.

apt-get install nodejs -y

Проверим, что node нужной версии установлен.

node -v

И что npm тоже установлен.

npm -v

Создадим проект в папке /home. Перейдем в эту папку.

cd /home

Копируем демо проект.

git clone https://github.com/openai/openai-quickstart-node.git

Переходим в папку проекта.

cd openai-quickstart-node

Создаем файл, куда вставим OPENAI_API_KEY

cp .env.example .env

Открываем его.

nano .env

Внутри него будет:

# Do not share your OpenAI API key with anyone! It should remain a secret.
OPENAI_API_KEY=

Вставляем OPENAI_API_KEY

# Do not share your OpenAI API key with anyone! It should remain a secret.
OPENAI_API_KEY=sk-n0123456789buNKlMOOs1AEnIPQgUuoYeL0s9a1PG8mKe3xN

Сохраняем: F2 -> Y -> Enter

Указываем нужный IP для запуска. Открываем:

nano package.json

Находим строку: "dev": "next dev",

{
  "name": "openai-quickstart-node",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start"
  },
  "dependencies": {
    "next": "^13.1.1",
    "openai": "^3.1.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "engines": {
    "node": ">=14.6.0"
  }
}

Заменяем ее на "dev": "next dev -H 123.444.555.666",

{
  "name": "openai-quickstart-node",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev -H 123.444.555.666",
    "build": "next build",
    "start": "next start"
  },
  "dependencies": {
    "next": "^13.1.1",
    "openai": "^3.1.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "engines": {
    "node": ">=14.6.0"
  }
}

Сохраняем: F2 -> Y -> Enter

Устанавливаем пакеты.

npm install

Запускаем сервис.

npm run dev

Открываем в браузере http://123.444.555.666:3000

Видим окно демонстрационного проекта:

Суть демо проекта - мы вводим имя животного (на английском) и система предлагает нам варианты героических имен для него:



Чтобы остановить сервис и выйти, нажимает CTRL+C

Доработаем демо проект, чтобы можно было вводить свои произвольные запросы.

Открываем файл, где изменим html шаблон.

nano pages/index.js

Находим блок

        <img src="/dog.png" className={styles.icon} />
        <h3>Name my pet</h3>
        <form onSubmit={onSubmit}>
          <input
            type="text"
            name="animal"
            placeholder="Enter an animal"
            value={animalInput}
            onChange={(e) => setAnimalInput(e.target.value)}
          />
          <input type="submit" value="Generate names" />
        </form>

Удаляем его. Вставляем вместо него:

        <h3>Введите текст</h3>
        <form onSubmit={onSubmit}>
          <textarea
            name="animal"
            placeholder="Введите текст"
            value={animalInput}
            onChange={(e) => setAnimalInput(e.target.value)}
            rows="20"
            cols="200"
          />
          <input type="submit" value="Generate" />
        </form>

Сохраняем: F2 -> Y -> Enter

Открываем файл, где изменим информацию для API запроса.

nano pages/api/generate.js

Находим блок:

    const completion = await openai.createCompletion({
      model: "text-davinci-003",
      prompt: generatePrompt(animal),
      temperature: 0.6,
    });

Вставляем в него строку: max_tokens: 4000,

    const completion = await openai.createCompletion({
      model: "text-davinci-003",
      prompt: generatePrompt(animal),
      temperature: 0.6,
      max_tokens: 4000,
    });

В этом же файле находим функцию:

function generatePrompt(animal) {
  const capitalizedAnimal =
    animal[0].toUpperCase() + animal.slice(1).toLowerCase();
  return `Suggest three names for an animal that is a superhero.

Animal: Cat
Names: Captain Sharpclaw, Agent Fluffball, The Incredible Feline
Animal: Dog
Names: Ruff the Protector, Wonder Canine, Sir Barks-a-Lot
Animal: ${capitalizedAnimal}
Names:`;
}

Удаляем ее. Вместо не вставляем:

function generatePrompt(animal) {
  const capitalizedAnimal =
    animal[0].toUpperCase() + animal.slice(1).toLowerCase();
  return `${capitalizedAnimal}`;
}

Сохраняем: F2 -> Y -> Enter

Запускаем сервис.

npm run dev

Открываем в браузере http://123.444.555.666:3000

Видим окно проекта, но с возможностью ввода произвольного текста:

Вводим вопрос и получаем ответ:

Чтобы остановить сервис и выйти, нажимаем CTRL+C.

Теперь мы можем отправлять запросы в ChatGPT по API, и встраивать данный функционал в приложения на Node.js. Далее рассмотрим параметры API запросов и моделей.

Параметры API запросов и моделей

Рассмотрим параметры API запросов.

Для Python (Flask) это файл openai-quickstart-python/app.py и код:

        response = openai.Completion.create(
            model="text-davinci-003",
            prompt=generate_prompt(animal),
            temperature=0.6,
            max_tokens=4000,
        )

Для Node.js (Next.js) это файл openai-quickstart-node/pages/api/generate.js и код:

    const completion = await openai.createCompletion({
      model: "text-davinci-003",
      prompt: generatePrompt(animal),
      temperature: 0.6,
      max_tokens: 4000,
    });

У ChatGPT есть разные модели. Их описание можно посмотреть здесь: Models. Конкретно в данном демо используется модель text-davinci-003. Ее описание:

  • Can do any language task with better quality, longer output, and consistent instruction-following than the curie, babbage, or ada models. Also supports inserting completions within text.

  • Может выполнить любую языковую задачу с лучшим качеством, более длительным выводом и последовательным выполнением инструкций, чем модели Кюри, Бэббиджа или Ада. Также поддерживает вставку дополнений в текст.

Также у модели указывается количество токенов. Их количество определяет длину запроса и ответа.

Пример ответа при max_tokens=4000

Пример ответа при max_tokens=100

Точнее, если указать мало токенов, вы не получите короткий ответ. Он просто будет обрезан, как в примере выше. Максимальное количество токенов для каждой модели также можно посмотреть здесь: Models. Например, для нашей модели text-davinci-003: MAX TOKENS = 4,097 tokens.

Последний параметр, который мы использовали - temperature. На сайте OpenAI про него сказано следующее:

  • OpenAI models are non-deterministic, meaning that identical inputs can yield different outputs. Setting temperature to 0 will make the outputs mostly deterministic, but a small amount of variability may remain.

  • Модели OpenAI недетерминированы, а это означает, что одинаковые входные данные могут привести к разным результатам. Установка температуры на 0 сделает выходные данные в основном детерминированными, но может остаться небольшая изменчивость.

То есть если укажем значение temperature=0 и зададим один и тот же вопрос несколько раз подряд, то ответ каждый раз будет одинаковый. Если укажем temperature=1 - на один и тот же вопрос он будет каждый раз выдавать разные ответы. В нашем демо примере у нас было значение temperature=0.6.


Собственно, на этом все. Благодарю всех, кто уделил внимание моей статье.

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

Также если у вас есть вопросы - пишите в личку. Отвечу в рамках своих знаний и возможностей.

***

Алексей Чижов

Комментарии (0)