Unity接入大模型(小羊驼Vicuna,vLLM,ChatGPT等)

实现在Unity内部的大模型访问,我也是第一次接触Unity中通过大模型url访问。此博客面向新手,旨在给大家简单理解大模型POST和GET过程,还有实现简单的大模型访问。

参考博客:什么是chatGPT?Unity结合OpenAI官方api实现类似chatGPT的AI聊天机器人

附带源码地址:OpenAIChatRobotMaster: 使用unity实现的基于OpenAI官方api的AI聊天机器人示例

参考的博客主要用于访问CHATGPT,但是我目前需求是访问自己的大模型URL,其中碰到的问题以及代码的一些详细解读。

目录

一、效果展示

二、源码POST解读

三、源码修改

四、代码评价

五、整个代码


一、效果展示

 UI改了一下,具体效果如上,这是使用了我们实验室自己部署的vicuna-13b大模型

二、源码POST解读

首先原博客的模型是chatgpt的:text-davinci-003模型,模型的请求体和响应体如下:

 所以原博客的unity代码中有这样的封装:

[System.Serializable]public class PostData{public string model;public string prompt;public int max_tokens; public float temperature;public int top_p;public float frequency_penalty;public float presence_penalty;public string stop;
}
[System.Serializable]public class TextCallback{public string id;public string created;public string model;public List<TextSample> choices;[System.Serializable]public class TextSample{public string text;public string index;public string finish_reason;}
}

代码逻辑我做了一个图,大家可以看看,可以方便理解源代码:
 

逻辑概述:输入框的文本信息_msg一方面渲染到了聊天框m_PostChatPrefab,另一方面被封装到了_postData类里的prompt中。将json信息传递到LLM中,最后返回的_msg转json格式得到_textback格式。我们需要得到的是其中的choices[0]。将得到的choices[0]渲染到聊天框m_RobotChatPrefab中。

三、源码修改

具体修改部分主要是请求体和响应体的格式。源码中post过程没有错误答应部分,我自己中途打印了一些中间变量,方便查错:

本次以vicuna-13b大模型为例,官方文档没有请求体和响应体的格式,所以通过postman来查看的格式,如下:

 参照上面的内容修改代码如下:

[System.Serializable]public class PostData{public string model;public List<Messages> messages;[System.Serializable]public class Messages{public string role;public string content;}public int web;public int account_id;public int conversation_id;public float temperature;public int top_p;public int n;public int max_tokens;public string stop;public bool stream;public float frequency_penalty;public float presence_penalty;public string user;
}
[System.Serializable]public class TextCallback{public string id;public string created;public string model;public List<TextSample> choices;[System.Serializable]public class TextSample{public string index;public Messages message;[System.Serializable]public class Messages{public string role;public string content;}public string finish_reason;}
}

其中的_postData传参代码修改如下:

PostData _postData = new PostData{model = m_PostDataSetting.model,messages = new List<PostData.Messages>{new PostData.Messages{role = "user",content = _postWord}},web = m_PostDataSetting.web,account_id = m_PostDataSetting.account_id,conversation_id = m_PostDataSetting.conversation_id,temperature = m_PostDataSetting.temperature,top_p = m_PostDataSetting.top_p,n = m_PostDataSetting.n,max_tokens = m_PostDataSetting.max_tokens,stop = "string",stream= false,frequency_penalty = m_PostDataSetting.frequency_penalty,presence_penalty = m_PostDataSetting.presence_penalty,user = "string"
};

心得:

其中报错内容有1.打印出的_jsonText没有message

2.TextCallback.TextSample.Messages定义不正确

原因:

string _jsonText = JsonUtility.ToJson (_postData);中:

JsonUtility.ToJson()方法具有一些限制,它只能序列化Unity支持的类型,并且不能序列化嵌套的自定义类型(如Messages类)。

所以在新加的public class Messages前面添加[System.Serializable],就可以序列化了。

四、代码评价

代码方面通俗易懂,但是因为后续工作需求,代码还有许多功能需要增加:

1.此代码将每一次的对话都直接渲染到聊天框中,没有在内部进行存储,导致的结果就是不能进行多轮对话,后续我将朝这个方向进行改进。

2.此对话响应方式是响应全部结束后才渲染出来,不能一个字一个字的流式响应。

针对这些需求,后续会对代码进行修改。

