基于大语言模型的物联网(artificial intelligence of thing)

news2024/9/21 20:37:37

        与当下热门的AI类似,曾几何时,物联网(Internet of thing)实现“万物互联"给人类带来了无限的遐想。但是往往事与愿违,美好的愿景并没有如约而至。十几年来,物联网远没有实现”万物互联“的美好愿景。

      随着chatGPT 为主的AI热潮,人们又一次提出了 AIoT (artificial intelligence of thing) 的新概念。AI 会给IoT 带来新的生机么?这是有趣的话题。 

        多年的实践表明,IoT 实现的难点在于没有广泛被接纳的IoT 协议,目前只有各个公司内部形成的各种IoT 生态,比如小米,华为,苹果的智能设备,它们自成一体。 它们成为了一个又一个信息孤岛,令人沮丧。

      哪怕是不同公司的遥控器都互不兼容。出于各自的商业利益,人类难以达成共识。

        各种自主无人系统的快速发展,增加了机器的内生智能,使智能机器之间的功能协作成为可能。然而,传统的智能机器协作协议在功能、效率和可扩展性方面存在局限性。此外,现有的智能机器协作研究尚未接近一种统一的范式,以促进机器之间以及机器与人类之间的交互。

       在我看来,chatGPT 的出现,为IoT 行业打开了另一条道路-”让机器说人话“.

        在人类文明进步过程中,自然语言成为人类最为广泛接纳的交流语言,相比于机器语言而言,人类语言非常丰富,对语法和语义的要求并严格。如果让设备采用人类的语言来交流,能够最大程度地实现设备之间的相互交流和理解。

     自然语言的通信仍然需要底层的协议承载,最简单和普及的通信协议莫过于TCP/IP 协议了,但是考虑到物联网设备需要点对多点通信,所以使用基于MQTT 的PUB/SUB 通信协议最为合适。

本文记录了如何使用自然语言/MQTT作为物联网设备的通信协议。

实验的主要内容

  • MQTT Broker :mosquitto
  • 大语言模型:本地部署ollama/llama-3 ,远程调用kimi。
  • 程序设计语言 :Python

准备工作

安装mosquitto

    要在 Windows 上安装 Mosquitto,请从 mosquitto.org(64 位或 32 位)中选择所需的安装文件,下载并运行它。  

具体过程请参考:

How to Install Mosquitto MQTT Broker on Windows

运行 

PS C:\Windows\system32> mosquitto

订阅

PS C:\Users\Yao> mosquitto_sub -i mosq_sub1 -t "Test topic" -d

发布

PS C:\Users\Yao> mosquitto_pub -i mosq_pub1 -t "Test topic" -m "Test message" -d

python MQTT Client

安装 paho-mqtt

pip3 install -i https://pypi.doubanio.com/simple paho-mqtt

发布

# python 3.6

import random
import time

from paho.mqtt import client as mqtt


broker = '127.0.0.1'
port = 1883
topic = "python/mqtt"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{random.randint(0, 1000)}'


def connect_mqtt():
    def on_connect(client, userdata, flags, rc,properties):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client =  mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id) 
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def publish(client):
    msg_count = 0
    while True:
        time.sleep(1)
        msg = f"messages: {msg_count}"
        result = client.publish(topic, msg)
        # result: [0, 1]
        status = result[0]
        if status == 0:
            print(f"Send `{msg}` to topic `{topic}`")
        else:
            print(f"Failed to send message to topic {topic}")
        msg_count += 1


def run():
    client = connect_mqtt()
    client.loop_start()
    publish(client)


if __name__ == '__main__':
    run()

订阅

# python3.6

import random

from paho.mqtt import client as mqtt


broker = '127.0.0.1'
port = 1883
topic = "/python/mqtt"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{random.randint(0, 100)}'


def connect_mqtt() -> mqtt:
    def on_connect(client, userdata, flags, rc,properties):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client =  mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id) 
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def subscribe(client: mqtt):
    def on_message(client, userdata, msg):
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")

    client.subscribe(topic)
    client.on_message = on_message


def run():
    client = connect_mqtt()
    subscribe(client)
    client.loop_forever()


if __name__ == '__main__':
    run()

实验 

Device1 通过自然语言控制 Device2。

GPTAgent 调用大语言模型,完成语言的理解,调用本地llama-3 或者远程调用kimi大模型。

Device2 模仿一个空调设备。

topic 定义

Device To ChatGPTDevice/GPT
chatGPT to DeviceGPT/Device
Device to DeviceDevice/Device

仿真程序

 为了做实验,编写了两个设备和一个Chat GPT Agent的仿真软件.使用Python 编写。

Device1  传感器

 定时地采集温度,并向Device2 发送控制命令。

Devices2 控制器

接收Device 1 发送的控制命令,控制空调。

