ChatGPTの初期段階(実際にはそれほど前のことではない)では、OpenAIはLLMを使用して外部インターネットにアクセスするさまざまな方法を進化させました。Code Interpreterを使用すると、ウェブサイトをCurlしてその内容を引き出すことができました。カスタムアドオンも外部のウェブサイトにアクセスすることを可能にしましたが、OpenAIから特別な許可が必要でした。OpenAIは、Microsoft Bingとのブラウジング機能も追加し、インターネットにアクセスすることもできました。しかし、これらのオプションは、ユーザーや開発者がOpenAIのシステムに要求する成長と需要に対して、持続可能であるとは証明されませんでした。したがって、OpenAIは最近、GPT Actionsと呼ばれる新しいプラットフォームを立ち上げました。GPT Actionsを使用すると、異なるサーバーに接続して、既存のウェブサービスの上にAI対応エンジンを提供するカスタム「GPT」を作成できます。
では、AIが何であるかを理解しようとするハードウェアエンジニアにとって、これはすべて何を意味するのでしょうか?AI制御のハードウェアはどう思いますか?それは不気味で、潜在的に危険で、同時に信じられないほどエキサイティングに聞こえます!この記事では、GPT Actionに接続するためのウェブサーバーの設定方法について詳しく説明します。さらに、ChatGPTを使用してRaspberry PiのIOを制御する方法も見ていきます。これにより、平均的なエンジニアがこれまでアクセスできなかった多くの新しくてエキサイティングなAI駆動プロジェクトが可能になります…今までのように。
コードに飛び込む前に、これは進化し続けている分野であり、急速に変化していることを指摘しておくことが重要です。また、この技術はOpenAIに依存しており、ChatGPTの有料バージョンへのサブスクリプションが必要です。競合他社が「GPT Actions」のバージョンを展開していくことはほぼ確実ですが、この記事を書いている時点では、GPT Actionsがウェブサービスに完全機能のLarge Language Model(LLM)を接続する最も簡単な方法でした(私の意見では)。
GPT Actionサービスのコンセプトはかなり直接的です。カスタムGPTをウェブサービスに指向させ、入力と出力が何であるかを伝え、実行させます。しかし、実装は私が想像していたよりもはるかに複雑でした(この記事を書く動機となりました)。ここにサービスの仕組みを示す図があります:
図1: サーバー間の相互作用
ご覧のとおり、OpenAIにウェブサービスとインターフェースドキュメント(OpenAPI)を提供し、ハードウェアとのやり取り方法を教えます。まずはハードウェアを関与させない非常に単純な例から始め、次にシンプルなLEDトグルの例に進みます。
ハードウェアエンジニアで、埋め込みソフトウェアに多少なじみがある程度の方にとって、このセクションはITやクラウドインフラストラクチャで働く人にとっては当たり前かもしれませんが、そうではないかもしれません。電気およびソフトウェアエンジニアとして、完全にSSL暗号化されたサーバーを設定することは、方法が多すぎるため、少し頭を悩ませるものでした。残念ながら、これはOpenAIからの前提条件なので、乗り越えなければなりません。すでにウェブサーバーを安全にホスティングする方法(例:ロードバランサーでのTLS終了)をお持ちの場合は、このセクションをスキップできます。私のように、この記事を読んでいるほとんどの人は、自宅のサーバーで実験したいと思っています。ルーターの設定を通じて、ポート80と443を外部に開放する必要があることに注意してください。ルーターのファイアウォールとポートフォワーディングの設定方法については、この記事の範囲外ですが、オンラインで見つけることができる多くのリソースがあります。 始めるために、SSL証明書をリクエストする必要があります。これは、有料サービス(例:Cloudfare)、無料のサードパーティサービス(例:ZeroSSL)、またはLet’s Encryptを使用した直接的な方法で行うことができます。このチュートリアルでは、certbotを介してLet’s Encryptを使用します。また、サーバーのIPアドレスを指すドメイン名が必要です。ドメイン名を購入するか、Cloudfare(有料)またはNo-IP(無料)を使用して動的DNS名を取得できます。動的DNS名をIPに転送するには、「A」レコードタイプが必要であり、URLリダイレクションではありません。 Let’s Encryptから90日間のSSL証明書をリクエストするには、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リダイレクトが適切に機能するように)SSLを設定するには、Nginxを設定したいと思います。リポジトリ内にnginxというフォルダを作成し、default.confという新しいファイルを作成します。このテンプレートを使用して、certbotを使用してSSL証明書をリクエストしたときに使用したドメイン名でyour_domain.comを置き換えます:
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と通信できる基本的なWebアプリケーションに焦点を当てます。すべてのコードはリポジトリ内で見つけることができるので、アプリケーションに含まれる詳細な部分ではなく、実行方法についてのみ強調します。
SSL暗号化されたWebサービスの性質を考えると、実際のSSL暗号化からWebアプリケーションを抽象化する必要がありました。これを行うには、Nginxが必要で、これによりトラフィックがリダイレクトされ、Let’s Encrypt経由で受け取った証明書が提供されます。すべてをきちんとした小さなパッケージに包み込むために、Docker Composeにそれをラップしました。これは、この例を実行するためにDockerが必要であることを意味します。初期設定は少し面倒で手間がかかりますが、ソフトウェアが今日向かっている方向ですので、このようなプロジェクトはDockerに慣れるのに絶好の場所です。補足として、すべての説明と指示はリポジトリ内のREADME.mdファイルに配置されています。上記の手順を正しく実行した限り、docker compose upを実行すると、すべてのコンポーネント(つまり、NginxとWebアプリケーション)がビルドされ、実行を開始するはずです。このアプリケーションは単なるシンプルな「Hello World」タイプの例であり、どこからでも実行できます。
docker compose upコマンドを実行した後、このような出力が表示されるはずです:
図2: ターミナルの出力
http://localhost:8000にアクセスしてアプリケーションをテストする必要があります。{"status":"OK"}というテスト出力が表示されるはずです。同じ結果は、前のステップで設定したドメイン名であるhttp://your_domain.comにアクセスしても見ることができます。ルーターとドメイン設定が正しいことを本当に確認するためには、ネットワークの外部(例えば、WiFiをオフにした携帯電話上で)でこのテストを行うべきです。
基本的なウェブサーバーが動作していることを確認したので、次にCustom GPT Actionに接続する必要があります。OpenAIは、サーバーがどのように相互作用するかを説明するOpenAPIと呼ばれるドキュメントを要求します。GPT Actionsの設定に直接コピーして貼り付けることができるopenapi.jsonが既にあります。設定にアクセスするには、左下隅にある名前をクリックし、「My GPTs」をクリックします:
図3: ChatGPTの設定
GPTを作成をクリックし、その後下部にある新しいアクションを作成をクリックします:
図4: GPTアクション設定の構成
その後、openapi.jsonの内容をスキーマボックスにコピーして貼り付けます:
図5: GPTアクションスキーマ設定
「https://your_doman.com」を実際のドメインのアドレスに置き換える必要があります。その時点で、いくつかのテストボタンが表示されます。ウェブサーバーが稼働していれば、テストボタンをクリックしてOpenAIがウェブサーバーと通信できるかどうかを確認できます。すべてが問題なければ、GPTを保存/公開(右上隅にあります)して、それを使い始めることができます。これはプライベートネットワーク(おそらく自宅)に接続しているので、自分自身のためにのみ公開してください。
GPTの実行
上記のすべてのセクションを通過し、GPTアクションのテストに成功した場合、おめでとうございます!さて、本格的にテストする時が来ました。「Instrument Controller」と呼ぶ私のCustom GPTを使用して新しいChatGPT会話を開始しましたが、今回はサーバーのステータスを簡単に尋ねました:
図6: GPTアクションを使用したサーバーステータス
そして、Docker Composeを実行したコマンドラインからの私のNginxログもトラフィックを確認しています:
"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を使用してソフトウェアアクションを実行する方法を示しましたが、ハードウェアを制御するにはどうすればよいでしょうか?この記事では既に多くのことを取り上げているので、基本的な点滅するLEDの例を見てみましょう。
Raspberry Piで上記と同じプロセスを実行して始めます。同じSSL証明書とリポジトリコードを自宅のコンピューターで使用したものと同じものを使用できます(すべてのデバイスが同じネットワーク内にあると仮定)。準備が整ったら、次のコマンドを実行します:
BUILD_TYPE=rpi docker compose up --build
この例には、ピン26(GPIO7)にあるオンボードLEDを切り替える機能が含まれています。app/RPiDemoApp.pyでピン番号を変更できます。また、新しい機能を追加したため、カスタムGPTのOpenAPIスキーマをリポジトリで提供されているopeanapi-rpi.jsonスキーマで更新する必要があります。
この時点で、ChatGPTを使用してチャットインターフェースでLEDを切り替えることができるはずです:
図8: GPTアクションを使用してRaspberry Pi上のLEDを切り替える
ここまで来られたことをお祝いします!これは複雑なチュートリアルであり、疑問や課題があることでしょう。ChatGPTはこの機能に関して毎日変更を加えており、初心者がプロセスを理解しやすい方法を見つけ出しています。更新されたドキュメントやプロセスをサポートするAIアシスタントボットにも注目してください。
この記事では、カスタムGPTアクションの作成方法と、それを囲むすべての足場を構築して、自宅のコンピューターからSSL暗号化されたウェブサービスを提供する方法を見てきました。基本的なウェブサービスを構築するだけでなく、このコードを拡張してRaspberry PiからLEDを制御することができました。これにより、「AI in the loop」(「hardware in the loop」の言い回し)を利用して、より複雑なハードウェアを制御し、通信する可能性が開かれました。将来の記事では、この例を基礎として、そのようなトピックや概念を探求します。