| 前言 
 在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(研究导向)
 
 Semantic Kernel(应用导向)
 最早期的多智能体研究框架
侧重学术研究和实验性功能
Python为主,生态相对独立
 
 Microsoft Agent Framework(企业导向)
 面向生产环境的AI应用开发框架
强大的插件系统和内存管理
多语言支持(C#、Python、Java)
适合单一智能体应用
 
 Agent Framework的核心优势
 专为多智能体协作设计
内置工作流编排能力(Sequential、Concurrent、Handoff、GroupChat)
支持Handoff转移模式和GroupChat管理模式
与Azure AI Foundry深度集成
同时支持.NET和Python
 
 
 大模型基础知识科普
 原生多智能体支持:无需手动管理智能体间的通信,框架自动处理消息路由
声明式工作流:通过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"  }]}
 函数调用(Function Calling)
 LLM就是一个普通的HTTP接口
输入:对话历史(messages数组)
输出:AI生成的回复(content字段)
所有复杂的Agent功能都是框架基于这个简单API构建的
 
 函数调用是让LLM能够操作外部工具的关键机制。
 工作流程:
 
 示例 - 定义天气查询函数:
 开发者定义可用的函数(工具)
LLM根据用户意图决定调用哪个函数
框架执行函数并获取结果
将结果返回给LLM继续对话
 LLM的调用响应:复制代码{  "name": "get_weather",  "description": "查询指定城市的天气信息",  "parameters": {    "type": "object",    "properties": {      "city": {        "type": "string",        "description": "城市名称,例如:北京"      }    },    "required": ["city"]  }}
重点理解:复制代码{  "role": "assistant",  "content": null,  "function_call": {    "name": "get_weather",    "arguments": "{"city": "北京"}"  }}
 MCP(Model Context Protocol)
 LLM不会直接执行函数,只是"建议"调用
框架负责解析并执行函数
执行结果需要再次发送给LLM才能生成最终回复
 
 MCP是新兴的标准化协议,用于LLM与外部工具的通信。
 MCP的优势:
 
 在我们的示例项目中,使用MCP集成了阿里云通义万相图片生成能力。
 标准化接口:不同工具遵循统一协议
动态工具发现:运行时加载工具
安全隔离:工具在独立进程运行
 agent-groupchat项目解析
 
 项目架构
 
 项目采用.NET Aspire编排,前后端分离架构:
 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/健康检查
 什么是.NET Aspire?
 .NET Aspire是微软推出的云原生应用编排框架,简化分布式应用的开发和部署:
 
 AppHost配置(AgentGroupChat.AppHost/Program.cs):
 服务发现:自动解析服务地址,前端无需硬编码API地址
统一启动:一个命令启动所有服务
可观测性:内置OpenTelemetry遥测数据收集
Dashboard:实时查看服务状态、日志、指标
 服务发现原理:复制代码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):
 Aspire会自动将agenthost服务的实际地址注入到配置中。复制代码// Web项目的Program.csvar agentHostUrl = builder.Configuration["AgentHostUrl"] ?? "https://localhost:7390";builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(agentHostUrl) });
智能体定义
 
 项目创建了6个性格各异的AI美女角色,组成"AI世界公馆":
 艾莲 (Elena)
 [code]new PersistedAgentProfile{    Id = "elena",    Name = "艾莲",    Avatar = "
 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
 |