天天看點

當 MQTT 遇上 ChatGPT:探索可自然互動的物聯網智能應用

前言

随着物聯網技術的迅猛發展,人與裝置、裝置與裝置之間的互動已變得不再困難,而如何更加自然、高效、智能地實作互動則成為物聯網領域新的挑戰。

近期,由 OpenAI 釋出的 ChatGPT、GPT-3.5 和 GPT-4 等先進大語言模型(LLM)及其應用在全球範圍内迅速普及,為通用人工智能(AGI,Artificial General Intelligence)與物聯網領域的結合帶來了更多可能性。

作為一款先進的自然語言處理應用,ChatGPT 憑借其卓越的自然語言處理能力可輕松實作人與機器的自然對話。而物聯網領域的主流協定 MQTT(Message Queuing Telemetry Transport)通過輕量級、低帶寬占用的通信方式以及釋出/訂閱模型,保證了資料的實時傳輸與高效處理。

我們由此可以大膽設想,将 MQTT 協定與 ChatGPT 結合使用,可以更加輕松地實作物聯網領域的人機智能互動:

  • 在智能家居領域,使用者可以通過與 ChatGPT 自然對話來控制家中的智能裝置,提高生活品質。
  • 在工業自動化領域,ChatGPT 可以幫助工程師更快速地分析裝置資料,提高生産效率。

基于此,本文将探讨如何将 MQTT 協定與 ChatGPT 這樣的自然語言處理應用相結合,同時将通過一個簡單的搭建示例來展示結合後的應用場景,為讀者探索物聯網智能應用提供一些思路。

基礎概念

在開始前,我們需要先簡單了解關于 MQTT 與 ChatGPT 的一些基本概念。

MQTT 協定

如上文所提,MQTT 協定是一種基于釋出/訂閱模式的輕量級消息傳輸協定,目前已經廣泛應用于物聯網、移動網際網路、智能硬體、車聯網、智慧城市、遠端醫療、電力、石油與能源等領域。

使用 MQTT 協定連接配接海量物聯網裝置需要 MQTT 伺服器這一關鍵元件。下文的方案設計中我們将采用大規模分布式物聯網 MQTT 消息伺服器 EMQX,實作海量物聯網裝置的高效可靠連接配接以及消息與事件流資料的實時處理分發。

之後,我們就可以使用 MQTT 用戶端來連接配接 MQTT 伺服器,實作與物聯網裝置的通信。本文中采用的是開源的跨平台 MQTT 用戶端 MQTTX,它包含桌面、指令行和 Web 端的應用,可以輕松實作與 MQTT 伺服器的連接配接測試,幫助開發者快速開發和調試 MQTT 服務及應用。

當 MQTT 遇上 ChatGPT:探索可自然互動的物聯網智能應用

ChatGPT

