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 三种调用方式(调用方式取决于具体模型的支持情况)
- 同步调用
调用后即可一次性获得最终结果
import zhipuai
zhipuai.model_api.invoke(model="具体的模型编码",... # 具体模型参数
)
- 异步调用
调用后会立即返回一个任务 ID ,然后用任务ID查询调用结果(根据模型和参数的不同,通常需要等待10-30秒才能得到最终结果)
import zhipuai
zhipuai.model_api.async_invoke(model="具体的模型编码",... # 具体模型参数
)
- 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 jwtdef 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 环境配置
- Arduino IDE:下载并安装 Arduino IDE;
- 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 responseDynamicJsonDocument 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 SerialSerial.begin(115200);// Connect to Wi-Fi networkWiFi.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 nothingif (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生成的回答。以下是详细的解释:
- 导入必要的库:
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
- 第一处修改定义Wi-Fi网络凭证:
const char* ssid = "J09 502";
const char* password = "qwertyuiop111";
- 第二处修改定义要调用的APIkey:
const char* apiKey = "eyJhbGciE0OTI4O1NiIsInNpZ25fdHlwZSI6IlNJR04iOjE3MDU2NjE0OTI4.eyJhcGlfa2V5IjoiZDIxMGExOTdlZTRlMmFmZGUzMzhhZWZkNTk0YmZkYWEiLCJleHAiOjE3MDU2NjE0OTI4OTAsGtQbYpnTTdGFtcCI6MTcwNDc5NzQ5Mjg5MH0._NT2-3q6ndo-RMiHUs4Irb0GtQbYpnTT0piBuXbgFds";
- 定义输入文本和函数 getGPTAnswer(String inputText):
- 输入文本是固定的问候语"你好,文通义千问",在实际应用中可以根据需要修改。
- 函数 getGPTAnswer() 负责执行以下操作:
初始化HTTPClient对象并设置目标URL。设置Content-Type头信息,构造请求体payload,将用户输入的内容添加到JSON结构中。发送POST请求并检查HTTP响应码。如果响应码为200,则读取并解析返回的JSON数据,提取出结果字段作为回答。若非200,则返回错误字符串 “”。
- setup() 函数:
- 初始化串口通信, 连接到指定的Wi-Fi网络。
- 连接成功后,获取一个初始的回答并打印出来,然后提示用户输入新的问题。
- 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实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣
如果你有任何问题,可以通过下面的二维码加入鹏鹏小分队,期待与你思维的碰撞😘😘😘