在现代 AI 应用开发中,函数调用是一项强大的功能,它允许 AI 模型直接与应用程序的功能进行交互。Microsoft Semantic Kernel 作为一个开源框架,提供了简单而强大的方式来集成这一能力。本文将详细介绍如何在 Semantic Kernel 中使用聊天完成(Chat Completion)进行函数调用,帮助开发者构建更智能、更实用的 AI 应用。
函数调用(Function Calling)允许 AI 模型识别何时应该调用预定义的函数,并以结构化的方式提供必要的参数。这使得 AI 能够:
在 Semantic Kernel 中,这一功能与大型语言模型(LLM)的能力无缝集成,使开发体验更加流畅。
首先,我们需要创建一个新的 C# 项目并安装必要的 NuGet 包:

在使用函数调用之前,我们需要初始化 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}");
}
}
}
}
}

Microsoft Semantic Kernel 的函数调用功能可应用于多种场景:
Microsoft Semantic Kernel 提供了一种优雅的方式来实现 AI 模型与应用程序功能的集成。通过聊天完成中的函数调用,开发者可以创建更加智能、交互性更强的应用程序,使 AI 能够执行实际的操作而不仅仅是生成文本。
要开始使用这些功能,请确保:
通过掌握这些技术,你将能够利用 Microsoft Semantic Kernel 的全部潜力,创建真正智能且实用的 AI 应用程序。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!