ChatGPT(https://openai.com/blog/chatgpt)是一款自然語言處理應用,它基于 OpenAI 的 GPT-3.5 和 GPT-4 等先進大語言模型建構。GPT(Generative Pre-trained Transformer)是一種深度學習模型,以其強大的文本生成和了解能力而聞名。ChatGPT 能夠了解和生成自然語言,與使用者進行流暢、自然的對話。而要實作 ChatGPT 的自然語言處理能力,我們就需要使用 OpenAI 提供的 API(https://platform.openai.com/docs/api-reference)來與 GPT 模型進行互動。

當 MQTT 遇上 ChatGPT:探索可自然互動的物聯網智能應用

方案設計與準備工作

基于 MQTT 協定和 ChatGPT 的能力,我們将設計一個方案來實作兩者的結合和互相操作。

為實作類似 ChatGPT 的自然語言處理功能,我們将再編寫一個用戶端腳本,在腳本中使用 OpenAI 提供的 API 來與 GPT 模型進行互動。當這個腳本中的 MQTT 用戶端接收到消息并轉發至 API 時,就會生成相應的自然語言響應,之後,這個響應消息将被釋出至特定的 MQTT 主題,以實作 ChatGPT 與 MQTT 用戶端之間的互動循環。

通過這個設計方案,我們将示範 ChatGPT 與 MQTT 協定之間進行消息接收、處理和轉發等環節的互操作流程。

首先,請按照以下步驟準備所需的工具和資源。

  • 安裝 EMQX:

可以使用 Docker 快速安裝和啟動 EMQX 5.0:

docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx:latest           

除 Docker 安裝外,EMQX 還支援使用 RPM 或 DEB 包安裝,具體安裝方法請參考 EMQX 5.0 安裝指南(https://www.emqx.io/docs/zh/v5.0/deploy/install.html)。

  • 安裝 MQTTX 桌面端應用:

進入到 MQTTX 官網(https://mqttx.app/zh),選擇對應的作業系統和 CPU 架構的版本,點選下載下傳後安裝。

  • 注冊 OpenAI 賬戶并擷取 API 密鑰:

進入到 OpenAI(https://platform.openai.com/overview)後,建立或登入到您的賬戶。完成後,點選右上角,選擇 View API Keys,在 API keys 欄目下,點選 Create new secret key 以生成一個新的 API 密鑰。請妥善保管此密鑰,因為它将在後續的程式中用于 API 認證。

當 MQTT 遇上 ChatGPT:探索可自然互動的物聯網智能應用

完成上述步驟後,我們已經擁有了将 MQTT 協定與 ChatGPT 應用相結合所需的工具和資源。關于如何利用 OpenAI 的 API 與 GPT 語言模型互動,您可以查閱 OpenAI 文檔(https://platform.openai.com/docs/introduction)以獲得詳細的指導和學習材料。

代碼實作

資源和環境準備完成後,我們将使用 Node.js 環境建構一個 MQTT 用戶端,此用戶端将通過 MQTT 主題接收消息,将資料發送至 OpenAI API,并通過 GPT 模型生成自然語言。生成的自然語言将随後釋出到指定的 MQTT 主題以實作內建互動。當然,您也可以根據自己的需求和熟悉程度選擇 Python、Golang 等其他程式設計語言。為了便于直覺示範,我們将直接使用 API,但您也可以選擇使用官方庫,它為 Node.js 和 Python 提供了更加簡潔的使用方式。

更多資訊請參考:OpenAI Libraries(https://platform.openai.com/docs/libraries/libraries)。
  • 準備 Node.js 環境:確定已經安裝了 Node.js(建議使用 v14.0 或更高版本)。建立一個新的項目檔案夾,并使用 npm init 指令初始化項目。然後,使用以下指令安裝必要的依賴包:
npm init -y
npm install axios mqtt dotenv           

axios 用于發送 HTTP 請求,mqtt 用于連接配接 MQTT 伺服器,dotenv 用于加載環境變量。

  • 使用環境變量:建立一個名為 .env 的檔案,并在其中添加您的 OpenAI API 密鑰:
OPENAI_API_KEY=your_openai_api_key           
  • 編寫代碼:建立一個 index.js 檔案,并在檔案中實作連接配接 MQTT 伺服器,訂閱指定的 MQTT 主題,并監聽消息。當接收到消息後,使用 axios 發送 HTTP 請求至 OpenAI API,生成自然語言回複,并将回複釋出到指定的 MQTT 主題下,以下将列出每個步驟的關鍵代碼,供您參考:

使用 mqtt 庫連接配接到 MQTT 伺服器,連接配接成功後并預設訂閱 chatgpt/request/+ 主題用于接收發送過來的 MQTT 消息:

const host = "127.0.0.1"; 
const port = "1883"; 
const clientId = `mqtt_${Math.random().toString(16).slice(3)}`; 
const OPTIONS = {
  clientId,
  clean: true,
  connectTimeout: 4000,
  username: "emqx",
  password: "public",
  reconnectPeriod: 1000, 
}; 
const connectUrl = `mqtt://${host}:${port}`; 
const chatGPTReqTopic = "chatgpt/request/+"; 
const client = mqtt.connect(connectUrl, OPTIONS);           

編寫 genText 異步函數,接收 userId 參數,并使用 axios 建立了一個 HTTP 用戶端執行個體,在 HTTP Headers 中使用 OpenAI API 密鑰進行認證,然後向 OpenAI API 發送一個 POST 請求,用于生成自然語言回複。生成的回複内容再通過 MQTT 用戶端釋出到使用者訂閱的特定主題上,用來接收回複。而曆史消息則被存儲在 Messages 數組中:

// Add your OpenAI API key to your environment variables in .env 
const OPENAI_API_KEY = process.env.OPENAI_API_KEY; 
let messages = []; // Store conversation history 
const maxMessageCount = 10; 
const http = axios.create({
 baseURL: "https://api.openai.com/v1/chat",
 headers: {
   "Content-Type": "application/json", 
   Authorization: `Bearer ${OPENAI_API_KEY}`,
 }, 
}); 
const genText = async (userId) => {
  try {
    const { data } = await http.post("/completions", {
      model: "gpt-3.5-turbo", 
      messages: messages[userId], 
      temperature: 0.7,
    }); 
    if (data.choices && data.choices.length > 0) {
      const { content } = data.choices[0].message;
      messages[userId].push({ role: "assistant", content: content });
      if (messages[userId].length > maxMessageCount) {
        messages[userId].shift(); // Remove the oldest message
      }
      const replyTopic = `chatgpt/response/${userId}`;
      client.publish(replyTopic, content, { qos: 0, retain: false }, (error) => {
        if (error) {
          console.error(error);
        }
      });
    }
  } catch (e) {
    console.log(e);
  } 
};           
  • 最後通過監聽主題為 chatgpt/request/+ 的消息,将接收到的消息存儲到 Messages 數組中,并調用 genText 函數生成自然語言回複并在函數内直接發送到使用者訂閱的特定主題上。曆史消息最大數量為 10 條:
client.on("message", (topic, payload) => {
  // Check if the topic is not the one you're publishing to
  if (topic.startsWith(chatGPTReqTopicPrefix)) {
    const userId = topic.replace(chatGPTReqTopicPrefix, "");
    messages[userId] = messages[userId] || [];
    messages[userId].push({ role: "user", content: payload.toString() });
    if (messages[userId].length > maxMessageCount) {
      messages[userId].shift(); // Remove the oldest message
    }
    genText(userId);
  }
});           
  • 運作該腳本服務:
node index.js           

至此,我們就完成該示範項目的基礎功能部分,除基礎功能外,該代碼還實作了使用者間的通路隔離,隻需添加不同的字尾在特定主題中。通過存儲之前的消息曆史,GPT 模型還可以了解對話中上下文中的語境,并根據之前的對話生成更加連貫和符合語境的回複。

完整的代碼可在 GitHub 的 openai-mqtt-nodejs(https://github.com/emqx/openai-mqtt-nodejs)中檢視到。

另一種方案

除上述示例外,我們也可以直接使用 EMQX 提供的規則引擎和資料橋接功能中的 Webhook 來實作快速開發。

EMQX 支援設定規則,當向特定主題釋出消息時觸發 Webhook 回調。我們隻需要編寫一個簡單的 Web 服務,使用 OpenAI API 與 GPT 模型進行互動并通過 HTTP 響應将生成的回複,可以通過建立 MQTT 用戶端釋出到指定主題,也可以直接使用 EMQX 的 Publish API 來完成該操作,最終實作內建互動的目的。

對于已有 Web 服務的使用者來說,這種方式可以最大限度地節省開發成本,快速實作 PoC 或 Demo。其優點是無需編寫獨立的 MQTT 用戶端,可以利用 EMQX 規則引擎簡化內建流程和靈活處理資料。但是,仍需要編寫和維護 Web 服務,對于複雜的應用場景,Webhook 可能不夠友善易用。

是以,上述提到的方案各有優勢,我們可以根據實際業務需求和開發者技術水準選擇更合适的方案。但無論哪種方式,EMQX 作為 MQTT 基礎設施都為系統內建提供了重要支援,使開發者可以借此快速建構項目原型與推動數字化轉型。

Demo 展示

完成 MQTT 用戶端與 GPT 模型的互動的執行個體開發後,我們就可以使用 MQTTX 桌面用戶端來測試此示範項目了。MQTTX 的使用者界面類似于聊天軟體,使頁面操作更加簡化,是以更适合示範對于對話機器人的互動。

首先,我們需要在 MQTTX 中建立一個新的連接配接,連接配接到上述代碼的中的同一個 MQTT 伺服器,例如:127.0.0.1,然後訂閱 chatgpt/response/demo 主題,用于接收回複,并向 chatgpt/request/demo 主題發送消息。這裡的 demo 字尾可以替換為其他的字元串,以實作使用者間的通路隔離,我們可以通過發送一個 Hello 消息來測試一下:

當 MQTT 遇上 ChatGPT:探索可自然互動的物聯網智能應用

接下來,我們模拟一些更複雜的示範環境,如果某個傳感器的溫度超過了預設的門檻值,ChatGPT 機器人會發送一個告警消息到另一個 MQTT 主題,該主題被連接配接到一個監控裝置,如智能手表或智能音箱。監控裝置收到告警消息後,可以使用自然語言技術将告警資訊轉換為語音,以便使用者可以更友善地接收和了解。

當 MQTT 遇上 ChatGPT:探索可自然互動的物聯網智能應用

例如我們還可以再建立一個智能家居環境,其中包括多個 MQTT 主題,這些主題對應不同類型的裝置(例如燈光、空調、音響等)。我們将使用 ChatGPT 生成自然語言指令,以便通過 MQTT 用戶端與這些裝置進行實時互動等。

當 MQTT 遇上 ChatGPT:探索可自然互動的物聯網智能應用

未來展望

結合 ChatGPT 和 MQTT 協定可以實作智能化的物聯網系統,在智能家居和工業自動化等領域有着廣泛的應用潛力。通過自然語言互動,使用者可以控制家居裝置的開關、亮度、顔色等參數,實作更加智能、舒适的居住環境;在工業自動化中,利用 ChatGPT 和 MQTT 實作智能化的裝置維護和控制,可以帶來更加高效、智能的制造過程。

在未來,我們可以設想讓 ChatGPT 或更加智能的 AGI 工具扮演更多提高物聯網領域效率和生産力的角色,例如:

  • 消息解析:對通過 MQTT 傳輸的消息進行解析,提取出需要的資料,為後續的處理和分析做好準備。
  • 語義了解:對從 MQTT 中接受的消息進行語義的了解和處理,進而提取出更加精确的資訊。
  • 智能處理:通過 AI 技術,對接受到的 MQTT 消息進行智能處理,幫助使用者更快地擷取合适的解決方案。
  • 使用者回報:作為智能互動的代表,通過 MQTT 接收使用者的回報資訊,并提供相應的響應。
  • 虛拟助手:作為虛拟助手的存在,通過語言識别技術來控制智能家居裝置,為使用者提供更智能、高效的服務,提升生活的便捷性和舒适度。

結語

在本篇部落格中,我們簡單探讨了 MQTT 和 ChatGPT 的結合及其潛在應用。通過 EMQX 與 MQTTX,結合 Open AI 提供的 API,實作了一個類似 ChatGPT 的 AI 應用,并通過使用 MQTT 連接配接後,對處理後的資料進行接收和轉發,展示了 MQTT 與 ChatGPT 的內建。

雖然目前這些技術結合還未投入生産環境,但随着更多內建 AI 技術的産品上市(如 New Bing 将 GPT 模型內建到搜尋引擎中,以及 GitHub 的 Copilot 等),我們相信人工智能(AI)和物聯網(IoT)技術的未來發展方向也将包括自然語言互動優化,裝置控制智能化程度提升,以及更多具有創新性的應用場景。

總之,MQTT 和 ChatGPT 的結合為我們揭示了一個值得關注和深入探索的領域。我們期待這些不斷發展的創新技術為我們帶來一個更美好的世界。

繼續閱讀