2025-11-20
C#
00

目录

什么是函数调用?
Semantic Kernel 环境准备
基础知识:创建 Kernel 实例
完整示例:天气查询与学习计划生成应用
实际应用场景
总结

在现代 AI 应用开发中,函数调用是一项强大的功能,它允许 AI 模型直接与应用程序的功能进行交互。Microsoft Semantic Kernel 作为一个开源框架,提供了简单而强大的方式来集成这一能力。本文将详细介绍如何在 Semantic Kernel 中使用聊天完成(Chat Completion)进行函数调用,帮助开发者构建更智能、更实用的 AI 应用。

什么是函数调用?

函数调用(Function Calling)允许 AI 模型识别何时应该调用预定义的函数,并以结构化的方式提供必要的参数。这使得 AI 能够:

  • 执行特定任务
  • 获取外部信息
  • 触发应用程序中的操作

在 Semantic Kernel 中,这一功能与大型语言模型(LLM)的能力无缝集成,使开发体验更加流畅。

Semantic Kernel 环境准备

首先,我们需要创建一个新的 C# 项目并安装必要的 NuGet 包:

image.png

基础知识:创建 Kernel 实例

在使用函数调用之前,我们需要初始化 Semantic Kernel:

C#
// 创建更安全的Semantic Kernel配置 var kernelBuilder = Kernel.CreateBuilder(); kernelBuilder.AddOpenAIChatCompletion( modelId: "deepseek-chat", apiKey: Environment.GetEnvironmentVariable("DEEPSEEK_API_KEY") ?? "sk-xxxxx", endpoint: new Uri("https://api.deepseek.com/v1") ); // 构建内核 var kernel = kernelBuilder.Build();

完整示例:天气查询与学习计划生成应用

下面是一个完整的应用示例,结合了上述所有功能:

C#
#pragma warning disable SKEXP0010 using System.ComponentModel; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.ChatCompletion; using Microsoft.SemanticKernel.Connectors.OpenAI; namespace AppFunction { class Program { static async Task Main(string[] args) { // 创建更安全的Semantic Kernel配置 var kernelBuilder = Kernel.CreateBuilder(); kernelBuilder.AddOpenAIChatCompletion( modelId: "deepseek-chat", apiKey: Environment.GetEnvironmentVariable("DEEPSEEK_API_KEY") ?? "sk-xxxx", endpoint: new Uri("https://api.deepseek.com/v1") ); // 构建内核 var kernel = kernelBuilder.Build(); // 注册学习计划生成插件 string studyPlanPrompt = @" 根据用户问题,生成一个与{{$topic}}相关的学习计划。 计划应包括: 1. 入门基础知识 2. 中级概念 3. 高级主题 4. 推荐资源 用户问题: {{$input}} "; // 创建函数 var studyPlanFunction = kernel.CreateFunctionFromPrompt( promptTemplate: "Generate a study plan for {{$subject}}", executionSettings: new OpenAIPromptExecutionSettings { MaxTokens = 1000 }, functionName: "GenerateStudyPlan", description: "Creates a personalized study plan" ); kernel.ImportPluginFromFunctions("StudyPlanPlugin", new[] { studyPlanFunction }); // 创建交互式聊天循环 var chatHistory = new ChatHistory(); chatHistory.AddSystemMessage("我是您的智能助手,为您生成学习计划。"); Console.WriteLine("欢迎使用智能助手!输入 'exit' 退出。"); // 在聊天循环中添加函数调用逻辑 while (true) { Console.Write("\n您的问题: "); string userInput = Console.ReadLine(); if (userInput.ToLower() == "exit") break; // 添加用户消息 chatHistory.AddUserMessage(userInput); // 设置函数调用设置 var settings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions, FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() // 启用自动函数选择 }; try { // 获取聊天完成服务 var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>(); // 设置函数调用设置 var settings1 = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() // 推荐使用这种方式 }; // 准备参数 var arguments = new KernelArguments(settings1) { ["subject"] = userInput }; // 调用学习计划生成函数 var studyPlanResult = await kernel.InvokeAsync( studyPlanFunction, arguments ); // 输出学习计划 Console.WriteLine("\n生成的学习计划:"); Console.WriteLine(studyPlanResult.GetValue<string>()); // 使用流式响应继续聊天 var response = chatCompletionService.GetStreamingChatMessageContentsAsync( chatHistory: chatHistory, executionSettings: settings, kernel: kernel ); // 收集完整响应用于添加到历史记录 string fullResponse = ""; await foreach (var content in response) { Console.Write(content.Content); fullResponse += content.Content; } // 将响应添加到聊天历史 chatHistory.AddAssistantMessage(fullResponse); } catch (Exception ex) { Console.WriteLine($"\n发生错误: {ex.Message}"); } } } } }

image.png

实际应用场景

Microsoft Semantic Kernel 的函数调用功能可应用于多种场景:

  • 内容创建应用:生成文章、学习计划、营销文案等内容
  • 客户服务机器人:查询订单状态、处理退款请求、回答产品问题
  • 数据分析助手:分析数据、生成报表、提供数据洞察
  • 个人助理:管理日程安排、设置提醒、查询天气、预订服务
  • 教育应用:生成学习材料、提供定制学习路径、回答学术问题

总结

Microsoft Semantic Kernel 提供了一种优雅的方式来实现 AI 模型与应用程序功能的集成。通过聊天完成中的函数调用,开发者可以创建更加智能、交互性更强的应用程序,使 AI 能够执行实际的操作而不仅仅是生成文本。

要开始使用这些功能,请确保:

  1. 使用支持函数调用的模型
  2. 为函数和参数提供清晰的描述
  3. 妥善处理函数调用结果
  4. 将函数调用结果整合到对话流程中

通过掌握这些技术,你将能够利用 Microsoft Semantic Kernel 的全部潜力,创建真正智能且实用的 AI 应用程序。

本文作者:技术老小子

本文链接:

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