2025-11-05
C#
00

目录

什么是 Semantic Kernel?
创建聊天历史对象
代码解释
添加丰富的消息
代码解释
检查聊天历史对象
代码解释
聊天历史的减少
代码解释
完整示例
结论

通过使用 Microsoft 的 Semantic Kernel,我们可以轻松地创建和管理聊天历史记录,以便在聊天会话中保持上下文和连贯性。本文将详细介绍如何使用 Semantic Kernel 调用 Ollama 历史聊天应用,并提供多个示例和注释,帮助开发者更好地理解和实现这一功能。

什么是 Semantic Kernel?

Semantic Kernel 是一个强大的工具,旨在简化与 AI 模型的交互。它提供了多种功能,包括聊天记录管理、函数调用和多模态支持,使开发者能够构建更智能的应用程序。

创建聊天历史对象

聊天历史对象是一个用于维护聊天会话中消息记录的列表。以下是如何在 C# 中创建一个聊天历史对象的示例:

C#
using Microsoft.SemanticKernel.ChatCompletion; // 创建聊天历史对象 ChatHistory chatHistory = new ChatHistory(); chatHistory.AddSystemMessage("你是一个有帮助的助手。"); chatHistory.AddUserMessage("可以点什么?"); chatHistory.AddAssistantMessage("我们有比萨、意大利面和沙拉可供选择。你想点什么?"); chatHistory.AddUserMessage("我想要第一个选项。");

代码解释

  • ChatHistory 是聊天历史对象的类。
  • AddSystemMessage 方法用于添加系统消息。
  • AddUserMessageAddAssistantMessage 方法分别用于添加用户和助手的消息。

添加丰富的消息

除了基本的消息,我们还可以添加更丰富的消息,例如包含用户名称和图片的消息。以下是一个示例:

C#
// 添加系统消息 chatHistory.Add(new ChatMessageContent { Role = AuthorRole.System, Content = "你是一个有帮助的助手" }); // 添加带有图片的用户消息 chatHistory.Add(new ChatMessageImageContent { Role = AuthorRole.User, ImageUrl = "https://example.com/menu.jpg" });

代码解释

  • ChatMessageContentChatMessageImageContent 是用于创建消息的类。
  • AuthorRole 枚举用于指定消息的角色(系统、用户或助手)。

检查聊天历史对象

在与聊天完成服务交互时,我们可以检查聊天历史对象,以查看函数调用和结果。以下是一个示例:

C#
// 获取当前聊天历史长度 int currentChatHistoryLength = chatHistory.Count; // 获取聊天消息内容 var results = await chatCompletionService.GetChatMessageContentAsync(chatHistory); // 打印新添加的消息 for (int i = currentChatHistoryLength; i < chatHistory.Count; i++) { Console.WriteLine(chatHistory[i]); } // 打印最终消息 Console.WriteLine(results);

代码解释

  • GetChatMessageContentAsync 方法用于获取聊天消息内容。
  • 我们可以遍历聊天历史并打印新添加的消息。

聊天历史的减少

随着聊天的进行,聊天历史可能会变得庞大,影响性能。我们可以使用聊天历史减少器来管理聊天历史。以下是一个示例:

注意:#pragma warning disable SKEXP0001

C#
// 创建聊天历史减少器 var reducer = new ChatHistoryTruncationReducer(targetCount: 2); // 添加用户消息 chatHistory.AddUserMessage("推荐一些关于西雅图的书籍。"); chatHistory.AddUserMessage("推荐一些关于都柏林的书籍。"); // 执行减少操作 var reducedMessages = await reducer.ReduceAsync(chatHistory); if (reducedMessages != null) { chatHistory = new ChatHistory(reducedMessages); }

代码解释

  • ChatHistoryTruncationReducer 用于减少聊天历史的大小。
  • ReduceAsync 方法根据目标消息数量减少聊天历史。

完整示例

C#
#pragma warning disable SKEXP0070 using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.ChatCompletion; namespace AppOllamaHistory { internal class Program { static async Task Main(string[] args) { var builder = Kernel.CreateBuilder(); var modelId = "deepseek-r1:1.5b"; var endpoint = new Uri("http://127.0.0.1:11434"); builder.Services.AddOllamaChatCompletion(modelId, endpoint); Kernel kernel = builder.Build(); var chatHistory = new ChatHistory(); // 添加系统消息 chatHistory.AddSystemMessage("我是你的助手."); // 模拟用户输入 var userMessages = new List<string> { "我想学习一门IT技术,帮我推荐几个", "请帮我选第二项" }; var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>(); foreach (var userMessage in userMessages) { // 添加用户消息 chatHistory.AddUserMessage(userMessage); Console.WriteLine($"\n>>> User:\n{userMessage}"); // 获取助手的响应 var response = await chatCompletionService.GetChatMessageContentAsync(chatHistory); chatHistory.AddAssistantMessage(response.Content!); Console.WriteLine($"\n>>> Assistant:\n{response.Content!}"); } // 打印聊天历史 Console.WriteLine("\nChat History:"); foreach (var message in chatHistory) { Console.WriteLine($"{message.Role}: {message.Content}"); } Console.ReadKey(); } } }

image.png

结论

通过使用 Microsoft 的 Semantic Kernel,我们可以轻松地创建和管理聊天历史对象,模拟函数调用,并有效地减少聊天历史。这些功能使得构建智能聊天应用程序变得更加简单和高效。希望本文能帮助你更好地理解如何使用 Semantic Kernel 调用 Ollama 历史聊天应用。

通过以上示例和详细说明,你可以在自己的项目中实现聊天历史管理功能,提升用户体验。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!