从零开始玩转 Microsoft Agent Framework:我的 MAF 实践之旅

前言

最近一直在写业务,感觉思维都快麻木了,趁着周末的时间,看了一下微软最新推出的智能体开发框架------Microsoft Agent Framework,以下简称MAF。

跟着官方文档跑了几个案例,感觉还是非常有意思的。它不是传统意义上的 LLM SDK,而是一个面向开发者构建智能代理(Agent)的完整工具链,支持多轮对话、函数调用、工具集成、可观测性等高级功能。

什么是 Microsoft Agent Framework?

概念性的东西,就不多说了,但这个新框架我觉得还是有必要介绍一下,这里就直接引用了微软官方文档的介绍了,我用翻译软件翻译了一下

Microsoft Agent Framework 是一款面向 .NET 和 Python 的开源开发套件,用于构建人工智能代理及多智能体工作流。它整合并扩展了 Semantic Kernel 和 AutoGen 项目中的诸多理念,既继承了两者的优势,又增添了全新功能。该框架由同一团队打造,将成为未来构建人工智能代理的统一基础。

Agent Framework 提供两大类核心能力:

AI 代理:独立的智能体,可利用大语言模型处理用户输入,调用工具和 MCP 服务器执行相应操作,并生成回复。这些代理支持多种模型提供商,包括 Azure OpenAI、OpenAI 和 Azure AI。

工作流:基于图结构的工作流,可将多个代理和功能连接起来,以完成复杂且多步骤的任务。工作流支持基于类型的路由、嵌套、检查点以及人机协同场景下的请求与响应模式。

此外,该框架还提供了基础构建模块,包括模型客户端(用于聊天补全与回复)、用于状态管理的代理线程、为代理记忆提供上下文的服务提供者、用于拦截代理行为的中间件,以及用于工具集成的 MCP 客户端。这些组件共同赋予您灵活强大的能力,助您构建交互性好、稳健可靠且安全的人工智能应用。

https://learn.microsoft.com/en-us/agent-framework/overview/agent-framework-overview

说起来,大家可能想到微软之前的智能体框架Semantic Kernel和AutoGen,这次的MAF简单来说就是两者的集合体,官方文档里也对他们的关系做了说明,大家可以自行搜一下资料,如果你以前没了解过SK和AutoGen,那恭喜你,不用专门去了解他们了,直接上手MAF即可,如果了解过,也不用有错付之类的负担,因为MAF就是基于两者,所以你有这些基础经验,上手会更顺滑。笔者之前也分别写过关于SKAutoGen的博客,这里不再赘述。

上手案例

概念引入完了,咱就直接甩案例吧,其实微软官方文档的案例写的已经很详细了,但如果没接触过模型开发或者对不太熟悉的小伙伴来说,这个文档还是多少有点门槛的。起码OpenAI或者AzureOpenAI的访问问题就需要耽搁一段时间。

事实上,在SK时期,就有这个问题,到了MAF时代,这个问题处理起来更加直接,这篇我照着文档跑了几个案例,来一一介绍下

为了方便大家对照,我在每个案例开头都附上官方文档的地址

基础框架

https://learn.microsoft.com/en-us/agent-framework/overview/agent-framework-overview

第一个案例就是搭建MAF框架,然后跑通一个最基础的案例。

  1. 创建一个控制台项目
csharp 复制代码
dotnet new console -o AgentFrameworkQuickStart
  1. 引入核心插件,注意这里因为MAF还是预览版,通过命令行引入的话要加上 --preview参数,在IDE(如vs)里,要勾选"预览版"选项
bash 复制代码
dotnet add package Azure.AI.OpenAI --prerelease
dotnet add package Microsoft.Agents.AI.OpenAI --prerelease

这里官方文档里还安装了Azure.Identity,这个我们可以不用,因为我们要接入国内平台的大模型。而且只是测试跑案例,暂时不需要它。

另外,我今天(2025.12.13)使用命令行安装的 Azure.AI.OpenAI的版本是2.8.1-beta.1,这个版本是有问题的,这个版本里依赖的OpenAI这个包和上级包有冲突,我是在IDE里手动将版本号上移了一个版本(2.7.0-beta2)才解决,如果大家刚好看到这里,然后也遇到相同问题的话,可以尝试参考一下

  1. 定义Provider

我这里是使用的国内硅基流动平台,也可以使用其他的。

定义一个类

csharp 复制代码
public class ModelProvider
{
    public string ApiKey { get; init; } = string.Empty;
    public string ModelId { get; init; } = string.Empty;
    public string Endpoint { get; init; } = string.Empty;
}

