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

2024-01-15 06:36

本文主要是介绍【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 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 环境配置

  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 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生成的回答。以下是详细的解释:

  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实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣

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

这篇关于【ESP32接入语言大模型之智谱清言】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结