【原创】什么是chatGPT?Unity结合OpenAI官方api实现类似chatGPT的AI聊天机器人

74次阅读

一、什么是 ChatGPT

最近 chatGPT 爆火 , 网络铺天盖地的各种文章视频 , 各种牛逼之声。倒算不上第一时间使用 , 发布隔了一周多 , 才从同事那里听说了这么个神奇的技术。这周阳了 , 持续发烧在家 , 忙着养病也没时间去了解。等到周五退烧了 , 病情也缓解了 , 也就趁着热度试用了一下 chatGPT, 确实很强大 , 对话逻辑清晰 , 甚至感觉不到和我对话的是一个 AI。除了能够聊天对话之外 , 你甚至可以叫他帮助你读代码 , 写代码 , 有点牛逼有没有 !

什么是 chatGPT 呢 ? 从网上查的 :chatGPT 是 OpenAI 开发的大型预训练语言模型 , 是 GPT- 3 模型的一个变体 , 经过训练可以在对话中生成类似人类的文本响应。

我问了一下它 chatGPT, 是这么回答我的 :chatGPT 是一种基于语言模型的聊天机器人技术 , 它使用大量文本数据来学习如何与自然语言对话。它可以理解上下文 , 能够自然而直观的回答用户的查询 , 它也可以自动生成问题和句子 , 使对话更加流畅。

哈哈 , 对自己还是很了解的嘛。

不过 , 今天这篇文章也不是来科普 chatGPT 的 , 因为使用 chatGPT 是需要科学上网的 , 不用点特殊手段是没办法使用到的。当然 , 发布 chatGPT 的 openAI 提供了 api, 可以通过 api 来实现 chatGPT 的对话功能 ,api 就不需要科学上网可直接访问了。那么我们看看怎么使用 unity 来开发实现一个 AI 聊天机器人吧。

二、开始前的准备

我们要使用 openAI 提供的 api 实现 AI 聊天机器人 , 首先需要做几个准备工作 :

①注册一个 OpenAI 的账号。目前 openAI 暂不支持大陆地区 , 怎么注册到 openAI 的账号 , 不在本文章解答范围内 , 请自行解决。

②创建 API 秘钥。登录账号后 , 在账户管理界面里 , 找到 API Keys 页面 , 创建一个秘钥。这里要注意 , 创建秘钥之后 , 站点会提示保存好你的秘钥 ,这里务必要复制保存 , 错过了可就没办法再复制了

【原创】什么是 chatGPT?Unity 结合 OpenAI 官方 api 实现类似 chatGPT 的 AI 聊天机器人

③复制保存一下 api 地址与代码示例 , 方便使用。

官方提供了几个代码示例 , 从代码示例里查看信息 , 获取到官方 api 的地址 :

https://api.openai.com/v1/completionshttps://api.openai.com/v1/completions 需要传递的参数 :

"model": "text-davinci-003",
"prompt": "",
"temperature": 0,
"max_tokens": 100,
"top_p": 1,
"frequency_penalty": 0.0,
"presence_penalty": 0.0,
"stop": ["\n"]

记录这些信息就差不多了 , 咱们调用 openAI 的官方 api 用到信息基本都有了 , 现在开始尝试在 unity 里实现聊天机器人的功能吧。

三、编写代码实现聊天机器人功能

接下来 , 我们开始在 unity 里编写代码 , 实现我们所需要的功能。

1、编写一个类 , 用来保存 Post 的参数 , 参数定义参考上一节中我们记录的传递参数列表。

[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;}

2、编写一个类 , 用于保存 OpenAI 返回的数据。这里我们要事先了解一下调用 openAI 的 api 后 , 返回给我们的数据格式 , 随便找一个 API 调试助手就可以了 , 参考官方文档要求的 Header 和发送的参数要求 (Json), 拿到返回数据 , 即可知道数据格式。我只处理我需要的信息 , 因此编写了以下的类来保存返回的数据。

 /// <summary> /// 返回的信息 /// </summary> [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;} }