对应的搞一个配置文件参数,测试阶段的话不搞也没事,这样方便一点

json 复制代码
{
  "ModelProvider": {
    "EndPoint": "https://api.moonshot.cn/v1",
    "ApiKey": "{你的key}",
    "ModelId": "kimi-k2-0905-preview"
  }
}

然后常规操作,就ok了

csharp 复制代码
var config = new ConfigurationBuilder()
    .AddJsonFile($"llm.json", optional: false, reloadOnChange: true)
    .Build();
var modelProvider = new ModelProvider()
{
    ApiKey = config["ModelProvider:ApiKey"] ?? string.Empty,
    ModelId = config["ModelProvider:ModelId"] ?? string.Empty,
    Endpoint = config["ModelProvider:Endpoint"] ?? string.Empty,
};
Console.WriteLine($"正在使用【${modelProvider.ModelId}】模型",ConsoleColor.Yellow);

第一个智能体

https://learn.microsoft.com/en-us/agent-framework/overview/agent-framework-overview

文档里第一个案例是一个笑话大师的案例,咱们小小的改造一下

csharp 复制代码
var agent = new OpenAIClient(
    new ApiKeyCredential(modelProvider.ApiKey),
    new OpenAIClientOptions { Endpoint = new Uri(modelProvider.Endpoint) })
    .GetChatClient(modelProvider.ModelId)
    .CreateAIAgent(instructions: "你是个脱口秀大师,可以很轻松的逗笑大家.", name: "脱口秀大师");

await foreach (var update in agent.RunStreamingAsync("来一段简短的脱口秀表演"))
{
    Console.Write(update);
}

视觉智能体

https://learn.microsoft.com/en-us/agent-framework/tutorials/agents/images

在试试视觉能力,注意,此时要换一个有视觉能力的模型,我前面使用的kimi不支持,可以换成其他模型,比如qwen系列

csharp 复制代码
var agent = new OpenAIClient(
    new ApiKeyCredential(modelProvider.ApiKey),
    new OpenAIClientOptions { Endpoint = new Uri(modelProvider.Endpoint) })
    .GetChatClient(modelProvider.ModelId)
    .CreateAIAgent(instructions: "你是一个能够分析图像的实用助手。.", name: "视觉代理");

ChatMessage message = new ChatMessage(ChatRole.User, [
    new TextContent("你在这张图片中看到了什么?"),
    new UriContent("{图片实际地址}", "image/png")
    ]);
// Console.WriteLine(await agent.RunAsync(message));

await foreach (var update in agent.RunStreamingAsync(message))
{
    Console.Write(update);
}

Function Tool

https://learn.microsoft.com/en-us/agent-framework/tutorials/agents/function-tools?pivots=programming-language-csharp

注意,在function tool之前的案例还有一篇关于多智能体的案例,我这里直接跳过了,链接给出来

https://learn.microsoft.com/en-us/agent-framework/tutorials/agents/multi-turn-conversation?pivots=programming-language-csharp

csharp 复制代码
var agent = new OpenAIClient(
    new ApiKeyCredential(modelProvider.ApiKey),
    new OpenAIClientOptions { Endpoint = new Uri(modelProvider.Endpoint) })
    .GetChatClient(modelProvider.ModelId)
    .CreateAIAgent(instructions: "你是一个智能助手。", tools: [AIFunctionFactory.Create(GetWeather)]);

Console.WriteLine(await agent.RunAsync("保定的天气怎么样?"));

[Description("Get the weather for a given location.")]
static string GetWeather([Description("The location to get the weather for.")] string location)
    => $"The weather in {location} is cloudy with a high of 15°C.";

这个呢,我没怎么修改,基本就是按照官方文档的例子来的。

需要多说一点的是,定义工具函数时,不再需要像SK时代,标记方法工具名特性了,直接写工具作用的描述就可以了,更加简洁。

工具调用在LLM发展初期就比较普及了,这也是Agent的灵魂,使Agent不再只是"回答问题",而是能像人一样去"执行动作"。

需要人批准的函数工具

https://learn.microsoft.com/en-us/agent-framework/tutorials/agents/function-tools-approvals?pivots=programming-language-csharp

这个实际上是MAF框架的一个重要特性,在实际的业务场景中,很多时候我们不能或者不应该让智能体直接去执行一些操作,而是需要得到人类的授权后,再决定是否执行,也就是"人机协同"模式,案例给的比较简单,实际我们可以在这个基础上扩充进很多业务进来,比如权限模块等等。

