[Unity+智谱AI开放平台]调用ChatGLM Tuobo模型驱动AI小姐姐数字人

1.简述

        本篇文章主要介绍一下,在Unity端,集成智谱AI开放平台提供的chatglm模型api,实现AI聊天互动相关的功能。从智谱AI官方站点上看到,提供有chatglm turbo的公共模型服务,能够实现32K超长上下文,应用到我们的AI二次元小姐姐项目中,完全足够了。

        价格方面,官方页面上有看到,0.005元/千tokens这样的价格,而且目前新注册用户可以获取18元的API试用金额,核算下来,可以免费使用几百万的token,算是一笔不错的免费额度了。那么接下来,咱们来看一下如何在智谱AI开放平台申请API应用,并集成到Unity中吧。

2.智谱AI开放平台

        首先,进入到智谱AI开放平台的官方站点,通过以下链接,进入到智谱AI开放平台网站

https://maas.aminer.cn/pricingicon-default.png?t=N7T8https://maas.aminer.cn/pricing       

        进入官方站点后,自行注册账号,登录进入到智谱开放平台的控制台界面。

        在控制台界面,可以看到平台赠送的18元试用金。点击查看api key按钮即可进入到应用创建页面,新增一个apikey,后续在Unity端调用api服务时,需要用到这个apikey。

3.接口说明

       3.1 接口对接流程

        根据官方文档说明,可以了解到,目前智谱AI开放平台针对Python以及Java提供有SDK,可以自行下载sdk示例。那么我们使用Unity就没有sdk可用了,只能根据官方文档的说明自行实现相关功能。

        官方介绍了http调用的方式,总体流程上:

        ①接口鉴权,需要根据标准JWT的规则,生成token

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

        ②api调用,采用post访问资源地址即可。

        这里需要说明一下,POST访问的Url地址,chatglm turbo的模型访问地址:
https://open.bigmodel.cn/api/paas/v3/model-api/chatglm_turbo/sse-invokeicon-default.png?t=N7T8https://open.bigmodel.cn/api/paas/v3/model-api/chatglm_turbo/invoke     

  注:这里我使用的是官方不推进的同步方式,因为项目当前的情况,所以选择了这个方式,官方还提供有异步方式以及SSE两种方式,可以自行阅读文档。

        官方文档地址:
https://maas.aminer.cn/dev/api#chatglm_turboicon-default.png?t=N7T8https://maas.aminer.cn/dev/api#chatglm_turbo

3.2 Unity中的代码实现

        本节内容将介绍在Unity中如何完成接口鉴权以及api的http访问的代码实现。

        一、接口鉴权

        官方文档在接口鉴权流程中的token生成规则的描述不是很清晰,只描述了header和payload的格式,其实还有一部分Signature的生成规则,并没有在文档里说明,详细可以参见JWT的生成规则。

        1、header的内容规则

        根据官方文档,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 : 属性表示当前时间戳,单位为毫秒

        这里需要注意一点,apikey的部分,前面从站点上创建的api key,观察api key的结构,是这样的规则{id}.{secret key},我们拿到apikey时,需要将密钥拆分成两部分,一部分就是上面这个payload需要使用的api_key,而另一部分的secret key,我们在后面生成Signature的时候要用到。

        关于时间戳,生成13位时间戳编码即可。

        鉴权token生成部分的代码如下:

    #region 生成api鉴权token/// <summary>/// 生成api鉴权 token/// </summary>/// <returns></returns>private string GetToken(){long expirationMilliseconds = DateTimeOffset.Now.AddHours(1).ToUnixTimeMilliseconds();long timestampMilliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();string jwtToken = GenerateJwtToken(m_ApiKey, expirationMilliseconds, timestampMilliseconds);return jwtToken;}//获取tokenprivate string GenerateJwtToken(string apiKeyId, long expirationMilliseconds, long timestampMilliseconds){// 构建Headerstring _headerJson = "{\"alg\":\"HS256\",\"sign_type\":\"SIGN\"}";string encodedHeader = Base64UrlEncode(_headerJson);// 构建Payloadstring _playLoadJson = string.Format("{{\"api_key\":\"{0}\",\"exp\":{1}, \"timestamp\":{2}}}", apiKeyId, expirationMilliseconds, timestampMilliseconds);string encodedPayload = Base64UrlEncode(_playLoadJson);// 构建签名string signature = HMACsha256(m_SecretKey, $"{encodedHeader}.{encodedPayload}");// 组合Header、Payload和Signature生成JWT令牌string jwtToken = $"{encodedHeader}.{encodedPayload}.{signature}";return jwtToken;}// Base64 URL编码private string Base64UrlEncode(string input){byte[] inputBytes = Encoding.UTF8.GetBytes(input);string base64 = Convert.ToBase64String(inputBytes);return base64.Replace('+', '-').Replace('/', '_').TrimEnd('=');}// 使用HMAC SHA256生成签名private string HMACsha256(string apiSecretIsKey, string buider){byte[] bytes = Encoding.UTF8.GetBytes(apiSecretIsKey);HMACSHA256 hMACSHA256 = new System.Security.Cryptography.HMACSHA256(bytes);byte[] date = Encoding.UTF8.GetBytes(buider);date = hMACSHA256.ComputeHash(date);hMACSHA256.Clear();return Convert.ToBase64String(date);}#endregion
        二、Http访问

        获取到接口鉴权token后,通过POST访问api地址,接口地址如下:
