还在羡慕ChatGPT的多功能对话体验?作为C#开发者,你完全可以打造一个属于自己的智能助手!今天我们将深入剖析一个完整的AI Agent项目,看看如何用Semantic Kernel框架构建一个具备学习计划生成、实时计算、文件操作等多项技能的智能助手。
这不仅仅是一个简单的聊天机器人,而是一个真正实用的开发工具,能够帮助你处理日常开发中的各种任务。准备好了吗?让我们一起探索C#与AI结合的无限可能!
在实际开发工作中,我们经常遇到这些场景:
传统的解决方案要么功能单一,要么需要频繁切换不同工具。而通过Semantic Kernel,我们可以将这些需求整合到一个统一的AI助手中。
我们的AI助手采用插件化架构,主要包含:
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();
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]);
}
}
}

这是很多开发者关心的核心问题。Semantic Kernel使用函数描述匹配机制:
description参数进行最佳匹配ToolCallBehavior.AutoInvokeKernelFunctions实现自动调用例如,当用户说"现在几点了?",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}");
}
想让你的AI助手更强大?可以考虑添加:
通过本文的深入解析,我们掌握了三个核心要点:
作为C#开发者,掌握Semantic Kernel让我们在AI浪潮中占据了先机。无论是个人技能提升还是企业级应用开发,这项技术都将为我们带来无限可能。
现在就开始动手吧! 你打算为你的AI助手添加哪些独特功能?在实际应用中遇到了什么有趣的问题?欢迎在评论区分享你的经验和想法!
觉得这篇文章对你有帮助?请转发给更多的C#开发同行,让我们一起在AI时代保持技术领先!关注我,获取更多C#与AI结合的实战技巧。
相关信息
通过网盘分享的文件:AppAiAgent.zip 链接: https://pan.baidu.com/s/1yHIsbIhIkwERA1WYVz568g?pwd=uygg 提取码: uygg --来自百度网盘超级会员v9的分享
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!