讲解视频:
随着人工智能技术的不断发展,自然语言处理领域也得到了广泛的关注和应用。智谱清言作为千亿参数对话模型 基于ChatGLM2模型开发,支持多轮对话,具备内容创作、信息归纳总结等能力。可以快速注册体验中国版语言大模型,与GLM大模型进行对话。本文将重点介绍如何通过ESP32接入国产大模型之智谱清言api。
智谱清言官网地址:https://open.bigmodel.cn/
上一篇博客已经分享了
【ESP32接入国产大模型之文心一言】
【ESP32接入语言大模型之通义千问】
这一次还是采用Arduino编程就会轻松许多开发。这样就可以把大模型装进口袋啦🤣🤣🤣
为方便用户使用,我们提供了 SDK 和原生 HTTP 来实现模型 API 的调用,建议您使用 SDK 进行调用以获得更好的编程体验。
api简介
官方提供两种SDK调用方
Python: https://github.com/zhipuai/zhipuai-sdk-python
Java: https://github.com/zhipuai/zhipuai-sdk-java。
平台提供了同步、异步、SSE 三种调用方式(调用方式取决于具体模型的支持情况)
import zhipuai
zhipuai.model_api.invoke(
model="具体的模型编码",
... # 具体模型参数
)
import zhipuai
zhipuai.model_api.async_invoke(
model="具体的模型编码",
... # 具体模型参数
)
import zhipuai
zhipuai.model_api.sse_invoke(
model="具体的模型编码",
... # 具体模型参数
)
同时支持标准的 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 调用
我们的所有 API 使用 API Key 进行身份验证。您可以访问智谱AI开放平台 API Keys 页面查找您将在请求中使用的 API Key。
提示 请注意保护您的密钥信息!不要与他人共享或在任何客户端代码(浏览器、应用程序)中公开您的 API Key。如您的 API Key存在泄露风险,您可以通过删除该密钥来保护您的账户安全。
本版本对鉴权方式进行了升级,历史已接入平台的用户可继续沿用老版本的鉴权方式。新版本的鉴权方法可参考以下详细描述:
在调用模型接口时需要传鉴权 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信息
接口请求
传输方式 | https |
---|---|
请求地址 | https://open.bigmodel.cn/api/paas/v3/model-api/chatglm_turbo/invoke |
调用方式 | 同步调用,等待模型执行完成并返回最终结果 |
字符编码 | UTF-8 |
接口请求格式 | JSON |
响应格式 | JSON |
接口请求类型 | POST |
开发语言 | 任意可发起 http 请求的开发语言 |
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":"你都可以做些什么事"},
]
)
大家根据自己的需要选择参数,注意上面框框是必填内容下面代码有所体现。
响应示例
{
"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
}
}
}
在继续此项目之前,请确保检查以下先决条件。
我们将使用 Arduino IDE 对 ESP32/ESP8266 开发板进行编程,因此在继续本教程之前,请确保已在 Arduino IDE 中安装这些开发板。
要学习本教程,您需要1个 ESP32 开发板或者ESP32C3,建议使用后者,笔者发现同样的代码后者可以轻松调用,ESP32不行(可能板子坏了)。
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生成的回答。以下是详细的解释:
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "J09 502";
const char* password = "qwertyuiop111";
const char* apiKey = "eyJhbGciE0OTI4O1NiIsInNpZ25fdHlwZSI6IlNJR04iOjE3MDU2NjE0OTI4.eyJhcGlfa2V5IjoiZDIxMGExOTdlZTRlMmFmZGUzMzhhZWZkNTk0YmZkYWEiLCJleHAiOjE3MDU2NjE0OTI4OTAsGtQbYpnTTdGFtcCI6MTcwNDc5NzQ5Mjg5MH0._NT2-3q6ndo-RMiHUs4Irb0GtQbYpnTT0piBuXbgFds";
注意:虽然代码中有OpenAI API相关注释,但实际上该代码是针对通义千问API编写的。如果你想要与OpenAI API交互,你需要使用OpenAI提供的API URL、access token及相应的JSON结构进行请求。
打开串口监视器,注意右下角选择换行符,选择115200波特率,输入你想问的问题,他就可以回答你
如果返回error ,大家对照列表查询错误代码,结合提示排查解决
🥳🥳🥳现在,我们在本教程中,您学习了如何使用ESP32接入语言大模型之智谱清言。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,后期会持续分享esp32跑freertos实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣
如果你有任何问题,可以通过下面的二维码加入鹏鹏小分队,期待与你思维的碰撞😘😘😘