五、整个代码

    private string m_ApiUrl = "http://*********/completion";//配置参数,用于存储聊天界面的一些配置信息。[SerializeField] private PostData m_PostDataSetting;//输入的信息,用于获取用户输入的聊天内容。[SerializeField] private InputField m_InputWord;//聊天文本放置的层,用于存储聊天气泡的位置信息。[SerializeField] private RectTransform m_rootTrans;//发送聊天气泡,用于存储用户发送的聊天气泡的预制体。[SerializeField] private ChatPrefab m_PostChatPrefab;//回复的聊天气泡,用于存储机器人回复的聊天气泡的预制体。[SerializeField] private ChatPrefab m_RobotChatPrefab;//滚动条,用于控制聊天界面的滚动。[SerializeField] private ScrollRect m_ScroTectObject;/// <summary>/// 发送信息UI/// </summary>public void SendData(){if (m_InputWord.text.Equals(""))return;//将输入框中的文本作为消息进行处理,string _msg = m_InputWord.text;// 以m_PostChatPrefab预制体为模板,生成聊天记录ChatPrefab _chat = Instantiate(m_PostChatPrefab, m_rootTrans.transform);_chat.SetText(_msg);//重新计算容器尺寸LayoutRebuilder.ForceRebuildLayoutImmediate(m_rootTrans);//使用协程(TurnToLastLine())确保聊天框始终显示最新的聊天记录。StartCoroutine(TurnToLastLine());//获取发送的数据并将其传递给回调函数(CallBack)。StartCoroutine(GetPostData(_msg, CallBack));//清空输入框文本m_InputWord.text = "";}/// <summary>/// AI回复的信息UI/// </summary>/// <param name="_callback"></param>private void CallBack(string _callback){//去除字符串两侧的空格_callback = _callback.Trim();//将该字符串传递给 ChatPrefab 类的实例变量 _chat。ChatPrefab _chat = Instantiate(m_RobotChatPrefab, m_rootTrans.transform);_chat.SetText(_callback);//重新计算容器尺寸LayoutRebuilder.ForceRebuildLayoutImmediate(m_rootTrans);//将页面滚动到最后一行,StartCoroutine(TurnToLastLine());}/// <summary>///UI协程函数, 将文本框滚动到最后一行消息的位置。/// </summary>/// <returns></returns>private IEnumerator TurnToLastLine(){yield return new WaitForEndOfFrame();//滚动到最近的消息m_ScroTectObject.verticalNormalizedPosition = 0;}/// <summary>/// 设置AI模型类型model/// </summary>/// <param name="_modelType"></param>public void SetAIModel(Toggle _modelType){if (_modelType.isOn){m_PostDataSetting.model = _modelType.name;}}//---------------------------------------------------------------------------------------------------------------/// <summary>/// 用于存储向AI模型发送的参数数据。/// </summary>[System.Serializable]public class PostData{public string model;public List<Messages> messages;[System.Serializable]public class Messages{public string role;public string content;}public int web;public int account_id;public int conversation_id;public float temperature;public int top_p;public int n;public int max_tokens;public string stop;public bool stream;public float frequency_penalty;public float presence_penalty;//public string user;}/// <summary>/// 向AI模型发送数据/// </summary>/// <param name="_postWord"></param>/// <param name="_callback"></param>/// <returns></returns>private IEnumerator GetPostData(string _postWord, System.Action<string> _callback){//UnityWebRequest发送POST请求,接口:m_ApiUrlvar request = new UnityWebRequest(m_ApiUrl, "POST");PostData _postData = new PostData{model = m_PostDataSetting.model,messages = new List<PostData.Messages>{new PostData.Messages{role = "user",content = _postWord}},web = m_PostDataSetting.web,account_id = m_PostDataSetting.account_id,conversation_id = m_PostDataSetting.conversation_id,temperature = m_PostDataSetting.temperature,top_p = m_PostDataSetting.top_p,n = m_PostDataSetting.n,max_tokens = m_PostDataSetting.max_tokens,stop = m_PostDataSetting.stop,stream = false,frequency_penalty = m_PostDataSetting.frequency_penalty,presence_penalty = m_PostDataSetting.presence_penalty,//user = m_PostDataSetting.user};//将 _postData 转换成 JSON 格式的字符串string _jsonText = JsonUtility.ToJson(_postData);byte[] data = System.Text.Encoding.UTF8.GetBytes(_jsonText);//请求数据data上传request.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);//设置请求的下载处理器DownloadHandlerBuffer,,,返回的数据存储在缓存区request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();//设置请求头。。告诉服务器上传的数据为 JSON 格式。request.SetRequestHeader("Content-Type", "application/json");//request.SetRequestHeader("Authorization",string.Format("Bearer {0}",m_OpenAI_Key));//异步发送请求并等待响应yield return request.SendWebRequest();Debug.Log("Response Code: " + request.responseCode);if (request.responseCode == 200){string _msg = request.downloadHandler.text;Debug.Log(" _msg: " + _msg);//将_msg转化为TextCallback数据结构if (!string.IsNullOrEmpty(_msg)){TextCallback _textback = JsonUtility.FromJson<TextCallback>(_msg);Debug.Log("_textback: " + _textback);Debug.Log("_textback.choices[0]: " + _textback.choices[0]);Debug.Log("_textback.choices[0].message: " + _textback.choices[0].message);Debug.Log("_textback.choices[0].message.content: " + _textback.choices[0].message.content);if (_textback != null && _textback.choices != null && _textback.choices.Count > 0){_callback(_textback.choices[0].message.content);}else { Debug.LogError("Request Error: Invalid response data."); }}else{ Debug.LogError("Request Error: Empty response data."); }}else{Debug.LogError("Request Error: " + request.responseCode);}}/// <summary>/// 用于退出应用程序,/// </summary>public void Quit(){ Application.Quit(); }void Update(){if (Input.GetKeyDown(KeyCode.Escape)){ Application.Quit(); }if (Input.GetKeyDown(KeyCode.Return)){ SendData(); }}[System.Serializable]public class TextCallback{public string id;public string created;public string model;public List<TextSample> choices;[System.Serializable]public class TextSample{public string index;public Messages message;[System.Serializable]public class Messages{public string role;public string content;}public string finish_reason;}}

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

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