3、编写 Post 方法 , 调用 http 接口。这里用到了 UnityWebRequest 类来实现 post 方法。使用 unity 提供的 JsonUtility 类来实现 Json 格式的转换。编写代码过程注意一下 : 发送 Raw 数据的时候 , 使用 utf- 8 来读取 byte 数组 , 开始的时候没用使用 utf-8,openAI 那边返回有报错 ;

private IEnumerator GetPostData(string _postWord,System.Action<string> _callback) {var request = new UnityWebRequest (m_ApiUrl, "POST"); PostData _postData = new PostData {model = m_PostDataSetting.model, prompt = _postWord, max_tokens = m_PostDataSetting.max_tokens, temperature=m_PostDataSetting.temperature, top_p=m_PostDataSetting.top_p, frequency_penalty=m_PostDataSetting.frequency_penalty, presence_penalty=m_PostDataSetting.presence_penalty, stop=m_PostDataSetting.stop}; string _jsonText = JsonUtility.ToJson (_postData); byte[] data = System.Text.Encoding.UTF8.GetBytes (_jsonText); request.uploadHandler = (UploadHandler)new UploadHandlerRaw (data); request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer (); request.SetRequestHeader ("Content-Type","application/json"); request.SetRequestHeader("Authorization",string.Format("Bearer {0}",m_OpenAI_Key)); yield return request.SendWebRequest (); if (request.responseCode == 200) {string _msg = request.downloadHandler.text; TextCallback _textback = JsonUtility.FromJson<TextCallback> (_msg); if (_textback!=null && _textback.choices.Count > 0) {_callback(_textback.choices [0].text); } } }

