当前位置: 首页 > news >正文

.NET+AI | Agent | 中间件执行次序剖析(12)


MAF 中间件执行顺序:深入理解洋葱模型

一句话简介

MAF 中间件遵循"洋葱模型"执行,请求从外向内,响应从内向外,正确理解执行顺序是构建企业级 Agent 的关键。


🎯 核心价值

  • 洋葱模型:请求依次经过外层→内层,响应按相反顺序返回

  • 三层触发频率:Agent Run 1次、ChatClient N次、Function M次

  • 精确时序:通过时间戳追踪完整执行链路


📝 执行顺序详解

触发次数对比

中间件层

触发时机

单次 Agent 调用触发次数

Agent RunRunAsync()1 次
ChatClient

每次 LLM 调用

2-N 次

(工具调用会增加)

Function

每次工具调用

0-M 次

(取决于工具数量)


💻 时序验证示例

带时间戳的中间件

var startTime = DateTime.UtcNow; double GetTimestamp() => (DateTime.UtcNow - startTime).TotalMilliseconds; // Agent Run 中间件 .Use(async (messages, thread, options, inner, ct) => { Console.WriteLine($"[T+{GetTimestamp():F0}ms] 🛡️ Agent Run Pre"); var response = await inner.RunAsync(messages, thread, options, ct); Console.WriteLine($"[T+{GetTimestamp():F0}ms] 🛡️ Agent Run Post"); return response; }, null)

典型输出

[T+0ms] 🛡️ Agent Run Pre [T+50ms] 📊 ChatClient Pre (第1次) [T+1200ms] 📊 ChatClient Post (第1次) [T+1210ms] 🔧 Function Pre: GetWeather [T+1320ms] 🔧 Function Post: GetWeather [T+1330ms] 📊 ChatClient Pre (第2次) [T+2500ms] 📊 ChatClient Post (第2次) [T+2510ms] 🛡️ Agent Run Post

📊 触发次数统计

场景:调用 2 个工具

Agent Run 中间件: 1 次 ChatClient 中间件: 2 次(初始调用 + 工具结果后调用) Function 中间件: 2 次(每个工具各 1 次)

计数器验证代码

var agentRunCount = 0; var chatClientCount = 0; var functionCount = 0; // 统计后输出 Console.WriteLine($"Agent Run: {agentRunCount} 次"); Console.WriteLine($"ChatClient: {chatClientCount} 次"); Console.WriteLine($"Function: {functionCount} 次");

🏢 企业级最佳实践

中间件注册顺序

注册顺序

执行顺序

推荐中间件

1️⃣ 最先注册

最外层

日志、监控

2️⃣ 中间注册

中间层

安全、限流

3️⃣ 最后注册

最内层

缓存、重试

注册顺序示例

var agent = chatClient.CreateAIAgent(...) .AsBuilder() .Use(LoggingMiddleware) // 最先注册 → 最外层 .Use(SecurityMiddleware) // 中间注册 → 中间层 .Use(CachingMiddleware) // 最后注册 → 最内层 .Build();

执行顺序:

请求 → Logging → Security → Caching → AI模型 响应 ← Logging ← Security ← Caching ←

🎯 总结

  • 洋葱模型:请求从外向内穿透,响应从内向外返回

  • 触发频率:Agent Run 1次,ChatClient/Function 多次

  • 注册顺序:先注册 = 更外层 = 先执行 Pre、后执行 Post

  • 实践建议:日志最外层,缓存最内层


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

http://www.rkmt.cn/news/128720.html

相关文章:

  • Linly-Talker在老年陪伴机器人中的情感交互尝试
  • 42、项目管理中的关键分析与资源整合
  • Linly-Talker支持姿态微调,提升动作自然度
  • Linly-Talker与RVC结合:实现更真实的歌声克隆数字人
  • 21、网络管理脚本实用指南
  • 39、掌握 Microsoft Project 2003 视图格式化与项目定制
  • 22、网络、服务器与安全管理任务全解析
  • 45、项目管理进阶:跨项目依赖与企业级项目管理
  • 零基础也能做数字人?Linly-Talker开源镜像全面开放
  • 23、证书服务安全管理任务全解析
  • 数字人制作成本直降90%?Linly-Talker带来革命性变化
  • 15、Windows 计算机管理与磁盘文件管理脚本详解
  • 48、掌握 Microsoft Project 2003 :项目管理全流程指南
  • 16、磁盘与文件管理脚本实用指南
  • Linly-Talker + LangChain:构建具备记忆的智能数字人助理
  • “用自己服务器也要向GitHub交钱?”微软新规引开发者众怒,官方紧急喊停!
  • 智能家居控制系统Java实现
  • 通信系统仿真:无线通信系统仿真_(17).无线通信系统的优化设计
  • Linly-Talker能否支持眼球追踪联动?视线交互功能研发进展
  • DPJ-140 基于单片机基于Arduino控制器的语音模块数据传输系统设计(源代码+proteus仿真)
  • Linly-Talker安全性评估:数据隐私与模型合规性说明
  • 重工业、轻工业和复杂装备行业的设备维护策略制定:目标、策略、实施框架和工具等的差异
  • 华为SR-MPLS TE跨域(E2E)配置案例
  • 行星齿轮非线性程序:相图、庞加莱与分叉图
  • 医疗健康领域应用:Linly-Talker构建智能导诊数字人
  • 智慧城市之城市环境智能监管 非法倾倒行为自动识别 环保执法证据采 垃圾倾倒倾倒物品类型识别数据据 垃圾堆识别数据集 公路垃圾识别10315期
  • 无需动捕设备!Linly-Talker通过语音驱动面部动画
  • 从GitHub到生产环境:Linly-Talker容器化部署最佳实践
  • Linly-Talker语音识别模块(ASR)精准度实测分析
  • Linly-Talker数字人系统:一张照片生成会说话的AI虚拟主播