敖雨燕 发表于 2025-10-28 23:50:02

.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 = "
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

士沌 发表于 2025-11-12 10:03:21

感谢分享,学习下。

那虻 发表于 前天 22:39

这个好,看起来很实用
页: [1]
查看完整版本: .NET开发上手Microsoft Agent Framework(一)从开发一个AI美女聊天群组开始