unity-C#调用百度千帆AppBuilder的OpenApi

devtools/2024/9/23 11:20:31/

目录

  • 功能描述
  • 准备工作
    • 百度智能云账号
    • 创建应用
    • 编辑应用
    • 创建Api秘钥
    • Api调用流程
    • unity代码
      • Unitywebrequest
        • 非流式
        • 流式
        • 注意事项
      • Restsharp

功能描述

使用百度千帆AppBuilder平台,通过api调用的方式实现AI大模型对话功能(文字)

准备工作

百度智能云账号

请自行在百度智能云进行创建
百度智能云官网
在这里插入图片描述
tips记得开通大模型的服务(需付费)

创建应用

进入AppBuilder点击创建应用
在这里插入图片描述

编辑应用

设置你需要的应用信息,如果有知识库的话需要设置对应的知识库(一个应用目前只能对应一个知识库)

  1. 设置名字和头像-这个只在网页访问的时候会显示
  2. 设置角色设定,可以先输入一些关键词,点击优化让ai帮你优化
  3. 选择知识库一个应用只能对应一个知识库(20240430)
  4. 还可以设置你需要的内容
  5. 右上角设置基模(目前ERNIE-4.0-8K比较贵,ERNIE-3.5-8K相对便宜效果也不错,根据实际需求选择即可)
  6. 右下角输入内容预览效果
  7. 以上内容确定后点击右上角的发布即可
    在这里插入图片描述

创建Api秘钥

在这里插入图片描述
点击右上方的个人中心图标
点击Api秘钥
在这里插入图片描述
新增秘钥,点击复制按钮一键复制秘钥

Api调用流程

官方文档

在这里插入图片描述
调用流程如下:

  1. 获取创建的应用的appid
  2. 获取api秘钥
  3. 先调用新建会话的api,获取conversation_id
  4. 根据conversation_id调用大模型对话接口正式发起会话

unity_39">unity代码

Unitywebrequest

非流式

使用非流式的调用方式的话就跟平常的api调用没差,这里就不多做说明了

