AI与.NET技术实操系列(四):使用 Semantic Kernel 和 DeepSeek 构建AI应用

news2025/5/19 18:16:08

1. 引言

在人工智能技术飞速发展的今天,大型语言模型(Large Language Models, LLMs)已成为智能应用开发的核心驱动力。从智能客服到自动化内容生成,LLMs的应用正在深刻改变我们的工作和生活方式。

对于.NET开发者而言,掌握如何将LLMs集成到应用程序中,不仅是一项技术挑战,更是抓住未来趋势的关键。微软推出的Semantic Kernel(SK)为此提供了一个强大的工具,它使开发者能够在.NET环境中轻松构建基于LLMs的智能应用,大幅降低了开发门槛。

Semantic Kernel是一个开源项目,旨在为开发者提供一套灵活且功能丰富的API,以简化LLMs的集成和使用。通过SK,开发者可以快速实现智能对话、内容生成、知识检索等功能,而无需深入研究LLMs的底层实现。SK采用“插件化”和“模块化”的设计理念,允许开发者根据需求自由组合和扩展功能,打造高度定制化的AI应用。这种设计不仅提高了开发效率,还为创新提供了广阔的空间。

然而,SK的强大功能也伴随着一定的复杂性。开发者需要理解其核心概念(如“内核”、“技能”和“插件”),并掌握模型选择、性能优化和资源管理等技术细节。这些都需要一定的AI和.NET开发经验。

本文将通过一个具体的实践任务——构建一个智能助手,展示如何使用Semantic Kernel在.NET中开发AI应用。这个任务贴近实际业务需求,能够帮助读者深入理解SK的使用方法和设计哲学。我们将从SK的基础知识入手,逐步介绍其安装、配置和基本用法,并通过详细的代码示例,引导读者完成一个功能完备的智能助手应用。

希望本文能激发你的兴趣,帮助你在.NET中开启Semantic Kernel的探索之旅。随着AI技术的不断进步,SK将为开发者带来更多创新机会,让我们共同迎接智能应用的新时代!


2. Semantic Kernel简介

在深入探讨Semantic Kernel(SK)之前,我们先来了解它是什么以及它在AI应用开发中的作用。Semantic Kernel是微软开发的一个开源项目,旨在帮助开发者构建基于大型语言模型的智能应用程序。它提供了一套工具和API,使开发者能够轻松地将LLMs集成到.NET应用中,实现智能对话、内容生成和知识检索等功能。

2.1 什么是Semantic Kernel?

Semantic Kernel(SK)是一个轻量级的软件开发工具包(SDK),允许开发者通过.NET平台与LLMs进行交互。它的核心设计理念是“插件化”和“模块化”,使开发者能够根据需求灵活组合和扩展功能。SK通过以下关键组件实现其功能:

  • 内核(Kernel):SK的核心组件,负责管理LLMs的调用、内存管理和技能的注册。它如同一个指挥中心,协调所有操作。
  • 技能(Skills):一组预定义的功能模块,可以是原生的.NET代码,也可以是基于LLMs的提示(prompt)。技能是SK功能的具体实现单元。
  • 插件(Plugins):技能的集合,可以作为一个整体注册到内核中,便于管理和复用。

通过这种设计,SK提供了一个灵活且可扩展的框架,使开发者能够快速构建复杂的AI应用。无论是简单的文本生成还是复杂的多轮对话系统,SK都能提供支持。

2.2 Semantic Kernel的优势

与直接调用LLMs的API相比,SK具有以下显著优势:

  • 简化的API:SK封装了LLMs的复杂性,提供直观易用的接口,降低了开发难度。
  • 插件化架构:开发者可以轻松添加、移除和组合技能,构建高度定制化的应用。
  • 内存管理:SK内置了对上下文的管理功能,支持在对话中维护历史信息,提升交互的连贯性。
  • 多模型支持:SK不仅兼容OpenAI的模型,还支持Azure OpenAI、Hugging Face等其他LLMs提供商的模型,具有良好的扩展性。

这些优势使SK成为.NET开发者构建AI应用的理想选择。无论你是初学者还是经验丰富的开发者,SK都能帮助你快速上手并实现创意。


3. 设置和使用Semantic Kernel

在开始使用Semantic Kernel之前,我们需要进行一些准备工作,包括安装SK的NuGet包和配置开发环境。

3.1 安装Semantic Kernel

SK可以通过NuGet包管理器安装。以下是安装SK核心包的命令:

dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.ChatCompletion

