大数跨境
0
0

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

.NET+AI | Agent | 中间件执行次序剖析(12) dotNET跨平台
2025-12-20
2
导读:MAF 中间件执行顺序:深入理解洋葱模型一句话简介MAF 中间件遵循"洋葱模型"执行,请求从外向内,响应从内


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

一句话简介

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 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
  • ✅ 实践建议:日志最外层,缓存最内层

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


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