相关文章

ChatGPT 的工作原理:深入探究

本文首发于微信公众号&#xff1a;大迁世界, 我的微信&#xff1a;qq449245884&#xff0c;我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi &#xff0c;包含一线大厂面试完整考点、资料以及我的…

ChatGPT私人订制!只需把文档一键上传,免费可玩

衡宇 发自 凹非寺量子位 | 公众号 QbitAI 想不想简单轻松地拥有一个私人订制GPT&#xff1f; 不如试试askwise&#xff0c;只需要上传word、pdf等各种文档&#xff0c;就能生成个性化知识库&#xff0c;然后AI在你的知识库中上下求索&#xff0c;进行回答。 浅试了一下&#xf…

台大李宏毅报告:ChatGPT (可能)是怎麼煉成的 - GPT 社會化的過程

台大李宏毅报告&#xff1a;ChatGPT &#xff08;可能&#xff09;是怎麼煉成的 - GPT 社會化的過程 ChatGPT官方Blog&#xff1a;ChatGPT未公布论文——根据兄弟模型InstructGPT论文进行猜想&#xff1a;&#xff08;1&#xff09;Chat GPT的學習四階段1.學習文字接龍2.人類老…

如何使用chatgpt生成精美PPT提高工作效率

本教程收集于:AIGC从入门到精通教程 如何快速生成精美PPT提高工作效率 一、ChatGPT生成markdown源代码 二、Mindshow登录/注册 三、导入markd

达摩院榜首模型人脸检测MogFace CVPR论文深入解读

团队模型、论文、博文、直播合集&#xff0c;点击此处浏览 一、开源 1.&#xff09;论文链接&#xff1a;MogFace: Towards a Deeper Appreciation on Face Detection 2.&#xff09;模型&代码&#xff1a;https://modelscope.cn/models/damo/cv_resnet101_face-detecti…

GTC 2023 | 「皮衣刀客」黄仁勋畅谈 AI Top 5,科学计算、生成式 AI、Omniverse 榜上有名

内容一览&#xff1a;北京时间 3 月 21 日 23:00&#xff0c;英伟达创始人兼 CEO 黄仁勋在 GTC 2023 上发表主题演讲&#xff0c;介绍了生成式 AI、元宇宙、大语言模型、云计算等领域最新进展。 关键词&#xff1a;英伟达 黄仁勋 GTC 2023 「Don’t Miss This Defining Momen…

《WebRTC系列》实战 Web 端支持 h265 硬解

1、背景 Web 端实时预览 H.265 需求一直存在&#xff0c;但由于之前 Chrome 本身不支持 H.265 硬解&#xff0c;软解性能消耗大&#xff0c;仅能支持一路播放&#xff0c;该需求被搁置。 去年 9 月份&#xff0c;Chrome 发布 M106 版本&#xff0c;默认开启 H.265 硬解&#xf…

极客公园对话 Zilliz 星爵:大模型时代,需要新的「存储基建」

大模型在以「日更」进展的同时&#xff0c;不知不觉也带来一股焦虑情绪&#xff1a;估值 130 亿美元的 AI 写作工具 Grammarly 在 ChatGPT 发布后网站用户直线下降&#xff1b;AI 聊天机器人独角兽公司 Character.AI 的自建大模型在 ChatGPT 进步之下&#xff0c;被质疑能否形成…

云平台的ChatGLM部署

最近ChatGPT很火&#xff0c;国内清华也发布了ChatGLM&#xff0c;于是想在云平台上实现一下小型的ChatGLM。目前准备在趋动云这个平台上试试ChatGLM-6B-int8。 目前ChatGLM-6B-int8显存最少需要10G 可以参考GitHub - THUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialo…

