Unity接入ChatGPT实现NPC聊天
实现要求
1、能向OpenAI官网发送消息
API官网:https://api.openai.com/v1/chat/completions
2、拥有自己的APIKey
实现步骤
1、明确发送消息的格式
// 定义对话历史string conversation = "[{\"role\": \"system\", \"content\": \"You are a helpful assistant.\"}," +//确定是跟哪个对话窗口发送消息"{\"role\": \"user\", \"content\": \""+ message+"\"}]";//发送的消息// 构建请求体string requestBody = "{\"messages\": " + conversation + ", \"max_tokens\": 1024, " +//max_tokens 是收到消息的字节长度 一个token是四个字节 maxtoken越长收到的消息就越长"\"model\": \"gpt-3.5-turbo\"}"; // 设置使用的模型引擎按照你自己Key的模型这个是3.5的模型
2、明确收取消息的格式
{"id": "Key来源账户的ID","object": "chat.completion","created": 1691993667,"model": "gpt-3.5-turbo-0613","choices": [{"index": 0,"message": {"role": "assistant","content": "收到的消息类型"},"finish_reason": "stop"}],"usage": {"prompt_tokens": 19,"completion_tokens": 18,"total_tokens": 37 //消息消耗的Token数量}
}
转化成对象类
public class ChatGPTJsonObjec
{public string id;public string @object;public string created;public string model;public Choices[] choices;public Usage usage;
}
[System.Serializable]
public class Choices
{public float index;public Message message;//消息放在这个类里下面有解释public string finish_reason;
}
[System.Serializable]
public class Message
{public string role;public string content;//收到的回复消息只要这个就行其他的都是一些用户信息没啥用
}
[System.Serializable]
public class Usage
{public int prompt_tokens;public int completion_tokens;public int total_tokens;//这条消息消耗的Token 一个token等于四个字节
}
实现脚本
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using System.Text;
///
/// 脚本功能:ChatGTP发送消息
/// public class BebornMemoryChatGPT : MonoBehaviour{//去API官网弄,有小白弄不来的私信我我告诉你哪里有public string apiKey = "key";private string apiUrl = "https://api.openai.com/v1/chat/completions";public Button button;public InputField inputField;private void Awake(){SendMessageToChatGPT("你好");//发送你好,里面的内容是啥都行}public void ToJson(){ChatGPTJsonObjec chatGPTJsonObjec = new ChatGPTJsonObjec();string json = JsonUtility.ToJson(chatGPTJsonObjec, true);Debug.Log(json);}/// /// 携程收发消息/// /// 发送的消息private void SendMessageToChatGPT(string message){// 定义对话历史string conversation = "[{\"role\": \"system\", \"content\": \"You are a helpful assistant.\"}," +//确定是跟哪个对话窗口发送消息"{\"role\": \"user\", \"content\": \""+ message+"\"}]";//发送的消息// 构建请求体string requestBody = "{\"messages\": " + conversation + ", \"max_tokens\": 1024, " +//max_tokens 是收到消息的字节长度 一个token是四个字节 maxtoken越长收到的消息就越长"\"model\": \"gpt-3.5-turbo\"}"; // 设置使用的模型引擎StartCoroutine(AsyncSendMessageToChatGPT(requestBody));Debug.Log("发送:"+ message);}private IEnumerator AsyncSendMessageToChatGPT(string message){byte[] data = Encoding.UTF8.GetBytes(message);using(UnityWebRequest www = new UnityWebRequest(apiUrl, "POST")){www.uploadHandler = new UploadHandlerRaw(data);//设置上传的数据是字符数组www.downloadHandler = new DownloadHandlerBuffer();www.SetRequestHeader("Content-Type", "application/json");www.SetRequestHeader("Authorization", "Bearer " + apiKey);yield return www.SendWebRequest();if (www.result != UnityWebRequest.Result.Success){Debug.LogError("Protocol Error: " + www.error);Debug.LogError("Error Response: " + www.downloadHandler.text);Debug.LogError("发送的消息失败,请重新创建链接,需要全局科学上网哦"+ www.result);}else{string receive = www.downloadHandler.text;Debug.Log(receive);//输出收到的所有Json信息ChatGPTJsonObjec chatGPTJsonObjec = JsonUtility.FromJson(receive);//chatGPTJsonObjec.choices[0].message.content 这个就是你收到的回复Debug.Log("收到的回复:"+chatGPTJsonObjec.choices[0].message.content);}}}}
#region JsonData
public class ChatGPTJsonObjec
{public string id;public string @object;public string created;public string model;public Choices[] choices;public Usage usage;
}
[System.Serializable]
public class Choices
{public float index;public Message message;public string finish_reason;
}
[System.Serializable]
public class Message
{public string role;public string content;
}
[System.Serializable]
public class Usage
{public int prompt_tokens;public int completion_tokens;public int total_tokens;
}
#endregion
实现效果

小结
能一本正经地回答一些呆瓜问题,挺好玩的,聊得越多越了解你,经过一定训练能当游戏的NPC。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
