在ChatGPT的早期(实际上并没有很久以前),OpenAI通过使用他们的LLM以不同的方式接触外部互联网。通过代码解释器,人们可以Curl一个网站并拉取其内容。自定义插件也允许你访问外部网站,但需要从OpenAI获得特殊权限。OpenAI还添加了与Microsoft Bing的浏览功能,也可以访问互联网。然而,所有这些选项对于用户和开发者对OpenAI系统的增长和需求来说,并不是非常可持续的。因此,OpenAI最近推出了一个名为GPT Actions的新平台。GPT Actions允许你创建自定义的“GPT”,可以连接到不同的服务器上,提供在现有网络服务之上的AI驱动引擎。
那么,这一切对于假装理解AI的硬件工程师意味着什么呢?AI控制的硬件听起来怎么样?听起来既不祥、潜在危险,又无比激动人心!在这篇文章中,我们将深入探讨如何设置一个将连接到你的GPT Action的网络服务器。我们甚至会看看如何启用ChatGPT来控制你的Raspberry Pi上的IO,为许多新的和激动人心的AI驱动项目打开大门,这是普通工程师直到现在都未能接触到的。
在深入代码之前,重要的是要注意,这是一个不断发展的领域,正在迅速变化。它也是一个依赖于OpenAI的技术,并且需要订阅ChatGPT的付费版本。几乎可以肯定的是,竞争对手将推出他们版本的“GPT Actions”,但在撰写本文时,GPT Actions(在我看来)是将一个功能齐全的大型语言模型(LLM)连接到你的网络服务的最简单方式。
GPT Action服务背后的概念非常直接。我们将我们的自定义GPT指向一个网络服务,告诉它输入和输出是什么,然后让它运行。然而,实现比我想象的要复杂得多(这是写这篇文章的动机)。这是服务工作方式的图表:
图1:服务器互动
如你所见,我们向OpenAI提供了一个网络服务和一个接口文档(OpenAPI),告诉我们如何与我们的硬件互动。我们将从一个非常简单的例子开始,不涉及硬件,然后逐步过渡到一个简单的LED切换示例。
对于那些对嵌入式软件最多算是熟悉的硬件工程师来说,这一部分对他们来说可能不像对那些在IT或云基础设施工作的人那样简单。作为一名电气工程师和软件工程师,设置一个完全SSL加密的服务器对我来说有点难以理解 - 主要是因为有很多种方法可以做到这一点。不幸的是,这是OpenAI的一个先决条件,所以我们必须硬着头皮做。如果你已经有了一种安全的托管Web服务器的方式(例如,在你的负载均衡器上进行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重定向工作(即确保所有流量都被加密),我们将要设置Nginx。在你的仓库中创建一个名为nginx的文件夹和一个新文件,命名为default.conf。使用这个模板,将your_domain.com替换为你使用certbot请求SSL证书时使用的域名:
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服务的性质,我已将Web应用程序与实际的SSL加密分开。为此,我们需要Nginx,它重定向流量并提供我们通过Certbot从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,您也应该看到相同的结果,其中“your_domain.com”是您在上一步中设置的域名。为了真正验证您的路由器和域设置是否正确,您应该在网络外部测试这一点(例如,用WiFi关闭的手机上)。
现在我们已经验证了我们的基本网络服务器正在工作,我们需要将其连接到我们的自定义GPT操作。OpenAI需要一个称为OpenAPI的文档,该文档告诉他们的服务器如何与您的服务器交互。已经有一个openapi.json,您可以直接复制并粘贴到GPT操作设置中。要进入您的设置,请点击左下角的您的名字,然后点击“我的GPTs”:
图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的命令行)也确认了流量:
```plaintext
"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中修改引脚号。您还需要使用提供在仓库中的opeanapi-rpi.json模式更新自定义GPT的OpenAPI模式(因为我们添加了一个新功能)。
此时,您应该能够使用ChatGPT的聊天界面切换LED:
图8:使用GPT操作在Raspberry Pi上切换LED
恭喜你走到这一步!这是一个复杂的教程,你无疑会有问题和/或挑战。ChatGPT正在每天对这个功能进行更改,并找到更简单的方法来引导初学者通过这个过程。请留意更新的文档,甚至是可以帮助您完成过程的AI助手机器人。
在本文中,我们探讨了自定义GPT操作,如何创建它们,并围绕它构建所有支架,以便从我们的家用电脑提供SSL加密的网络服务。除了构建基本的网络服务,我们还能够扩展这段代码来控制Raspberry Pi上的LED。这为控制和通信更复杂的硬件打开了可能性,同时利用“AI在循环中”(借用“硬件在循环中”的说法)。在未来的文章中,我们将探索这些主题和概念,以此示例为基础。