На заре существования ChatGPT (что на самом деле было совсем недавно), OpenAI развивалась различными способами доступа к внешнему интернету через использование своей LLM. С помощью Code Interpreter можно было использовать Curl для доступа к сайту и извлечения его содержимого. Пользовательские дополнения также позволяли обращаться к внешним сайтам, но требовали специальных разрешений от OpenAI. OpenAI также добавила возможности просмотра с помощью Microsoft Bing, которые также могли обращаться к интернету. Однако все эти варианты не оказались устойчивыми для роста и спроса, которые пользователи и разработчики предъявляли к системам OpenAI. Таким образом, OpenAI недавно представила новую платформу под названием GPT Actions. GPT Actions позволяют создавать пользовательские «GPT», которые могут подключаться к различным серверам для предоставления движков на основе ИИ поверх существующего веб-сервиса.
Так что же все это значит для инженера-электронщика, который притворяется, что понимает, что такое ИИ? Как вам звучит управляемое ИИ оборудование? Звучит зловеще, потенциально опасно и невероятно захватывающе одновременно! В этой статье мы погрузимся в то, как настроить веб-сервер, который будет подключен к вашему GPT Action. Мы даже рассмотрим, как включить ChatGPT для управления вводом-выводом на вашем Raspberry Pi, открывая возможности для множества новых и захватывающих проектов на базе ИИ, к которым обычный инженер никогда не имел доступа… до сих пор.
Прежде чем погружаться в код, важно отметить, что это развивающаяся область, которая быстро меняется. Это также технология, зависящая от OpenAI и требующая подписки на платную версию ChatGPT. Почти наверняка конкуренты будут выпускать свои версии «GPT Actions», но на момент написания этой статьи GPT Actions (по моему мнению) были самым простым способом подключения полностью функциональной Большой Языковой Модели (LLM) к вашему веб-сервису.
Концепция сервиса GPT Action довольно проста. Мы направляем наш пользовательский GPT к веб-сервису, сообщаем ему, каковы входные и выходные данные, и позволяем ему работать. Однако реализация оказалась гораздо сложнее, чем я представлял (что и стало поводом для написания этой статьи). Вот диаграмма работы сервиса:
Рисунок 1: Взаимодействие с сервером
Как видите, мы предоставляем OpenAI веб-сервис и документ интерфейса (OpenAPI), который говорит нам, как взаимодействовать с нашим оборудованием. Мы начнем с очень простого примера, который не включает в себя оборудование, а затем перейдем к простому примеру с переключением светодиода.
Для инженеров-электронщиков, которые, в лучшем случае, знакомы с встроенным программным обеспечением, этот раздел может быть не таким очевидным, как для кого-то, кто работает в сфере IT или облачной инфраструктуры. Будучи инженером-электриком и программистом, настройка полностью зашифрованного сервера SSL была для меня немного непростой задачей - в основном потому, что существует множество способов это сделать. К сожалению, это предварительное условие от OpenAI, так что нам придется с этим справляться. Если у вас уже есть безопасный способ размещения веб-сервера (например, завершение TLS на вашем балансировщике нагрузки), вы можете пропустить этот раздел. Как и многие другие, кто читает эту статью, я хотел бы поэкспериментировать со своим домашним сервером. Имейте в виду, что вам все равно нужно будет открыть порты 80 и 443 для внешнего мира через настройки вашего маршрутизатора. Инструкции по настройке брандмауэра и переадресации портов вашего маршрутизатора выходят за рамки этой статьи, но в интернете вы можете найти множество ресурсов, которые помогут вам с этим.
Для начала нам нужно запросить SSL-сертификат. Это можно сделать с помощью платных услуг (например, Cloudfare), бесплатных сторонних сервисов (например, ZeroSSL) или прямым способом с использованием Let’s Encrypt. В этом учебнике мы будем использовать Let’s Encrypt через certbot. Вам также понадобится доменное имя, указывающее на IP-адрес вашего сервера. Вы можете либо купить его, либо получить динамическое DNS-имя, используя Cloudfare (платно) или No-IP (бесплатно). Имейте в виду, что перенаправление вашего динамического DNS-имени на ваш IP требует записи типа "A", а не перенаправления URL.
Чтобы запросить 90-дневный SSL-сертификат от Let’s Encrypt, нам нужно будет использовать Certbot. У них есть исполняемые файлы, которые могут быть запущены на любой операционной системе. Мы собираемся выполнить самую простую команду для получения сертификатов. Вот команда для получения сертификата:
sudo certbot certonly --standalone --agree-tos -v --preferred-challenges http -d your_domain.com
Если вы используете Windows, вам не нужно использовать часть с sudo. Обязательно замените your_domain.com на купленное доменное имя или имя, полученное от службы динамического DNS (например, No-IP). Будет сгенерирована папка, содержащая серию файлов сертификата. На этом этапе пришло время клонировать шаблон репозитория: https://gitlab.com/ai-examples/gpt-actions-webserver/. Переместите сгенерированную папку certbot в репозиторий после его клонирования.
Чтобы правильно настроить перенаправление SSL (т.е. обеспечить шифрование всего трафика), мы захотим настроить Nginx. Создайте папку внутри вашего репозитория с именем nginx и новый файл с именем default.conf. Используя этот шаблон, замените your_domain.com на доменное имя, которое было использовано при запросе SSL-сертификата с помощью certbot:
server {
listen 80;
server_name your_domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /etc/ssl/certs/fullchain.pem;
ssl_certificate_key /etc/ssl/private/privkey.pem;
location / {
proxy_pass http://web:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
На этом этапе у вас должно быть правильно настроено шифрование SSL и все готово к работе. Теперь мы сосредоточимся на базовом веб-приложении, которое может взаимодействовать с нашим пользовательским GPT. Весь код вы можете найти в репозитории, поэтому мы лишь кратко расскажем, как его запустить, а не будем углубляться в детали того, что входит в приложение.
Учитывая природу веб-сервиса с шифрованием SSL, я абстрагировал веб-приложение от самого шифрования SSL. Для этого нам нужен Nginx, который перенаправляет трафик и обслуживает сертификаты, полученные от Let’s Encrypt через Certbot. Чтобы полностью упаковать все в аккуратный небольшой пакет, я использовал Docker Compose. Это означает, что вам понадобится Docker для запуска этого примера. Настройка изначально может показаться немного громоздкой и утомительной, но в наши дни программное обеспечение движется именно в этом направлении, так что такой проект - отличное место для знакомства с Docker. Кстати, все описания и инструкции размещены в файле README.md внутри репозитория. Если вы следовали предыдущим шагам, вы должны быть в состоянии выполнить команду docker compose up, и все компоненты (т.е. Nginx и веб-приложение) должны собраться и начать работу. Помните, что это приложение - просто пример типа "Hello World" и его можно запустить откуда угодно.
После выполнения команды docker compose up вы должны увидеть вывод, подобный этому:
Рисунок 2: Вывод в терминале
Вы должны протестировать ваше приложение, перейдя по адресу http://localhost:8000. Вы увидите тестовый вывод, который говорит {"status":"OK"}. Тот же результат вы должны увидеть, перейдя по адресу http://your_domain.com, где "your_domain.com" - это имя домена, которое вы настроили на предыдущем шаге. Чтобы действительно убедиться, что настройки вашего роутера и домена верны, стоит протестировать это вне вашей сети (например, на вашем мобильном телефоне с отключенным Wi-Fi).
Теперь, когда мы проверили, что наш базовый веб-сервер работает, нам нужно подключить его к нашему пользовательскому действию GPT. OpenAI требует документ под названием OpenAPI, который указывает их серверам, как взаимодействовать с вашими. Уже есть openapi.json, который вы можете скопировать и вставить непосредственно в настройки GPT Actions. Чтобы перейти к вашим настройкам, кликните на ваше имя в левом нижнем углу, а затем кликните на «Мои GPT»:
Рисунок 3: Настройки ChatGPT
Кликните на Создать GPT, затем Создать новое действие внизу:
Рисунок 4: Настройки конфигурации действия GPT
После этого вы можете скопировать и вставить содержимое openapi.json в поле Schema:
Рисунок 5: Настройки схемы действия GPT
Вам нужно будет заменить «https://your_doman.com» на адрес вашего реального домена. На этом этапе появятся несколько кнопок для тестирования. Предполагая, что ваш веб-сервер работает, вы можете нажать на кнопку теста и проверить, может ли OpenAI связаться с вашим веб-сервером. Если все в порядке, то вы можете сохранить/опубликовать GPT (в правом верхнем углу) и начать с ним работать. Убедитесь, что вы публикуете это только для себя, поскольку это подключается к частной сети (предположительно, дома).
Запуск GPT
Если вам удалось пройти через все вышеуказанные разделы и успешно протестировать ваше действие GPT, то поздравляем! Теперь пришло время действительно все это протестировать. Я начал новый разговор в ChatGPT, но на этот раз используя мой пользовательский GPT, который я назвал «Контроллер инструментов». Чтобы упростить, я попросил статус моего сервера:
Рисунок 6: Статус сервера с использованием действий GPT
И мои логи Nginx (из командной строки, где я запустил Docker Compose) также подтверждают трафик:
"GET / HTTP/1.1" 200 15 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot" "-"
У нас также есть генератор случайных чисел:
Рисунок 7: Получение случайных чисел от сервера с использованием действий GPT
И трафик с Nginx также подтверждает, что мы получили 5 запросов от нашего сервера.
На данном этапе мы показали, как выполнять программные действия с использованием GPT, но что насчет управления аппаратным обеспечением? В этой статье мы уже рассмотрели многое, поэтому давайте просто рассмотрим базовый пример с мигающим светодиодом.
Для начала запустите тот же процесс, что и выше, на Raspberry Pi. Обратите внимание, вы можете использовать тот же SSL-сертификат и код репозитория, что и на вашем домашнем компьютере (при условии, что все устройства находятся в одной сети). Как только все будет готово, выполните следующую команду:
BUILD_TYPE=rpi docker compose up --build
В этом примере теперь есть возможность переключать встроенный светодиод на контакте 26 (GPIO7). Вы можете изменить номер контакта в app/RPiDemoApp.py. Вам также потребуется обновить схему OpenAPI для пользовательского GPT с помощью схемы opeanapi-rpi.json, предоставленной в репозитории (поскольку мы добавили новую функцию).
На этом этапе вы должны быть в состоянии переключать светодиод с помощью чат-интерфейса с ChatGPT:
Рисунок 8: Переключение светодиода на Raspberry Pi с использованием действий GPT
Поздравляем с достижением этого этапа! Это было сложное руководство, и у вас, безусловно, возникнут вопросы и/или проблемы. ChatGPT ежедневно вносит изменения в эту функцию и находит более простые способы объяснения процесса начинающим. Следите за обновленной документацией и даже ботами-помощниками на базе ИИ, которые могут помочь вам в этом процессе.
В этой статье мы рассмотрели пользовательские действия GPT, как их создавать, и построили всю необходимую инфраструктуру для предоставления SSL-защищенного веб-сервиса с нашего домашнего компьютера. В дополнение к созданию базового веб-сервиса, мы смогли расширить этот код для управления светодиодом с Raspberry Pi. Это открывает возможности для управления и взаимодействия с гораздо более сложным аппаратным обеспечением, используя "ИИ в цикле" (игра слов "аппаратное обеспечение в цикле"). В будущих статьях мы исследуем такие темы и концепции, используя этот пример в качестве основы.