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的效果(这里不作比较)。

3ab12759253bf5d956494b17d4cc08a3.png

(GPT问答)

11ad173b5448a9aaed8590ceea46d7e4.png

(Gemini问答)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值