如果需要使用OpenAI的模型,还需安装相关的连接器包:

dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI

这些包提供了SK的核心功能和与特定LLMs提供商交互的能力。

3.2 配置开发环境

SK支持.NET 6.0及以上版本,建议使用Visual Studio 2022或Visual Studio Code进行开发。以下是配置开发环境的步骤:

  1. 打开Visual Studio,创建一个新的.NET 控制台应用程序。
  2. 在解决方案资源管理器中,右键点击项目,选择“管理NuGet包”。
  3. 搜索“Microsoft.SemanticKernel”,安装最新版本。
  4. 在代码文件中添加必要的using指令:
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;

完成这些步骤后,你的开发环境就已准备好,可以开始使用SK进行AI应用开发。

3.3 基本用法

在使用SK之前,我们需要初始化内核并配置LLMs的连接。以下是一个基本的配置示例:

var modelId = "";
var apiKey = "";
// Create a kernel with OpenAI chat completion
var builder = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId, apiKey);

// Build the kernel
Kernel kernel = builder.Build();
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();

在这个示例中,如果使用的是OpenAI的GPT系列模型,你需要将"your-api-key"替换为你的OpenAI API密钥。如果使用其他模型(如Azure OpenAI),只需调整配置参数即可。

配置好内核后,我们可以通过SK调用LLMs生成文本。以下是一个简单的文本生成示例:

// Create a history store the conversation
var history = new ChatHistory();

// Get the response from the AI
var result = await chatCompletionService.GetChatMessageContentAsync(
    history,
    executionSettings: openAIPromptExecutionSettings,
    kernel: kernel);

在这个示例中,我们直接将history传递给内核,SK会自动处理与LLMs的通信并返回生成的内容。这是最基本的用法,展示了SK的简洁性和易用性。


4. 构建一个基于LLMs的智能应用

为了更好地理解Semantic Kernel的实际应用,我们将通过一个实践任务——构建一个智能助手,展示如何使用SK开发AI应用。这个智能助手能够回答用户的问题,并通过对话历史维护上下文,提供连贯的交互体验。

4.1 设计智能助手

在设计智能助手时,我们需要考虑以下几个方面:

  • 用户输入:从控制台获取用户的问题或指令。
  • LLMs响应:使用SK调用LLMs生成回答。
  • 对话管理:维护对话历史,确保回答与上下文相关。
  • 技能扩展:为助手添加自定义功能,如查询天气或获取外部数据。

在这个示例中,我们将实现一个基础版的智能助手,随后展示如何通过技能扩展其功能。

4.2 实现智能助手

由于我的ChatGpt订阅已经过期,所以接下来应用所接入的大模型换成了DeepSeek,由于DeepSeek API 与 OpenAI 的ChatCompletion的 API 格式兼容,因此我们将复用 OpenAI 连接器,里面的代码只是做了一些微调。

  • 不用设置OpenAPI的模型和API Key
  • IChatCompletionService的获取方式发生了变化,不再从DI Container中获取,而是直接创建对象,有兴趣的朋友,可以把基于DeepSeek的IChatCompletionService对象注入到DI Container中,这样也显得专业,但这里就不做扩展了。
this._chatCompletionService = new OpenAIChatCompletionService("deepseek-chat"new Uri("https://api.deepseek.com"), "你的DeepSeek API Key");

以下是智能助手的完整代码实现:

class SmartAssistant
{
    private readonly IChatCompletionService _chatCompletionService;
    private readonly List<string> _conversationHistory = [];
    private readonly Kernel _kernel;

    public SmartAssistant()
    {
        // Create a kernel with OpenAI chat completion
        IKernelBuilder builder = Kernel.CreateBuilder();
        this._kernel = builder.Build();

        this._chatCompletionService = new OpenAIChatCompletionService("deepseek-chat"new Uri("https://api.deepseek.com"), "你的DeepSeek API Key");
    }

