2、Semantic Kernel简单使用

2、Semantic Kernel简单使用

Semantic Kernel 快速开始

1. 引入 NuGet包

首先需要引入最新的Microsoft.SemanticKernel NuGet 包。

1
#r "nuget: Microsoft.SemanticKernel"

2. 引入命名空间

1
2
3
4
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.TextGeneration;
using Microsoft.Extensions.DependencyInjection;

3. 服务注册

以下代码注册了聊天补全服务,实际上是注册了IChatCompletionServiceITextGenerationService 两个接口的具体实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Create kernel builder
var builder = Kernel.CreateBuilder();
// Add OpenAI chat completion
// builder.AddOpenAIChatCompletion(
// modelId: "YOUR_MODEL_ID",
// apiKey: "YOUR_API_KEY");
// Add Azure OpenAI chat completion
builder.AddAzureOpenAIChatCompletion(
deploymentName:"gpt-4o",
endpoint:"https://my-openapi.openai.azure.com/",
apiKey: "163ed6f8bc2947e0906d6ee5e173a222");
// Build kernel
var kernel = builder.Build();

kernel.Display();

IChatCompletionServiceITextGenerationService 两者的核心用途都是生成文本,不同点是:

  • IChatCompletionService:主要用于聊天场景,它更侧重于模拟对话交互。在聊天场景中,模型需要考虑对话的上下文,通常需要提供对话历史记录作为输入,理解对话的意图并生成合适的回复,输出通常是一个符合聊天对话格式的回复。比如,开发一个聊天机器人,就可以使用 IChatCompletionService 来处理用户的输入并生成相应的回复。
  • ITextGenerationService:适用于一般性的文本生成任务,没有特别强调对话的上下文。输入和输出通常是普通文本,可以用于生成文章、故事、摘要等各种类型的文本。例如,根据给定的主题生成一篇新闻报道,或者生成一段产品描述等。

4. 使用聊天补全服务构建会话

使用ITextGenerationService

1
2
3
4
5
6
// get text generation service
var textGenerationService = kernel.Services.GetRequiredService<ITextGenerationService>();

var text = await textGenerationService.GetTextContentAsync("今天天气不错,");

text.Display();

是啊,天气好的时候特别适合出去走走或者进行一些户外活动。你有什么计划吗?

使用IChatCompletionService

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 引入交互式的内核命名空间,以便用户输入
using PolyglotKernel= Microsoft.DotNet.Interactive.Kernel;
using Microsoft.SemanticKernel.Connectors.AzureOpenAI;

// Get chat completion service
var chatCompletionService = kernel.Services.GetRequiredService<IChatCompletionService>();


while (true)
{
// Get input from user
var message = await PolyglotKernel.GetInputAsync("enter message...");
Console.WriteLine($"You:{message}");
if (string.IsNullOrEmpty(message.Trim())
|| message.Equals("exit", StringComparison.OrdinalIgnoreCase))
{
break;
}
// Get response from chat completion service
var response = await chatCompletionService.GetChatMessageContentAsync(message);
Console.WriteLine($"AI:{response}");
// response.Display();
}
You:你是谁,你能干什么
AI:我是一个人工智能语言模型,旨在帮助回答问题和提供信息。我可以帮助解答各种主题的问题,如科学、历史、技术、生活等;帮助解决简单的问题,比如数学计算或语言翻译;也可以提供建议或创意,如文章草稿或项目构思。如果你有任何问题或需要帮助的地方,随时可以问我。
You:exit

5. 保存会话历史

由于大模型是没有记忆的,因此对于需要上下文信息的多次对话而言,我们需要将聊天历史保存以便将其作为上下文发送给大模型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 引入交互式的内核命名空间,以便用户输入
using PolyglotKernel= Microsoft.DotNet.Interactive.Kernel;

// Get chat completion service
var chatCompletionService = kernel.Services.GetRequiredService<IChatCompletionService>();
// Create chat history
var chatHistory = new ChatHistory();
// chatHistory.AddSystemMessage("你是一名善解人意的心理咨询师!");
while (true)
{
// Get input from user
var message = await PolyglotKernel.GetInputAsync("enter message...");
if (string.IsNullOrEmpty(message))
{
break;
}

Console.WriteLine($"You:{message}");
// Add user message to chat history
chatHistory.AddUserMessage(message);
// Get response from chat completion service with history
var response = await chatCompletionService.GetChatMessageContentAsync(chatHistory);
Console.WriteLine($"AI:{response.Content}");
// Add AI response to chat history
chatHistory.AddAssistantMessage(response.Content);
// response.Display();
}
You:你是谁,你能干什么
AI:我是一个人工智能助手,旨在帮助回答问题、提供信息和解决各种问题。我可以帮助查找信息、提供建议、回答常见问题、协助学习新知识、进行语言翻译等。如果你有任何问题或需要帮助,请随时告诉我!
You:你能给我看下明天的天气吗
AI:抱歉,我无法查看实时天气信息。如果你想获取明天的天气预报,可以访问天气网站或使用天气应用程序,这些平台通常会提供准确和及时的天气信息。
You:那你退下吧
AI:好的,如果你有其他问题或需要帮助,随时可以回来找我。祝你一天愉快!
You:exit
AI:了解。如果你需要我,再来找我吧!愿你过得愉快。再见!

6. 使用打字机效果(流式输出)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 引入交互式的内核命名空间,以便用户输入
using PolyglotKernel= Microsoft.DotNet.Interactive.Kernel;

// Get chat completion service
var chatCompletionService = kernel.Services.GetRequiredService<IChatCompletionService>();

// Get input from user
var message = await PolyglotKernel.GetInputAsync("enter message...");
Console.WriteLine($"You: {message}");
// Get response from chat completion service
var chatResult = chatCompletionService.GetStreamingChatMessageContentsAsync(message);
string response = "";
await foreach (var chunk in chatResult)
{
if (chunk.Role.HasValue) Console.Write(chunk.Role + ": ");
response += chunk;
await Task.Delay(100);
Console.Write(chunk);
}
You: 你好
Assistant: 你好!有什么我可以帮助你的吗?

7.使用NLog记录日志

为了便于理解SK 的调用细节,因此开启日志是必不可少,这一节就来具体展开说明下具体如何使用NLog

\#r "nuget:NLog.Extensions.Logging"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using Microsoft.Extensions.DependencyInjection;
using NLog.Extensions.Logging;
using NLog.Targets;

public static IServiceCollection AddNLogging(this IServiceCollection services)
{
// 定义文件日志输出目标
var fileTarget = new FileTarget()
{
FileName = @"C:\Users\54302\Desktop\sk-demo.log", AutoFlush = true
};
// 定义控制台日志输出目标
var consoleTarget = new ConsoleTarget();

var config = new NLog.Config.LoggingConfiguration();
// 定义日志输出规则(输出所有Trace级别及以上的日志到控制台)
config.AddRule(
NLog.LogLevel.Trace,
NLog.LogLevel.Info,
target: fileTarget, // 这里采用文件输出
"*");// * 表示所有Logger
// 注册NLog
services.AddLogging(loggingBuilder => loggingBuilder.AddNLog(config));
return services;
}

var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
deploymentName:"gpt-4o",
endpoint:"https://my-openapi.openai.azure.com/",
apiKey: "163ed6f8bc2947e0906d6ee5e173a222");
// 增加NLoggin服务
builder.Services.AddNLogging();
var kernel = builder.Build();

kernel.Display();
作者

步步为营

发布于

2025-03-18

更新于

2025-04-11

许可协议