通过使用 Microsoft 的 Semantic Kernel,我们可以轻松地创建和管理聊天历史记录,以便在聊天会话中保持上下文和连贯性。本文将详细介绍如何使用 Semantic Kernel 调用 Ollama 历史聊天应用,并提供多个示例和注释,帮助开发者更好地理解和实现这一功能。
Semantic Kernel 是一个强大的工具,旨在简化与 AI 模型的交互。它提供了多种功能,包括聊天记录管理、函数调用和多模态支持,使开发者能够构建更智能的应用程序。
聊天历史对象是一个用于维护聊天会话中消息记录的列表。以下是如何在 C# 中创建一个聊天历史对象的示例:
C#using Microsoft.SemanticKernel.ChatCompletion;
// 创建聊天历史对象
ChatHistory chatHistory = new ChatHistory();
chatHistory.AddSystemMessage("你是一个有帮助的助手。");
chatHistory.AddUserMessage("可以点什么?");
chatHistory.AddAssistantMessage("我们有比萨、意大利面和沙拉可供选择。你想点什么?");
chatHistory.AddUserMessage("我想要第一个选项。");
ChatHistory 是聊天历史对象的类。AddSystemMessage 方法用于添加系统消息。AddUserMessage 和 AddAssistantMessage 方法分别用于添加用户和助手的消息。除了基本的消息,我们还可以添加更丰富的消息,例如包含用户名称和图片的消息。以下是一个示例:
C#// 添加系统消息
chatHistory.Add(new ChatMessageContent
{
Role = AuthorRole.System,
Content = "你是一个有帮助的助手"
});
// 添加带有图片的用户消息
chatHistory.Add(new ChatMessageImageContent
{
Role = AuthorRole.User,
ImageUrl = "https://example.com/menu.jpg"
});
ChatMessageContent 和 ChatMessageImageContent 是用于创建消息的类。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();
}
}
}

通过使用 Microsoft 的 Semantic Kernel,我们可以轻松地创建和管理聊天历史对象,模拟函数调用,并有效地减少聊天历史。这些功能使得构建智能聊天应用程序变得更加简单和高效。希望本文能帮助你更好地理解如何使用 Semantic Kernel 调用 Ollama 历史聊天应用。
通过以上示例和详细说明,你可以在自己的项目中实现聊天历史管理功能,提升用户体验。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!