深入解析Semantic Kernel中的聊天历史记录对象

深入解析Semantic Kernel中的聊天历史记录对象

一、引言

你有没有遇到过刚跟AI说过"我喜欢吃披萨",下一秒问"我喜欢吃什么?",AI开始问口味偏好。这背后其实是AI缺乏【短期记忆】的困扰。今天我们分享的【聊天历史记录】,就是给AI装上【记忆芯片】的关键技术。

聊天历史记录对象是Semantic Kernel中用于维护聊天会话中消息记录的核心组件。它主要用于存储来自不同作者的消息,例如用户、AI助手、工具或系统消息。作为发送和接收消息的主要机制,聊天历史记录对象对于维护对话上下文和连续性至关重要。

在持续的对话过程中,聊天记录能够帮助AI模型更好地理解当前交互的上下文,提供更加相关和个性化的响应。此外,聊天记录还可以用于调试、分析用户行为模式以及改进AI模型性能。

二、聊天历史记录对象

2.1 创建聊天历史记录对象

聊天历史记录对象是后台列表,便于创建和添加消息。可存储于数据库中按不同用户进行历史聊天记录动态获取。

using Microsoft.SemanticKernel.ChatCompletion;

// Create a chat history object
ChatHistory chatHistory = [];

//添加系统消息
chatHistory.AddSystemMessage("你是一个乐于助人的AI助手。");
chatHistory.AddUserMessage("我喜欢吃披萨、听歌");
chatHistory.AddAssistantMessage("听起来你的兴趣爱好很 Lifestyle 噢!披萨是一种非常受欢迎的食物,无论是经典的意式披萨还是各种美式变种,它们都有着独特的风味。你有没有什么特别喜欢的披萨口味呢?另外,听歌也是一种很好的放松方式,可以提升心情,增加乐趣。你有特别喜欢的歌手或音乐类型吗?如果有,不妨分享一下,我们也可以交流一下。");
chatHistory.AddUserMessage("我喜欢什么?");

2.2 消息类型

2.2.1 用户消息(User Message)

代表用户输入内容,如同聊天软件中你发送的消息:

history.AddAssistantMessage("听起来你的兴趣爱好很 Lifestyle 噢!披萨是一种非常受欢迎的食物,无论是经典的意式披萨还是各种美式变种,它们都有着独特的风味。你有没有什么特别喜欢的披萨口味呢?另外,听歌也是一种很好的放松方式,可以提升心情,增加乐趣。你有特别喜欢的歌手或音乐类型吗?如果有,不妨分享一下,我们也可以交流一下。");

2.2.2 助手消息(Assistant Message)

记录AI的回复:

history.AddUserMessage("我喜欢吃披萨、听歌");

2.2.3 系统消息(System Message)

给AI的"角色设定卡",控制AI的行为模式:

history.AddSystemMessage("你是一个乐于助人的AI助手。");

2.3 为什么减少聊天历史记录?

管理聊天历史记录对于维护上下文感知对话至关重要,同时确保高效性能。 随着对话的进行,历史记录对象可能会超出模型上下文窗口的限制,从而影响响应质量并降低处理速度。 减少聊天历史记录的结构化方法可确保最相关的信息仍然可用,而无需不必要的开销。

  • 性能优化:大型聊天历史记录会增加处理时间。 减小其大小有助于保持快速高效的交互。
  • 上下文窗口管理:语言模型具有固定的上下文长度(如8K、128K)。 当历史记录超过此限制时,旧消息将丢失。 管理聊天历史记录可确保最重要的上下文保持可访问性。
  • 内存效率:在受资源约束的环境(如移动应用程序或嵌入式系统)中,无限制的聊天历史记录可能会导致内存使用率过高和性能降低。
  • 隐私和安全:保留不必要的对话历史记录会增加公开敏感信息的风险。 结构化缩减过程可最大程度地减少数据保留期,同时维护相关上下文。

2.4 减少聊天历史记录的策略

