【ESP32接入语言大模型之智谱清言】

1. 智谱清言

讲解视频:

随着人工智能技术的不断发展,自然语言处理领域也得到了广泛的关注和应用。智谱清言作为千亿参数对话模型 基于ChatGLM2模型开发,支持多轮对话,具备内容创作、信息归纳总结等能力。可以快速注册体验中国版语言大模型,与GLM大模型进行对话。本文将重点介绍如何通过ESP32接入国产大模型之智谱清言api。
智谱清言官网地址:https://open.bigmodel.cn/
上一篇博客已经分享了
【ESP32接入国产大模型之文心一言】
【ESP32接入语言大模型之通义千问】
这一次还是采用Arduino编程就会轻松许多开发。这样就可以把大模型装进口袋啦🤣🤣🤣

在这里插入图片描述

1.1 了解智谱清言api

为方便用户使用,我们提供了 SDK 和原生 HTTP 来实现模型 API 的调用,建议您使用 SDK 进行调用以获得更好的编程体验。
api简介

官方提供两种SDK调用方
Python: https://github.com/zhipuai/zhipuai-sdk-python
Java: https://github.com/zhipuai/zhipuai-sdk-java。

在这里插入图片描述

1.1.1 SDK调用方式

平台提供了同步、异步、SSE 三种调用方式(调用方式取决于具体模型的支持情况)

  1. 同步调用
    调用后即可一次性获得最终结果
import zhipuai
zhipuai.model_api.invoke(
    model="具体的模型编码",
    ... # 具体模型参数
)
  1. 异步调用
    调用后会立即返回一个任务 ID ,然后用任务ID查询调用结果(根据模型和参数的不同,通常需要等待10-30秒才能得到最终结果)
import zhipuai
zhipuai.model_api.async_invoke(
    model="具体的模型编码",
    ... # 具体模型参数
)
  1. SSE 调用(可参考Server-Sent Events 教程)
    调用后可以流式的实时获取到结果直到结束
import zhipuai
zhipuai.model_api.sse_invoke(
    model="具体的模型编码",
    ... # 具体模型参数
)

1.1.2 HTTP 调用

同时支持标准的 HTTP 调用

POST https://open.bigmodel.cn/api/paas/v3/model-api/{model}/{invoke_method}

请求头
Content-Type : application/json

Authorization : 鉴权token,见如下 接口鉴权说明

路径参数
model : 具体的模型编码

invoke_method : 调用方式,取值为 invoke : 同步调用,async-invoke : 异步调用,sse-invoke : SSE 调用

1.2 接口鉴权

我们的所有 API 使用 API Key 进行身份验证。您可以访问智谱AI开放平台 API Keys 页面查找您将在请求中使用的 API Key。

提示 请注意保护您的密钥信息!不要与他人共享或在任何客户端代码(浏览器、应用程序)中公开您的 API Key。如您的 API Key存在泄露风险,您可以通过删除该密钥来保护您的账户安全。

本版本对鉴权方式进行了升级,历史已接入平台的用户可继续沿用老版本的鉴权方式。新版本的鉴权方法可参考以下详细描述:

1.2.1 非SDK用户鉴权

