用4個(gè)簡(jiǎn)單步驟構(gòu)建一個(gè)能上網(wǎng)瀏覽的AI應(yīng)用——借助微軟的Playwright MCP服務(wù)器和Semantic Kernel
作者创建的图像,解释MCP前后的情况
使用 MCP 与 Semantic Kernel 的一步一步指南:MCP!现在AI圈里最火的词就是MCP。所以我就想,何不自己也跟着凑个热闹?因此我写了这篇博客,介绍如何用MCP服务器和Semantic Kernel以及Azure AI Foundry一起玩。
让我们先来理解一下什么是MCP。
有许多博客和视频帮助我了解了MCP的概念,我会在文章末尾附上相关链接。
对我来说,最简单的理解方式是这样的:就像REST定义了一种与Web API交互的标准方法一样,Anthropic的MCP (Model Context Protocol) 提供了一种标准的方式来让LLM与外部服务进行交互。
作者供图
每次当我开发一个新的AI应用并希望给我的AI代理添加一个新的工具或功能时,我通常需要实现一个自定义的集成。例如,如果我想让我的AI应用连接到AI搜索服务,我必须定义一个连接器来与AI搜索中的向量存储进行交互。现在,如果我想添加网络搜索的能力,我还需要另外一个连接器来处理这个功能。
例如 LangChain、Semantic Kernel、AutoGen 等 AI 框架确实提供了一些开箱即用的功能和常见连接器——但它们并不总是很好地适用于所有应用程序。
有了 MCP ,我再也不需要处理那些复杂的细节了。MCP 的开发者们已经创建了这些连接器,并提供了一种标准化的访问方式。我只需通过我的 MCP 客户端(可以是 Claude 桌面应用、Cursor、Chainlit 等)来调用工具,而无需担心集成的细节。这不是挺棒的吗?
我们现在来看看一个具体的应用场景。
我想要用 .NET 开发一个LLM应用,这个应用可以打开新闻网站,点击第一条新闻链接并总结其内容。之前我在一个 博客 里也做过类似的事情——更多细节可以在这篇博客里找到。
第一步:配置语义内核
var builder = Kernel.CreateBuilder(); // 创建内核构建器(Kernel.CreateBuilder())
builder.AddAzureOpenAIChatCompletion("GPT4ov1", "https://<AzureOpenAI>.openai.azure.com", "<REPLACE_WITH_KEY>"); // 构建器添加AzureOpenAI聊天完成功能(builder.AddAzureOpenAIChatCompletion(...))
Kernel kernel = builder.Build();
步骤2:在您的.NET应用程序中安装官方的C# MCP,并安装MCP客户端
public static async Task<IMcpClient> GetMCPClientForPlaywright()
{
McpClientOptions options = new()
{
ClientInfo = new() { Name = "Playwright", Version = "1.0.0" }
};
var config = new McpServerConfig
{
Id = "Playwright",
Name = "Playwright",
TransportType = "stdio",
TransportOptions = new Dictionary<string, string>
{
["command"] = "npx",
["arguments"] = "-y @playwright/mcp@latest",
}
};
var mcpClient = await McpClientFactory.CreateAsync(
config,
options
);
return mcpClient;
}
你可以通过从服务器打印出工具列表来确认你的客户端是否设置正确。
var mcpClient = await GetMCPClientForPlaywright(); // 获取MCP客户端
await foreach (var tool in mcpClient.ListToolsAsync()) // 遍历工具列表
{
Console.WriteLine($"{tool.Name} ({tool.Description})"); // 输出工具名称及描述
}
然后,把MCP的函数改成KernelFunctions
语义内核工具或插件都是以KernelFunctions
的形式封装的,因此在使用MCP时,需要额外的一个步骤,将这些函数转换为KernelFunctions
。SK为此提供了一个扩展功能,但至少在我尝试时,它与最新版本的.NET MCP不兼容。所以我扩展了它,让它可以与最新版本的.NET MCP一起工作。我会在我的代码参考中分享这段代码。
var 内核功能 = await mcpClient.MapToFunctionsAsync();
内核功能.AddFromFunctions("浏览器", 核心);
Note: The final line should be adjusted to 内核功能.AddFromFunctions("浏览器");
to match the English syntax correctly, as the object 核心
is not necessary in this context. Thus, the final translation should be:
var 内核功能 = await mcpClient.MapToFunctionsAsync();
内核功能.AddFromFunctions("浏览器");
步骤4:发送你的第一条信息吧!
// 启用自动函数调用
var executionSettings = new OpenAIPromptExecutionSettings
{
Temperature = 0,
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
// 请为我总结与MCP相关的AI新闻,这些新闻来自必应新闻。打开第一个链接并总结其内容
var prompt = "请为我总结与MCP相关的AI新闻,这些新闻来自必应新闻。打开第一个链接并总结其内容";
var result = await kernel.InvokePromptAsync(prompt, new(executionSettings)).ConfigureAwait(false);
Console.WriteLine($"\n\n{prompt}\n{result}");
结果为:
App的输出
你可以在这里找到代码示例。
GitHub - akshaykokane/semantic-kernel-playwright-mcp 加入 akshaykokane/semantic-kernel-playwright-mcp 项目,在 GitHub 上注册账户来贡献。 那么,让我们来看看结论吧:MCP确实正在彻底改变我们如何将外部服务与大型语言模型集成的方式。凭借其无缝的接口和日益增长的使用,可以预见未来每个主要的服务都将提供一个兼容MCP的层,从而释放出强大而直观的AI互动。构建AI应用程序从未如此简单易行。
在我的下一篇文章中,我将进一步展示如何从零开始搭建你自己的MCP服务器。更多精彩内容即将揭晓,敬请期待!
学习愉快,干杯,祝你好运!🥂🚀
参考文献:- modelcontextprotocol.io
- https://github.com/microsoft/playwright-mcp
- https://github.com/microsoft/semantic-kernel/tree/7a19ae350eaff5746ace52d2c894a9975d82ba59/dotnet/samples/Demos/ModelContextProtocol
- 如之前所说,以下是理解 MCP 的资料:https://blog.dailydoseofds.com/p/visual-guide-to-model-context-protocol, https://www.youtube.com/watch?v=7j_NE6Pjv-E&t=875s, https://norahsakal.com/blog/mcp-vs-api-model-context-protocoexplained/
共同學(xué)習(xí),寫(xiě)下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章