【大模型部署】在C# Winform中使用文心一言ERNIE-3.5 4K 聊天模型
前言
今天来写一个简单的ernie-c#的例子,主要参考了百度智能云的例子,然后自己改了改,学习了ERNIE模型的鉴权方式,数据流的格式和简单的数据解析,实现了在C#中调用百度智能云的ernie(其实就是文心一言3.5的语言模型)的例子。
步骤
- 注册百度智能云
- 创建应用
- 开通ERNIE 3.5 4K模型的付费通道(似乎是免费的)
- 获取AK和SK
- 代码接入
步骤1-注册百度智能云
百度智能云
按提示注册即可
步骤2-创建应用
点击“应用接入” -> “创建应用”
按下图操作即可
步骤3-开通ERNIE 3.5 4K模型的付费通道
百度会送20元的优惠券,试用的话是免费的,如果要收费的话,请酌情开通
我的代金券
步骤4-获取AK和SK
在这里获取AK和SK,后面代码里面要用
代码接入
定义AK和SK
// 您的AccessKey ID
const string API_KEY = "qSXXXXXXXXXXXXXXXXQ";
// 您的AccessKey Secret
const string SECRET_KEY = "Kb8XXXXXXXXXXXXXXXXXX24ZH";
定义发送和回传的数据结构
public class Message
{
[JsonProperty("role")]
public string Role { get; set; }
[JsonProperty("content")]
public string Content { get; set; }
}
public class ErnieMessage
{
[JsonProperty("messages")]
public Message[] Messages { get; set; }
[JsonProperty("temperature")]
public double Temperature { get; set; }
[JsonProperty("top_p")]
public double TopP { get; set; }
[JsonProperty("penalty_score")]
public double PenaltyScore { get; set; }
[JsonProperty("disable_search")]
public bool DisableSearch { get; set; }
[JsonProperty("enable_citation")]
public bool EnableCitation { get; set; }
}
ErnieMessage ernieMessage = new ErnieMessage();
public class ChatCompletionResult
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("object")]
public string ObjectType { get; set; } // 这里的属性名可以根据实际需求进行命名,例如避免与.NET的内置Object类冲突
[JsonProperty("created")]
public long CreatedTimestamp { get; set; } // 通常时间戳会转换为DateTime,但这里保持为long
[JsonProperty("result")]
public string Result { get; set; }
[JsonProperty("is_truncated")]
public bool IsTruncated { get; set; }
[JsonProperty("need_clear_history")]
public bool NeedClearHistory { get; set; }
[JsonProperty("finish_reason")]
public string FinishReason { get; set; }
[JsonProperty("usage")]
public Usage UsageInfo { get; set; }
// 嵌套类来表示Usage对象
public class Usage
{
[JsonProperty("prompt_tokens")]
public int PromptTokens { get; set; }
[JsonProperty("completion_tokens")]
public int CompletionTokens { get; set; }
[JsonProperty("total_tokens")]
public int TotalTokens { get; set; }
}
}
定义消息池
// 定义消息池
public class MessagePool
{
public List<Message> Messages { get; set; }
public MessagePool()
{
Messages = new List<Message>();
}
public void AddMessage(Message message)
{
Messages.Add(message);
}
public void ClearMessages()
{
Messages.Clear();
}
}
定义角色
enum eRole { User, Assistant}
string Role(eRole role)
{
return role == eRole.User ? "user" : "assistant";
}
定义聊天函数
private string Chat(string strSend, eRole role)
{
var client = new RestClient($"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-3.5-4k-0205?access_token={GetAccessTokenMethod()}");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
AddMessageToPool(strSend, role);
var body = JsonConvert.SerializeObject(ernieMessage, Formatting.None);
request.AddParameter("application/json", body, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
AddMessageToPool(response.Content, eRole.Assistant);
ChatCompletionResult result = JsonConvert.DeserializeObject<ChatCompletionResult>(response.Content);
FillCompletionInfo(result);
if (result.NeedClearHistory) ClearHistoryMethod();
return result.Result;
}