高通Ziad Asghar:AI处理的重心从云端向边缘侧转移,智能手机是最佳平台 | MEET 2023...

萧箫 整理自 MEET 2023量子位 | 公众号 QbitAI 从Stable Diffusion到ChatGPT&#xff0c;这半年AI算法应用可谓突飞猛进。 但对于硬件领域而言&#xff0c;AI计算的下一个突破口或未来趋势究竟是什么&#xff1f; 尤其是AI应用最大的领域之一——移动端&#xff0c;大量AI算法在…

Stable Diffusion免费(三个月)通过阿里云轻松部署服务

温馨提示&#xff1a;划重点&#xff0c;活动入口在这里喔&#xff0c;不要迷路了。 其实我就在AIGC_有没有一种可能&#xff0c;其实你早就在AIGC了&#xff1f;阿里云邀请你&#xff0c;体验一把AIGC级的毕加索、达芬奇、梵高等大师作画的快感。阿里云将提供免费云产品资源&…

如何通过限制 IP 相关信息 | 控制用户访问站点频率

文章目录 通过 IP 限制反爬实验介绍知识点课程环境 IP 限制实战用 Nginx 限制特定 IP关于 allow 和 deny 的使用说明Nginx 限制 IP 访问频率Python Flask 模拟 IP 黑名单 实验总结 通过 IP 限制反爬 实验介绍 在常规的反爬手段中&#xff0c;IP 限制是应用广泛且比较有效的&a…

win11 报错 你的IT管理员已经限制对此应用一些区域的访问 解决方法

你的IT管理员已经限制对此应用一些区域的访问,你尝试访问的项目不可用。有关详细,请与你的IT支持人员联系。 1.按下wins&#xff0c;在框中输入cmd&#xff0c;右键管理员身份运行 2.在命令提示符中输入 reg add “HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Def…

wordpress开放注册和邮件问题解决

1开放注册 WordPress后台,设置-常规,勾选任何人都可以注册前面的复选框,新用户角色改为作者&#xff0c;保存即可开启。 2新用户注册收不到邮件问题解决 wordpress配置SMTP服务发送邮件(以qq邮箱为例) 第一步、配置邮箱&#xff08;这里介绍qq邮箱&#xff09; 我试过多个…

SLAM基础知识汇总【长期更新】

SLAM基础知识汇总 特征点相关 特征点由关键点和描述子构成&#xff1a; 关键点&#xff1a;特征点在图像里的位置描述子&#xff1a;通常是一个向量&#xff0c;描述了该关键点周围的信息&#xff0c;朝向大小等 [ORB-SLAM2] ORB-SLAM中的ORB特征&#xff08;提取&#xff…

国科大数字图像处理(复习与整理)

图像处理复习笔记&#xff1a; 1、证明一个系统是线性系统2、证明函数卷积的傅里叶变换等于函数傅氏变换后的乘积3、采样定理与混叠4、直方图均衡化第一节课知识点第二节课知识点第三节课知识点第四节课知识点第五节课知识点第六节课知识点第七节课知识点第八节课知识点第九节课…

3D视觉感知新SOTA BEVFormer复现nuscenes数据集测试demo

0 写在前面 分享最近在BEV感知方面的工作&#xff0c;欢迎自动驾驶同行交流学习&#xff0c;助力自动驾驶早日落地。 1.概述 对于自动驾驶而言&#xff0c;BEV&#xff08;鸟瞰图&#xff09;下的目标检测是一项十分重要的任务。尽管这项任务已经吸引了大量的研究投入&#…

CCF认证202305-1重复局面

题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3次以上&#xff0c;可由任意一方提出和棋。 问题描述 国际象棋每一个局面可以用大小为 的字符数组来表示&#xff0c;其中每一位对应棋盘上的一个格子。六种棋子王、后、车、象、马、兵分别用字母 k、q、…

地鼠君黑盒测试--小白如何梳理需求,告别听不懂

没有需求文档的痛苦 刚开始作黑盒&#xff08;功能&#xff09;测试时&#xff0c;小白难免会遇到这种情况&#xff0c;就是需求梳理不清晰&#xff0c;没有需求文档或者需求文档太简单。这种一开始没人带时&#xff0c;不容易发觉后续测试多痛苦。 笔者一开始时&#xff0c;就…

记一次购买海外服务器的经历和python包管理小记

概述 最近在研究ChatGPT&#xff0c;需要有个服务器一直挂着&#xff0c;刚好看到raksmart在搞活动&#xff1b; 可以关注下&#xff0c;他们的活动页面 https://billing.raksmart.com/whmcs/index.php?rp%2Fannouncements&languagechinese-cn 刚好四月&#xff0c;有便…