前言
在AI快速发展的今天,微软推出了多个AI开发框架,从早期的AutoGen到Semantic Kernel,再到最新的Microsoft Agent Framework。很多开发者可能会有疑问:为什么微软要推出这么多框架?它们之间有什么区别?本文将通过一个实际的AI美女聊天群组项目,带你深入理解Microsoft Agent Framework,掌握多智能体开发的核心概念。
本文的示例代码已开源:agent-framework-tutorial-code/agent-groupchat
为什么微软要推出Microsoft Agent Framework?
AutoGen vs Semantic Kernel vs Agent Framework
在讲解新框架之前,我们先理解一下微软AI框架的演进路径:
AutoGen(研究导向)
- 最早期的多智能体研究框架
- 侧重学术研究和实验性功能
- Python为主,生态相对独立
Semantic Kernel(应用导向)
- 面向生产环境的AI应用开发框架
- 强大的插件系统和内存管理
- 多语言支持(C#、Python、Java)
- 适合单一智能体应用
Microsoft Agent Framework(企业导向)
- 专为多智能体协作设计
- 内置工作流编排能力(Sequential、Concurrent、Handoff、GroupChat)
- 支持Handoff转移模式和GroupChat管理模式
- 与Azure AI Foundry深度集成
- 同时支持.NET和Python
Agent Framework的核心优势
- 原生多智能体支持:无需手动管理智能体间的通信,框架自动处理消息路由
- 声明式工作流:通过AgentWorkflowBuilder构建复杂协作场景
- 内置编排模式:
- Handoff模式:智能体通过function calling实现控制权转移
- GroupChat模式:通过GroupChatManager选择下一个发言智能体(支持RoundRobin、Prompt-based等策略)
- 状态管理:支持checkpoint存储,可恢复中断的工作流
大模型基础知识科普
在使用框架之前,我们需要理解大模型的工作原理。很多开发者对大模型有神秘感,其实它本质上就是一个HTTP API调用。
LLM API的本质
让我们用curl演示一个最简单的OpenAI API调用:- curl https://api.openai.com/v1/chat/completions \
- -H "Content-Type: application/json" \
- -H "Authorization: Bearer YOUR_API_KEY" \
- -d '{
- "model": "gpt-4o-mini",
- "messages": [
- {
- "role": "user",
- "content": "你好,请介绍一下自己"
- }
- ]
- }'
复制代码 响应结果:- {
- "id": "chatcmpl-abc123",
- "object": "chat.completion",
- "created": 1677652288,
- "model": "gpt-4o-mini",
- "choices": [{
- "index": 0,
- "message": {
- "role": "assistant",
- "content": "你好!我是一个AI助手,可以回答问题、提供建议..."
- },
- "finish_reason": "stop"
- }]
- }
复制代码 关键点:
- LLM就是一个普通的HTTP接口
- 输入:对话历史(messages数组)
- 输出:AI生成的回复(content字段)
- 所有复杂的Agent功能都是框架基于这个简单API构建的
函数调用(Function Calling)
函数调用是让LLM能够操作外部工具的关键机制。
工作流程:
- 开发者定义可用的函数(工具)
- LLM根据用户意图决定调用哪个函数
- 框架执行函数并获取结果
- 将结果返回给LLM继续对话
示例 - 定义天气查询函数:- {
- "name": "get_weather",
- "description": "查询指定城市的天气信息",
- "parameters": {
- "type": "object",
- "properties": {
- "city": {
- "type": "string",
- "description": "城市名称,例如:北京"
- }
- },
- "required": ["city"]
- }
- }
复制代码 LLM的调用响应:- {
- "role": "assistant",
- "content": null,
- "function_call": {
- "name": "get_weather",
- "arguments": "{"city": "北京"}"
- }
- }
复制代码 重点理解:
- LLM不会直接执行函数,只是"建议"调用
- 框架负责解析并执行函数
- 执行结果需要再次发送给LLM才能生成最终回复
MCP(Model Context Protocol)
MCP是新兴的标准化协议,用于LLM与外部工具的通信。
MCP的优势:
- 标准化接口:不同工具遵循统一协议
- 动态工具发现:运行时加载工具
- 安全隔离:工具在独立进程运行
在我们的示例项目中,使用MCP集成了阿里云通义万相图片生成能力。
agent-groupchat项目解析
项目架构
项目采用.NET Aspire编排,前后端分离架构:- agent-groupchat/
- ├── AgentGroupChat.AppHost/ # Aspire编排入口
- │ └── Program.cs # 服务编排配置
- │
- ├── AgentGroupChat.AgentHost/ # 后端API服务(.NET 9)
- │ ├── Services/
- │ │ ├── AgentChatService.cs # 核心聊天服务
- │ │ ├── WorkflowManager.cs # 工作流管理
- │ │ ├── AgentRepository.cs # 智能体配置管理
- │ │ └── AgentGroupRepository.cs # 群组管理
- │ ├── Models/
- │ │ ├── AgentProfile.cs # 智能体模型
- │ │ └── AgentGroup.cs # 群组模型
- │ └── Program.cs # API端点
- │
- ├── AgentGroupChat.Web/ # Blazor WebAssembly前端
- │ ├── Components/
- │ │ ├── Pages/
- │ │ │ ├── Home.razor # 聊天主页面
- │ │ │ └── Admin.razor # 管理后台
- │ │ └── Layout/
- │ │ └── MainLayout.razor # 主布局
- │ ├── Services/
- │ │ └── AgentHostClient.cs # API客户端
- │ └── Program.cs # 前端入口
- │
- └── AgentGroupChat.ServiceDefaults/ # 共享服务配置
- └── Extensions.cs # OpenTelemetry/健康检查
复制代码 Aspire编排说明
什么是.NET Aspire?
.NET Aspire是微软推出的云原生应用编排框架,简化分布式应用的开发和部署:
- 服务发现:自动解析服务地址,前端无需硬编码API地址
- 统一启动:一个命令启动所有服务
- 可观测性:内置OpenTelemetry遥测数据收集
- Dashboard:实时查看服务状态、日志、指标
AppHost配置(AgentGroupChat.AppHost/Program.cs):- var builder = DistributedApplication.CreateBuilder(args);
- // 添加后端API服务
- var agentHost = builder.AddProject<Projects.AgentGroupChat_AgentHost>("agenthost");
- // 添加Blazor前端,引用后端服务
- builder.AddProject<Projects.AgentGroupChat_Web>("webfrontend")
- .WithExternalHttpEndpoints() // 暴露外部访问端口
- .WithReference(agentHost) // 注入agenthost服务发现信息
- .WaitFor(agentHost); // 等待后端启动完成
- builder.Build().Run();
复制代码 服务发现原理:
前端通过Aspire自动获取后端地址(Program.cs):- // Web项目的Program.cs
- var agentHostUrl = builder.Configuration["AgentHostUrl"] ?? "https://localhost:7390";
- builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(agentHostUrl) });
复制代码 Aspire会自动将agenthost服务的实际地址注入到配置中。
智能体定义
项目创建了6个性格各异的AI美女角色,组成"AI世界公馆":
艾莲 (Elena)
[code]new PersistedAgentProfile{ Id = "elena", Name = "艾莲", Avatar = "
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |