大数跨境
0
0

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

.NET+AI | Agent | 工具调用中间件对比(13) dotNET跨平台
2025-12-21
4
导读:MAF 与 MEAI 工具调用中间件集成一句话简介MEAI 的 UseFunctionInvocation

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 层处理

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


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