Semantic Kernel进阶:创建和管理聊天(ChatCompletion)历史记录对象(四)

时间:2024-10-29 07:34:31

一、引言

在构建基于Semantic Kernel的AI应用时,聊天历史记录对象(Chat History)是维护对话上下文和连续性的关键。本文将一步步指导你如何创建和管理聊天历史记录对象,从而为你的AI代理提供一个强大的对话管理工具。
在这里插入图片描述

二、聊天历史记录对象的重要性

聊天历史记录对象用于存储聊天会话中的所有消息,包括来自用户、助理、工具或系统的消息。它不仅帮助AI模型理解对话的上下文,还能确保对话的连贯性,无论对话跨越多少轮次。

三、实战

3.1创建聊天历史记录对象

创建聊天历史记录对象是一个简单的过程。以下是在C#中创建聊天历史记录对象的步骤:

  1. 引入必要的命名空间
using Microsoft.SemanticKernel.ChatCompletion;
  1. 创建聊天历史记录对象
ChatHistory history = new ChatHistory();
  1. 添加消息到聊天历史记录
history.AddSystemMessage("你是一个乐于助人的技术助手");

history.AddUserMessage("可以学到什么技术?");
history.AddAssistantMessage("关注我的博客,可以了解SemanticKernel、python、c#、docker等知识。您想要学点什么?");

在这个例子中,我们添加了系统消息、用户消息和助理消息,从而构建了一个简单的对话流程。

3.2 实战小例子

构建一个命令行聊天对话功能,具体代码如下,可以看到AI可以准确识别提到的每一项技术。
下面为完整代码,可以看前面几篇实战例子中的代码介绍。

        public static async Task RunAsync()
        {
#pragma warning disable SKEXP0001, SKEXP0010, SKEXP0050, SKEXP0020, ASP0000
            //如果使用依赖项注入,则可能需要将 AI 服务直接添加到服务提供商。
            //如果要创建 AI 服务的单一实例并在暂时性内核中重复使用它们,这非常有用。

            var builder = Host.CreateApplicationBuilder();

            // 创建语义内核
            Kernel kernel = Kernel.CreateBuilder()
                .AddOpenAIChatCompletion(
                    modelId: Global.Model,//你使用的模型
                    endpoint: new Uri(Global.EndpointKey),//你使用的模型请求地址
                    apiKey: Global.ApiKey)//你使用的key
                .Build();

            builder.Services.AddOpenAIChatCompletion(
                 modelId: Global.Model,
                    endpoint: new Uri(Global.EndpointKey),
                    apiKey: Global.ApiKey
            );

            builder.Services.AddTransient((serviceProvider) => {
                return new Kernel(serviceProvider);
            });

            //将聊天完成服务添加到内核后,可以使用 get 服务方法检索它们。 下面是如何从内核检索聊天完成服务的示例。
            var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();

            Console.WriteLine("--------------问答--------------");


            string input;
            bool running = true;

            ChatHistory history = new ChatHistory();
            history.AddSystemMessage("你是一个乐于助人的技术助手");

            history.AddUserMessage("可以学到什么技术?");
            history.AddAssistantMessage("关注我的博客,可以了解SemanticKernel、python、c#、docker等知识。您想要学点什么?");

            while (running)
            {
                Console.WriteLine("当前历史对话数:" + history.Count);

                Console.WriteLine("请输入您的问题(输入'exit'退出):");
                input = Console.ReadLine();

                if (input.ToLower() == "exit")
                    running = false;
                else
                {
                    //将用户的问题添加到历史记录中
                    history.AddUserMessage(input);

                    var response = await chatCompletionService.GetChatMessageContentAsync(
                        history,
                        kernel: kernel
                    );

                    Console.WriteLine("AI回复内容如下:");
                    Console.WriteLine(response);
                    //将AI回复添加到历史记录中
                    history.Add(response);
                }

                Console.WriteLine("---------------下一次循环-------------");
                Console.WriteLine();

            }

            Console.WriteLine("程序退出。");

            
        }

如下图,AI可以根据历史记录,准确无误地找到上面提到的4种技术(SemanticKernel、python、c#、docker)。

当提问第5种时,也可正确识别历史记录中是没有第5中技术的,AI就根据自身学习的内容,推荐了JS
在这里插入图片描述

在这里插入图片描述

四、结论

通过使用聊天历史记录对象,Semantic Kernel为AI应用程序提供了一种强大的方式,以维护对话的上下文和连续性。这不仅提高了用户体验,还使得AI模型能够更自然地参与对话。


希望这篇文章能帮助你理解如何使用聊天历史记录功能来增强你的Semantic Kernel应用程序。如果你有任何问题或需要进一步的帮助,请随时提问。