1.簡述
? ? ? ? 最近看到新聞,說是百度、字節(jié)、商湯、百川、智普等幾家企業(yè)及機(jī)構(gòu)所發(fā)布的生成式大語言模型,通過了《生成式人工智能服務(wù)管理暫行辦法》,成為首批獲得官方備案的大語言模型服務(wù)提供商。雖然一直在使用包括文心一言、chatglm這些大語言模型的,但這次好像用著合法合規(guī),有了保障的感覺。
? ? ? ? 關(guān)于百度的文心一言,也是繼chatgpt發(fā)布以來國內(nèi)首發(fā)跟進(jìn),發(fā)布的大語言模型了。從文心一言的官方應(yīng)用上,并沒有找到api的使用入口,讓我一度以為百度沒有開放相關(guān)的接口服務(wù)。文心一言官方傳送門:
https://yiyan.baidu.com/https://yiyan.baidu.com/? ? ? ? 直到有一天下午接到百度AI開放平臺的客戶回訪,順便咨詢了一下文心一言的API相關(guān)的問題,才了解到,在百度的千帆大模型平臺上,是有提供針對百度自研模型的API服務(wù)的。所以簡單看了一下千帆大模型平臺,果然是有大語言模型的API入口,不止提供有百度的文心一言大模型,也提供了幾個(gè)主流大語言模型的公共服務(wù)。所以,就將百度文心大模型的API服務(wù)集成到我的AI二次元姐姐項(xiàng)目里,這樣大家又多了一個(gè)國內(nèi)合法的選擇了,百度智能云平臺傳送門:
https://cloud.baidu.com/https://cloud.baidu.com/? ? ? ? 接下來,我將介紹一下如何在百度智能云平臺上,開通大語言模型服務(wù),以及如何使用我的AI工具包,在Unity上部署實(shí)現(xiàn)AI二次元小姐姐聊天應(yīng)用。
2.開通大語言模型應(yīng)用
? ? ? ?2.1 千帆大模型平臺
????????使用百度文心大模型應(yīng)用,首先我們需要注冊一個(gè)百度賬號,這里就不再贅述了。注冊賬號后,根據(jù)上節(jié)內(nèi)容中提到的百度智能云平臺,點(diǎn)擊鏈接進(jìn)入到官方站點(diǎn)。
? ? ? ? 進(jìn)入到官方平臺頁面后,我們可以在頂部的菜單欄里找到【產(chǎn)品->AI開發(fā)平臺->文心千帆大模型】,從這個(gè)入口就可以找到我們需要的文心大模型服務(wù)了。
? ? ? ? 點(diǎn)擊文心千帆大模型平臺,進(jìn)入到大模型平臺頁面,這里我們可以查看文心千帆大模型所提供的各種能力。
? ? ? ? 能夠提供的大語言模型,根據(jù)官方文檔我們可以了解到,千帆大語言模型平臺支持的生成式AI模型包括百度自研的文心一言、文心一格,也包含了多個(gè)第三方大模型,如chatGLM、Llama、RWKV,也支持stable diffusion圖片生成模型,總體上看還是很強(qiáng)大的。
? ? ? ? 這里,我們需要的是利用文本生成模型來驅(qū)動(dòng)我們的AI數(shù)字人的,所以只需要使用文本生成模型就可以滿足我們的需求。百度智能云平臺提供了若干種大語言模型的公共服務(wù),我們可以直接使用,包括文心大模型以及一些第三方模型。可支持的大語言模型可詳細(xì)查看官方文檔。
? ? ? ?2.2?創(chuàng)建大模型應(yīng)用
????????在使用文心大模型之前,我們首先需要?jiǎng)?chuàng)建一個(gè)大模型應(yīng)用,只需要點(diǎn)擊文心大模型主頁上的【立即使用】按鈕,就可以跳轉(zhuǎn)到控制臺界面(請先登錄賬號),在控制臺頁面中,找到“應(yīng)用接入”,點(diǎn)擊進(jìn)入到應(yīng)用創(chuàng)建的頁面。
? ? ? ? 在應(yīng)用創(chuàng)建視圖下,點(diǎn)擊“創(chuàng)建應(yīng)用”,進(jìn)入到應(yīng)用創(chuàng)建頁面。根據(jù)平臺的提示,填寫應(yīng)用名稱和描述信息,可用的大模型公共服務(wù),平臺默認(rèn)全部勾選了,可以不用管,直接提交創(chuàng)建,這樣我們就完成了應(yīng)用的創(chuàng)建操作。
? ? ? ? 應(yīng)用創(chuàng)建成功之后,就可以在控制臺界面中找到應(yīng)用的api key以及secret key這兩個(gè)密鑰,妥善保管好,后面我們會用到。
? ? ? ? 2.3 開通模型付費(fèi)
? ? ? ? 平臺所提供大語言模型公共服務(wù),需要我們開通付費(fèi)后,才能使用。百度千帆大模型平臺的模型服務(wù)采用的是,按量計(jì)費(fèi)模式,我們先開通模型服務(wù)付費(fèi)之后,再根據(jù)使用的token數(shù)量,計(jì)算費(fèi)用。我們可以在控制臺界面的上方,找到計(jì)費(fèi)管理按鈕,點(diǎn)擊就可以進(jìn)入到計(jì)費(fèi)開通界面了。
? ? ? ? 平臺提供的公共模型服務(wù)的價(jià)格,可以在視圖中查看,100萬token的價(jià)格在幾塊錢至十幾塊錢不等,可以根據(jù)自己的需求,選擇模型進(jìn)行開通即可。
? ? ? ? 開通模型付費(fèi)后,咱們就可以使用相應(yīng)的模型服務(wù)了,接下來,咱們就可以在unity端,進(jìn)行API對接的代碼實(shí)現(xiàn)了。
3.API服務(wù)對接
? ? ? ? 千帆大模型平臺的API對接流程,和百度AI開放平臺的其他服務(wù)對接的流程是類似,首先,需要使用應(yīng)用創(chuàng)建后,拿到的api key以及secret key,通過百度的鑒權(quán)api,拿到授權(quán)token,這個(gè)access token的有效期是30天,可以根據(jù)需要更新即可。獲取到token后,在大語言模型API對接流程中,我們需要根據(jù)所選擇的語言模型的訪問地址,將token拼接到url中,再進(jìn)行服務(wù)的訪問。
? ? ? ? 接下來,我們來看看詳細(xì)的對接過程的代碼實(shí)現(xiàn)吧。
3.1 鑒權(quán)接口
? ? ? ? 百度應(yīng)用服務(wù)的鑒權(quán)接口訪問,需要提供應(yīng)用的api key以及secret key,這兩個(gè)密鑰在我們創(chuàng)建應(yīng)用后,可以在控制臺找到。獲取access token的api地址如下:
https://aip.baidubce.com/oauth/2.0/tokenhttps://aip.baidubce.com/oauth/2.0/token
? ? ? ? 代碼示例:
using Newtonsoft.Json.Linq;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class BaiduSettings : MonoBehaviour
{
#region 參數(shù)定義
/// <summary>
/// API Key
/// </summary>
[Header("填寫應(yīng)用的API Key")] public string m_API_key = string.Empty;
/// <summary>
/// Secret Key
/// </summary>
[Header("填寫應(yīng)用的Secret Key")] public string m_Client_secret = string.Empty;
/// <summary>
/// 是否從服務(wù)器獲取token
/// </summary>
[SerializeField] private bool m_GetTokenFromServer = true;
/// <summary>
/// token值
/// </summary>
public string m_Token = string.Empty;
/// <summary>
/// 獲取Token的地址
/// </summary>
[SerializeField] private string m_AuthorizeURL = "https://aip.baidubce.com/oauth/2.0/token";
#endregion
private void Awake()
{
if (m_GetTokenFromServer)
{
StartCoroutine(GetToken(GetTokenAction));
}
}
/// <summary>
/// 獲取到token
/// </summary>
/// <param name="_token"></param>
private void GetTokenAction(string _token)
{
m_Token = _token;
}
/// <summary>
/// 獲取token的方法
/// </summary>
/// <param name="_callback"></param>
/// <returns></returns>
private IEnumerator GetToken(System.Action<string> _callback)
{
//獲取token的api地址
string _token_url = string.Format(m_AuthorizeURL + "?client_id={0}&client_secret={1}&grant_type=client_credentials"
, m_API_key, m_Client_secret);
using (UnityWebRequest request = new UnityWebRequest(_token_url, "GET"))
{
request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
yield return request.SendWebRequest();
if (request.isDone)
{
string _msg = request.downloadHandler.text;
TokenInfo _textback = JsonUtility.FromJson<TokenInfo>(_msg);
string _token = _textback.access_token;
_callback(_token);
}
}
}
/// <summary>
/// 返回的token
/// </summary>
[System.Serializable]
public class TokenInfo
{
public string access_token = string.Empty;
}
}
3.2 大語言模型API對接
? ? ? ?3.2.1 請求參數(shù)說明
????????獲取到access token之后,我們就可以根據(jù)文心大模型的api文檔,進(jìn)行接口對接了。不同模型的接口地址略有差異,我們可以通過查閱API文檔,獲取到各個(gè)模型的訪問地址,API文檔地址如下:
https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Nlks5zkzuhttps://cloud.baidu.com/doc/WENXINWORKSHOP/s/Nlks5zkzu? ? ? ? 通過文檔查閱,我們可以發(fā)現(xiàn),千帆大模型平臺提供的公共模型服務(wù)的訪問地址,前面的地址是一樣,只有模型名稱的差異,注意這點(diǎn)就可以了,我們具體看一下接口的要求。
請求地址(示例):
?https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/根據(jù)模型而定
名稱 | 值 |
---|---|
Content-Type | application/json |
????????關(guān)于access token,我們將token拼接在url里即可,以下是url示例:
?https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/根據(jù)模型而定?access_token=token值
????????需要發(fā)送的報(bào)文結(jié)構(gòu)
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
messages | List(message) | 是 | 聊天上下文信息。說明: (1)messages成員不能為空,1個(gè)成員表示單輪對話,多個(gè)成員表示多輪對話 (2)最后一個(gè)message為當(dāng)前請求的信息,前面的message為歷史對話信息 (3)必須為奇數(shù)個(gè)成員,成員中message的role必須依次為user、assistant (4)最后一個(gè)message的content長度(即此輪對話的問題)不能超過2000個(gè)字符;如果messages中content總長度大于2000字符,系統(tǒng)會依次遺忘最早的歷史會話,直到content的總長度不超過2000個(gè)字符 |
temperature | float | 否 | 說明: (1)較高的數(shù)值會使輸出更加隨機(jī),而較低的數(shù)值會使其更加集中和確定 (2)默認(rèn)0.95,范圍 (0, 1.0],不能為0 (3)建議該參數(shù)和top_p只設(shè)置1個(gè) (4)建議top_p和temperature不要同時(shí)更改 |
top_p | float | 否 | 說明: (1)影響輸出文本的多樣性,取值越大,生成文本的多樣性越強(qiáng) (2)默認(rèn)0.8,取值范圍 [0, 1.0] (3)建議該參數(shù)和temperature只設(shè)置1個(gè) (4)建議top_p和temperature不要同時(shí)更改 |
penalty_score | float | 否 | 通過對已生成的token增加懲罰,減少重復(fù)生成的現(xiàn)象。說明: (1)值越大表示懲罰越大 (2)默認(rèn)1.0,取值范圍:[1.0, 2.0] |
stream | bool | 否 | 是否以流式接口的形式返回?cái)?shù)據(jù),默認(rèn)false |
user_id | string | 否 | 表示最終用戶的唯一標(biāo)識符,可以監(jiān)視和檢測濫用行為,防止接口惡意調(diào)用 |
message說明
名稱 | 類型 | 描述 |
---|---|---|
role | string | 當(dāng)前支持以下: user: 表示用戶 assistant: 表示對話助手 |
content | string | 對話內(nèi)容,不能為空 |
?3.2.2?響應(yīng)參數(shù)說明
? ? ? ? 以下是后臺響應(yīng)的報(bào)文結(jié)構(gòu)
名稱 | 類型 | 描述 |
---|---|---|
id | string | 本輪對話的id |
object | string | 回包類型 chat.completion:多輪對話返回 |
created | int | 時(shí)間戳 |
sentence_id | int | 表示當(dāng)前子句的序號。只有在流式接口模式下會返回該字段 |
is_end | bool | 表示當(dāng)前子句是否是最后一句。只有在流式接口模式下會返回該字段 |
is_truncated | bool | 當(dāng)前生成的結(jié)果是否被截?cái)?/td> |
result | string | 對話返回結(jié)果 |
need_clear_history | bool | 表示用戶輸入是否存在安全,是否關(guān)閉當(dāng)前會話,清理歷史會話信息 true:是,表示用戶輸入存在安全風(fēng)險(xiǎn),建議關(guān)閉當(dāng)前會話,清理歷史會話信息 false:否,表示用戶輸入無安全風(fēng)險(xiǎn) |
ban_round | int | 當(dāng)need_clear_history為true時(shí),此字段會告知第幾輪對話有敏感信息,如果是當(dāng)前問題,ban_round=-1 |
usage | usage | token統(tǒng)計(jì)信息,token數(shù) = 漢字?jǐn)?shù)+單詞數(shù)*1.3 (僅為估算邏輯) |
usage說明
名稱 | 類型 | 描述 |
---|---|---|
prompt_tokens | int | 問題tokens數(shù) |
completion_tokens | int | 回答tokens數(shù) |
total_tokens | int | tokens總數(shù) |
注意?:同步模式和流式模式,響應(yīng)參數(shù)返回不同,詳細(xì)內(nèi)容參考示例描述。
- 同步模式下,響應(yīng)參數(shù)為以上字段的完整json包。
- 流式模式下,各字段的響應(yīng)參數(shù)為 data: {響應(yīng)參數(shù)}。
3.2.3 代碼示例
????????以下是訪問大語言模型API服務(wù)的完整代碼示例
/// <summary>
/// token腳本
/// </summary>
[SerializeField] private BaiduSettings m_Settings;
/// <summary>
/// 歷史對話
/// </summary>
private List<message> m_History = new List<message>();
/// <summary>
/// 選擇的模型類型
/// </summary>
[Header("設(shè)置模型名稱")]
public ModelType m_ModelType = ModelType.ERNIE_Bot_turbo;
/// <summary>
/// 初始化
/// </summary>
private void OnInit()
{
m_Settings = this.GetComponent<BaiduSettings>();
GetEndPointUrl();
}
/// <summary>
/// 發(fā)送消息
/// </summary>
/// <returns></returns>
public override void PostMsg(string _msg, Action<string> _callback)
{
base.PostMsg(_msg, _callback);
}
/// <summary>
/// 發(fā)送數(shù)據(jù)
/// </summary>
/// <param name="_postWord"></param>
/// <param name="_callback"></param>
/// <returns></returns>
public override IEnumerator Request(string _postWord, System.Action<string> _callback)
{
stopwatch.Restart();
string _postUrl = url + "?access_token=" + m_Settings.m_Token;
m_History.Add(new message("user", _postWord));
RequestData _postData = new RequestData
{
messages = m_History
};
using (UnityWebRequest request = new UnityWebRequest(_postUrl, "POST"))
{
string _jsonData = JsonUtility.ToJson(_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 = JsonConvert.DeserializeObject<ResponseData>(_msg);
//歷史記錄
string _responseText = response.result;
m_History.Add(new message("assistant", response.result));
//添加記錄
m_DataList.Add(new SendData("assistant", response.result));
//回調(diào)
_callback(response.result);
}
}
stopwatch.Stop();
Debug.Log("chat百度-耗時(shí):" + stopwatch.Elapsed.TotalSeconds);
}
/// <summary>
/// 獲取資源路徑
/// </summary>
private void GetEndPointUrl()
{
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/" + CheckModelType(m_ModelType);
}
/// <summary>
/// 獲取資源
/// </summary>
/// <param name="_type"></param>
/// <returns></returns>
private string CheckModelType(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 "";
}
#region 數(shù)據(jù)定義
//發(fā)送的數(shù)據(jù)
[Serializable]
private class RequestData
{
public List<message> messages = new List<message>();//發(fā)送的消息
public bool stream = false;//是否流式輸出
public string user_id=string.Empty;
}
[Serializable]
private class message
{
public string role=string.Empty;//角色
public string content = string.Empty;//對話內(nèi)容
public message() { }
public message(string _role,string _content)
{
role = _role;
content = _content;
}
}
//接收的數(shù)據(jù)
[Serializable]
private class ResponseData
{
public string id = string.Empty;//本輪對話的id
public int created;
public int sentence_id;//表示當(dāng)前子句的序號。只有在流式接口模式下會返回該字段
public bool is_end;//表示當(dāng)前子句是否是最后一句。只有在流式接口模式下會返回該字段
public bool is_truncated;//表示當(dāng)前子句是否是最后一句。只有在流式接口模式下會返回該字段
public string result = string.Empty;//返回的文本
public bool need_clear_history;//表示用戶輸入是否存在安全
public int ban_round;//當(dāng)need_clear_history為true時(shí),此字段會告知第幾輪對話有敏感信息,如果是當(dāng)前問題,ban_round=-1
public Usage usage = new Usage();//token統(tǒng)計(jì)信息,token數(shù) = 漢字?jǐn)?shù)+單詞數(shù)*1.3
}
[Serializable]
private class Usage
{
public int prompt_tokens;//問題tokens數(shù)
public int completion_tokens;//回答tokens數(shù)
public int total_tokens;//tokens總數(shù)
}
#endregion
/// <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,
}
4. Unity端數(shù)字人配置
? ? ? ? 項(xiàng)目的源碼已經(jīng)發(fā)布到Github了,我們可以直接下載,并導(dǎo)入到unity中使用,要求unity版本在2020.3.44及以上。導(dǎo)入工具包之后,可以在Scene文件夾下,找到示例場景,在場景中找到LLM->chatBaidu對象,這里就維護(hù)了百度文心大模型的驅(qū)動(dòng)腳本。
? ? ? ? 在unity編輯器端,選擇chatBaidu對象之后,在屬性面板里填寫前面創(chuàng)建的應(yīng)用密鑰,并且選擇好已經(jīng)開通付費(fèi)的大語言模型。
? ? ? ? 配置一下聊天服務(wù)腳本,將AI驅(qū)動(dòng)的腳本改成百度文心大模型的腳本。如果不需要使用語音服務(wù)的話,可以在配置欄里,關(guān)掉語音服務(wù),這樣就可以填寫語音服務(wù)相關(guān)的東西了。
? ? ? ? 上述配置完成,我們就可以使用百度文心大模型來驅(qū)動(dòng)AI二次元小姐姐了。
5.結(jié)束語 ? ? ? ?
????????這次的文章簡單介紹了百度文心大模型平臺API的對接流程,并針對接口對接的流程進(jìn)行了介紹,包括接口的鑒權(quán)、以及發(fā)送報(bào)文、響應(yīng)報(bào)文的結(jié)構(gòu)說明,并提供了針對全流程在unity端的實(shí)現(xiàn)代碼示例。通過上述的代碼實(shí)現(xiàn),我們就可以在unity引擎中,使用百度文心大模型的api來驅(qū)動(dòng)AI二次元小姐姐的對話交互。完整的代碼工程可以從我的開源項(xiàng)目下載使用,項(xiàng)目包含了針對多種GPT應(yīng)用的集成工具,以及語音服務(wù)的集成,對我這個(gè)項(xiàng)目感興趣的朋友,可以上我的B站號查看,我也做有詳細(xì)的教程,相關(guān)源碼可以在的嗶哩嗶哩主站找到相關(guān)視頻,在視頻介紹以及評論區(qū)獲取。
【Unity+文心一言】文心大模型API驅(qū)動(dòng)AI小姐姐,Unity開源工具包,打造AI二次元小姐姐~
項(xiàng)目地址傳送門:
AI二次元老婆開源項(xiàng)目(unity-AI-Chat-Toolkit):
Github地址:https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit文章來源:http://www.zghlxwxcb.cn/news/detail-722150.html
Gitee地址:https://gitee.com/DammonSpace/unity-ai-chat-toolkit
?文章來源地址http://www.zghlxwxcb.cn/news/detail-722150.html
到了這里,關(guān)于Unity+百度文心大模型驅(qū)動(dòng)AI小姐姐數(shù)字人的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!