MAF 快速入门:从 ChatClient 到 AIAgent

一句话简介

Microsoft Agent Framework (MAF) 是微软推出的企业级 AI Agent 开发框架,基于 Microsoft.Extensions.AI 构建,为开发者提供状态管理、身份定义和工具管理等高级能力。


🎯 核心价值

  • ✅ 状态管理:内置 AgentThread 实现多轮对话记忆

  • ✅ 身份定义:固定的 Instructions 和 Name,无需每次传入

  • ✅ 工具管理:Agent 级别统一管理工具集合

  • ✅ 企业级:构建在 MEAI 之上,适合生产环境


📝 Agent vs ChatClient:什么时候用 Agent?

很多开发者会困惑:我已经有 IChatClient 了,为什么还需要 Agent?

特性

IChatClient

AIAgent

定位

💬 底层 AI 调用抽象

🤖 高级智能体封装

状态管理

❌ 无状态,每次调用独立

✅ 内置对话线程 (AgentThread)

身份定义

❌ 需手动传入 System Message

✅ 固定的 Instructions 和 Name

工具管理

⚠️ 需手动配置 ChatOptions.Tools

✅ Agent 级别统一管理

使用场景

🔧 单次对话场景

🏢 多轮交互、企业级对话系统

简单来说:

  • ChatClient = 纯函数:给定输入,返回输出,不保留状态

  • Agent = 有记忆的助手:有固定身份、能记住上下文、能使用工具


🏗️ MAF 架构定位

MAF 构建在 Microsoft.Extensions.AI 之上,提供更高层次的抽象,让开发者专注于业务逻辑。


💻 快速开始:创建第一个 Agent

三步创建 Agent

完整示例:口语教练 Agent

// 1. 获取底层 ChatClient
var chatClient = AIClientHelper.GetDefaultChatClient();

// 2. 创建 Agent
AIAgent spokenEnglishCoach = chatClient.CreateAIAgent(
    instructions: "你是一位专业的英语口语教练。帮助学生提升英语口语能力,始终保持鼓励和友好的态度。",
    name: "SpokenEnglishCoach"
);

// 3. 调用 Agent (同步模式)
var response = await spokenEnglishCoach.RunAsync(
    "我想提高英语口语能力,但不知道从哪里开始。你能给我一些建议吗?"
);

Console.WriteLine($"🤖 {spokenEnglishCoach.Name}: {response}");

核心要点:

  • 🔧 instructions:定义 Agent 的角色和行为(System Message)

  • 🔧 name:Agent 的唯一标识,用于日志和调试

  • 🔧 RunAsync:同步调用,等待完整响应


🌊 流式调用:提升用户体验

同步调用需要等待完整响应,用户体验不佳。流式调用可以逐字显示 AI 的响应,就像 ChatGPT 那样。

对比:同步 vs 流式

流式调用示例

// 流式调用,逐块输出
await foreach (var chunk in spokenEnglishCoach.RunStreamingAsync(
    "请讲解如何练习英语的连读技巧,并给出例子。"
))
{
    Console.Write(chunk); // 逐块输出,不换行
}

核心差异:

  • 同步RunAsync() → Task<string>

  • 流式RunStreamingAsync() → IAsyncEnumerable<string>


🏢 MAF 核心概念

三大核心组件

组件

功能

说明

AIAgent

智能代理

具有固定身份(Name + Instructions)和工具集合

AgentThread

对话线程

维护独立的对话历史,支持序列化

AgentRun

执行实例

每次调用创建一个 Run,返回响应


⚠️ 当前限制:无法记住历史

上面的示例中,每次调用 RunAsync() 都是独立的单次对话,Agent 不会记住之前的内容。

问题演示:

// 第一轮
var response1 = await spokenEnglishCoach.RunAsync("我叫张三,我想学英语口语。");

// 第二轮 - Agent 无法记住 "我叫张三"
var response2 = await spokenEnglishCoach.RunAsync("你知道我叫什么名字吗?");
// ❌ Agent 会回答:抱歉,我不知道您的名字...

💡 解决方案:AgentThread

要实现多轮对话记忆,需要使用 AgentThread

// 创建对话线程
var thread = agent.GetNewThread();

// 所有对话使用同一个 thread
await agent.RunAsync("我叫张三", thread);
await agent.RunAsync("你知道我叫什么吗?", thread); 
// ✅ 能够记住:"您好,张三!"

AgentThread 将在下节课详细讲解。


🎯 总结

  • ✅ MAF 定位:构建在 MEAI 之上的企业级 Agent 框架,提供状态管理和工具能力

  • ✅ Agent vs ChatClient:Agent 是有状态、有身份的智能体,适合多轮对话场景

  • ✅ 创建 AgentchatClient.CreateAIAgent(instructions, name) 三步完成

  • ✅ 调用模式:同步调用 RunAsync() 和流式调用 RunStreamingAsync()

  • ✅ 核心概念:Agent(智能代理)、Thread(对话线程)、Run(执行实例)

  • ⚠️ 当前限制:单次调用无历史记忆,需使用 AgentThread 解决(下节课)

下节课预告: 《多轮对话与上下文管理》—— 深入 AgentThread 的创建、使用和持久化。


如需获取文章配套完整代码,可扫码咨询领取。👇

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