4、我的代码里写了一个回调函数 , 用来处理 openAI 返回的信息。代码仅做参考 , 因为我的应用写成了一个聊天对话机器人的形式 , 所以在获取到 openAI 返回的信息之后 , 会创建一个对话框 , 并且把返回的信息输入到对话框里。获取信息之后更新窗体尺寸并且自动跳到最新的会话位置。

 private void CallBack(string _callback){_callback=_callback.Trim(); ChatPrefab _chat=Instantiate(m_RobotChatPrefab,m_ChatParent); _chat.SetText(_callback); // 重新计算容器尺寸 LayoutRebuilder.ForceRebuildLayoutImmediate(m_rootTrans); StartCoroutine(TurnToLastLine()); } private IEnumerator TurnToLastLine(){ yield return new WaitForEndOfFrame(); // 滚动到最近的消息 m_ScroTectObject.verticalNormalizedPosition=0; }

5、现在我们基本上已经完成了主要的代码编写。后面的一些工作就是使用 unity 制作一下聊天应用的界面和一些交互的代码了 , 就不再赘述 , 后面是全部代码。

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI; public class GetOpenAI : MonoBehaviour {//API key private string m_OpenAI_Key=" 你的 API KEY"; // 定义 Chat API 的 URL private string m_ApiUrl = "https://api.openai.com/v1/completions"; // 配置参数 [SerializeField]private PostData m_PostDataSetting; // 输入的信息 [SerializeField]private InputField m_InputWord; // 聊天文本放置的层 [SerializeField]private Transform m_ChatParent; [SerializeField]private RectTransform m_rootTrans; // 发送聊天气泡 [SerializeField]private ChatPrefab m_PostChatPrefab; // 回复的聊天气泡 [SerializeField]private ChatPrefab m_RobotChatPrefab; // 滚动条 [SerializeField]private ScrollRect m_ScroTectObject; // 发送信息 public void SendData() { if(m_InputWord.text.Equals("")) return; string _msg=m_InputWord.text; ChatPrefab _chat=Instantiate(m_PostChatPrefab,m_ChatParent); _chat.SetText(_msg); // 重新计算容器尺寸 LayoutRebuilder.ForceRebuildLayoutImmediate(m_rootTrans); StartCoroutine(TurnToLastLine()); StartCoroutine (GetPostData (_msg,CallBack)); m_InputWord.text=""; } //AI 回复的信息 private void CallBack(string _callback){_callback=_callback.Trim(); ChatPrefab _chat=Instantiate(m_RobotChatPrefab,m_ChatParent); _chat.SetText(_callback); // 重新计算容器尺寸 LayoutRebuilder.ForceRebuildLayoutImmediate(m_rootTrans); StartCoroutine(TurnToLastLine()); } private IEnumerator TurnToLastLine(){ yield return new WaitForEndOfFrame(); // 滚动到最近的消息 m_ScroTectObject.verticalNormalizedPosition=0; } // 设置 AI 模型 public void SetAIModel(Toggle _modelType){if(_modelType.isOn){m_PostDataSetting.model=_modelType.name;} } [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;} private IEnumerator GetPostData(string _postWord,System.Action<string> _callback) {var request = new UnityWebRequest (m_ApiUrl, "POST"); PostData _postData = new PostData {model = m_PostDataSetting.model, prompt = _postWord, max_tokens = m_PostDataSetting.max_tokens, temperature=m_PostDataSetting.temperature, top_p=m_PostDataSetting.top_p, frequency_penalty=m_PostDataSetting.frequency_penalty, presence_penalty=m_PostDataSetting.presence_penalty, stop=m_PostDataSetting.stop}; string _jsonText = JsonUtility.ToJson (_postData); byte[] data = System.Text.Encoding.UTF8.GetBytes (_jsonText); request.uploadHandler = (UploadHandler)new UploadHandlerRaw (data); request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer (); request.SetRequestHeader ("Content-Type","application/json"); request.SetRequestHeader("Authorization",string.Format("Bearer {0}",m_OpenAI_Key)); yield return request.SendWebRequest (); if (request.responseCode == 200) {string _msg = request.downloadHandler.text; TextCallback _textback = JsonUtility.FromJson<TextCallback> (_msg); if (_textback!=null && _textback.choices.Count > 0) {_callback(_textback.choices [0].text); } } } public void Quit(){ Application.Quit(); } void Update(){ if(Input.GetKeyDown(KeyCode.Escape)){Application.Quit(); } } /// <summary> /// 返回的信息 /// </summary> [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;} } } 

四、结束语

花了一点时间简单实现了一个基于 OpenAI 的聊天机器人的功能。完整的工程文件 , 我挂载在 Git 和 Gee 上供参考 ,unity 版本请使用 unity2020.1 及以上版本。代码水平有限 , 上述编码过程仅做参考 , 如有不恰当之处欢迎交流。

聊天机器人效果可观看视频 :
今日头条 https://m.toutiao.com/is/hH5j3Tx/ 完整代码可自行到到 Git 上下载 ,unity 版本请使用 unity2020.1 及以上版本

Gitee:OpenAIChatRobotMaster: 使用 unity 实现的基于 OpenAI 官方 api 的 AI 聊天机器人示例https://gitee.com/DammonSpace/open-aichat-robot-master


2023.2.7 更新 :

有网友私信说源码存在一点问题 , 昨晚我看了一下 , 确实有点问题 , 忘记上传字体文件了 , 所以导致界面和预设的文字显示不出来 , 已经做了修复 , 更新了一下源码。这里说明一下 ,unity 的版本请使用 2020.1 及以上 , 源码下载完 , 把 openAISample 文件夹拖到你自己的工程文件里 , 记得把 Texure 文件夹里的贴图设置成 sprit, 检查一下 UI 还有文字显示是不是正常的。源码里没有配置 openAI 的应用秘钥 , 所以需要自己注册账号 , 申请秘钥。具体申请方法自行百度咯[笑]

同时我也录制了一个关于这个 demo 的视频 , 希望能对大家有帮助 , 传送门 :

手把手教你使用 unity 打造 chatGPT 聊天机器人_哔哩哔哩_bilibili

原文链接:https://blog.csdn.net/sinat_28962939/article/details/128358522

正文完
 
不知道
版权声明:本站原创文章,由 不知道 2023-08-13发表,共计7522字。
转载说明:声明:本站内容均来自互联网,归原创作者所有,如有侵权必删除。 本站文章皆由CC-4.0协议发布,如无来源则为原创,转载请注明出处。