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

目录

  • 功能描述
  • 准备工作
    • 百度智能云账号
    • 创建应用
    • 编辑应用
    • 创建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代码

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;//临时对话id

    const string TAG = "YiyanAppBuilderApiCtr";
///调用接口
///
IEnumerator YiyanAppBuilderStreamIE(string prompt)
    {
        this._temAsk = prompt;
        yield return GetConversationID();//调用新建会话接口获取conversationid
        byte[] 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的内容

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

001_Langchain

LangChain LangChain 是一个开源框架,旨在帮助开发者使用大型语言模型(LLMs)和聊天模型构建端到端的应用程序。它提供了一套工具、组件和接口,以简化创建由这些模型支持的应用程序的过程。LangChain 的核心概念包括组件(Components)、链(Chains)、模型输入/输出(Mode…

Failed to build flash-attn:ERROR: Could not build wheels for flash-attn

安装 FlashAttention 的时候遇到报错&#xff1a; Failed to build flash-attn ERROR: Could not build wheels for flash-attn, which is required to install pyproject.toml-based projects可能是安装的版本与环境存在冲突吧&#xff0c;我的环境是&#xff1a; python 3.1…

GRU模块:nn.GRU层的介绍

如果需要深入理解GRU的话&#xff0c;那么内部实现的详细代码和计算公式就比较重要&#xff0c;中间的一些过程和变量的意义需要详细关注&#xff0c;只有这样&#xff0c;才能准备把握这个模块的内涵和意义&#xff0c;设计初衷和使用方式等等&#xff0c;所以&#xff0c;仔细…

值得推荐的多款iPaaS工具

当今企业面临着日益复杂的数据和系统集成挑战&#xff0c;为了提高业务效率和灵活性&#xff0c;许多企业转向了iPaaS工具&#xff08;Integration Platform as a Service&#xff0c;即集成平台即服务&#xff09;。iPaaS工具可以帮助企业轻松地连接和集成各种应用程序、数据和…

如何切换PHP版本

如果服务器上安装了多个php&#xff0c;可能会导致默认的php版本错误&#xff0c;无法启动swoole等服务&#xff0c; 查看命令行的php版本方法&#xff1a;https://q.crmeb.com/thread/9921 解决方法如下&#xff0c;选一个即可&#xff1a; 一、切换命令行php版本&#xff…

servlet-会话(cookie与session)

servlet会话技术 会话技术cookie创建Cookieindex.jspCookieServlet 获取Cookieindex.jspshowCookie session创建sessionindex.jsplogin.jspLoginServlet 获取sessionRedurectServket 清除会话login.jspClearItmeServlet 会话技术 两种会话&#xff1a;cookie&#xff0c;sessi…

在 Linux 中创建文件

目录 ⛳️推荐 前言 使用 touch 命令创建一个新的空文件 使用 echo 命令创建一个新文件 使用 cat 命令创建新文件 测试你的知识 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到…

利用Python简单操作MySQL数据库,轻松实现数据读写

PyMySQL是Python编程语言中的一个第三方模块&#xff0c;它可以让Python程序连接到MySQL数据库并进行数据操作。它的使用非常简单&#xff0c;只需要安装PyMySQL模块&#xff0c;然后按照一定的步骤连接到MySQL数据库即 可。本文将介绍PyMySQL的安装、连接MySQL数据库、创建表、…

嗨动PDF编辑器V1.60版本发布,有哪些亮点值得注意!

嗨动PDF编辑器V1.60版发布&#xff0c;有哪些亮点值得注意呢&#xff1f; 在数字信息爆炸的时代&#xff0c;PDF文档以其跨平台、易于阅读和保持格式统一的特性&#xff0c;成为了工作、学习和生活中的常客。但很多时候&#xff0c;我们收到的PDF文档只是“只读”的&#xff0…

什么是香草看涨期权?香草看涨期权有哪些特点?

什么是香草看涨期权&#xff1f;香草看涨期权有哪些特点&#xff1f; 香草看涨期权&#xff0c;通常也称为香草期权&#xff0c;是金融市场上的一种金融衍生品&#xff0c;由券商或金融机构推出。它允许投资者以较小的费用获取相应股票市值的收益权&#xff0c;主要用于风险管…

6款好用的数据恢复软件推荐【不收费】+【收费】

日常办公和学习中&#xff0c;总有一些小粗心鬼会不小心误删了自己的重要文件&#xff0c;或者是由于设备故障导致数据丢失。如果需要进行数据恢复&#xff0c;那么可以试试数据恢复工具&#xff0c;只需要自己再电脑中操作&#xff0c;就可以帮助找回数据文件&#xff0c;下面…

基于随机森林与支持向量机的高光谱图像分类(含python代码)

目录 一、背景 二、代码实现 三、项目代码 一、背景 基于深度学习的教程&#xff08;卷积神经网络&#xff09;详见&#xff1a;基于卷积神经网络的高光谱图像分类详细教程&#xff08;含python代码&#xff09;-CSDN博客 在高光谱图像分类领域&#xff0c;随机森林&#…

CAT Game Builder

CAT游戏生成器是在Unity中制作游戏的更简单、更快的方法。使用CAT的模块化条件、动作、触发器和集成游戏系统,您可以创建原型、演示或完整游戏,而无需额外编程。 CAT Game Builder是一个完全可扩展的框架,专为专业团队设计,但对初学者来说足够容易掌握。CAT Game Builder使…

2024蓝桥杯CTF writeUP--Theorem

密码方向的签到题&#xff0c;根据题目已知n、e和c&#xff0c;并且p和q是相邻的素数&#xff0c;可以考虑分解。 通过prevprime函数分解n&#xff0c;然后 RSA解密即可&#xff1a; from Crypto.Util.number import long_to_bytes import gmpy2 import libnumfrom sympy im…

大语言模型LLM入门篇

大模型席卷全球&#xff0c;彷佛得模型者得天下。对于IT行业来说&#xff0c;以后可能没有各种软件了&#xff0c;只有各种各样的智体&#xff08;Agent&#xff09;调用各种各样的API。在这种大势下&#xff0c;笔者也阅读了很多大模型相关的资料&#xff0c;和很多新手一样&a…

1.数据结构---顺序表

ArrayList 在new的时候并没有进行内存的分配 此时才进行内存分配 两个结论: 第一次Add的时候分配大小为10的内存 扩容是1.5倍扩容

如何修复显示器或笔记本电脑屏幕的黄色色调?这里提供几种方法

序言 如果你的笔记本电脑屏幕呈淡黄色,则可以启用夜灯功能。该问题也可能源于连接松散的显示电缆、损坏的显卡驱动程序或错误配置的显示器设置。以下是一些故障排除步骤,你可以尝试解决此问题。 禁用夜间模式 夜间模式功能旨在减少显示器的蓝色色调,使屏幕看起来更温暖,…

光伏设备数据交互模硬件接口要求

模组的弱电接口采用26&#xff08;间距2.54mm&#xff09;双排插针作为连接件&#xff0c;模组与电能表的硬件接口示意图如 图1所示&#xff08;模组正视图方向&#xff09;&#xff0c;接口定义说明见表3。模组外接插座和插头采用凤凰端子结构&#xff0c;接口示意 图应符合附…

网贷大数据查询要怎么保证准确性?

相信现在不少人都听说过什么是网贷大数据&#xff0c;但还有很多人都会将它跟征信混为一谈&#xff0c;其实两者有本质上的区别&#xff0c;那网贷大数据查询要怎么保证准确性呢?本文将为大家总结几点&#xff0c;感兴趣的朋友不妨去看看。 想要保证网贷大数据查询的准确度&am…

差动绕组电流互感器过电压保护器ACTB

安科瑞薛瑶瑶18701709087/17343930412 电流互感器在运行中如果二次绕组开路或一次绕组流过异常电流&#xff0c;都会在二次侧产生数千伏甚至上万伏的过电压。这不仅会使CT和二次设备损坏&#xff0c;也严重威胁运行人员的生命安全&#xff0c;并造成重大经济损失。采用电流互感…