基于 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个并发请求)

五、关键设计

  1. 会话隔离:每 Session 独立 Agent 实例(名称含 sessionId)+ 独立限流器
  2. 会话存储:InMemorySessionStore,ConcurrentDictionary 实现,限制历史最多 10 条消息,支持过期清理
  3. 反射注册工具:FunctionHelper.CreateMiddleware() 自动扫描 [Function] 特性方法,支持任意返回类型
  4. JSON Schema 约束:Coordinator 输出强制走 RouteToBranch 函数,next_agent 只能从枚举值中选
  5. 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 / GetRefundRecords
  • RechargeTool:GetBalance / GetRechargeRecords / GetTimeCardStatus
  • PowerBankTool:GetRentRecords / GetCurrentRent / GetBillingDetail
  • CoordinatorTool: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();
        }
    }
}

源码地址:留言奉上

posted @ 2026-08-31 13:46  天才卧龙  阅读(23)  评论(0)    收藏  举报