找回密码
 立即注册
首页 业界区 业界 .NET开发上手Microsoft Agent Framework(一)从开发一 ...

.NET开发上手Microsoft Agent Framework(一)从开发一个AI美女聊天群组开始

敖雨燕 3 天前
前言

在AI快速发展的今天,微软推出了多个AI开发框架,从早期的AutoGen到Semantic Kernel,再到最新的Microsoft Agent Framework。很多开发者可能会有疑问:为什么微软要推出这么多框架?它们之间有什么区别?本文将通过一个实际的AI美女聊天群组项目,带你深入理解Microsoft Agent Framework,掌握多智能体开发的核心概念。
本文的示例代码已开源:agent-framework-tutorial-code/agent-groupchat
1.png


  • 视频演示
为什么微软要推出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调用:
  1. curl https://api.openai.com/v1/chat/completions \
  2.   -H "Content-Type: application/json" \
  3.   -H "Authorization: Bearer YOUR_API_KEY" \
  4.   -d '{
  5.     "model": "gpt-4o-mini",
  6.     "messages": [
  7.       {
  8.         "role": "user",
  9.         "content": "你好,请介绍一下自己"
  10.       }
  11.     ]
  12.   }'
复制代码
响应结果:
  1. {
  2.   "id": "chatcmpl-abc123",
  3.   "object": "chat.completion",
  4.   "created": 1677652288,
  5.   "model": "gpt-4o-mini",
  6.   "choices": [{
  7.     "index": 0,
  8.     "message": {
  9.       "role": "assistant",
  10.       "content": "你好!我是一个AI助手,可以回答问题、提供建议..."
  11.     },
  12.     "finish_reason": "stop"
  13.   }]
  14. }
复制代码
关键点

  • LLM就是一个普通的HTTP接口
  • 输入:对话历史(messages数组)
  • 输出:AI生成的回复(content字段)
  • 所有复杂的Agent功能都是框架基于这个简单API构建的
函数调用(Function Calling)

函数调用是让LLM能够操作外部工具的关键机制。
工作流程

  • 开发者定义可用的函数(工具)
  • LLM根据用户意图决定调用哪个函数
  • 框架执行函数并获取结果
  • 将结果返回给LLM继续对话
示例 - 定义天气查询函数:
  1. {
  2.   "name": "get_weather",
  3.   "description": "查询指定城市的天气信息",
  4.   "parameters": {
  5.     "type": "object",
  6.     "properties": {
  7.       "city": {
  8.         "type": "string",
  9.         "description": "城市名称,例如:北京"
  10.       }
  11.     },
  12.     "required": ["city"]
  13.   }
  14. }
复制代码
LLM的调用响应:
  1. {
  2.   "role": "assistant",
  3.   "content": null,
  4.   "function_call": {
  5.     "name": "get_weather",
  6.     "arguments": "{"city": "北京"}"
  7.   }
  8. }
复制代码
重点理解

  • LLM不会直接执行函数,只是"建议"调用
  • 框架负责解析并执行函数
  • 执行结果需要再次发送给LLM才能生成最终回复
MCP(Model Context Protocol)

MCP是新兴的标准化协议,用于LLM与外部工具的通信。
MCP的优势

  • 标准化接口:不同工具遵循统一协议
  • 动态工具发现:运行时加载工具
  • 安全隔离:工具在独立进程运行
在我们的示例项目中,使用MCP集成了阿里云通义万相图片生成能力。
agent-groupchat项目解析

项目架构

项目采用.NET Aspire编排,前后端分离架构:
  1. agent-groupchat/
  2. ├── AgentGroupChat.AppHost/         # Aspire编排入口
  3. │   └── Program.cs                  # 服务编排配置
  4. ├── AgentGroupChat.AgentHost/       # 后端API服务(.NET 9)
  5. │   ├── Services/
  6. │   │   ├── AgentChatService.cs     # 核心聊天服务
  7. │   │   ├── WorkflowManager.cs      # 工作流管理
  8. │   │   ├── AgentRepository.cs      # 智能体配置管理
  9. │   │   └── AgentGroupRepository.cs # 群组管理
  10. │   ├── Models/
  11. │   │   ├── AgentProfile.cs         # 智能体模型
  12. │   │   └── AgentGroup.cs           # 群组模型
  13. │   └── Program.cs                  # API端点
  14. ├── AgentGroupChat.Web/             # Blazor WebAssembly前端
  15. │   ├── Components/
  16. │   │   ├── Pages/
  17. │   │   │   ├── Home.razor          # 聊天主页面
  18. │   │   │   └── Admin.razor         # 管理后台
  19. │   │   └── Layout/
  20. │   │       └── MainLayout.razor    # 主布局
  21. │   ├── Services/
  22. │   │   └── AgentHostClient.cs      # API客户端
  23. │   └── Program.cs                  # 前端入口
  24. └── AgentGroupChat.ServiceDefaults/ # 共享服务配置
  25.     └── Extensions.cs               # OpenTelemetry/健康检查
复制代码
Aspire编排说明

什么是.NET Aspire?
.NET Aspire是微软推出的云原生应用编排框架,简化分布式应用的开发和部署:

  • 服务发现:自动解析服务地址,前端无需硬编码API地址
  • 统一启动:一个命令启动所有服务
  • 可观测性:内置OpenTelemetry遥测数据收集
  • Dashboard:实时查看服务状态、日志、指标
AppHost配置(AgentGroupChat.AppHost/Program.cs):
  1. var builder = DistributedApplication.CreateBuilder(args);
  2. // 添加后端API服务
  3. var agentHost = builder.AddProject<Projects.AgentGroupChat_AgentHost>("agenthost");
  4. // 添加Blazor前端,引用后端服务
  5. builder.AddProject<Projects.AgentGroupChat_Web>("webfrontend")
  6.     .WithExternalHttpEndpoints()  // 暴露外部访问端口
  7.     .WithReference(agentHost)      // 注入agenthost服务发现信息
  8.     .WaitFor(agentHost);           // 等待后端启动完成
  9. builder.Build().Run();
复制代码
服务发现原理
前端通过Aspire自动获取后端地址(Program.cs):
  1. // Web项目的Program.cs
  2. var agentHostUrl = builder.Configuration["AgentHostUrl"] ?? "https://localhost:7390";
  3. builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(agentHostUrl) });
复制代码
Aspire会自动将agenthost服务的实际地址注入到配置中。
智能体定义

项目创建了6个性格各异的AI美女角色,组成"AI世界公馆":
艾莲 (Elena)
[code]new PersistedAgentProfile{    Id = "elena",    Name = "艾莲",    Avatar = "
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册