可以使用多种方法来保持聊天历史记录可管理,同时保留基本信息:

  • 截断:当历史记录超过预定义限制时,将删除最早的消息,确保仅保留最近的交互。
  • 摘要:较旧的消息压缩为摘要,同时保留关键详细信息,同时减少存储的消息数。
  • 基于token长度:基于token长度是通过测量token总数并在超出限制时删除或汇总旧消息,确保聊天历史记录保持在模型的token长度限制范围内。

聊天历史记录化简器通过评估历史记录的大小并根据可配置参数(要保留的消息数)和阈值计数(触发减少点)来自动执行这些策略。
通过集成这些减少技术,聊天应用程序可以保持响应性和性能,而不会影响聊天上下文。
在Semantic Kernel中,聊天历史记录化简器抽象由 IChatHistoryReducer 接口定义:

[Experimental("SKEXP0001")]
public interface IChatHistoryReducer
{
    Task<IEnumerable<ChatMessageContent>?> ReduceAsync(IReadOnlyList<ChatMessageContent> chatHistory, CancellationToken cancellationToken = default);
}

此接口允许自定义实现来减少聊天历史记录。

此外,语义内核还提供内置化简器:

  • ChatHistoryTruncationReducer - 将聊天历史记录截断为指定大小并丢弃已删除的消息。
    当聊天历史记录长度超过限制时,将触发减少。
  • ChatHistorySummarizationReducer -
    截断聊天历史记录,汇总已删除的消息,并将摘要添加回聊天历史记录作为单个消息。

这两个化简器始终保留系统消息,以保留模型的基本上下文。

三、 实战

注:调用方式可参考使用 Semantic Kernel 快速对接国产大模型实战指南(DeepSeek/Qwen/GLM)

var modelConfig = Global.CurModelContext("glm-4-flash");
// 1. 填充OpenAI格式LLM调用参数值
var modelId = modelConfig.Model;
var endpoint = modelConfig.EndpointKey;
var apiKey = modelConfig.ApiKey;

// 2. 创建一个OpenAI聊天完成的内核
var builder = Kernel.CreateBuilder()
    .AddOpenAIChatCompletion(modelId,
    new Uri(endpoint),
    apiKey);

// 4.构建内核
Kernel kernel = builder.Build();

//5. 对话功能(流式)
await StartStreamingChatSession(kernel);

 /// <summary>
 /// 统一对话管理(流式输出)
 /// </summary>
 /// <param name="kernel"></param>
 /// <returns></returns>
 private async Task StartStreamingChatSession(Kernel kernel)
 {
	// 保留系统消息和最新5条对话信息(注:可以通过调整targetCount来设置保留历史记录数量)
	var reducer = new ChatHistoryTruncationReducer(targetCount: 6); 

     var chatService = kernel.GetRequiredService<IChatCompletionService>();
     var history = new ChatHistory();
     history.AddSystemMessage("你是一个乐于助人的AI助手。");

     while (true)
     {
         ///获取用户输入
         Console.Write("用户 > ");
         var input = Console.ReadLine();

         //将用户输入添加到历史记录
         history.AddUserMessage(input);

         // 以下示例演示如何在维护聊天流时仅保留最后两条用户消息。
         //注:也可使用传统方式,对历史进行截断。如history.RemoveRange(0, history.Count - 5);
         var reducedMessages = await reducer.ReduceAsync(history);
         // 保留系统消息和最新的两条用户信息
         if (reducedMessages is not null)
         {
             history = new ChatHistory(reducedMessages);
         }

         //获取流式响应
         var response = chatService.GetStreamingChatMessageContentsAsync(
             chatHistory: history,
             kernel: kernel
         );
         Console.WriteLine($"助手 > ");
         string resStr = "";
         //输出流式响应
         await foreach (var chunk in response)
         {

             resStr += chunk;//拼接聊天记录
             Console.Write(chunk);
         }
         //将完整的响应添加到历史记录
         history.AddAssistantMessage(resStr);
         //输出换行
         Console.WriteLine();
     }
 }

在这里插入图片描述

在这里插入图片描述