https://open.bigmodel.cn/api/paas/v3/model-api/chatglm_turbo/sse-invokeicon-default.png?t=N7T8https://open.bigmodel.cn/api/paas/v3/model-api/chatglm_turbo/invoke     

        关于接口的报文结构,根据官方提供的接口文档说明,这里做一下详细说明。

        请求报文结构:

prompt

list

调用对话模型时,将当前对话信息列表作为提示输入给模型; 按照 {"role": "user", "content": "你好"} 的键值对形式进行传参; 总长度超过模型最长输入限制后会自动截断,需按时间由旧到新排序

role

string

本条信息作者的角色,可选择user 或 assistant
user 指用户角色输入的信息
assistant 指模型返回的信息

content

string

本条信息的具体内容

temperature

float

采样温度,控制输出的随机性,必须为正数
取值范围是:(0.0,1.0],不能等于 0,默认值为 0.95
值越大,会使输出更随机,更具创造性;值越小,输出会更加稳定或确定
建议您根据应用场景调整 top_p 或 temperature 参数,但不要同时调整两个参数

top_p

float

用温度取样的另一种方法,称为核取样
取值范围是:(0.0, 1.0) 开区间,不能等于 0 或 1,默认值为 0.7
模型考虑具有 top_p 概率质量tokens的结果
例如:0.1 意味着模型解码器只考虑从前 10% 的概率的候选集中取tokens
建议您根据应用场景调整 top_p 或 temperature 参数,但不要同时调整两个参数

request_id

string

由用户端传参,需保证唯一性;用于区分每次请求的唯一标识,用户端不传时平台会默认生成。

incremental

boolean

SSE接口调用时,用于控制每次返回内容方式是增量还是全量,不提供此参数时默认为增量返回
true 为增量返回
false 为全量返回

return_type

string

用于控制每次返回内容的类型,空或者没有此字段时默认按照json_string返回
json_string 返回标准的 JSON 字符串
text 返回原始的文本内容

ref

object

用于控制请求时的外部信息引用,目前用于控制是否引用外部信息,空或者没有此字段时默认开启搜索,传参格式
{"enable": "true", "search_query": "历史"}

          回复报文结构:

code

int

错误码,详情请查看错误码说明

msg

string

错误信息

success

boolean

请求成功失败标识,true(成功),false(失败)

data

object

request_id

string

用户在客户端请求时提交的任务编号或者平台生成的任务编号

task_id

string

智谱AI开放平台生成的任务订单号,调用请求结果接口时请使用此订单号

task_status

string

处理状态,PROCESSING(处理中),SUCCESS(成功),FAIL(失败)
注:处理中状态需通过查询获取结果

        接口的调用,采用POST方式即可,示例代码如下:

/// <summary>/// 发送数据/// </summary> /// <param name="_postWord"></param>/// <param name="_callback"></param>/// <returns></returns>public override IEnumerator Request(string _postWord, System.Action<string> _callback){stopwatch.Restart();string jsonPayload = JsonConvert.SerializeObject(new RequestData{model=m_Type.ToString(),prompt = m_DataList});using (UnityWebRequest request = new UnityWebRequest(url, "POST")){byte[] data = System.Text.Encoding.UTF8.GetBytes(jsonPayload);request.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();request.SetRequestHeader("Content-Type", "application/json");request.SetRequestHeader("Authorization", GetToken());yield return request.SendWebRequest();if (request.responseCode == 200){string _msg = request.downloadHandler.text;ResponseData response = JsonConvert.DeserializeObject<ResponseData>(_msg);if (response.data.choices.Count > 0){string _msgBack = response.data.choices[0].content;//回调_callback(_msgBack);}else{Debug.Log(_msg);}}}stopwatch.Stop();Debug.Log("chatGLM Turbo耗时:" + stopwatch.Elapsed.TotalSeconds);}

        数据定义:

[Serializable]private class RequestData{[SerializeField] public string model;[SerializeField] public List<SendData> prompt;[SerializeField] public float temperature = 0.7f;}[Serializable]private class ResponseData{[SerializeField] public int code;[SerializeField] public string msg = string.Empty;[SerializeField] public string success = string.Empty;[SerializeField] public ReData data=new ReData();}[Serializable]private class ReData{[SerializeField] public string task_id = string.Empty;[SerializeField] public string request_id = string.Empty;[SerializeField] public string task_status = string.Empty;[SerializeField] public List<SendData> choices=new List<SendData>();}

4. Unity端数字人配置

        项目的源码已经发布到Github了,我们可以直接下载,并导入到unity中使用,要求unity版本在2020.3.44及以上。导入工具包之后,可以在Scene文件夹下,找到示例场景,在场景中找到LLM->chatglm Turbo对象,这里就维护了智谱AI开放平台的模型调用脚本。

        项目已经实现了智谱AI开放平台对接所需的接口鉴权以及API访问的代码,我们只需要在控制台中,找到创建好的api key,将密钥填写到脚本中的{Key}参数即可。

        详细配置,可以到我的B站主页,查看本期视频的配置过程。

5.结束语
      

        这次的文章简单介绍了智谱AI开放平台的API的对接流程,并针对接口对接的流程进行了介绍,包括接口的鉴权、基于JWT的token生成规则,以及chatglm turbo模型的接口调用代码示例等内容,通过上述的代码实现,我们就可以在unity引擎中,使用智谱AI开放平台的api来驱动AI二次元小姐姐的对话交互。完整的代码工程可以从我的开源项目下载使用,项目包含了针对多种GPT应用的集成工具,以及语音服务的集成,对我这个项目感兴趣的朋友,可以上我的B站号查看,我也做有详细的教程,相关源码可以在的哔哩哔哩主站找到相关视频,在视频介绍以及评论区获取。

[Unity+AI Chat+智谱AI]轻松实现32K超长上下文对话, 对接智谱AI开放平台ChatGLM Turbo,简单配置AI二次元小姐姐


项目地址传送门:

AI二次元老婆开源项目(unity-AI-Chat-Toolkit):

Github地址:https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit

Gitee地址:https://gitee.com/DammonSpace/unity-ai-chat-toolkit

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

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

相关文章

Spring Security 6.1.x 系列(3)—— 基于过滤器的基础原理(二)

四、SecurityFilterChain 在Serlvet中&#xff0c;一组Security Filter组成SecurityFilterChain&#xff0c;SecurityFilterChain的概念就比较好理解&#xff0c;是Spring Security 提供的过滤器链&#xff0c;用于管理本身所有的过滤器&#xff0c;在上面的流程图中已有说明。…

【嵌入式】Linux C编程——C要注意的东西

1、语法分析中的“贪心法”&#xff1a; 编译器将程序分解成符号的方法是&#xff0c;从左到右一个字符一个字符地读入&#xff0c;如果该字符可能组成一个符号&#xff0c;那么再读入下一个字符&#xff0c;判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分&…

Lvs+Nginx+NDS

什么是&#xff1f;为什么&#xff1f;需要负载均衡 一个网站在创建初期&#xff0c;一般来说都是只有一台服务器对用户提供服务 ​ 从图里可以看出&#xff0c;用户经过互联网直接连接了后端服务器&#xff0c;如果这台服务器什么时候突然 GG 了&#xff0c;用户将无法访问这…

Python构造代理IP池提高访问量

目录 前言 一、代理IP是什么 二、代理IP池是什么 三、如何构建代理 IP 池 1. 从网上获取代理 IP 地址 2. 对 IP 地址进行筛选 3. 使用筛选出来的 IP 地址进行数据的爬取 四、总结 前言 爬虫程序是批量获取互联网上的信息的重要工具&#xff0c;在访问目标网站时需要频…

QT实现用本地资源管理器来打开文件夹

QString path"文件夹路径";QDesktopServices::openUrl(QUrl("file:"path, QUrl::TolerantMode)); 在windows中QT编程&#xff0c;使用资源管理器来打开指定本地文件夹的方法&#xff1a; 第一种&#xff1a;使用Qprocess命令&#xff08;相当于在cmd命令管…

【面试经典150 | 链表】反转链表 II

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;迭代 其他语言python3 写在最后 Tag 【头插法】【迭代】【链表】 题目来源 92. 反转链表 II 题目解读 返回部分链表。 解题思路 方法一&#xff1a;迭代 我们首先需要找到开始反转链表的前一个节点&#xff0c;为此…

React 你还在用 Redux 吗?更简化的状态管理工具(Recoil)

以往传统的 Redux 状态管理工具使用起来代码太过于复杂。 你需要通过纯函数触发 action 再去修改 data 中定义的数据&#xff0c;而且要通过接口请求数据还需要借助 redux - think 这个中间件才能完成。。。 更加方便使用的工具&#xff1a;Recoil ~ 由 facebook 推出契合 R…