    public async Task RunAsync()
    {
        Console.WriteLine("欢迎使用智能助手!输入 'exit' 退出。");

        // Add a plugin (the LightsPlugin class is defined below)
        //使用插件可以让你的人工智能代理能够运行你的代码以从外部来源检索信息或执行操作
        this._kernel.Plugins.AddFromType<LightsPlugin>("Lights");
        // Enable planning
        OpenAIPromptExecutionSettings openAiPromptExecutionSettings = new()
        {
            FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
        };
        // Create a history store the conversation
        ChatHistory history = [];
        // Initiate a back-and-forth chat
        string? userInput;
        do
        {
            // Collect user input
            Console.Write("User > ");
            userInput = Console.ReadLine();
            // Add user input
            history.AddUserMessage(userInput);
            // Get the response from the AI
            ChatMessageContent result = await this._chatCompletionService.GetChatMessageContentAsync(
                history,
                executionSettings: openAiPromptExecutionSettings,
                kernel: this._kernel);
            // Print the results
            Console.WriteLine("Assistant > " + result);
            // Add the message from the agent to the chat history
            history.AddMessage(result.Role, result.Content ?? string.Empty);
        } while (userInput is not null);
    }
}
//使用插件可以让你的人工智能代理能够运行你的代码以从外部来源检索信息或执行操作。
public class LightsPlugin
{
    // Mock data for the lights
    private readonly List<LightModel> _lights =
    [
        new() { Id = 1, Name = "Table Lamp", IsOn = false },
        new() { Id = 2, Name = "Porch light", IsOn = false },
        new() { Id = 3, Name = "Chandelier", IsOn = true }
    
];

    [KernelFunction("get_lights")]
    [Description("Gets a list of lights and their current state")]
    public async Task<List<LightModel>> GetLightsAsync()
    {
        return this._lights;
    }

    [KernelFunction("change_state")]
    [Description("Changes the state of the light")]
    public async Task<LightModel?> ChangeStateAsync(int id, bool isOn)
    {
        LightModel? light = this._lights.FirstOrDefault(light => light.Id == id);

        if (light == null)
        {
            return null;
        }
        // Update the light with the new state
        light.IsOn = isOn;

        return light;
    }
}