它的价值就会实现安全可控的自动化流程,避免误操作。

csharp 复制代码
AIFunction weatherFunction = AIFunctionFactory.Create(GetWeather);
AIFunction approvalRequiredWeatherFunction = new ApprovalRequiredAIFunction(weatherFunction);

var agent = new OpenAIClient(
    new ApiKeyCredential(modelProvider.ApiKey),
    new OpenAIClientOptions { Endpoint = new Uri(modelProvider.Endpoint) })
    .GetChatClient(modelProvider.ModelId)
    .CreateAIAgent(instructions: "你是一个智能助手。", tools: [approvalRequiredWeatherFunction]);

AgentThread thread = agent.GetNewThread();
AgentRunResponse response = await agent.RunAsync("保定的天气如何?", thread);

var functionApprovalRequests = response.Messages
    .SelectMany(x => x.Contents)
    .OfType<FunctionApprovalRequestContent>()
    .ToList();
FunctionApprovalRequestContent requestContent = functionApprovalRequests.First();
Console.WriteLine($"我需要您的批准才能执行 '{requestContent.FunctionCall.Name}'");
var approvalMessage = new ChatMessage(ChatRole.User, [requestContent.CreateResponse(true)]);
Console.WriteLine(await agent.RunAsync(approvalMessage, thread));


[Description("Get the weather for a given location.")]
static string GetWeather([Description("The location to get the weather for.")] string location)
    => $"The weather in {location} is cloudy with a high of 15°C.";

将 Agent 暴露为 MCP 工具

通过 MAF,我可以轻松把我的 Agent 包装成一个 MCP Server,然后在任意MCP客户端中注册这个工具,就可以直接调用它!

csharp 复制代码
var agent = new OpenAIClient(
        new ApiKeyCredential(modelProvider.ApiKey),
        new OpenAIClientOptions { Endpoint = new Uri(modelProvider.Endpoint) })
    .GetChatClient(modelProvider.ModelId)
    .CreateAIAgent(instructions: "你是个笑话大师.", name: "笑话大师");
var jokerMcpTool = McpServerTool.Create(agent.AsAIFunction());
var builder = Host.CreateEmptyApplicationBuilder(settings: null);
builder.Services
    .AddMcpServer()
    .WithStdioServerTransport()
    .WithTools([jokerMcpTool]);
await builder
    .Build()
    .RunAsync();

然后在Cline中调用他的效果

是的,现在通过MAF框架创建一个MCPServer,就像写接口一样,非常丝滑。

结语

好了,本次我就跑了这几个案例,感觉还是非常不错的。微软通过 MAF 提供了一条清晰的技术路径,让我们这些开发者也能轻松构建属于自己的"智能助手"。

接下来,还是会继续对MAF的探索之旅,因为我现在做的项目也要接入智能体框架。这东西我觉得绝不是所谓"锦上添花"之类的定位,而是办公效率提质增效的核心因素,当然这有一个必要条件,就是你的业务系统里基础操作是稳定的,可靠的,基于此,智能体的接入才能彻底释放生产力!

本篇对MAF的介绍只是冰山一角,还有更有特点的工作流,AG-UI,DevUI等,等下次有机会在细聊,晚安啦攻城狮们。

相关推荐
天庭鸡腿哥15 小时前
无须激活,安装即是Pro版!
microsoft·macos·visual studio·everything
派大鑫wink19 小时前
Python 流程控制实战:打造文字版数独小游戏(新手友好)
服务器·前端·microsoft
专注VB编程开发20年20 小时前
多线程解压安装ZIP,EXE分析-微软的MSI安装包和 .NET SDK EXE
linux·运维·服务器·microsoft·.net
天天进步20152 天前
【Cradle 源码解析四】手眼协同:IO 控制层与动作执行 (Action Execution)
microsoft
宝桥南山2 天前
Power Automate - 从Web Api获取Json数据并以table的形式发送邮件和审批请求
microsoft·微软·rpa
Leinwin2 天前
Azure NCv6 现已开放公共预览
microsoft·azure
AI原吾2 天前
[特殊字符] 欢迎来到蓝牙便利店
microsoft·智能手机·ble
福尔摩斯张2 天前
Linux信号捕捉特性详解:从基础到高级实践(超详细)
linux·运维·服务器·c语言·前端·驱动开发·microsoft
添加shujuqudong1如果未回复3 天前
Matlab 基于光流场的交通流量分析与应用
microsoft