【机器学习可解释性】5.SHAP值的高级使用

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP 值5.SHAP值的高级使用 正文 汇总SHAP值以获得更详细的模型解释 总体回顾 我们从学习排列重要性和部分依赖图开始&#xff0c;以显示学习后的模型的内容。 然后我们学习了SHAP值来分解单个预测的组成部…

CSS3背景样式

在CSS 2.1中&#xff0c;background属性的功能还无法满足设计的需求&#xff0c;为了方便设计师更灵活地设计需要的网页效果&#xff0c;CSS3在原有background基础上新增了一些功能属性&#xff0c;可以在同一个对象内叠加多个背景图像&#xff0c;可以改变背景图像的大小尺寸&…

[ubuntu系统下的文本编辑器nano,vim,gedit,文件使用,以及版本更新问题]

文本编辑器概要 在Ubuntu系统下&#xff0c;有许多文本编辑器可供选择&#xff0c;每个编辑器都有其独特的特性和用途。以下是一些常见的文本编辑器&#xff1a; Gedit&#xff1a; 这是Ubuntu默认的文本编辑器&#xff0c;它简单易用&#xff0c;适合基本的文本编辑任务。 安…

前端基础---跳转相关的功能

后端给链接地址并且给token进行跳转 如果点击有key4&#xff0c;说明要跳转到相应的页面 auth是通过后端获取的地址&#xff0c; jdk是后端获取的相应的token&#xff0c; 然后进行拼接&#xff0c;进行window.open&#xff08;&#xff09;进行跳转 if (key 4) {var testUrl …

基于RFID技术的优化医药供应链管理解决方案

一、社会背景和挑战 随着全球假药问题的严重性日益凸显&#xff0c;医疗产品的追溯和管理变得越来越重要。据世界卫生组织报告&#xff0c;全球假药比例已超过10%&#xff0c;而中国每年至少有20万人死于假药和不当用药。在国际上&#xff0c;医疗产品的追溯体系已成为监管机构…

MLF - 麻辣粉

MLF全称中期借贷便利&#xff08;Medium-term lending Facility&#xff09;,理解为央行向商业银行、政策银行发放的贷款&#xff0c;但需要符合一定要求才可向央行申请。银行通过MLF向央行借款的时候&#xff0c;需要提供担保品。一般为国债、央行票据、政策性金融债、地方债、…

数据库的用户管理

一、创建用户&#xff1a;create user 二、赋予用户权限&#xff1a;grant&#xff08;终端执行&#xff09; 三、删除用户权限&#xff1a;revoke&#xff08;在终端操作&#xff09; 四、用户的重命名&#xff1a;rename 五、删除用户&#xff1a;drop 六、修改用户密码 1、…

linux目录与文件管理

目录与路径 关于执行文件路径的变量&#xff1a;$PATH ls完整文件名为&#xff1a;/bin/ls 在任何文件夹下输入ls命令可以显示出一些信息而不是找不到命令&#xff0c;这就是因为环境变量PATH所致。在执行命令时&#xff0c;系统会依照PATH的设置去每个PATH定义的目录下查找文…

前端环境的安装 Node npm yarn

一 node npm 1.下载NodeJS安装包 下载地址&#xff1a;Download | Node.js 2.开始安装 打开安装包后&#xff0c;一直Next即可。当然&#xff0c;建议还是修改一下安装位置&#xff0c;NodeJS默认安装位置为 C:\Program Files 3.验证是否安装成功 打开DOS命令界面&#…

MINIO 对象存储服务

MINIO 官网下载地址&#xff1a; 注&#xff1a;需要下载 MINIO SERVER&#xff08;服务端&#xff09; 和 MINIO CLIENT&#xff08;客户端&#xff09;两个文件 WINDOWS版本下载地址&#xff1a;https://min.io/download#/windows LINUX版本下载地址&#xff1a;https://mi…

Python web自动化测试 —— 文件上传

​文件上传三种方式&#xff1a; &#xff08;一&#xff09;查看元素标签&#xff0c;如果是input&#xff0c;则可以参照文本框输入的形式进行文件上传 方法&#xff1a;和用户输入是一样的&#xff0c;使用send_keys 步骤&#xff1a;1、找到定位元素&#xff0c;2&#…

【大数据基础平台】星环TDH社区开发版单机部署

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#…

Vue之CSS基础

CSS&#xff1a;层叠样式表 1、选择器 从模板template中选择某元素进行样式设置 需要注意的是作用域到底是当前模板还是整个html文档 1.1 基础(单一)选择器 标签、类、 id、通配符 标签、直接使用标签名&#xff0c;比如div,span… 优点&#xff1a;全选 模板中的名{。。。}…