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

打印 上一主题 下一主题

主题 1700|帖子 1700|积分 5100

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核心包的下令:
  1. dotnet add package Microsoft.SemanticKernel<br />dotnet add package Microsoft.SemanticKernel.ChatCompletion<br />
复制代码
假如需要使用OpenAI的模子,还需安装相关的毗连器包:
  1. dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI<br />
复制代码
这些包提供了SK的核心功能和与特定LLMs提供商交互的本领。
  3.2 配置开发环境

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

  •          打开Visual Studio,创建一个新的.NET 控制台应用步伐。
  •          在解决方案资源管理器中,右键点击项目,选择“管理NuGet包”。
  •          搜索“Microsoft.SemanticKernel”,安装最新版本。
  •          在代码文件中添加必要的using指令:
  1. using Microsoft.SemanticKernel;<br />using Microsoft.SemanticKernel.ChatCompletion;<br />using Microsoft.SemanticKernel.Connectors.OpenAI;<br />
复制代码
完成这些步调后,你的开发环境就已准备好,可以开始使用SK举行AI应用开发
  3.3 根本用法

  在使用SK之前,我们需要初始化内核并配置LLMs的毗连。以下是一个根本的配置示例:
  1. var modelId = "";<br />var apiKey = "";<br />// Create a kernel with OpenAI chat completion<br />var builder = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId, apiKey);<br /><br />// Build the kernel<br />Kernel kernel = builder.Build();<br />var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();<br /><br />
复制代码
在这个示例中,假如使用的是OpenAI的GPT系列模子,你需要将"your-api-key"替换为你的OpenAI API密钥。假如使用其他模子(如Azure OpenAI),只需调整配置参数即可。
  配置好内核后,我们可以通过SK调用LLMs生成文本。以下是一个简单的文本生成示例:
  1. // Create a history store the conversation<br />var history = new ChatHistory();<br /><br />// Get the response from the AI<br />var result = await chatCompletionService.GetChatMessageContentAsync(<br />    history,<br />    executionSettings: openAIPromptExecutionSettings,<br />    kernel: kernel);<br />
复制代码
在这个示例中,我们直接将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中,这样也显得专业,但这里就不做扩展了。
  1. this._chatCompletionService = new OpenAIChatCompletionService("deepseek-chat", new Uri("https://api.deepseek.com"), "你的DeepSeek API Key");<br />
复制代码
以下是智能助手的完整代码实现:
  1. class SmartAssistant
  2. {
  3.     private readonly IChatCompletionService _chatCompletionService;
  4.     private readonly List<string> _conversationHistory = [];
  5.     private readonly Kernel _kernel;
  6.     public SmartAssistant()
  7.     {
  8.         // Create a kernel with OpenAI chat completion
  9.         IKernelBuilder builder = Kernel.CreateBuilder();
  10.         this._kernel = builder.Build();
  11.         this._chatCompletionService = new OpenAIChatCompletionService("deepseek-chat", new Uri("https://api.deepseek.com"), "你的DeepSeek API Key");<br />    }
  12.     public async Task RunAsync()
  13.     {
  14.         Console.WriteLine("接待使用智能助手!输入 'exit' 退出。");
  15.         // Add a plugin (the LightsPlugin class is defined below)
  16.         //使用插件可以让你的人工智能代理能够运行你的代码以从外部泉源检索信息或实行操纵
  17.         this._kernel.Plugins.AddFromType<LightsPlugin>("Lights");
  18.         // Enable planning
  19.         OpenAIPromptExecutionSettings openAiPromptExecutionSettings = new()
  20.         {
  21.             FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
  22.         };
  23.         // Create a history store the conversation
  24.         ChatHistory history = [];
  25.         // Initiate a back-and-forth chat
  26.         string? userInput;
  27.         do
  28.         {
  29.             // Collect user input
  30.             Console.Write("User > ");
  31.             userInput = Console.ReadLine();
  32.             // Add user input
  33.             history.AddUserMessage(userInput);
  34.             // Get the response from the AI
  35.             ChatMessageContent result = await this._chatCompletionService.GetChatMessageContentAsync(
  36.                 history,
  37.                 executionSettings: openAiPromptExecutionSettings,
  38.                 kernel: this._kernel);
  39.             // Print the results
  40.             Console.WriteLine("Assistant > " + result);
  41.             // Add the message from the agent to the chat history
  42.             history.AddMessage(result.Role, result.Content ?? string.Empty);
  43.         } while (userInput is not null);
  44.     }
  45. }
复制代码
  1. //使用插件可以让你的人工智能代理能够运行你的代码以从外部来源检索信息或执行操作。<br />public class LightsPlugin<br />{<br />    // Mock data for the lights<br />    private readonly List<LightModel> _lights =<br />    [<br />        new() { Id = 1, Name = "Table Lamp", IsOn = false },<br />        new() { Id = 2, Name = "Porch light", IsOn = false },<br />        new() { Id = 3, Name = "Chandelier", IsOn = true }<br />    ];<br /><br />    [KernelFunction("get_lights")]<br />    [Description("Gets a list of lights and their current state")]<br />    public async Task<List<LightModel>> GetLightsAsync()<br />    {<br />        return this._lights;<br />    }<br /><br />    [KernelFunction("change_state")]<br />    [Description("Changes the state of the light")]<br />    public async Task<LightModel?> ChangeStateAsync(int id, bool isOn)<br />    {<br />        LightModel? light = this._lights.FirstOrDefault(light => light.Id == id);<br /><br />        if (light == null)<br />        {<br />            return null;<br />        }<br />        // Update the light with the new state<br />        light.IsOn = isOn;<br /><br />        return light;<br />    }<br />}<br /><br />public class LightModel<br />{<br />    [JsonPropertyName("id")] public int Id { get; set; }<br /><br />    [JsonPropertyName("name")] public string Name { get; set; }<br /><br />    [JsonPropertyName("is_on")] public bool? IsOn { get; set; }<br />}<br />
复制代码
  1. //运行<br />var assistant = new SmartAssistant();<br />await assistant.RunAsync();<br />
复制代码
代码分析
  

  •          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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表