编辑
2025-11-24
C#
00

目录

🤔 问题分析:为什么需要自定义AI助手?
💡 解决方案:Semantic Kernel + 插件化架构
🏗️ 核心架构设计
🛠️ 代码实战:构建你的AI助手
🎯 第一步:搭建基础框架
🧩 第二步:实现智能插件系统
📚 学习计划生成插件
⚡ 实用工具插件集合
🎭 第三步:实现智能对话循环
完整代码
🔍 AI是如何选择插件的?
⚠️ 常见坑点提醒
🔧 环境配置问题
🚨 异常处理最佳实践
💡 性能优化技巧
🎯 实际应用场景
🏢 企业级应用
👨‍💻 个人开发
🌟 扩展思路
📋 总结要点

还在羡慕ChatGPT的多功能对话体验?作为C#开发者,你完全可以打造一个属于自己的智能助手!今天我们将深入剖析一个完整的AI Agent项目,看看如何用Semantic Kernel框架构建一个具备学习计划生成、实时计算、文件操作等多项技能的智能助手。

这不仅仅是一个简单的聊天机器人,而是一个真正实用的开发工具,能够帮助你处理日常开发中的各种任务。准备好了吗?让我们一起探索C#与AI结合的无限可能!

🤔 问题分析:为什么需要自定义AI助手?

在实际开发工作中,我们经常遇到这些场景:

  • 学习新技术时需要制定系统的学习计划
  • 开发过程中需要快速进行数学计算或字符串处理
  • 项目管理时需要检查文件状态、生成随机测试数据
  • 团队协作中希望有一个统一的智能助手来提升效率

传统的解决方案要么功能单一,要么需要频繁切换不同工具。而通过Semantic Kernel,我们可以将这些需求整合到一个统一的AI助手中。

💡 解决方案:Semantic Kernel + 插件化架构

🏗️ 核心架构设计

我们的AI助手采用插件化架构,主要包含:

  1. Kernel核心:负责AI模型连接和对话管理
  2. 插件系统:提供各种实用功能
  3. 流式输出:模拟真实对话体验
  4. 历史管理:保持上下文连贯性
C#
// Kernel初始化 - 连接AI服务 var kernelBuilder = Kernel.CreateBuilder(); kernelBuilder.AddOpenAIChatCompletion( modelId: "deepseek-chat", apiKey: Environment.GetEnvironmentVariable("DEEPSEEK_API_KEY"), endpoint: new Uri("https://api.deepseek.com/v1") ); var kernel = kernelBuilder.Build();

🛠️ 代码实战:构建你的AI助手

nuget 安装 Microsoft.SemanticKernel

🎯 第一步:搭建基础框架

C#
#pragma warning disable SKEXP0010 using Microsoft.SemanticKernel.ChatCompletion; using Microsoft.SemanticKernel.Connectors.OpenAI; using Microsoft.SemanticKernel; using System.Text; namespace AppAiAgent { class Program { static async Task Main(string[] args) { Console.OutputEncoding = Encoding.UTF8; // 初始化Kernel var kernel = await InitializeKernel(); // 注册插件 RegisterAllPlugins(kernel); // 启动对话循环 await StartChatLoop(kernel); } } }

🧩 第二步:实现智能插件系统

📚 学习计划生成插件

这是我们的明星功能,能根据用户输入自动生成结构化学习计划:

C#
static void RegisterStudyPlanPlugin(Kernel kernel) { string studyPlanPrompt = @" 请根据用户的学习主题生成一个详细的学习计划。 学习主题: {{$subject}} 请按以下格式生成学习计划: 📚 **学习计划: {{$subject}}** 🎯 **学习目标** [明确的学习目标] 📖 **第一阶段:基础入门 (1-2周)** - 基础概念1 - 基础概念2 - 推荐资源:[具体资源] 📈 **第二阶段:进阶学习 (2-4周)** - 进阶概念1 - 进阶概念2 - 实践项目建议 🚀 **第三阶段:高级应用 (2-4周)** - 高级主题1 - 高级主题2 - 综合项目 💡 **学习建议** [具体的学习方法和技巧]"; var studyPlanFunction = kernel.CreateFunctionFromPrompt( promptTemplate: studyPlanPrompt, functionName: "GenerateStudyPlan", description: "为指定主题生成详细的学习计划" ); kernel.ImportPluginFromFunctions("StudyPlanPlugin", [studyPlanFunction]); }