public class LightModel
{
    [JsonPropertyName("id")public int Id { getset; }

    [JsonPropertyName("name")public string Name { getset; }

    [JsonPropertyName("is_on")public bool? IsOn { getset; }
}
//运行
var assistant = new SmartAssistant();
await assistant.RunAsync();

代码解析

  • SmartAssistant类:封装智能助手的逻辑,使用 ChatHistory存储对话历史。
  • 构造方法:初始化SK内核,创建DeepSeek的IChatCompletionService对象。
  • RunAsync方法:主方法,负责接收用户输入、构造提示、调用LLMs并输出回答。
  • ChatHistory和OpenAiPromptExecutionSettings构造:将对话历史拼接为完整的提示,确保上下文传递给LLMs。
  • 内核调用:通过 DeepSeek的IChatCompletionService.GetChatMessageContentAsync调用LLMs,获取生成的回答。

运行这段代码后,用户可以与智能助手进行多轮对话。例如:

这个智能助手展示了SK在对话管理方面的能力,开发者可以基于此进一步扩展功能。

5. Semantic Kernel在实际应用中的意义和挑战

Semantic Kernel为开发者提供了强大的工具,使他们能够快速构建基于LLMs的智能应用。然而,其应用价值和潜在挑战同样值得关注。

5.1 意义

  • 加速开发:SK简化了LLMs的集成过程,使开发者能够专注于应用逻辑而非底层细节。
  • 灵活性:插件化架构支持功能的自由扩展,适应多样化的业务需求。
  • 提升体验:基于LLMs的智能应用能提供自然流畅的交互,显著改善用户体验。

例如,一个基于SK的智能客服系统可以在几小时内搭建完成,并根据企业需求快速调整功能,这种效率在传统开发中难以想象。

5.2 挑战

  • 模型选择:不同的LLMs在性能、成本和适用场景上存在差异。开发者需要权衡这些因素,选择合适的模型。
  • 性能优化:LLMs的调用涉及网络延迟和计算资源消耗,尤其在高并发场景下,需要优化架构以确保响应速度。
  • 审查机制:LLMs可能生成不准确、有偏见甚至有害的内容,开发者必须实施审查机制,确保应用的安全性和公平性。

这些挑战要求开发者在技术实现之外,具备系统设计和伦理意识,才能充分发挥SK的潜力。


6. 技术伦理

Semantic Kernel的出现不仅带来了技术上的便利,更引发了对AI应用深层次问题的思考。

  • 技术与责任的平衡:随着AI能力的增强,开发者在享受技术红利时,也需承担确保应用安全、公正的责任。如何避免AI滥用,是一个值得探讨的话题。
  • 隐私与数据安全:智能应用可能涉及用户数据的收集和处理,尤其在多轮对话中,开发者必须遵守隐私法规,保护用户权益。
  • 社会的长期影响:AI技术的普及可能改变就业结构、决策方式甚至人际交往,开发者作为技术推动者,需思考如何让AI为社会带来正向价值。

这些问题没有简单的答案,但它们提醒我们:技术的发展不应只追求效率,更应关注其对人类和社会的影响。


7. 结语

本文通过介绍Semantic Kernel的基础知识、设置和使用方法,以及构建智能助手的实践案例,为.NET开发者提供了一个全面而深入的指南。作为微软的开源项目,SK以其简洁的API、灵活的架构和强大的功能,为开发者打开了AI应用开发的大门。从基本的文本生成到复杂的技能扩展,SK的设计理念和特性为创新提供了无限可能。

通过本文的示例代码和讨论,希望你能感受到SK的实用性,并从中获得灵感,尝试在自己的项目中应用这一技术。随着AI技术的不断进步,Semantic Kernel将继续进化,为开发者带来更多机遇。让我们共同探索这一领域,在智能应用的浪潮中创造属于自己的价值!

参考链接:https://learn.microsoft.com/en-us/semantic-kernel/get-started/quick-start-guide?pivots=programming-language-csharp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS:ComposeTitleBar 组件自学指南

在日常的鸿蒙应用开发工作中&#xff0c;我们常常会面临构建美观且功能实用的用户界面的挑战。而标题栏作为应用界面的重要组成部分&#xff0c;它不仅承载着展示页面关键信息的重任&#xff0c;还能为用户提供便捷的操作入口。最近在参与的一个项目里&#xff0c;我就深深体会…

25-智慧旅游系统(协同算法)三端

介绍 技术&#xff1a; 基于 B/S 架构 SpringBootMySQLLayuivue 环境&#xff1a; Idea mysql maven jdk1.8 node 管理端功能 首页展示图表&#xff1a;以数据可视化方式展示关键业务数据。 用户管理&#xff1a;管理系统用户&#xff0c;包括查看、编辑等操作。 供应商管…

数据结构实验1.2: 顺序表的基本运算

文章目录 一&#xff0c;问题描述二&#xff0c;基本要求三&#xff0c;算法分析&#xff08;1&#xff09;插入算法&#xff08;2&#xff09;删除算法 四&#xff0c;参考程序五&#xff0c;运行效果 一&#xff0c;问题描述 创建一个顺序表&#xff0c;编程实现顺序表的下列…

【QT】QT中的信号与槽

QT中的信号与槽 一、信号与槽函数的作用二、如何关联信号与槽函数1、借助集成开发环境&#xff0c;右键转到槽函数示例代码&#xff1a; 2、调用connect函数手动关联信号与槽函数 三、扩展四、总结信号与槽的特点1、一个类如果要使用信号以及槽函数&#xff0c;那么该类的定义中…

使用Python爬虫获取1688商品(按图搜索)接口

一、引言 随着电商行业的不断发展&#xff0c;消费者对商品搜索的效率和准确性要求越来越高。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富的商品搜索功能&#xff0c;其中按图搜索功能&#xff08;类似于淘宝的拍立淘&#xff09;极大地提升了用户的购物体验。本文将…

AI Agent拐点已至,2B+2C星辰大海——行业深度报告

大家好&#xff0c;我是吾鳴。 今天吾鳴要给大家分享一份由开源证券出品的关于AI Agent的报告&#xff0c;报告从AI Agent商业化应用、C端B端应用与布局&#xff0c;投资建议等方向介绍2025AI Agent新元年。报告一共28页PDF&#xff0c;文末有完整版下载地址。 内容摘要 2025年…

【CSS】- 表单控件的 placeholder 如何控制换行显示?

表单控件的 placeholder 如何换行展示&#xff1f; HTML 中&#xff0c;<textarea> 元素的 placeholder 属性默认情况下不支持换行。不过&#xff0c;可以通过以下几种方法来实现换行效果&#xff1a; 模版字符串 模板字符串可以轻松地创建多行字符串&#xff0c;而不…

node.js、npm相关知识

Node.js 是一个基于 Chrome V8 JavaScript 引擎 构建的开源、跨平台的 JavaScript 运行时环境&#xff0c;主要用于服务器端编程。它允许开发者使用 JavaScript 编写高性能的后端服务&#xff0c;突破了 JavaScript 仅在浏览器中运行的限制。 npm&#xff08;Node Package Man…

基于HTML5和CSS3实现3D旋转相册效果

基于HTML5和CSS3实现3D旋转相册效果 这里写目录标题 基于HTML5和CSS3实现3D旋转相册效果项目介绍技术栈核心功能实现原理1. HTML结构2. CSS样式设计2.1 基础样式设置2.2 容器样式2.3 图片样式 3. JavaScript实现4. 交互功能实现4.1 触摸和鼠标拖拽4.2 播放控制 项目亮点技术难点…

上市电子制造企业如何实现合规的质量文件管理?

浙江洁美电子科技股份有限公司成立于2001年&#xff0c;是一家专业为片式电子元器件(被动元件、分立器件、集成电路及LED)配套生产电子薄型载带、上下胶带、离型膜、流延膜等产品的国家高新技术企业&#xff0c;主要产品有分切纸带、打孔经带、压孔纸带、上下胶带、塑料载带及其…

vscode中的【粘滞滚动】的基本概念和作用,关闭了以后如何开启

1、粘滞滚动的基本概念和作用 ‌VSCode中的“粘滞”功能主要是指编辑器在滚动时的一种特殊效果&#xff0c;使得编辑器在滚动到某个位置时会“粘”在那里&#xff0c;而不是平滑滚动到底部或顶部。‌ 粘滞滚动的基本概念和作用 粘滞滚动功能可以让用户在滚动时更直观地看到当前…

IDEA如何设置以新窗口打开新项目

在 IntelliJ IDEA 中设置以新窗口打开新项目&#xff0c;可以通过以下两种方式实现&#xff1a; 方法 1&#xff1a;通过对话框提示选择新窗口 打开项目时&#xff1a; 当通过 File > Open&#xff08;或欢迎界面点击 Open&#xff09;选择新项目时&#xff0c;IDEA 会弹出对…

【含文档+PPT+源码】基于微信小程序的社交摄影约拍平台的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的社交摄影约拍平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…

Springboot集成Dubbo和Zookeeper框架搭建

目录 1.搭建环境 2.搭建步骤 3.效果展示 4.注意项 1.搭建环境如下图所示&#xff1a; 2.搭建步骤 2.1 目标概述 一共三个服务,一个公共接口服务,一个提供者服务,一个消费者服务。最终以浏览器或者postman查询接口,实现订单信息回显。最终项目结构如图所示&#xff1a; 2.2 …

发票管理自动化-发票查验接口让财务告别繁琐的核验流程

发票管理的效率与准确性直接影响着企业运营的顺畅性&#xff0c;在过去&#xff0c;财务人员查验发票时&#xff0c;需手工输入发票代码、号码、日期、金额、验证码等信息一张一张进行核验。整个过程不仅操作繁琐&#xff0c;而且极易出错。若遇到验证码难以辨认的情况&#xf…

基于modbusTcp连接Modbus Slave本地模拟服务通讯(C#编写ModbusTcp类库)(一)

C#编写ModbusTcp类库,模拟plc进行本地通信测试 Modbus是一个应用层协议,常用于工业自动化设备之间的通信,主要有两种传输方式:RTU和TCP。 常见的功能码包括读取线圈(01)、读取离散输入(02)、读保持寄存器(03)、读输入寄存器(04)、写单个线圈(05)、写单个寄存器(…

IS-IS:单区域集成配置与多区域集成配置

一、IS-IS概述 IS-IS&#xff08;Intermediate System to Intermediate System&#xff09; 是一种链路状态内部网关协议&#xff08;IGP&#xff09;&#xff0c;设计用于自治系统&#xff08;AS&#xff09;内部的路由选择。最初由ISO为OSI模型的无连接网络服务&#xff08;…

API 安全之认证鉴权

作者&#xff1a;半天 前言 API 作为企业的重要数字资源&#xff0c;在给企业带来巨大便利的同时也带来了新的安全问题&#xff0c;一旦被攻击可能导致数据泄漏重大安全问题&#xff0c;从而给企业的业务发展带来极大的安全风险。正是在这样的背景下&#xff0c;OpenAPI 规范…

[测试] Google Test | 主流的 C 测试框架

目录 GoogleTest 2. 准备工作 3. 测试 4.怎么用 Attention is All You Need 写项目代码的时候 边写边测试 非常重要&#xff0c;这样可以帮助我们减少很多的问题。 这篇文章后面 主要以 GoogleTest 为例&#xff0c;进行介绍最近找了些 gtest 相关的资料,学习了下.后面主要…

OpenCV 图形API(3)高层次设计概览

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 G-API 是一个异构框架&#xff0c;提供了统一的 API 来使用多个支持的后端编程图像处理流水线。 关键的设计理念是在指定使用哪些内核和设备时保持流…