news 2026/7/18 18:49:05

.NET+AI | Agent | 工具调用中间件对比(13)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
.NET+AI | Agent | 工具调用中间件对比(13)

MAF 与 MEAI 工具调用中间件集成

一句话简介

MEAI 的 UseFunctionInvocation 与 MAF 的 Function Middleware 是嵌套协作关系,前者负责自动化循环,后者负责业务控制。


🎯 核心价值

  • 嵌套协作:UseFunctionInvocation 在外层,MAF Middleware 在内层

  • 职责分离:MEAI 管自动化,MAF 管业务逻辑

  • 触发次数相等:FunctionInvoker 和 MAF Middleware 触发次数相同


📝 四层调用架构

各层职责对比

层级

位置

职责

典型用途

UseFunctionInvocation

ChatClient 层

自动化循环管理

迭代控制、并发调用

MEAI FunctionInvoker

ChatClient 内部

自定义调用前后逻辑

监控、预处理

MAF Function Middleware

Agent 层

业务逻辑控制

日志、权限、Mock


💻 执行链路

1. LLM 返回需要调用工具 GetWeather ↓ 2. 🔄 UseFunctionInvocation 检测到 FunctionCallContent ↓ 3. 📝 调用 FunctionInvoker(如果配置了) ↓ 4. 📝 FunctionInvoker 调用 context.Function.InvokeAsync() ↓ 5. 🔧 触发 MAF Function Middleware Pre-Invoke ↓ 6. ⚙️ 执行实际工具函数 GetWeather("北京") ↓ 7. 🔧 触发 MAF Function Middleware Post-Invoke ↓ 8. 📝 返回给 FunctionInvoker ↓ 9. 🔄 UseFunctionInvocation 将结果回传给 LLM

💻 配置示例

完整配置

// 1️⃣ ChatClient 层配置 var chatClient = baseChatClient .AsBuilder() .UseFunctionInvocation(configure: options => { options.AllowConcurrentInvocation = true; // 并发调用 options.MaximumIterationsPerRequest = 10; // 迭代控制 // 可选:自定义 FunctionInvoker options.FunctionInvoker = async (context, ct) => { Console.WriteLine($"📝 MEAI: 调用 {context.Function.Name}"); returnawait context.Function.InvokeAsync(context.Arguments, ct); }; }) .Build(); // 2️⃣ Agent 层配置 var agent = chatClient.CreateAIAgent(...) .AsBuilder() .Use(async (agent, context, next, ct) => { Console.WriteLine($"🔧 MAF: 调用 {context.Function.Name}"); returnawait next(context, ct); }) .Build();

🏢 最佳实践

职责分离原则

// ✅ 推荐:清晰的职责分离 .UseFunctionInvocation(configure: options => { // MEAI 层:只负责自动化控制 options.AllowConcurrentInvocation = true; options.MaximumIterationsPerRequest = 10; // 不配置 FunctionInvoker,让 MAF 层统一处理 }) .Use(async (agent, context, next, ct) => { // MAF 层:统一的企业级控制 ValidatePermission(context.Function.Name); // 权限检查 LogFunctionCall(context); // 审计日志 returnawait next(context, ct); })

避免重复拦截

// ❌ 避免:在两个地方做相同的事 .UseFunctionInvocation(options => { options.FunctionInvoker = async (ctx, ct) => { Console.WriteLine("MEAI: 日志记录"); // 重复! returnawait ctx.Function.InvokeAsync(...); }; }) .Use(async (agent, ctx, next, ct) => { Console.WriteLine("MAF: 日志记录"); // 重复! returnawait next(ctx, ct); })

使用场景选择

场景

推荐配置

简单 Agent

不使用 UseFunctionInvocation

需要并发调用

使用 UseFunctionInvocation

企业级控制

使用 MAF Function Middleware

两者结合

MEAI 自动化 + MAF 业务控制


🎯 总结

  • 嵌套关系:UseFunctionInvocation → FunctionInvoker → MAF Middleware → 工具

  • 触发次数:FunctionInvoker 触发次数 == MAF Middleware 触发次数

  • 职责分离:MEAI 负责自动化,MAF 负责业务逻辑

  • 最佳实践:不要在两层做重复的事,统一在 MAF 层处理


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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 9:35:53

Excalidraw自动伸缩部署:Kubernetes集群实践

Excalidraw自动伸缩部署:Kubernetes集群实践 在远程协作日益成为常态的今天,团队对高效、直观的可视化工具需求急剧上升。Excalidraw作为一款开源手绘风格白板工具,凭借其极简设计和强大的实时协作能力,迅速在技术架构图绘制、产品…

作者头像 李华
网站建设 2026/7/18 22:27:04

Excalidraw CDN加速部署方案:全球访问提速

Excalidraw CDN加速部署方案:全球访问提速 在跨国团队协作日益频繁的今天,一个看似微小的技术细节——前端资源加载速度,往往成为决定产品体验生死的关键。设想一下:欧洲的产品经理正准备与印度的开发团队进行一场关键架构评审&a…

作者头像 李华
网站建设 2026/7/18 22:27:38

Excalidraw源码阅读笔记:核心模块架构剖析

Excalidraw源码阅读笔记:核心模块架构剖析 在远程协作成为常态的今天,一个简单却高效的可视化工具往往能决定一场头脑风暴的成败。我们见过太多功能臃肿、操作复杂的绘图软件——它们擅长制作“完美”的图表,却在快速表达想法时显得笨拙不堪。…

作者头像 李华
网站建设 2026/7/18 8:08:39

打印机驱动安装全攻略:从准备到验证一步到位

在日常办公和家庭使用中,打印机驱动安装不当常常导致设备无法正常工作,轻则打印卡顿,重则直接提示“驱动未安装”或“设备无法识别”。其实,只要掌握正确的流程和技巧,打印机驱动安装就能高效完成。本文将结合不同操作…

作者头像 李华
网站建设 2026/7/18 7:41:46

官网-职工带薪年休假条例

官网:职工带薪年休假条例(国务院令第514号)_中华人民共和国中央人民政府门户网站 第一条 为了维护职工休息休假权利,调动职工工作积极性,根据劳动法和公务员法,制定本条例。 第二条* 机关、团体、企业、事业单位、民办非企业单位、有雇工的个体工商户等单位的职工连续…

作者头像 李华
网站建设 2026/7/18 20:06:18

网络流24题 加强版 P4480 [BJWC2018] 餐巾计划问题

https://www.luogu.com.cn/problem/P1251 为弱化版。 我们发现建图非常简单。拆个点,随便模拟题意连即可。 但是!网络流太笨了。加强版 P4480 就必须要贪心了。 于是我一年前用 SSP 水过了加强版 P4480。 以下变量定义按照 https://www.luogu.com.cn/problem/P1251 来,因…

作者头像 李华