高功率厚膜电阻选型与应用实战:从核心挑战到FRP系列解决方案
2026/5/23 14:15:16
MAF 中间件遵循"洋葱模型"执行,请求从外向内,响应从内向外,正确理解执行顺序是构建企业级 Agent 的关键。
✅洋葱模型:请求依次经过外层→内层,响应按相反顺序返回
✅三层触发频率:Agent Run 1次、ChatClient N次、Function M次
✅精确时序:通过时间戳追踪完整执行链路
中间件层 | 触发时机 | 单次 Agent 调用触发次数 |
|---|---|---|
| Agent Run | RunAsync() | 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 PostAgent 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
✅实践建议:日志最外层,缓存最内层
如需获取文章配套完整代码,可扫码咨询领取。👇