文章目录
将MCP(ModelContextProtocol)与Semantic Kernel集成(调用github)
在当今快速发展的技术领域,人工智能(AI)的应用正在不断拓展和深化。为了更好地将AI模型与各种数据源和工具连接起来,模型上下文协议(Model Context Protocol, MCP) 应运而生。MCP是一种开放协议,旨在标准化应用程序向大型语言模型(LLM)提供上下文的方式。本文将详细介绍如何将MCP工具与 语义内核(Semantic Kernel) 集成,以实现更强大的AI功能。
一、模型上下文协议(MCP)简介
1.1 简介
模型上下文协议(MCP)是一种开放协议,它标准化了应用程序如何向大型语言模型(LLM)提供上下文信息。MCP通过定义统一的接口,使得不同的数据源和工具能够与AI模型进行无缝连接。这种标准化的连接方式不仅提高了系统的互操作性,还增强了AI模型对上下文的理解能力,从而为用户提供更加精准和智能的服务。
MCP的潜在应用场景包括数据集成、知识管理等,对于开发先进的AI解决方案具有重要意义。
本文介绍了如何将 Model Context Protocol 工具与 Semantic Kernel 结合使用。模型上下文协议 (MCP) 是一种开放协议,用于标准化应用程序如何为 LLM 提供上下文。MCP 标准化了 AI 模型与各种数据源和工具之间的连接。
模型上下文协议非常重要,因为它增强了 AI 模型与数据和工具的交互方式,促进了互作性、灵活性并改进了上下文理解。它的潜在应用涵盖各个领域,包括数据集成和知识管理,使其成为开发高级 AI 解决方案的重要组成部分。
1.2 示例
本文中描述的示例侧重于通过函数调用将 AI 模型连接到 MCP 工具。
有关模型上下文协议 (MCP) 的更多信息,请参阅文档。
下面描述的此示例使用官方 ModelContextProtocol 包,受这些示例的影响。
该示例显示:
- 如何使用 ModelContextProtocol 连接到 MCP 服务器
- 检索 MCP 服务器提供的工具列表
- 将 MCP 工具转换为 Semantic Kernel 函数,以便将它们添加到 Kernel 实例中
- 从 Semantic Kernel 调用 MCP 工具以响应 LLM 函数调用请求
二、集成步骤
2.1 安装环境依赖
dotnet add package ModelContextProtocol --prerelease
dotnet add package SemanticKernel
2.2 构建语义内核(Kernel)
在开始集成之前,我们需要构建一个语义内核(Kernel)实例。Kernel是语义内核的核心组件,负责管理和执行各种AI功能。在本示例中,我们将使用OpenAI的Chat Completion模型,因此需要提供有效的API密钥。
var builder = Kernel.CreateBuilder();
builder.Services.AddLogging(c => c.AddDebug().SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace));
builder.Services.AddOpenAIChatCompletion(
modelId: "glm-4-flash",// 这里使用了智谱的免费模型,可按需替换其他模型
endpoint: new Uri("https://open.bigmodel.cn/api/paas/v4"),
apiKey: "YOUR KEY");
Kernel kernel = builder.Build();
2.3 创建MCP客户端
MCP采用客户端-服务器架构,客户端通过MCP协议与服务器建立一对一连接。在本示例中,我们将创建一个MCP客户端,连接到本地运行的GitHub服务器。
- MCP 主机:希望通过 MCP 访问数据的 IDE 或 AI 工具等程序
- MCP 客户端:与服务器保持 1:1 连接的协议客户端
- MCP 服务器:轻量级程序,每个程序都通过标准化的 Model Context Protocol 公开特定功能
什么是 npx?
npx 是 Node.js 附带的命令行工具(从版本 5.2.0 开始),是 npm(Node Package Manager)生态系统的一部分。它用于直接从命令行执行Node.js包,而无需在系统上全局安装它们。
// 创建一个MCPClient GitHub的服务器
await using IMcpClient mcpClient = await McpClientFactory.CreateAsync(new StdioClientTransport(new()
{
Name = "GitHub",
Command = "npx",
Arguments = ["-y", "@modelcontextprotocol/server-github"],
}));
2.4 获取MCP工具
MCP服务器可以将可执行功能作为工具暴露给客户端。这些工具可以被LLM调用,从而实现与外部系统的交互。通过以下代码,我们可以获取GitHub服务器提供的工具列表,并打印每个工具的名称和描述。
// 获取GitHub服务器上可用的工具列表
var tools = await mcpClient.ListToolsAsync().ConfigureAwait(false);
foreach (var tool in tools.Tools)
{
Console.WriteLine($"{tool.Name}: {tool.Description}");
}
GitHub MCP服务器提供了多种工具,例如创建或更新文件、搜索仓库、创建问题等。
2.5 将MCP工具转换为Kernel函数
为了在语义内核中使用MCP工具,我们需要将它们转换为Kernel函数。Kernel函数是语义内核中表示工具的抽象。通过以下代码,我们可以将MCP工具转换为Kernel函数,并将其添加到Kernel实例中。
kernel.Plugins.AddFromFunctions("GitHub", tools.Select(aiFunction => aiFunction.AsKernelFunction()));
2.6 通过函数调用MCP工具
将MCP工具转换为Kernel函数后,我们就可以在Kernel中使用它们了。以下是一个示例,展示如何通过函数调用获取GitHub仓库的最近四次提交。
OpenAIPromptExecutionSettings executionSettings = new()
{
Temperature = 0,
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(options: new() { RetainArgumentTypes = true })
};
var prompt = "总结最后四次提交到microsoft/semantic-kernel存储库的情况?";
var result = await kernel.InvokePromptAsync(prompt, new(executionSettings)).ConfigureAwait(false);
Console.WriteLine($"\n\n{prompt}\n{result}");
注:获取github提交信息失败,实际上已经调用了mcp了,前面测试还可以,写博客时一直失败,后续会再排查原因
三、完整代码示例
// 创建一个MCPClient GitHub的服务器
await using var mcpClient = await McpClientFactory.CreateAsync(new StdioClientTransport(new()
{
Name = "MCPServer",
Command = "npx",
Arguments = ["-y", "@modelcontextprotocol/server-github"],
}));
// 获取GitHub服务器上可用的工具列表
var tools = await mcpClient.ListToolsAsync().ConfigureAwait(false);
foreach (var tool in tools)
{
Console.WriteLine($"{tool.Name}: {tool.Description}");
}
// 构建内核与MCP工具内核函数
var builder = Kernel.CreateBuilder();
builder.Services
.AddLogging(c => c.AddDebug().SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace))
.AddOpenAIChatCompletion(
modelId: "glm-4-flash",
endpoint: new Uri("https://open.bigmodel.cn/api/paas/v4"),
apiKey: "YOUR KEY");
Kernel kernel = builder.Build();
#pragma warning disable SKEXP0001 // 类型仅用于评估,在将来的更新中可能会被更改或删除。取消此诊断以继续。
kernel.Plugins.AddFromFunctions("GitHub", tools.Select(aiFunction => aiFunction.AsKernelFunction()));
#pragma warning restore SKEXP0001 // 类型仅用于评估,在将来的更新中可能会被更改或删除。取消此诊断以继续。
// 开启函数自动调用
#pragma warning disable SKEXP0001 // 类型仅用于评估,在将来的更新中可能会被更改或删除。取消此诊断以继续。
OpenAIPromptExecutionSettings executionSettings = new()
{
Temperature = 0,
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(options: new() { RetainArgumentTypes = true })
};
#pragma warning restore SKEXP0001 // 类型仅用于评估,在将来的更新中可能会被更改或删除。取消此诊断以继续。
// 测试使用GitHub工具
//var prompt = "Summarize the last four commits to the microsoft/semantic-kernel repository?";
var prompt = "总结最后四次提交到microsoft/semantic-kernel存储库的情况?";
var result = await kernel.InvokePromptAsync(prompt, new(executionSettings)).ConfigureAwait(false);
Console.WriteLine($"\n\n{prompt}\n{result}");
四、总结
通过将MCP工具与语义内核集成,能够实现对GitHub数据的高效访问和操作。这种集成不仅提高了系统的灵活性和互操作性,还为开发者提供了更加便捷的方式来构建智能应用程序。
注:如果遇到下面报错,说明电脑上没装Node.js,需要进行安装。