首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2SemanticKernel简单使用

2SemanticKernel简单使用

作者头像
步步为营DotNet
发布2026-06-16 21:48:49
发布2026-06-16 21:48:49
910
举报

Semantic Kernel 快速开始

1. 引入 NuGet包

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

代码语言:javascript
复制
#r "nuget: Microsoft.SemanticKernel"

2. 引入命名空间

代码语言:javascript
复制
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.TextGeneration;
using Microsoft.Extensions.DependencyInjection;

3. 服务注册

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

代码语言:javascript
复制
// 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

代码语言:javascript
复制
// get text generation service
var textGenerationService = kernel.Services.GetRequiredService<ITextGenerationService>();

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

text.Display();

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

使用IChatCompletionService

代码语言:javascript
复制
// 引入交互式的内核命名空间,以便用户输入
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();
}
代码语言:javascript
复制
You:你是谁,你能干什么
AI:我是一个人工智能语言模型,旨在帮助回答问题和提供信息。我可以帮助解答各种主题的问题,如科学、历史、技术、生活等;帮助解决简单的问题,比如数学计算或语言翻译;也可以提供建议或创意,如文章草稿或项目构思。如果你有任何问题或需要帮助的地方,随时可以问我。
You:exit

5. 保存会话历史

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

代码语言:javascript
复制
// 引入交互式的内核命名空间,以便用户输入
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();
}
代码语言:javascript
复制
You:你是谁,你能干什么
AI:我是一个人工智能助手,旨在帮助回答问题、提供信息和解决各种问题。我可以帮助查找信息、提供建议、回答常见问题、协助学习新知识、进行语言翻译等。如果你有任何问题或需要帮助,请随时告诉我!
You:你能给我看下明天的天气吗
AI:抱歉,我无法查看实时天气信息。如果你想获取明天的天气预报,可以访问天气网站或使用天气应用程序,这些平台通常会提供准确和及时的天气信息。
You:那你退下吧
AI:好的,如果你有其他问题或需要帮助,随时可以回来找我。祝你一天愉快!
You:exit
AI:了解。如果你需要我,再来找我吧!愿你过得愉快。再见!

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

代码语言:javascript
复制
// 引入交互式的内核命名空间,以便用户输入
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);
}
代码语言:javascript
复制
You: 你好
Assistant: 你好!有什么我可以帮助你的吗?

7.使用NLog记录日志

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

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

代码语言:javascript
复制
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();
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Semantic Kernel 快速开始
    • 1. 引入 NuGet包
    • 2. 引入命名空间
    • 3. 服务注册
    • 4. 使用聊天补全服务构建会话
    • 5. 保存会话历史
    • 6. 使用打字机效果(流式输出)
    • 7.使用NLog记录日志
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档