.NET开发上手Microsoft Agent Framework(一)从开发一个AI美女聊天群组开始
前言在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)
new PersistedAgentProfile{ Id = "elena", Name = "艾莲", Avatar = "
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 感谢分享,学习下。 这个好,看起来很实用
页:
[1]