具体的方法

  • TurnOn- 开启空调
  • TurnOff-关闭空调
  • Up-调高温度
  • Down-调低温度

控制流程

  •  订阅Device/Device 主题的信息
  • 订阅Device/GPT 主题的信息
  • 当接收到 Device1 发送来的消息后,组织大语言模型的Prompt ,发送给chatGPT IoT Agent(主题为Device/GPT),chatGPT 解析自然语言,将结果发布给Device 2 设备(主题为GPT/Device )
  • Device2 根据chatGPT 解析的结果,控制设备。
chatGPT Agent

        订阅 Device/GPT 主题的信息,做出自然语言命令的解释,然后将结果返回给发送的设备。

为了提高大语言模型服务的实时性,在PC 机上部署了ollama /llama-3 大模型。

源代码

GPTAgent

# python3.6

import random
from openai import OpenAI
from paho.mqtt import client as mqtt


broker = '127.0.0.1'
port = 1883
topic = "Device/GPT"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{random.randint(0, 100)}'
#LLM = OpenAI(base_url="http://localhost:11434/v1", api_key="lm-studio")
LLM=OpenAI(
    api_key="sk-xxxxxxx",
    base_url="https://api.moonshot.cn/v1",
)
def connect_mqtt() -> mqtt:
    def on_connect(client, userdata, flags, rc,properties):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client =  mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id) 
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def subscribe(client: mqtt):
    def on_message(client, userdata, msg):
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
        
        history = [
            {"role": "system", "content": "你是一个聪明的助手。你总是提供合理、准确且有帮助的答案。总是用中文简体回答"},
            {"role": "user", "content": msg.payload.decode()},
        ]
        completion = LLM.chat.completions.create(
            model="moonshot-v1-8k",
            messages=history,
            temperature=0,
           
        )
        Response=completion.choices[0].message.content
        print(Response)
        result = client.publish("GPT/Device", Response.encode('utf-8'))
        # result: [0, 1]
        status = result[0]
        if status == 0:
            print(f"Send `{msg}` to topic `{topic}`")
        else:
            print(f"Failed to send message to topic {topic}")
        
    client.subscribe(topic)
    client.on_message = on_message


def run():
    client = connect_mqtt()
    subscribe(client)
    client.loop_forever()


if __name__ == '__main__':
    run()

Device2

# python3.6

import random
import json
from paho.mqtt import client as mqtt


broker = '127.0.0.1'
port = 1883
#topic = "GPT/Device"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{random.randint(0, 100)}'


def connect_mqtt() -> mqtt:
    def on_connect(client, userdata, flags, rc,properties):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client =  mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id) 
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def subscribe(client: mqtt):
    def on_message(client, userdata, msg):
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
        if msg.topic=="Device/Device":
            print("Device to Device")
            Prefix='''针对下面的命令,判断应该调用哪个工具执行:
                      工具:
                        TurnOn:打开空调
                        TurnOff:关闭空调
                        Up: 调高温度
                        Down:调低空调
                      命令:  
                   '''
            Suffix='''请以JSON 格式输出,格式为:
                /`/`/`json
                   {"ToolName":"The Name Of Tool"}
                   /`/`/`
                   '''
            Prompt=Prefix+msg.payload.decode()+ Suffix      
            client.publish("Device/GPT", Prompt)
        else:
            if msg.topic=="GPT/Device":
               print("GPT/Device")
               Result=msg.payload.decode()
               p=Result.find("```json")
               print(p)
               if p>=0:
                  Temp=Result.replace("```json","")
                  e=Temp.find("```") 
                  print(e)
                  print(Temp[p:e])
                  JsonContent=json.loads(Temp[p:e]) 
                  print(JsonContent)
                  if JsonContent["ToolName"]=="TurnOn":
                         print("打开空调!")
                  else:
                      if JsonContent["ToolName"]=="TurnOff":
                             print("关闭空调!")
                      else:
                          if JsonContent["ToolName"]=="Up":
                                 print("调高空调温度!")
                          else:
                             if JsonContent["ToolName"]=="Down":
                                    print("调低空调温度!") 
                          
    client.subscribe("GPT/Device")
    client.subscribe("Device/Device")
    client.on_message = on_message


def run():
    client = connect_mqtt()
    subscribe(client)
    client.loop_forever()


if __name__ == '__main__':
    run()

Device1

# python 3.6

import random
import time

from paho.mqtt import client as mqtt


broker = '127.0.0.1'
port = 1883
topic = "Device/Device"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{random.randint(0, 1000)}'