⚡ 实用工具插件集合

C#
static void RegisterEnhancedUtilityPlugins(Kernel kernel) { // 1. 实时时间插件 var realTimeFunction = kernel.CreateFunctionFromMethod( method: () => DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss dddd"), functionName: "GetCurrentTime", description: "获取当前系统时间和日期" ); // 2. 数学计算插件 var calculatorFunction = kernel.CreateFunctionFromMethod( method: (string expression) => { try { var dataTable = new System.Data.DataTable(); var result = dataTable.Compute(expression.Replace("×", "*"), null); return $"计算结果: {expression} = {result}"; } catch { return $"无法计算表达式: {expression}"; } }, functionName: "Calculate", description: "计算数学表达式" ); // 3. 字符串处理插件 var stringFunction = kernel.CreateFunctionFromMethod( method: (string text, string operation) => { return operation.ToLower() switch { "uppercase" => text.ToUpper(), "lowercase" => text.ToLower(), "reverse" => new string(text.Reverse().ToArray()), "length" => $"字符串长度: {text.Length}", _ => "支持的操作: uppercase, lowercase, reverse, length" }; }, functionName: "ProcessString", description: "处理字符串:转大写、小写、反转、获取长度" ); // 注册所有插件 kernel.ImportPluginFromFunctions("TimePlugin", [realTimeFunction]); kernel.ImportPluginFromFunctions("CalculatorPlugin", [calculatorFunction]); kernel.ImportPluginFromFunctions("StringPlugin", [stringFunction]); }

🎭 第三步:实现智能对话循环

C#
static async Task StartChatLoop(Kernel kernel) { var chatHistory = new ChatHistory(); chatHistory.AddSystemMessage(@"你是一个智能学习助手,具备以下能力: 1. 生成个性化学习计划 2. 获取当前时间 3. 进行数学计算 4. 回答各种问题 请根据用户需求选择合适的工具来协助用户。"); Console.WriteLine("🤖 欢迎使用智能AI学习助手!"); while (true) { Console.Write("👤 您: "); string userInput = Console.ReadLine(); if (userInput?.Trim().ToLower() == "exit") break; chatHistory.AddUserMessage(userInput); // 配置自动函数调用 var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions, MaxTokens = 2000, Temperature = 0.7 }; // 流式响应处理 await ProcessStreamingResponse(kernel, chatHistory, executionSettings); } }

完整代码

C#
#pragma warning disable SKEXP0010 using Microsoft.SemanticKernel.ChatCompletion; using Microsoft.SemanticKernel.Connectors.OpenAI; using Microsoft.SemanticKernel; using System.Text; using System.Net; namespace AppAiAgent { class Program { static async Task Main(string[] args) { Console.OutputEncoding = Encoding.UTF8; // Kernel 初始化及AI服务连接 var kernel = InitializeKernel(); // 注册学习计划生成插件 RegisterStudyPlanPlugin(kernel); // 注册其他实用插件 RegisterEnhancedUtilityPlugins(kernel); // 启动聊天循环 await StartChatLoop(kernel); } /// <summary> /// 初始化Kernel /// </summary> static Kernel InitializeKernel() { var kernelBuilder = Kernel.CreateBuilder(); kernelBuilder.AddOpenAIChatCompletion( modelId: "deepseek-chat", apiKey: Environment.GetEnvironmentVariable("DEEPSEEK_API_KEY") ?? "sk-183fcc943dd442c29a585c4fdb449677", endpoint: new Uri("https://api.deepseek.com/v1") ); return kernelBuilder.Build(); } /// <summary> /// 启动聊天循环 /// </summary> static async Task StartChatLoop(Kernel kernel) { // 聊天历史管理 var chatHistory = new ChatHistory(); chatHistory.AddSystemMessage(@"你是一个智能学习助手,具备以下能力: 1. 生成个性化学习计划 2. 获取当前时间 3. 进行数学计算 4. 回答各种问题 请根据用户需求选择合适的工具来协助用户。"); Console.WriteLine("🤖 欢迎使用智能AI学习助手!"); Console.WriteLine("💡 我可以帮您生成学习计划、回答问题、进行计算等"); Console.WriteLine("📝 输入 'exit' 可随时退出\n"); while (true) { Console.Write("👤 您: "); string userInput = Console.ReadLine(); if (string.IsNullOrWhiteSpace(userInput)) continue; if (userInput.Trim().ToLower() == "exit") break; // 添加用户消息到历史 chatHistory.AddUserMessage(userInput); try { Console.Write("🤖 AI助手: "); // 处理AI响应 await ProcessAIResponse(kernel, chatHistory); } catch (Exception ex) { Console.WriteLine($"❌ 发生错误: {ex.Message}\n"); } } Console.WriteLine("👋 感谢使用,再见!"); } /// <summary> /// 处理AI响应 /// </summary> static async Task ProcessAIResponse(Kernel kernel, ChatHistory chatHistory) { // 获取聊天完成服务 var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>(); // 配置执行设置 - 启用自动函数调用 var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions, MaxTokens = 2000, Temperature = 0.7 }; // 流式响应输出 var streamResponse = chatCompletionService.GetStreamingChatMessageContentsAsync( chatHistory: chatHistory, executionSettings: executionSettings, kernel: kernel ); string fullResponse = ""; bool isFirstToken = true; await foreach (var content in streamResponse) { if (!string.IsNullOrEmpty(content.Content)) { // 第一个token前添加一个小延迟,模拟思考 if (isFirstToken) { await Task.Delay(100); isFirstToken = false; } Console.Write(content.Content); fullResponse += content.Content; // 添加微小延迟,让输出更自然 await Task.Delay(20); } } Console.WriteLine("\n"); // 将完整响应添加到聊天历史 if (!string.IsNullOrWhiteSpace(fullResponse)) { chatHistory.AddAssistantMessage(fullResponse); } } static void RegisterStudyPlanPlugin(Kernel kernel) { string studyPlanPrompt = @" 请根据用户的学习主题生成一个详细的学习计划。 学习主题: {{$subject}} 请按以下格式生成学习计划: 📚 **学习计划: {{$subject}}** 🎯 **学习目标** [明确的学习目标] 📖 **第一阶段:基础入门 (1-2周)** - 基础概念1 - 基础概念2 - 推荐资源:[具体资源] 📈 **第二阶段:进阶学习 (2-4周)** - 进阶概念1 - 进阶概念2 - 实践项目建议 - 推荐资源:[具体资源] 🚀 **第三阶段:高级应用 (2-4周)** - 高级主题1 - 高级主题2 - 综合项目 - 推荐资源:[具体资源] 💡 **学习建议** [给出具体的学习方法和技巧] 📋 **学习检查清单** - [ ] 完成基础阶段 - [ ] 完成进阶阶段 - [ ] 完成高级阶段 - [ ] 完成实践项目"; var studyPlanFunction = kernel.CreateFunctionFromPrompt( promptTemplate: studyPlanPrompt, executionSettings: new OpenAIPromptExecutionSettings { MaxTokens = 1500, Temperature = 0.8 }, functionName: "GenerateStudyPlan", description: "为指定主题生成详细的学习计划" ); kernel.ImportPluginFromFunctions("StudyPlanPlugin", [studyPlanFunction]); } static void RegisterEnhancedUtilityPlugins(Kernel kernel) { // 1. 真实时间插件 - 获取系统时间 var realTimeFunction = kernel.CreateFunctionFromMethod( method: () => { return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); }, functionName: "GetCurrentTime", description: "获取当前系统时间和日期" ); // 2. 真实计算器插件 - 实际计算数学表达式 var realCalculatorFunction = kernel.CreateFunctionFromMethod( method: (string expression) => { try { // 简单的数学表达式计算 var dataTable = new System.Data.DataTable(); var result = dataTable.Compute(expression.Replace("×", "*").Replace("÷", "/"), null); return $"计算结果: {expression} = {result}"; } catch { return $"无法计算表达式: {expression}"; } }, functionName: "Calculate", description: "计算数学表达式" ); // 3. 文件操作插件 var fileFunction = kernel.CreateFunctionFromMethod( method: (string fileName) => { if (File.Exists(fileName)) return $"文件 {fileName} 存在"; else return $"文件 {fileName} 不存在"; }, functionName: "CheckFile", description: "检查文件是否存在" ); // 4. 随机数生成插件 var randomFunction = kernel.CreateFunctionFromMethod( method: (int min, int max) => { var random = new Random(); return random.Next(min, max + 1).ToString(); }, functionName: "GenerateRandomNumber", description: "生成指定范围内的随机数" ); // 5. 字符串处理插件 var stringFunction = kernel.CreateFunctionFromMethod( method: (string text, string operation) => { return operation.ToLower() switch { "uppercase" => text.ToUpper(), "lowercase" => text.ToLower(), "reverse" => new string(text.Reverse().ToArray()), _ => "支持的操作: uppercase, lowercase, reverse, length" }; }, functionName: "ProcessString", description: "处理字符串:转大写、小写、反转、获取长度" ); kernel.ImportPluginFromFunctions("TimePlugin", [realTimeFunction]); kernel.ImportPluginFromFunctions("CalculatorPlugin", [realCalculatorFunction]); kernel.ImportPluginFromFunctions("FilePlugin", [fileFunction]); kernel.ImportPluginFromFunctions("RandomPlugin", [randomFunction]); kernel.ImportPluginFromFunctions("StringPlugin", [stringFunction]); } } }

image.png

🔍 AI是如何选择插件的?

这是很多开发者关心的核心问题。Semantic Kernel使用函数描述匹配机制:

  1. 语义分析:AI分析用户输入的语义内容
  2. 功能匹配:根据插件的description参数进行最佳匹配
  3. 自动调用:通过ToolCallBehavior.AutoInvokeKernelFunctions实现自动调用
  4. 结果整合:将插件执行结果融入到自然语言回复中

例如,当用户说"现在几点了?",AI会:

  • 识别这是时间查询需求
  • 匹配到GetCurrentTime插件(描述:获取当前系统时间和日期)
  • 自动调用并返回格式化的时间信息

⚠️ 常见坑点提醒

🔧 环境配置问题

C#
// ❌ 错误:硬编码API Key apiKey: "sk-123456789" // ✅ 正确:使用环境变量 apiKey: Environment.GetEnvironmentVariable("DEEPSEEK_API_KEY") ?? throw new InvalidOperationException("请设置DEEPSEEK_API_KEY环境变量")

🚨 异常处理最佳实践

C#
try { // AI对话处理逻辑 var response = await chatCompletionService.GetStreamingChatMessageContentsAsync(/*...*/); } catch (HttpRequestException ex) { Console.WriteLine($"❌ 网络连接错误: {ex.Message}"); } catch (ArgumentException ex) { Console.WriteLine($"❌ 参数错误: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"❌ 系统错误: {ex.Message}"); }

💡 性能优化技巧

  • 使用流式输出提升用户体验
  • 合理设置Temperature参数控制回复的创造性
  • 实现聊天历史管理避免内存溢出

🎯 实际应用场景

🏢 企业级应用

  • 技术培训:为新员工生成岗位技能学习计划
  • 代码辅助:提供实时的编程计算和字符串处理
  • 项目管理:智能文件状态检查和随机测试数据生成

👨‍💻 个人开发

  • 技术学习:制定系统的技术栈学习路径
  • 开发工具:集成多种实用功能的开发助手
  • 知识管理:建立个性化的技术问答系统

🌟 扩展思路

想让你的AI助手更强大?可以考虑添加:

  • 数据库插件:查询项目数据
  • API调用插件:集成第三方服务
  • 邮件插件:发送通知和报告
  • Git插件:代码仓库操作

📋 总结要点

通过本文的深入解析,我们掌握了三个核心要点:

  1. 插件化架构:通过Semantic Kernel的插件系统,我们可以轻松扩展AI助手的功能边界,从简单对话升级为多技能智能工具。
  2. 智能函数选择:AI通过语义分析和描述匹配,能够自动选择最适合的插件来响应用户需求,真正实现了"理解即执行"。
  3. 实战价值:这不仅仅是一个技术演示,而是一个可以直接应用于实际开发工作的实用工具,能够显著提升开发效率。

作为C#开发者,掌握Semantic Kernel让我们在AI浪潮中占据了先机。无论是个人技能提升还是企业级应用开发,这项技术都将为我们带来无限可能。

现在就开始动手吧! 你打算为你的AI助手添加哪些独特功能?在实际应用中遇到了什么有趣的问题?欢迎在评论区分享你的经验和想法!


觉得这篇文章对你有帮助?请转发给更多的C#开发同行,让我们一起在AI时代保持技术领先!关注我,获取更多C#与AI结合的实战技巧。

相关信息

通过网盘分享的文件:AppAiAgent.zip 链接: https://pan.baidu.com/s/1yHIsbIhIkwERA1WYVz568g?pwd=uygg 提取码: uygg --来自百度网盘超级会员v9的分享

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!