大数跨境
0
0

.NET+AI | Agent | 自定义中间件(11)

.NET+AI | Agent | 自定义中间件(11) dotNET跨平台
2025-12-18
4
导读:MAF 中间件管道架构:企业级 Agent 的三层拦截体系一句话简介MAF 提供三层中间件架构,分别拦截 C

MAF 中间件管道架构:企业级 Agent 的三层拦截体系

一句话简介

MAF 提供三层中间件架构,分别拦截 ChatClient 调用、Agent 运行和工具调用,实现日志、限流、权限等企业级横切关注点。

🎯 核心价值

  • ✅ 三层拦截:ChatClient 层、Agent Run 层、Function Invocation 层
  • ✅ 职责分离:每层处理不同粒度的横切关注点
  • ✅ 灵活组合:可独立或组合使用,按需配置

📝 三层中间件架构

各层职责对比

层级
拦截时机
典型用途
触发频率
Agent Run RunAsync()
 调用
PII 过滤、Guardrails
每次 Agent 调用 1 次
ChatClient
LLM 调用
Token 统计、限流、缓存
每次 LLM 调用(可能多次)
Function
工具执行
日志、权限检查、Mock
每次工具调用

💻 实现方式

1. ChatClient 中间件

使用 MEAI 的 DelegatingChatClient 或 Use() 方法:

var chatClient = AIClientHelper.GetDefaultChatClient()
    .AsBuilder()
    .Use(getResponseFunc: async (messages, options, innerClient, ct) =>
    {
        Console.WriteLine($"📊 [ChatClient] 请求消息数: {messages.Count()}");
        var response = await innerClient.GetResponseAsync(messages, options, ct);
        Console.WriteLine($"📊 [ChatClient] Token: {response.Usage?.TotalTokenCount}");
        return response;
    })
    .Build();

核心要点:

  • 🔧 拦截每次 LLM 调用
  • 🔧 可访问完整的请求和响应
  • 🔧 适用于监控、限流、缓存等场景

2. Agent Run 中间件

使用 AgentBuilder.Use() 添加:

var agent = chatClient.CreateAIAgent(instructions: "你是智能助手")
    .AsBuilder()
    .Use(async (messages, thread, options, innerAgent, ct) =>
    {
        Console.WriteLine($"🛡️ [Agent Run] Pre-Run 检查");
        var response = await innerAgent.RunAsync(messages, thread, options, ct);
        Console.WriteLine($"🛡️ [Agent Run] Post-Run 完成");
        return response;
    }, null)
    .Build();

核心要点:

  • 🛡️ 包裹整个 Agent 执行流程
  • 🛡️ 适用于安全检查、审计日志
  • 🛡️ 每次 RunAsync() 只触发一次

3. Function Invocation 中间件

拦截工具函数的执行:

var agent = chatClient.CreateAIAgent(...)
    .AsBuilder()
    .Use(async (agent, context, next, ct) =>
    {
        Console.WriteLine($"🔧 [Function] 调用: {context.Function.Name}");
        var result = await next(context, ct);
        Console.WriteLine($"🔧 [Function] 结果: {result}");
        return result;
    })
    .Build();

核心要点:

  • 🔧 拦截每个工具函数调用
  • 🔧 可修改参数或覆盖结果
  • 🔧 适用于权限检查、Mock 数据

🏢 企业级最佳实践

推荐的中间件组合

// 1️⃣ ChatClient 层:监控和性能
var chatClient = baseChatClient.AsBuilder()
    .Use(new TokenMonitoringMiddleware())
    .Use(new RateLimitingMiddleware())
    .Build();

// 2️⃣ Agent 层:安全和审计
var agent = chatClient.CreateAIAgent(...)
    .AsBuilder()
    .Use(PIIFilterMiddleware, null)      // PII 过滤
    .Use(GuardrailsMiddleware, null)     // 内容安全
    .Use(FunctionLoggingMiddleware)      // 工具日志
    .Build();

各层职责建议

层级
推荐用途
ChatClient
Token 统计、限流、缓存、重试
Agent Run
PII 过滤、Guardrails、全局审计
Function
权限检查、调用日志、Mock 数据

🎯 总结

  • ✅ 三层架构:ChatClient、Agent Run、Function Invocation 各司其职
  • ✅ 洋葱模型:请求从外向内,响应从内向外
  • ✅ 灵活组合:根据需求选择合适的中间件层级
  • ✅ 企业级应用:安全检查最外层,性能优化靠内层

如需获取文章配套完整代码,可扫码咨询领取。👇


【声明】内容源于网络
0
0
dotNET跨平台
专注于.NET Core的技术传播。在这里你可以谈微软.NET,Mono的跨平台开发技术。在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,
内容 914
粉丝 0
dotNET跨平台 专注于.NET Core的技术传播。在这里你可以谈微软.NET,Mono的跨平台开发技术。在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,
总阅读15.0k
粉丝0
内容914