四、常见问题解决方案

  • 对话越长响应越慢怎么办?

    • 启用流式输出
    • 减少聊天记录长度
  • 如何保证多用户隔离?

    • 为每个会话创建独立ChatHistory实例
    • 使用DI容器管理对话生命周期
  • 系统消息被覆盖如何处理?

    • 定期检测并补充系统指令
    • 将系统消息单独追加到聊天记录中

五、总结

我们学习了如何在 Semantic Kernel 中创建和管理聊天历史记录对象,以及如何使用聊天记录进行问答。聊天历史记录对象在维护对话上下文和连续性方面发挥着重要作用,是构建高效对话系统的必要工具。让AI不再健忘!

<think>好的,我需要回答用户关于Semantic Kernel的问题,特别是关于它的GitHub仓库和作为微软开源框架的信息。首先,我得回忆一下Semantic Kernel的基本概念,确保信息准确。Semantic Kernel是微软开发的一个开源框架,用于集成AI模型,比如大型语言模型(LLMs),到应用程序中。它支持多种编程语言,可能包括C#和Python,但需要确认。 接下来,用户提到了GitHub,所以必须提供正确的仓库链接。我需要查找微软官方的Semantic Kernel仓库,确保链接正确无误。通常微软的开源项目会放在GitHub的microsoft组织下,所以可能链接是github.com/microsoft/semantic-kernel。需要验证这一点。 然后,用户想了解它作为开源框架的特点。应该包括主要功能,比如插件架构、规划能力、与AI服务的集成,以及支持的模型类型,比如OpenAI、Azure OpenAI、Hugging Face等。还要提到支持的编程语言,例如C#、Python、Java,但需要确认最新的支持情况,可能Java还在测试阶段。 另外,用户可能对应用场景感兴趣,比如智能助手、自动化流程、数据增强等。需要举几个例子说明其用途。还要确保引用相关资源,如官方文档和GitHub仓库,并在回答末尾添加引用标识。 最后,生成相关问题时要考虑用户可能的后续疑问,比如与LangChain的区别、使用场景、核心功能、支持的模型,以及如何开始使用。确保问题相关且有帮助,引导用户进一步探索。 在回答过程中,需要遵循用户提供的格式要求,使用正确的LaTeX语法,虽然当前内容可能不需要数学公式,但需保持警惕。同时,用中文回答,结构清晰,分点说明,保持自然流畅。检查是否有任何错误或过时信息,比如框架的最新版本或新增功能,确保回答的准确性和可靠性。</think>### Semantic Kernel 简介 Semantic Kernel(SK)是微软推出的开源框架,旨在帮助开发者将大型语言模型(LLMs)等AI能力集成到应用程序中。它提供了一套工具和接口,支持灵活的任务规划、上下文管理以及与外部服务的交互。 ### GitHub 与开源信息 - **GitHub仓库**:官方仓库为 [microsoft/semantic-kernel](https://github.com/microsoft/semantic-kernel),包含代码、文档和示例[^1]。 - **框架特点**: 1. **插件架构**:支持扩展功能模块(如API、数据库),并通过自然语言调用。 2. **规划能力**:将复杂任务分解为可执行的子任务,例如自动生成代码或数据分析步骤。 3. **多模型支持**:兼容OpenAI、Azure OpenAI、Hugging Face等模型。 4. **多语言支持**:支持C#、Python、Java(实验阶段)等语言。 ### 应用场景 - **智能助手**:集成LLMs实现对话式交互(如客服机器人)。 - **自动化流程**:自动生成代码、文档或执行数据清洗。 - **知识增强**:结合外部数据源(如企业数据库)提升模型输出的准确性[^2]。 ### 示例代码(Python) ```python import semantic_kernel as sk from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion kernel = sk.Kernel() kernel.add_chat_service("chat", OpenAIChatCompletion("gpt-3.5-turbo", "API_KEY")) skill = kernel.import_semantic_skill_from_directory("skills", "SummarizeSkill") summary = kernel.run(skill["Summarize"], input_text="长文本内容...") print(summary) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值