def connect_mqtt():
    def on_connect(client, userdata, flags, rc,properties):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client =  mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id) 
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def publish(client):
    msg_count = 0
    while True:
        time.sleep(5)
        #msg = f"messages: {msg_count}"
        if (msg_count & 1) == 0: 
             msg="请打开空调!"
        else:
             msg="请关闭空调!"  
        result = client.publish(topic, msg.encode('utf-8'))
        # result: [0, 1]
        status = result[0]
        if status == 0:
            print(f"Send `{msg}` to topic `{topic}`")
        else:
            print(f"Failed to send message to topic {topic}")
        msg_count += 1


def run():
    client = connect_mqtt()
    client.loop_start()
    publish(client)


if __name__ == '__main__':
    run()

结果

  Device1 的发送周期为5秒钟,kimi 大模型响应自如。而本地llama-3 速度还是不行。

应用场景

使用自然语言作为物联网的通信语言的缺点是

  •    延时长
  •   成本高

 对于实时性要求不高的应用场景,有一定的应用场景。

设备添加一个维护接口

        为设备添加一个自然语言的维护接口,具有很大的好处,以前的设备通常也保留了一个字符终端的命令行接口,当设备发生故障,或者需要配置,维护时,使用命令行控制设备,现在可以转换成自然语言来维护。自然语言适合远程操作。不需要记忆各种命令的格式。

  另一个好处是当设备发生故障时,可以手动操作。

        自然语言命令接口也有利于与上层软件的兼容。使上层软件更加灵活,并且与各种厂商的设备互联互通。

不同生态系统的互联

        例如小米的设备与华为的设备互联互通,可以采用自然语言通信。

进一步的思考

        实现IoT 设备的自然语言通信,只需要一个小型的语言模型就可以实现,并且在IoT 领域增强,这种小型的IoTModel 部署在云端,或者边缘。随着AI 成本的下降,也许很快能够出现IoT GPT 服务器产品出现。基于自然语言的IoT 通信将会流行起来。他们将会在智慧城市,工业,智能家居,农业,环境等行业流行起来。

      笔者相信,除了物联网应用之外,自然语言通信协议的另一个巨大的潜在市场是政府,大企业之间异构系统的互联互通。比如在一个医院信息管理系统中,医生的电脑要调用各种检查报告,查询病例,床位信息。这都要通过复杂的API 实现,当需要更新API,或者添加一项新的数据科目时,所有相关的软件都需要做相应的更新。除了医院信息管理系统的厂商能够做软件的更新之外,别的厂商难以介入。这就人为地设置了各种“数据墙”,难以挖掘医学数据。使用“自然语言”协议能够解决异构系统的信息共享。

        信息共享是人们朝思暮想的目标,但是长期以来难以实现,为此还不断地推广类似DDS,OPCUA 等统一的协议,老实说,许多年过去了,收效甚微。也许,自然语言将成为异种机互联的终结协议,我们将迎来“让机器说人话”的时候了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka·Producer

Producer发送原理 拦截器进行拦截 对key和value进行序列化 org.apache.kafka.clients.producer.KafkaProducer#doSend 分区选择 计算消息要发送到topic的哪个分区上 若指定了分区,则使用指定的值没有指定的话则使用分区器计算得到或者使用hash取余的方式 暂存…

Stm32通过SPI读写W25QXX

Printf的重定向 因为printf是c中的库函数,要使用printf输出到串口,需要重定向,将printf定向到HAL_UART_Transmit。 新建一个retarget.c文件。 #include "stdio.h" #include "stm32f1xx_hal.h" #include "usart.h&…

创意无限,尽在掌握:热门视频剪辑软件一览

我们记录生活、分享故事、传播信息用视频的频率越来越高了。而这些视频往往都是通过剪辑之后才能展示出当前的效果。那这次我们就来探索剪辑视频的时候都会用到什么工具吧。 1.福昕视频剪辑 连接直达>>https://www.pdf365.cn/foxit-clip/ 这是一款专为追求高效与创意…

Pytorch 张量运算函数(补充)

mean() mean()函数是进行张量均值计算的函数,常用参数可以设置参数dim来进行对应维度的均值计算 以下是使用一个二维张量进行演示的例子 import numpy as np import torch device torch.device(mps if torch.backends.mps.is_available() else cpu) print(device ) data1 …

【数据管理】数据治理

目录 1、相关概念 2、数据治理和管理职责语境关系图 3、业务驱动因素 4、目标和原则 5、 数据治理和数据管理的关系 6、数据治理组织 7、数据管理职能 8、数据制度 9、数据资产估值 1、相关概念 1)战略(Stategy):定义、交流和驱动数据战略和数…

[数据集][目标检测]电力场景输电线异物检测数据集VOC+YOLO格式2060张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2060 标注数量(xml文件个数):2060 标注数量(txt文件个数):2060 标注…

电脑丢失dll文件一键修复之dll确实损坏影响电脑运行

