基于 AutoGen 多智能体框架的 AI 智能客服系统
基于 AutoGen 多智能体框架的 AI 智能客服系统,使用 ASP.NET Core 8.0 Web API,后端调用阿里云通义千问(qwen-plus)大模型。
二、技术栈
| 组件 | 技术 |
|---|---|
| 框架 | ASP.NET Core 8.0 Web API |
| AI 框架 | AutoGen 0.2.3 + AutoGen.OpenAI |
| 大模型 | 阿里云 DashScope(qwen-plus,OpenAI 兼容模式) |
| 认证 | JWT Bearer Token |
| 韧性 | Polly(重试 + 熔断 + 超时) |
| 限流 | System.Threading.RateLimiting(令牌桶) |
三、核心架构 — Coordinator-Branch 路由模式
用户请求 → ChatController → Coordinator Agent(意图识别 + 路由)
↓
RouteToBranch() 函数调用
↓
┌───────┬───────┼───────┬───────┐
↓ ↓ ↓ ↓ ↓
订单查询 充值业务 充电宝 通用问答 帮助
Coordinator(协调者):分析用户意图,通过 RouteToBranch Function Calling 决定路由到哪个分支 Agent,输出受 JSON Schema 严格约束。
5 个分支 Agent:
| Agent Code | 职责 | Function Calling |
|---|---|---|
| 订单查询 | 订单状态/支付/退款 | GetOrders, GetOrderDetail, GetRefundRecords |
| 充值业务 | 余额/充值记录/时间卡 | GetBalance, GetRechargeRecords, GetTimeCardStatus |
| 充电宝业务 | 租借/归还/计费 | GetRentRecords, GetCurrentRent, GetBillingDetail |
| 通用问答 | FAQ/使用指南 | 无 |
| 帮助 | 打招呼/能力概览 | 无 |
四、中间件管道(10 层,由内到外)
Branch Agent 中间件链: ① FunctionCall(工具注册) ② Polly 重试/熔断/超时(3次重试,指数退避,连续5次失败熔断30s,30s超时) ③ 工具级限流(每 Session 独立令牌桶,5 token/桶,每秒补充2个) ④ 时间戳(记录响应耗时) ⑤ Token 统计(估算输入/输出 Token) ⑥ 日志(Agent 名称 + 消息数 + 耗时) ⑦ JWT 鉴权(实时读取 HttpContext 用户身份,注入为 SystemMessage) ⑧ Prompt 注入防护(正则 + 关键词检测,13 种攻击模式) 全局中间件: ⑨ 并发控制(SemaphoreSlim,最多5个并发请求)
五、关键设计
- 会话隔离:每 Session 独立 Agent 实例(名称含 sessionId)+ 独立限流器
- 会话存储:
InMemorySessionStore,ConcurrentDictionary实现,限制历史最多 10 条消息,支持过期清理 - 反射注册工具:
FunctionHelper.CreateMiddleware()自动扫描[Function]特性方法,支持任意返回类型 - JSON Schema 约束:Coordinator 输出强制走
RouteToBranch函数,next_agent只能从枚举值中选 - Few-Shot 自动生成:从
AgentConfigs.All的Examples自动生成示例 prompt
六、当前状态
- 业务工具全是 TODO:
OrderTool、RechargeTool、PowerBankTool的方法体都只返回占位字符串,没有对接实际业务 API - Services 文件夹被排除编译(
<Compile Remove="Services\**" />),里面有AgentService.cs和IAgentService.cs但没参与构建 - 没有引用任何业务项目:不依赖 AliyunHelper、CoreDbContext、swapService 等,是一个完全独立的 Web API
七、文件清单
swapAgent/ ├── Program.cs # 入口:DI + 中间件管道 ├── appsettings.json # LLM 配置(DashScope qwen-plus)+ JWT 配置 ├── Controllers/ │ ├── AuthController.cs # 测试用 JWT Token 生成接口 │ └── ChatController.cs # 聊天接口(POST /api/chat/chat) ├── Agents/ │ ├── CoordinatorAgentFactory.cs # 协调者工厂(JSON Schema + SystemMessage) │ ├── BranchAgentFactory.cs # 分支工厂(10层中间件链) │ └── UserAgentFactory.cs # 会话存储 + UserProxyAgent ├── Models/ │ ├── AgentConfig.cs # 5个Agent配置(SystemMessage + Few-Shot示例) │ └── ChatModels.cs # ChatRequest / ChatResponse ├── Middleware/ │ ├── AuthMiddleware.cs # JWT 鉴权(Agent层) │ ├── ConcurrencyController.cs # 全局并发控制(5并发) │ ├── LoggingMiddleware.cs # 日志 + 时间戳 + Token统计 │ ├── PollyMiddleware.cs # 重试/熔断/超时 │ ├── PromptInjectionMiddleware.cs # Prompt注入防护 │ └── RateLimitingService.cs # 令牌桶限流 ├── Tools/ │ └── BusinessTools.cs # 业务工具(全是TODO占位) └── Utils/ ├── FunctionHelper.cs # 反射注册Function Calling └── JsonSchemaGenerator.cs # JSON Schema + Few-Shot生成
技术栈与依赖
| 层面 | 技术 |
|---|---|
| 框架 | .NET 8.0 / ASP.NET Core Web API |
| AI 框架 | AutoGen 0.2.3 + AutoGen.OpenAI 0.2.3 |
| LLM | 阿里云 DashScope(qwen-plus 模型,OpenAI 兼容接口) |
| 认证 | JWT Bearer Token(Microsoft.AspNetCore.Authentication.JwtBearer) |
| 弹性/容错 | Polly 8.4(重试 + 熔断 + 超时) |
| 限流 | System.Threading.RateLimiting(Token Bucket) |
| 文档 | Swashbuckle(Swagger) |
关键类职责详解
1. Program.cs — 应用入口
- 配置 JWT 认证(从
appsettings.json读取) - 注册 DI 服务:
ChatClient(单例)、RateLimitingService、InMemorySessionStore、两个 Agent Factory - 构建中间件管道:Swagger → ConcurrencyControl → Authentication → Authorization → Controllers
2. CoordinatorAgentFactory — 协调者工厂
- 创建意图路由 Agent,使用 JSON Schema 结构化输出强制 LLM 输出
{next_agent, reason} - SystemMessage 包含所有分支 Agent 的描述 + Few-Shot 示例(自动从
AgentConfigs生成) - 中间件链:
FunctionCall(RouteToBranch) → 日志 → 鉴权 → Prompt注入防护 - 无状态,可复用单例
3. BranchAgentFactory — 分支 Agent 工厂
- 根据
code参数创建不同业务 Agent,每个绑定对应的 Tool(Function Calling) - 会话隔离:Agent 名称包含 sessionId,每 Session 独立限流器
- 中间件链(10层,由内到外):
FunctionCall → Polly重试 → 限流 → 时间戳 → Token统计 → 日志 → 鉴权 → Prompt注入防护
4. UserAgentFactory + InMemorySessionStore — 会话管理
InMemorySessionStore:基于ConcurrentDictionary的内存会话存储,限制历史最多 10 条,支持过期清理UserAgentFactory:创建UserProxyAgent(AutoGen 内置,humanInputMode=NEVER表示自动回复)
5. ChatController — 聊天端点
POST /api/chat/chat,需要 JWT 认证- 流程:读历史 → 追加用户消息 → 创建 Coordinator + Branch Agent → 调用
GenerateReplyAsync→ 保存响应 → 返回
6. BusinessTools.cs — Function Calling 工具
OrderTool:GetOrders / GetOrderDetail / GetRefundRecordsRechargeTool:GetBalance / GetRechargeRecords / GetTimeCardStatusPowerBankTool:GetRentRecords / GetCurrentRent / GetBillingDetailCoordinatorTool:RouteToBranch(路由决策函数)- 所有 Tool 方法均为 TODO 桩实现,尚未对接真实业务 API
7. FunctionHelper — 反射注册器
- 通过反射扫描工具类上
[Function]特性标注的方法 - 自动构建
FunctionContract(参数描述来自[Description]) - 自动创建
functionMap(JSON 参数反序列化 + 方法调用 + 结果序列化)
8. 中间件层(6 个独立关注点)
| 中间件 | 职责 |
|---|---|
ConcurrencyMiddleware |
全局 SemaphoreSlim(5,5),限制最多 5 个并发请求 |
AuthMiddleware |
从 HttpContext 读取 JWT 用户身份,注入为 SystemMessage 让 LLM 感知 |
PollyMiddleware |
指数退避重试(3次) + 熔断(5次/30s) + 超时(30s) |
RateLimitingService |
每 Session 独立 TokenBucket(5 token, 2/秒补充) |
LoggingMiddleware |
响应耗时 + 消息数 + Token 估算统计 |
PromptInjectionMiddleware |
正则+关键词检测注入攻击,支持 Block/Sanitize/LogOnly 三种模式 |
核心代码
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using OpenAI; using swapAgent.Agents; using swapAgent.Middleware; using swapAgent.Models; using System.ClientModel; using System.Text; namespace swapAgent { public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // ── JWT 认证配置 ────────────────────────────────────────── var jwtOptions = builder.Configuration.GetSection("Jwt").Get<JwtOptions>() ?? new JwtOptions(); builder.Services.Configure<JwtOptions>(builder.Configuration.GetSection("Jwt")); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = jwtOptions.Issuer, ValidAudience = jwtOptions.Audience, IssuerSigningKey = new SymmetricSecurityKey( Encoding.UTF8.GetBytes(jwtOptions.Secret)) }; }); builder.Services.AddAuthorization(); // IHttpContextAccessor(Singleton,供 Agent 层鉴权中间件实时读取当前用户) builder.Services.AddHttpContextAccessor(); // ── 业务注册 ────────────────────────────────────────────── builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { // Swagger 加 Bearer Token 输入框 c.AddSecurityDefinition("Bearer", new Microsoft.OpenApi.Models.OpenApiSecurityScheme { Name = "Authorization", Type = Microsoft.OpenApi.Models.SecuritySchemeType.Http, Scheme = "Bearer", BearerFormat = "JWT", In = Microsoft.OpenApi.Models.ParameterLocation.Header, Description = "输入 JWT Token,格式:Bearer {token}" }); c.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement { { new Microsoft.OpenApi.Models.OpenApiSecurityScheme { Reference = new Microsoft.OpenApi.Models.OpenApiReference { Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme, Id = "Bearer" } }, Array.Empty<string>() } }); }); // ─ LLM 配置 ────────────────────────────────────────────── builder.Services.Configure<LlmOptions>( builder.Configuration.GetSection("LLM")); // ── ① 注册 OpenAI ChatClient(单例)──────────────────────── var llmOptions = builder.Configuration.GetSection("LLM").Get<LlmOptions>() ?? new LlmOptions(); var openAIClient = new OpenAIClient( new ApiKeyCredential(llmOptions.ApiKey), new OpenAIClientOptions { Endpoint = new Uri(llmOptions.Endpoint) }); builder.Services.AddSingleton(_ => openAIClient.GetChatClient(llmOptions.ModelId)); // ── ② 注册限流服务(单例)───────────────────────────────── builder.Services.AddSingleton<RateLimitingService>(); // ── ③ 注册会话存储(单例)───────────────────────────────── builder.Services.AddSingleton<ISessionStore, InMemorySessionStore>(); // ── ④ 注册 Agent Factory(单例)─────────────────────────── // ✅ Factory 单例,但 CreateXxx() 每次返回新 Agent 实例 builder.Services.AddSingleton<CoordinatorAgentFactory>(); builder.Services.AddSingleton<BranchAgentFactory>(); // ── ⑤ 注册业务服务(根据实际需要添加)────────────────────── // builder.Services.AddSingleton<OrderService>(); // builder.Services.AddScoped<IAuthService, AuthService>(); var app = builder.Build(); // ── 中间件管道 ───────────────────────────────────────────── if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); // ✅ 添加并发控制中间件(在认证授权之后,Controller 之前) // 中间件本身是单例的(ASP.NET Core 中间件默认单例) app.UseConcurrencyControl(); // 认证 → 授权(顺序不能颠倒) app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run(); } } }

浙公网安备 33010602011771号