Semantic Kernel:Chat聊天服务
生成式AI之所以火爆,是通过ChatGPT引起的,因为这种智能对话(chat)式交互,颠覆人们对人机对话的认识和理解,它可以真人一样把上下文串起来,进行整体的理解和回复。
当然,SK会在早期的版中就进行了适配,SK让聊天上下文留存是通过ChatHistory实现的,并且这些内存会区分角色,当前1.15.0的包中角色有四种:System,Assistant,User,Tool,下面说明一下四种角色的功能和作用:
-
System (系统): 这个角色指示或设置助理的行为。在系统中,它可能是管理权限、控制流程或执行系统级任务的角色。
-
Assistant (助理): 这个角色提供对系统指令和用户提示输入的响应。在对话中,助理角色是向用户提供帮助、回答问题或执行任务的角色。
-
User (用户): 这个角色提供聊天完成所需的输入。在对话中,用户角色代表与系统交互的实际人类用户,他们提出问题或请求信息。
- Tool (工具): 这个角色提供聊天完成所需的额外信息和参考资料。在对话中,工具角色可能是提供支持功能、数据查询或其他辅助性任务的角色。
下面是一个聊天的场景,通过system来设置一个角色和他的特点,然后让user输入,assistant来回复。
using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.ChatCompletion; using System.Runtime.CompilerServices; using System.Text; var chatModelId = "gpt-4o"; var geminiModelId = "gemini-1.5-flash-latest"; var geminiKey = File.ReadAllText(@"C:\GPT\gemini.txt"); var key = File.ReadAllText(@"C:\GPT\key.txt"); #pragma warning disable SKEXP0070 var kernel = Kernel.CreateBuilder() .AddOpenAIChatCompletion(chatModelId, key) //.AddGoogleAIGeminiChatCompletion(geminiModelId, geminiKey) .Build(); var chatHistory = new ChatHistory(systemMessage: "你是一位.net高级讲师,回答问题言简意赅。"); var chat = kernel.GetRequiredService<IChatCompletionService>(); var settings = new PromptExecutionSettings { ExtensionData = new Dictionary<string, object> { ["max_tokens"] = 1000, ["temperature"] = 0.2, ["top_p"] = 0.8, ["presence_penalty"] = 0.0, ["frequency_penalty"] = 0.0 } }; while (true) { //提问 Console.ResetColor(); Console.WriteLine("----------学生提问:----------"); chatHistory.AddUserMessage(Console.ReadLine()); Console.WriteLine(); //回答 var reply = await chat.GetChatMessageContentAsync(chatHistory, settings); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("==========讲师回答:=========="); Console.WriteLine(reply.Content); chatHistory.AddMessage(reply.Role, reply.Content); Console.WriteLine(); }
上面的回复如果内容多,需要等待,下面是流式响应,增加用户体验,流式与否与回复的内容无关。
Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("==========讲师回答:=========="); AuthorRole? role = AuthorRole.Assistant; var contentBuilder = new StringBuilder(); await foreach (var reply in chat.GetStreamingChatMessageContentsAsync(chatHistory, settings)) { if (reply.Role.HasValue && role != reply.Role) { role = reply.Role; } Console.Write(reply.Content); contentBuilder.Append(reply.Content); } chatHistory.AddMessage(role.Value, contentBuilder.ToString()); Console.WriteLine();
下面是两问两答,第二个问答,明显能看到GPT的“聪明”之处理,能理解下下文。
另外,在前面我们说过,同一类服务支持不同的LLM,上例中分别是GPT和Gemini,用Kernel好处就是可以注入不同的LLM服务,当一个服务有问题,或收费政策发生变化时,可以灵活切换。
下面是两种LLM的效果(这里不作比较)。
(GPT问答)
(Gemini问答)
文章来源微信公众号
想要更快更方便的了解相关知识,可以关注微信公众号
****欢迎关注我的asp.net core系统课程****
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2018-03-01 Ocelot + Consul实践