流式
const string API_KEY = "api秘钥";const string _baseUrl = "https://qianfan.baidubce.com/v2/app/conversation";const string _startConversRoute = "/runs";const string _appId = "appid";RequestBody _reqBody;//实例化的请求体string _temResultTotal = "";string _temAsk = "";private StreamReader streamReader;private MemoryStream responseStream;private string _temConversationID;//临时对话idconst string TAG = "YiyanAppBuilderApiCtr";
///调用接口
///
IEnumerator YiyanAppBuilderStreamIE(string prompt){this._temAsk = prompt;yield return GetConversationID();//调用新建会话接口获取conversationidbyte[] bodyRaw = Data2byte(prompt);//将请求的内容封装在请求体中最后一并转化为字节数据using (UnityWebRequest request = UnityWebRequest.Post($"{_baseUrl}{_startConversRoute}", "")){request.SetRequestHeader("Accept", "application/octet-stream");//改行可加可不加request.SetRequestHeader("Authorization", $"Bearer {API_KEY}");request.SetRequestHeader("Content-Type", "application/json");request.uploadHandler = new UploadHandlerRaw(bodyRaw);//将请求的数据添加如请求中request.SendWebRequest();//发起调用byte[] results = new byte[1024];//try//{  tips 如果追求流式效果,此处不能使用trycatch包裹业务代码,否则实现的效果和非流式一样while (!request.isDone){yield return new WaitForSeconds(0.5f);//添加yield return (填null或者0)都行results = request.downloadHandler.data;this.HandleStreamData(results);//对接受的数据进行处理}if (request.isDone && results != null){//业务逻辑}//}//catch (Exception ex)//{//}}yield return null;}private void HandleStreamData(byte[] results){string line = "";if (results != null){responseStream = new MemoryStream(results);streamReader = new StreamReader(responseStream);while ((line = streamReader.ReadLine()) != null){string _temResult = "";if (line.Length < 6) continue;try{//将字节流数据的头信息(data: )去掉,然后通过json转换得到我们想要的数据if (JObject.Parse(line.Substring(5))["answer"].ToString() == "") continue;Debug.Log(line.Substring(5));_temResult = JObject.Parse(line.Substring(5))["answer"].ToString();}catch (Exception ex){//说明json转换失败,跳过Debug.Log("yiyan transform byte2json fail>>>>" + ex.Message + line.Substring(5));continue;}if (!_temStreamCBList.ContainsKey(_temResult)){//对数据进行过滤,将出现的特殊符号去掉_temResult = _temResult.Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", "");_temResult = FilterStr(_temResult);if (_temResult == null || _temResult == "") continue;Debug.Log(_temResult);//将流数据转换加入队列,调用循环进行播放和处理this._temResultTotal += _temResult;try{_temStreamCBList.Add(_temResult, _temResult);}catch (Exception ex){Log.Info($"{TAG}>>>ArgumentException: An item with the same key has already been added. Key");continue;}if (_temStreamCBList.Count == 1){//业务逻辑}}}}}/***  根据apikey和appid获取conversation_id用于开启对话*/IEnumerator GetConversationID(){Dictionary<string, string> form = new Dictionary<string, string>();form.Add("app_id", _reqBody.app_id);string _jsonBody = JsonConvert.SerializeObject(form);byte[] bytes = Encoding.UTF8.GetBytes(_jsonBody);using (UnityWebRequest request = UnityWebRequest.Post(_baseUrl, "")){request.SetRequestHeader("Content-Type", "application/json");request.SetRequestHeader("Authorization", $"Bearer {API_KEY}");request.uploadHandler = new UploadHandlerRaw(bytes);yield return request.SendWebRequest();ResponseBody response = JsonUtility.FromJson<ResponseBody>(request.downloadHandler.text);_temConversationID = response.conversation_id;Debug.Log(_temConversationID);}}private byte[] Data2byte(string prompt){_reqBody.query = prompt;_reqBody.conversation_id = _temConversationID;string body = JsonConvert.SerializeObject(_reqBody);byte[] bodyRaw = Encoding.UTF8.GetBytes(body);return bodyRaw;}public string FilterStr(string str){string pattern = @"\*|\^|\[(\d+)\]"; // 匹配 *、^、[ 和 ] 字符  以及[]里的数字//Regex reg = new Regex("\\s+");string _regResult = Regex.Replace(str, pattern, "");//Debug.Log(_regResult);return _regResult;}#region 请求yiyan-api需要的请求体[Serializable]
class RequestBody
{public string app_id;public string query;public bool stream;public string conversation_id;
}
[Serializable]
class ResponseBody
{public string request_id;public string conversation_id;
}
#endregion
注意事项

截止至20240430也就是今天为止
官方请求后返回的数据中会在最后有关于知识库的下标的数据,如下图
在这里插入图片描述
官方的回复是
在这里插入图片描述
因此在实际进行调用的时候还需要对最后的数据进行过滤

通过以上流程即可调用成功

Restsharp

该插件可以更便捷的实现调用,不过该插件存在多线程(UI更新不及时)的问题,因此不做该插件实现调用api的内容


http://www.ppmy.cn/devtools/26436.html

相关文章

【数值优化基础 (自动驾驶)】—— 知识点(方便回顾)

笔记&#xff1a;机器人学中的数值优化基础 数值优化简介 1.优化问题 min f(x) s.t.g(x)<0 h(x)0 假设&#xff1a;&#xff08;1&#xff09;目标函数有下界&#xff08;2&#xff09;下水平集不能无界 2.凸包问题&#xff1a;给定点集&#xff0c;求构成凸包的点 3.常见…

【AI工具合集】图片、文本、音视频工具与A I岗位面试资料

1、AI 工具集合 全球最新热门 Al 工具&#xff0c; AI 工具整合包&#xff0c;可以下载并在 Windows 系统私有化本地化运行&#xff0c;包括图片、文本、视频、音频等工具资源&#xff0c;按照功能、业务和行业来分类。 1.1 AI 图片工具 MoneyPrinter&#xff1a;一键生成短…

【UnityRPG游戏制作】Unity_RPG项目之场景环境搭建和解析

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

搭建基础镜像(centos+jdk+tomcat)

搭建基础镜像&#xff08;centosjdktomcat&#xff09; 1. 基于centosjdk基础镜像2. 拷贝源文件到工作目录3. 安装tomcat3.1 解压安装包3.2 拷贝setenv.sh文件3.3 拷贝tomcat配置文件3.4 拷贝启动脚本3.5 设置entrypoint命令 4. 配置文件示例4.1 server.xml4.2 setenv.sh4.3 st…

STL——stackqueue

stack stack即为栈&#xff0c;先进后出是其特点 栈只有栈顶元素能被外界使用&#xff0c;故不存在遍历行为 栈中常用接口 构造函数 stack<T> stk; //默认构造方式 stack(const stack &stk); //拷贝构造 赋值操作 stack& operator(const stack &stk); …

23 重构:烟囱式、平台化、中台化的架构

上一讲里&#xff0c;我们介绍了两大类型的系统升级重构方案&#xff0c;还介绍了如何进行重构版本的上线&#xff0c;以及如何平滑地完成新老版本切换的方案。在本讲里&#xff0c;将会具体介绍如何判断系统发展到什么阶段需要重构&#xff0c;以及如何实施重构。 系统稳定性…

K8S controller编写之Informer的原理+使用[drift]

概念 核心思想&#xff08;重点&#xff09;watch-list 机制 Watch 通过 HTTP 协议与 Kubernetes API Server 建立长连接&#xff0c;接收 Kubernetes API Server 发来的资源变更事件。Watch 操作的实现机制使用 HTTP 协议的分块传输编码——当 client-go 调用 Kubernetes API…

2024年Q1季度电子书线上市场数据分析:高端市场潜力巨大,销额同比超170%!

数字阅读设备的普及和互联网技术的不断进步&#xff0c;越来越多的读者选择使用电子书来获取知识和娱乐。在今年Q1季度中&#xff0c;电子书线上市场规模正在持续扩大。 根据鲸参谋数据显示&#xff0c;在线上电商平台&#xff08;某东&#xff09;电子书Q1销量累计约23.3万件…