在使用电脑过程中,DLL文件丢失或损坏是一个常见的问题,它可能导致程序无法正常运行,甚至影响整个系统的稳定性。本文将详细介绍如何一键修复丢失的DLL文件,探讨常见的DLL丢失报错原因,并提供详细的修复步骤和预防措施。…

sklearn回归树

说明:内容来自菜菜的sklearn机器学习和ai生成 回归树 调用对象的参数 class sklearn.tree.DecisionTreeRegressor (criterion’mse’, splitter’best’, max_depthNone, min_samples_split2, min_samples_leaf1, min_weight_fraction_leaf0.0, max_featuresNone…

大数据基础:数仓架构演变

文章目录 数仓架构演变 一、传统离线大数据架构 二、​​​​​​Lambda架构 三、Kappa架构 四、​​​​​​​​​​​​​​混合架构 五、湖仓一体架构 六、流批一体架构 数仓架构演变 20世纪70年代,MIT(麻省理工)的研究员致力于研究一种优化的技术架构&…

Linux shell编程学习笔记75:sed命令——沧海横流任我行(下)

0 前言 在 Linux shell编程学习笔记73:sed命令——沧海横流任我行(上)-CSDN博客文章浏览阅读684次,点赞32次,收藏24次。在大数据时代,我们要面对大量数据,有时需要对数据进行替换、删除、新增、…

OpenCV几何图像变换(9)仿射变换函数warpAffine()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 函数是应用一个仿射变换到图像上。 warpAffine 函数使用指定的矩阵对源图像进行仿射变换: dst ( x , y ) src ( M 11 x M 12 y M…

Elasticsearch:使用 ELSER 进行语义搜索 - sparse_vector

Elastic Learned Sparse EncodeR(或 ELSER)是由 Elastic 训练的 NLP 模型,可让你使用稀疏向量表示执行语义搜索。语义搜索不是根据搜索词进行文字匹配,而是根据搜索查询的意图和上下文含义检索结果。 本教程中的说明向你展示了如…

[医疗 AI ] 3D TransUNet:通过 Vision Transformer 推进医学图像分割

[医疗 AI ] 3D TransUNet:通过 Vision Transformer 推进医学图像分割’ 论文地址 - https://arxiv.org/pdf/2310.07781 0. 摘要 医学图像分割在推进医疗保健系统的疾病诊断和治疗计划中起着至关重要的作用。U 形架构,俗称 U-Net,已被证明在…

提高实时多媒体传输效率的三大方法

实时多媒体数据传输面临的挑战 实时多媒体数据的传输具有数据量巨大、对时延和时延抖动高度敏感及能容忍丢分组的特点。然而,当今互联网的网络层协议提供的仅是一种“尽最大努力服务”,对分组的端到端时延、时延抖动和分组丢失率等指标不做任何承诺。这…

MySQL的延迟复制

目录 1 MySQL 延迟复制介绍 1.1 延迟复制语法: 1.2 延迟复制可用于多种用途: 1.3 延迟复制的有关的参数 1.4 延迟复制的操作 2 MySQL 延迟复制 实操 2.1 实验环境 2.2 对 SLAVE --MySQL-3 进行延迟复制操作 2.3 停止相关进程的原因 2.4 实验测试 2.5 动…

Variomes:支持基因组变异筛选的高召回率搜索引擎

《Bioinformatics》2022 Variomes: https://candy.hesge.ch/Variomes Source code: https://github.com/variomes/sibtm-variomes SynVar: https://goldorak.hesge.ch/synvar 文章摘要(Abstract) 动机(Mot…

读软件开发安全之道:概念、设计与实施07密码学(上)

1. 加密工具 1.1. 加密工具之所以没有得到充分使用,就是因为人们往往认为密码学是一个准入门槛极高的专业领域 1.2. 如今的加密学大部分都源自纯数学,所以只要能够正确使用,加密学确实行之有效 1.2.1. 不代表这些算法本身确实无法破解&…

机器学习 | 基于wine数据集的KMeans聚类和PCA降维案例

KMeans聚类:K均值聚类是一种无监督的学习算法,它试图根据数据的相似性对数据进行聚类。无监督学习意味着不需要预测结果,算法只是试图在数据中找到模式。在k均值聚类中,我们指定希望将数据分组到的聚类数。该算法将每个观察随机分…

四大消息队列:Kafka、ActiveMQ、RabbitMQ、RocketMQ对比

四大消息队列:Kafka、ActiveMQ、RabbitMQ、RocketMQ对比 1. 社区活跃度2. 持久化消息3. 技术实现4. 高并发性能5. RabbitMQ与Kafka对比 💖The Begin💖点点关注,收藏不迷路💖 在软件开发中,消息队列&#xf…

【Redis】Redis数据结构——Hash 哈希

哈希 命令hsethgethexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhincrbyfloat命令小结 内部编码使用场景缓存⽅式对⽐ ⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中&#…