MAF 与 MEAI 工具调用中间件集成
一句话简介
MEAI 的 UseFunctionInvocation 与 MAF 的 Function Middleware 是嵌套协作关系,前者负责自动化循环,后者负责业务控制。
🎯 核心价值
-
✅ 嵌套协作:UseFunctionInvocation 在外层,MAF Middleware 在内层 -
✅ 职责分离:MEAI 管自动化,MAF 管业务逻辑 -
✅ 触发次数相等:FunctionInvoker 和 MAF Middleware 触发次数相同
📝 四层调用架构
各层职责对比
|
|
|
|
|
|---|---|---|---|
| UseFunctionInvocation |
|
|
|
| MEAI FunctionInvoker |
|
|
|
| MAF Function Middleware |
|
|
|
💻 执行链路
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);
})
使用场景选择
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
🎯 总结
-
✅ 嵌套关系:UseFunctionInvocation → FunctionInvoker → MAF Middleware → 工具 -
✅ 触发次数:FunctionInvoker 触发次数 == MAF Middleware 触发次数 -
✅ 职责分离:MEAI 负责自动化,MAF 负责业务逻辑 -
✅ 最佳实践:不要在两层做重复的事,统一在 MAF 层处理
如需获取文章配套完整代码,可扫码咨询领取。👇

