资源及介绍接上篇
nuget引用以下组件
效果展示:
内存和cpu占有:
代码如下:路径换成自己的模型路径 模型请从上篇文尾下载
internal class Program
{
private static CancellationTokenSource? cts;
private static IChatClient? model;
private static List<Message> Messages { get; } = [];
static async Task Main(string[] args)
{
bool bRet = SetConsoleCtrlHandler(cancelHandler, true);
GenAIModel.InitializeGenAI();
model = await GenAIModel.CreateAsync(@"D:\microsoft--Phi-3.5-mini-instruct-onnx\main\cpu_and_mobile\cpu-int4-awq-block-128-acc-level-4", new LlmPromptTemplate
{
System = "<|system|>\n{
{CONTENT}}<|end|>\n",
User = "<|user|>\n{
{CONTENT}}<|end|>\n",
Assistant = "<|assistant|>\n{
{CONTENT}}<|end|>\n",
Stop = ["<|system|>", "<|user|>", "<|assistant|>", "<|end|>"]
});
Console.WriteLine("Enter your prompt (Press Shift + Enter to insert a newline)");
while (true)
{
var txt = "";
txt = Console.ReadLine();
if (!string.IsNullOrEmpty(txt))
AddMessage(txt);
}
}
private static void AddMessage(string text)
{
if (model == null)
{
return;
}
Messages.Add(new Message(text.Trim(), DateTime.Now, ChatRole.User));
Task.Run(async () =>
{
var history = Messages.Select(m => new ChatMessage(m.Role, m.Content)).ToList();
var responseMessage = new Message(string.Empty, DateTime.Now, ChatRole.Assistant);
Messages.Add(responseMessage);
cts = new CancellationTokenSource();
history.Insert(0, new ChatMessage(ChatRole.System, "You are a helpful assistant"));
Console.WriteLine(responseMessage);
await foreach (var messagePart in model.CompleteStreamingAsync(history, null, cts.Token))
{
var part = messagePart;
responseMessage.Content += part;
Console.Write(part);
}
Console.WriteLine("***************************END***************************");
cts?.Dispose();
cts = null;
});
}
#region close
public delegate bool ControlCtrlDelegate(int CtrlType);
[DllImport("kernel32.dll")]
private static extern bool SetConsoleCtrlHandler(ControlCtrlDelegate HandlerAppClose, bool Add);
private static ControlCtrlDelegate cancelHandler = new ControlCtrlDelegate(HandlerAppClose);
/// <summary>
/// 关闭窗口时的事件
/// </summary>
/// <param name="CtrlType"></param>
/// <returns></returns>
static bool HandlerAppClose(int CtrlType)
{
cts?.Cancel();
cts?.Dispose();
cts = null;
model?.Dispose();
return false;
}
#endregion
}