想要使用文心一言,首先要登录百度智能云千帆控制台
https://cloud.baidu.com/product/wenxinworkshop?track=developer_qianfan_tanchuang
1.在控制台找到应用接入 - 然后点击创建应用
2.填写应用信息
3.创建之后,记下API Key 和 Secret Key,等会会用到
4.打开Unity,建一个简单的聊天场景
5.加入测试代码
public class ChatAI: MonoBehaviour
{
public string token;
//这里填写百度千帆大模型里的应用api key
public string api_key = "xxxxxx";
//这里填写百度千帆大模型里的应用secret key
public string secret_key = "xxxxxxxxx";
//发送按钮
public Button sendBtn;
//输入框
public TMP_InputField info;
//AI回应
public TextMeshProUGUI responseText;
// 历史对话
private List<message> historyList = new List<message>();
public void Awake()
{
//初始化文心一言,获取token
StartCoroutine(GetToken());
sendBtn.onClick.AddListener(OnSend);
}
public void OnSend()
{
OnSpeak(info.text);
}
//开始对话
public void OnSpeak(string talk )
{
StartCoroutine(Request(talk));
}
private IEnumerator GetToken()
{
//获取token的api地址
string _token_url = string.Format("https://aip.baidubce.com/oauth/2.0/token" + "?client_id={0}&client_secret={1}&grant_type=client_credentials" , api_key, secret_key);
using (UnityWebRequest request = new UnityWebRequest(_token_url, "POST"))
{
request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
yield return request.SendWebRequest();
if (request.isDone)
{
string msg = request.downloadHandler.text;
TokenInfo mTokenInfo = JsonUtility.FromJson<TokenInfo>(msg);
//保存Token
token = mTokenInfo.access_token;
}
}
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="_postWord"></param>
/// <param name="_callback"></param>
/// <returns></returns>
public IEnumerator Request(string talk)
{
string url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/";
string postUrl = url + GetModelType(ModelType.ERNIE_Bot) + "?access_token=" + token;
historyList.Add(new message("user", talk));
RequestData postData = new RequestData
{
messages = historyList
};
using (UnityWebRequest request = new UnityWebRequest(postUrl, "POST"))
{
string jsonData = XJsonParser.ToJson<RequestData>(postData);
byte[] data = System.Text.Encoding.UTF8.GetBytes(jsonData);
request.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);
request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
if (request.responseCode == 200)
{
string _msg = request.downloadHandler.text;
ResponseData response;
XJsonParser.ToObject(out response, _msg);
//加入历史数据
historyList.Add(new message("assistant", response.result));
responseText.text = response.result;
}
}
}
/// <summary>
/// 获取资源
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
private string GetModelType(ModelType type)
{
if (type == ModelType.ERNIE_Bot)
{
return "completions";
}
if (type == ModelType.ERNIE_Bot_turbo)
{
return "eb-instant";
}
if (type == ModelType.BLOOMZ_7B)
{
return "bloomz_7b1";
}
if (type == ModelType.Qianfan_BLOOMZ_7B_compressed)
{
return "qianfan_bloomz_7b_compressed";
}
if (type == ModelType.ChatGLM2_6B_32K)
{
return "chatglm2_6b_32k";
}
if (type == ModelType.Llama_2_7B_Chat)
{
return "llama_2_7b";
}
if (type == ModelType.Llama_2_13B_Chat)
{
return "llama_2_13b";
}
if (type == ModelType.Llama_2_70B_Chat)
{
return "llama_2_70b";
}
if (type == ModelType.Qianfan_Chinese_Llama_2_7B)
{
return "qianfan_chinese_llama_2_7b";
}
if (type == ModelType.AquilaChat_7B)
{
return "aquilachat_7b";
}
return "";
}
//发送的数据
private class RequestData
{
//发送的消息
public List<message> messages = new List<message>();
//是否流式输出
public bool stream = false;
public string user_id = string.Empty;
}
private class message
{
//角色
public string role =string.Empty;
//对话内容
public string content = string.Empty;
public message() { }
public message(string _role, string _content )
{
if (_role != "")
{
role = _role;
}
content = _content;
}
}
//接收的数据
private class ResponseData
{
//本轮对话的id
public string id = string.Empty;
public int created;
//表示当前子句的序号,只有在流式接口模式下会返回该字段
public int sentence_id;
//表示当前子句是否是最后一句,只有在流式接口模式下会返回该字段
public bool is_end;
//表示当前子句是否是最后一句,只有在流式接口模式下会返回该字段
public bool is_truncated;
//返回的文本
public string result = string.Empty;
//表示输入是否存在安全
public bool need_clear_history;
//当need_clear_history为true时,此字段会告知第几轮对话有敏感信息,如果是当前问题,ban_round=-1
public int ban_round;
//token统计信息,token数 = 汉字数+单词数*1.3
public Usage usage = new Usage();
}
private class Usage
{
//问题tokens数
public int prompt_tokens;
//回答tokens数
public int completion_tokens;
//tokens总数
public int total_tokens;
}
/// <summary>
/// 模型名称
/// </summary>
public enum ModelType
{
ERNIE_Bot,
ERNIE_Bot_turbo,
BLOOMZ_7B,
Qianfan_BLOOMZ_7B_compressed,
ChatGLM2_6B_32K,
Llama_2_7B_Chat,
Llama_2_13B_Chat,
Llama_2_70B_Chat,
Qianfan_Chinese_Llama_2_7B,
AquilaChat_7B,
}
/// <summary>
/// 返回的token
/// </summary>
[System.Serializable]
public class TokenInfo
{
public string access_token = string.Empty;
}
}
6.输入问题,然后点击发送。
等待回复会有一点点时间,实际开发的时候,可以加一些过渡动画
7.接收到来着文心一言的回答。
8.本教程只作简单的演示功能,开发者可以根据自己的需求设计出丰富的对话功能。
附官方文档
https://cloud.baidu.com/doc/WENXINWORKSHOP/s/flfmc9do2