在调用模型接口时需要传鉴权 token 进行认证;当前平台鉴权 token 由用户端生成,鉴权 token 生成采用标准 JWT 中提供的创建方法生成(详细参考:https://jwt.io/introduction)。

第一步 获取您的 API Key

登录到智谱AI开放平台 API Keys 页面获取最新版生成的用户 API Key

新版机制中平台颁发的 API Key 同时包含 “用户标识 id” 和 “签名密钥 secret”,即格式为 {id}.{secret} 。

第二步 使用 JWT 组装

用户端需引入对应 JWT 相关工具类,并按以下方式组装 JWT 中 header、payload 部分

1、header 具体示例

{“alg”:“HS256”,“sign_type”:“SIGN”}

alg : 属性表示签名使用的算法,默认为 HMAC SHA256(写为HS256)

sign_type : 属性表示令牌的类型,JWT 令牌统一写为 SIGN 。

2、payload 具体示例

{“api_key”:{ApiKey.id},“exp”:1682503829130, “timestamp”:1682503820130}

api_key : 属性表示用户标识 id,即用户API Key的{id}部分
exp : 属性表示生成的JWT的过期时间,客户端控制,单位为毫秒
timestamp : 属性表示当前时间戳,单位为毫秒
第三步 将鉴权 token 放入 HTTP 请求的 header 中

用户需要将生成的鉴权 token 放入 HTTP 的 Authorization header 头中:

Authorization: 鉴权token

Example: Python 语言中的鉴权 token 组装过程

import time
import jwt

def generate_token(apikey: str, exp_seconds: int):
    try:
        id, secret = apikey.split(".")
    except Exception as e:
        raise Exception("invalid apikey", e)

    payload = {
        "api_key": id,
        "exp": int(round(time.time() * 1000)) + exp_seconds * 1000,
        "timestamp": int(round(time.time() * 1000)),
    }

    return jwt.encode(
        payload,
        secret,
        algorithm="HS256",
        headers={"alg": "HS256", "sign_type": "SIGN"},
    )

apikey = "d210a197ee4e2afde338aefd594bf111.VQCNSY1234LhBsax"
exp_seconds = 3600*24*10
print(generate_token(apikey,exp_seconds))

打印API key信息
在这里插入图片描述

1.4 同步调用

接口请求

传输方式https
请求地址https://open.bigmodel.cn/api/paas/v3/model-api/chatglm_turbo/invoke
调用方式同步调用,等待模型执行完成并返回最终结果
字符编码UTF-8
接口请求格式JSON
响应格式JSON
接口请求类型POST
开发语言任意可发起 http 请求的开发语言

1.4.1 接口请求参数

在这里插入图片描述
Python 调用示例

zhipuai.api_key = "your api key"
# 请求模型
response = zhipuai.model_api.invoke(
    model="chatglm_turbo",
    prompt=[
        {"role": "user", "content": "你好"},
        {"role": "assistant", "content": "我是人工智能助手"},
        {"role": "user", "content": "你叫什么名字"},
        {"role": "assistant", "content": "我叫chatGLM"},
        {"role":"user", "content":"你都可以做些什么事"},
    ]
)

大家根据自己的需要选择参数,注意上面框框是必填内容下面代码有所体现。

1.4.2 接口响应参数

在这里插入图片描述
响应示例

{
  "code": 200,
  "msg": "",
  "success": true,
  "data": {
      "task_id": "75931252186628016897601864755556524089",
      "request_id": "123445676789",
      "task_status": "SUCCESS",
      "choices": [
          {"role": "assistant", "content":"作为一个大型语言模型,我可以完成许多不同的任务,包括但不限于: \n1. 回答问题 \n2.提供建议……"}
      ],
      "usage": {
          "prompt_tokens": 215,
          "completion_tokens": 302,
          "total_tokens": 517
      }     
  }
}

2. 先决条件

在继续此项目之前,请确保检查以下先决条件。

我们将使用 Arduino IDE 对 ESP32/ESP8266 开发板进行编程,因此在继续本教程之前,请确保已在 Arduino IDE 中安装这些开发板。

2.1 环境配置

  1. Arduino IDE:下载并安装 Arduino IDE;
  2. ESP32 开发板库:在 Arduino IDE 中添加 ESP32 支持;
    参考博客:【esp32c3配置arduino IDE教程】
    为安装过程留出一些时间,具体时间可能因您的互联网连接而异。

2.2 所需零件

要学习本教程,您需要1个 ESP32 开发板或者ESP32C3,建议使用后者,笔者发现同样的代码后者可以轻松调用,ESP32不行(可能板子坏了)

  • 1 x ESP32(阅读最佳 ESP32开发板)
  • 1 x ESP32C3(实惠的Arduino开发板——合宙ESP32C3)
    在这里插入图片描述

3. 核心代码

esp32 Arduino代码如下

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

// Replace with your network credentials
const char* ssid = "J09 502";
const char* password = "qwertyuiop111";

// Replace with your OpenAI API key
const char* apiKey = "eyJhbGciE0OTI4O1NiIsInNpZ25fdHlwZSI6IlNJR04iOjE3MDU2NjE0OTI4.eyJhcGlfa2V5IjoiZDIxMGExOTdlZTRlMmFmZGUzMzhhZWZkNTk0YmZkYWEiLCJleHAiOjE3MDU2NjE0OTI4OTAsGtQbYpnTTdGFtcCI6MTcwNDc5NzQ5Mjg5MH0._NT2-3q6ndo-RMiHUs4Irb0GtQbYpnTT0piBuXbgFds";

// Send request to OpenAI API
String inputText = "你好,智谱!";
String apiUrl = "https://open.bigmodel.cn/api/paas/v3/model-api/chatglm_turbo/invoke";

String answer;
String getGPTAnswer(String inputText) {
  HTTPClient http;
  http.begin(apiUrl);
  http.addHeader("Content-Type", "application/json");
  http.addHeader("Authorization", String(apiKey));
  String payload = "{\"prompt\":{\"role\": \"user\",\"content\": \"" + inputText + "\"}}";
  int httpResponseCode = http.POST(payload);
  if (httpResponseCode == 200) {
    String response = http.getString();
    http.end();
    Serial.println(response);

    // Parse JSON response
    DynamicJsonDocument jsonDoc(1024);
    deserializeJson(jsonDoc, response);
    String outputText = jsonDoc["data"]["choices"][0]["content"];
    return outputText;
    // Serial.println(outputText);
  } else {
    http.end();
    Serial.printf("Error %i \n", httpResponseCode);
    return "<error>";
  }
}

void setup() {
  // Initialize Serial
  Serial.begin(115200);

  // Connect to Wi-Fi network
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
  answer = getGPTAnswer(inputText);
  Serial.println("Answer: " + answer);
  Serial.println("Enter a prompt:");

}

void loop() {
  // do nothing
  if (Serial.available()) {
    inputText = Serial.readStringUntil('\n');
    // inputText.trim();
    Serial.println("\n Input:"+inputText);

    answer = getGPTAnswer(inputText);
    Serial.println("Answer: " + answer);
    Serial.println("Enter a prompt:");
  }
  // delay(2);
}

这段代码是一个基于Arduino平台(可能是ESP32或ESP8266)的示例,它通过WiFi连接到指定的无线网络,并利用HTTPClient库向智谱清言API发送POST请求以获取AI生成的回答。以下是详细的解释:

  1. 导入必要的库:
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

  1. 第一处修改定义Wi-Fi网络凭证:
const char* ssid = "J09 502";
const char* password = "qwertyuiop111";
  1. 第二处修改定义要调用的APIkey:
const char* apiKey = "eyJhbGciE0OTI4O1NiIsInNpZ25fdHlwZSI6IlNJR04iOjE3MDU2NjE0OTI4.eyJhcGlfa2V5IjoiZDIxMGExOTdlZTRlMmFmZGUzMzhhZWZkNTk0YmZkYWEiLCJleHAiOjE3MDU2NjE0OTI4OTAsGtQbYpnTTdGFtcCI6MTcwNDc5NzQ5Mjg5MH0._NT2-3q6ndo-RMiHUs4Irb0GtQbYpnTT0piBuXbgFds";
  1. 定义输入文本和函数 getGPTAnswer(String inputText):
  • 输入文本是固定的问候语"你好,文通义千问",在实际应用中可以根据需要修改。
  • 函数 getGPTAnswer() 负责执行以下操作:
    初始化HTTPClient对象并设置目标URL。设置Content-Type头信息,构造请求体payload,将用户输入的内容添加到JSON结构中。发送POST请求并检查HTTP响应码。如果响应码为200,则读取并解析返回的JSON数据,提取出结果字段作为回答。若非200,则返回错误字符串 “”。
  1. setup() 函数:
  • 初始化串口通信, 连接到指定的Wi-Fi网络。
  • 连接成功后,获取一个初始的回答并打印出来,然后提示用户输入新的问题。
  1. loop() 函数:
  • 检查串口是否有可用的数据输入。
  • 如果有新输入,读取一行内容,调用 getGPTAnswer() 函数获取AI回答,并将对话过程输出到串口。

注意:虽然代码中有OpenAI API相关注释,但实际上该代码是针对通义千问API编写的。如果你想要与OpenAI API交互,你需要使用OpenAI提供的API URL、access token及相应的JSON结构进行请求。

4. 上传验证

打开串口监视器,注意右下角选择换行符,选择115200波特率,输入你想问的问题,他就可以回答你

4.1 对话测试

在这里插入图片描述

4.2 报错

如果返回error ,大家对照列表查询错误代码,结合提示排查解决
在这里插入图片描述

5. 总结

🥳🥳🥳现在,我们在本教程中,您学习了如何使用ESP32接入语言大模型之智谱清言。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,后期会持续分享esp32跑freertos实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣

如果你有任何问题,可以通过下面的二维码加入鹏鹏小分队,期待与你思维的碰撞😘😘😘

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习 | 无监督聚类K-means和混合高斯模型

机器学习 | 无监督聚类K-means和混合高斯模型 1. 实验目的 实现一个K-means算法和混合高斯模型&#xff0c;并用EM算法估计模型中的参数。 2. 实验内容 用高斯分布产生 k k k个高斯分布的数据&#xff08;不同均值和方差&#xff09;&#xff08;其中参数自己设定&#xff…

第十三讲 单片机驱动彩色液晶屏 bin档的烧录方法

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

解锁 JavaScript 数组的强大功能:常用方法和属性详解(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

摆脱油光和黑头,先敷15分钟的亚马逊白泥面膜吧

寒冷干燥的冬季&#xff0c;是皮肤最容易出现问题的时候&#xff0c;像是油性皮肤就更容易出油&#xff0c;另外黑头之类的问题也会变得更加常见。因此&#xff0c;在这个季节里&#xff0c;我们需要特别注意保护皮肤&#xff0c;多多补水保湿&#xff0c;同时深入清洁毛孔是非…

SpringCloud.03.网关Gateway

目录 网关Gateway的概念&#xff1a; 准备 使用 方式一 因为配置了网关所以可以直接通过gateway发送请求 方式二 修改配置前&#xff1a;http://localhost:8082/provider/run 方式三(动态路由) 导入配置类 网关Gateway的概念&#xff1a; Spring Cloud Gateway 是 Spri…

分布形态的度量_峰度系数的探讨

集中趋势和离散程度是数据分布的两个重要特征,但要全面了解数据分布的特点&#xff0c;还应掌握数据分布的形态。 描述数据分布形态的度量有偏度系数和峰度系数, 其中偏度系数描述数据的对称性,峰度系数描述与正态分布的偏离程度。 峰度系数反映分布峰的尖峭程度的重要指标. 当…

失踪人员信息发布与管理系统:计算机毕设课题的研究与实践 springboot+java+vue+mysql

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

认知觉醒(九)

认知觉醒(九) 专注力——情绪和智慧的交叉地带 第一节 情绪专注&#xff1a;一招提振你的注意力 用元认知来观察自己的注意力是一件很有意思的事情&#xff0c;相信你可以轻易观察到这种现象&#xff1a;身体做着A&#xff0c;脑子却想着B。 跑步的时候&#xff0c;手脚在…

力扣日记1.14-【二叉树篇】108. 将有序数组转换为二叉搜索树

力扣日记&#xff1a;【二叉树篇】108. 将有序数组转换为二叉搜索树 日期&#xff1a;2023.1.14 参考&#xff1a;代码随想录、力扣 108. 将有序数组转换为二叉搜索树 题目描述 难度&#xff1a;简单 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;…

现代控制理论基础

在学习卡尔曼滤波、粒子滤波、隐马尔可夫模型时候&#xff0c;经常会提到状态方程的概念&#xff0c;这边联想到当时学习过的一门课程现代控制理论&#xff0c;这边就简单回顾一下吧。在回顾之前&#xff0c;串联下高等数学中微分方程的知识点。 一. 微分方程 高等数学上册第…

架构师 - 架构师是做什么的 - 学习总结

架构师核心定义 架构师是什么 架构师是业务和技术之间的桥梁 架构师的核心职责是消除不确定性、和降低复杂性 架构设计环 架构师的三个核心能力 架构师的三个关键思维 架构师主要职责 架构设计 Vs 方案设计 架构设计前期 主要任务 澄清不确定性 明确利益干系人的诉求消除冲…

10.9.2 std::function 非OO的多态实现 Page185~187

源代码&#xff1a; #include <iostream> #include <functional> #include <list>using namespace std;//使用function模板类定义一个类型&#xff0c; //该类型要求作为T的 //函数类型是参数是string,返回值是void typedef std::function <void (std::s…

全链路压测方案(一)—方案调研

一、概述 在业务系统中&#xff0c;保证系统稳定至关重要&#xff0c;直接影响线上业务稳定和性能。测试工作作为保证生产质量的最后一关&#xff0c;扮演者重要的角色。全链路压测是一种重要的测试工具和手段。可以解决系统中多环节多节点无法全流程打满流量的痛点问题&a…

Ubuntu 22.04 Cron使用

需要定时处理的场景还是比较多的&#xff0c;比如信息推送、日志清理等。 这篇文章我们来说说如何使用cron来实现定时处理&#xff0c;以及监控任务的执行。 使用 Ubuntu中使用cron&#xff0c;要用到的命令是crontab。不加sudo时&#xff0c;处理的是个人的定时任务。当加上…

pytorch集智4-情绪分类器

1 目标 从中文文本中识别出句子里的情绪。和上一章节单车预测回归问题相比&#xff0c;这个问题是分类问题&#xff0c;不是回归问题 2 神经网络分类器 2.1 如何用神经网络分类 第二章节用torch.nn.Sequantial做的回归预测器&#xff0c;输出神经元只有一个。分类器和其区别…

计算机网络期末复习(基础概念+三套卷子练习)

第一章&#xff1a;计算机网络概念 计算机网络的概念 计算机网络的定义 计算机网络是指将地理位置不同的 具有独立功能的多台计算机 及其外部设备&#xff0c;通过 通信线路链接 起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#…

【生存技能】git操作

先下载git https://git-scm.com/downloads 我这里是win64&#xff0c;下载了相应的直接安装版本 64-bit Git for Windows Setup 打开git bash 设置用户名和邮箱 查看设置的配置信息 获取本地仓库 在git bash或powershell执行git init&#xff0c;初始化当前目录成为git仓库…

精品量化公式——“区域突破”,应对当下行情较好的主图看盘策略

不多说&#xff0c;直接上效果如图&#xff1a; ► 日线表现 代码评估 技术指标代码评估&#xff1a; VAR1, VAR2, VAR3&#xff1a;这些变量是通过指数移动平均&#xff08;EMA&#xff09;计算得出的。EMA是一种常用的技术分析工具&#xff0c;用于平滑价格数据并减少市场“…

Ubuntu共享文件到win

Ubuntu共享文件到win 1、安装samba sudo apt-get install samba samba-common2、创建一个共享文件夹&#xff0c;并设置777权限 mkdir /home/qyh/share sudo chmod 777 /home/qyh/share我的用户名&#xff1a;qyh。 3、添加用户及密码 sudo smbpasswd -a qyh4、修改配置文…

操作系统复习篇

目录 一、引论 1.1、操作系统的目标 方便性&#xff1a; 有效性&#xff1a; 可扩充性&#xff1a; 开放性&#xff1a; 1.2、操作系统的作用 用户与计算机硬件系统之间的接口&#xff1a; 计算机系统资源的管理者&#xff1a; 实现对计算机资源的抽象&#xff1a; 1…