news 2026/4/18 0:57:22

使用Microsoft Agent Framework构建可组合的多Agent系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用Microsoft Agent Framework构建可组合的多Agent系统

在构建复杂的 AI 应用时,我们经常会遇到一个难题:如何让一个通用 Agent 调用另一个专业 Agent?

单一 Agent 往往无法胜任所有工作,我们需要明确的“分工”。本文通过 Microsoft Agent Framework 的一个示例,演示如何将一个 Agent 封装成标准的“函数工具”,供另一个 Agent 按需调用。

这种模式通常被称为 Agent-as-a-Function,它显著增强了多 Agent 系统的可组合性。

场景设定

我们构建一个“套娃”式的多 Agent 场景:

  • 底层工具:一个查询天气的 C# 本地函数

  • 子 Agent(WeatherAgent):天气专家,持有底层工具

  • 主 Agent(Main Agent):负责用户交互,并且必须只用日语输出结果

  • 任务:用户用中文提问,主 Agent 调用子 Agent 获取信息后,根据自身指令翻译并用日语回答

核心代码解析

1. 准备工作与本地函数

首先配置 Azure OpenAI 连接,并定义一个最基础的 GetWeather 本地函数。这里使用 [Description] 特性,是为了让 LLM 能更准确理解工具的用途与参数语义。

为了突出 Agent 组合模式,这里使用了简化的本地函数;在真实项目中,可以替换为 API / MCP / 插件调用。

var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT"); var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini"; [Description("获取指定地点的天气信息。")] static string GetWeather([Description("要获取天气的地点。")] string location) => $"{location} 多云,最高气温 15°C。";

2. 创建子 Agent:WeatherAgent(天气专家)

接下来创建一个专注于天气问题的专家 Agent,并将 GetWeather 注册为它的工具能力。

此时,weatherAgent 仍然只是一个独立 Agent,尚未作为函数对外暴露。

AIAgent weatherAgent = new AzureOpenAIClient(new Uri(endpoint), new AzureCliCredential()) .GetChatClient(deploymentName) .CreateAIAgent( name: "WeatherAgent", instructions: "你专注于回答天气相关的问题,必要时调用工具获取信息后再回答。", description: "一个提供天气信息的智能体。", tools: [AIFunctionFactory.Create(GetWeather)] );

3. 关键一步:将 Agent 封装为函数(Agent-as-a-Function)

核心在于.AsAIFunction()

它并不是一次简单的函数调用,而是一次完整的 Agent 推理过程,只是对外表现为一个标准的 AI Function 契约。

AIAgent agent = new AzureOpenAIClient(new Uri(endpoint), new AzureCliCredential()) .GetChatClient(deploymentName) .CreateAIAgent( instructions: """ 你是一个助手,必须只用日语回答。 工具返回的内容可能是中文,请将其翻译成自然的日语后再输出。 不要输出中文或英文。 """, tools: [weatherAgent.AsAIFunction()] );

对主 Agent 来说,WeatherAgent 就像一个普通工具函数,但其内部实际上包含完整的 Prompt、推理和工具调用逻辑。

4. 运行效果与调用流程

Console.WriteLine(await agent.RunAsync("东京的天气如何?"));

一次典型的执行过程如下:

  1. 用户用中文提问

  2. 主 Agent 在推理过程中判断需要天气信息,并选择调用 WeatherAgent 工具

  3. 子 Agent 调用GetWeather("东京")获取结果

  4. 子 Agent 返回天气信息

  5. 主 Agent 根据自身 System Prompt,将结果翻译并以日语输出

最终输出示例:

東京の天気は曇りで、最高気温は15℃です。

在真实系统中,超时控制、调用深度限制、错误回传与重试等逻辑,通常放在主 Agent 的工具调用包装层(tool policy / middleware)中统一处理,以避免多 Agent 调用链失控或变成黑盒。

为什么这种模式很重要?

  • 封装与复用:复杂能力(如 SQL Agent、Code Agent)可以整体封装为工具

  • 职责分离:主 Agent 负责交互与语言控制,子 Agent 专注垂直领域推理

  • 可组合扩展:作为工具的 Agent 内部仍可调用其他 Agent,形成树状结构

  • 轻量 vs 编排器:当只需要能力组合时,Agent-as-a-Function 更轻量;当需要复杂路由与多步工作流时,再引入 orchestrator 更合适

总结

AsAIFunction()本质上是一座桥梁:它用 Function 作为契约,把一个完整的 Agent 能力模块暴露给其他 Agent 使用。

通过这种方式,我们不再构建一个全知全能的巨型 Brain,而是构建一组可组合、可复用、职责清晰的专家团队。

如果你正在使用 Microsoft Agent Framework,不妨尝试把你的通用能力抽取出来,封装成 Agent Tool,让系统能力真正“模块化”。

源代码地址

https://github.com/bingbing-gui/aspnetcore-developer/tree/master/src/09-AI-Agent/Agent-Framework/12-Agent-As-Function-Tool

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

虚拟手柄驱动完全指南:3步轻松实现游戏控制器模拟

虚拟手柄驱动完全指南:3步轻松实现游戏控制器模拟 【免费下载链接】ViGEmBus 项目地址: https://gitcode.com/gh_mirrors/vig/ViGEmBus 想在电脑上畅玩各类主机游戏却苦于没有对应手柄?通过虚拟手柄驱动,你可以快速将键盘鼠标变身为专…

作者头像 李华
网站建设 2026/4/18 8:05:18

YOLOv8适合哪些应用场景?工业检测、自动驾驶、安防监控全解析

YOLOv8适合哪些应用场景?工业检测、自动驾驶、安防监控全解析 在智能制造车间的高速生产线上,一个微小划痕可能让整块PCB板报废;在城市街头穿梭的无人配送车,必须在毫秒内识别出突然闯入的行人;地铁站角落的一次翻越护…

作者头像 李华
网站建设 2026/4/18 5:37:57

基于微信小程序+SpringBoot的瑜伽馆课程预约选课管理系统

文章目录 具体实现截图主要技术与实现手段系统设计与实现的思路系统设计方法java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 具体实现截图 本系统(程序源码数据库调试部署讲解)带文档1…

作者头像 李华
网站建设 2026/4/18 8:17:45

YOLOv8日志记录与监控:训练过程可视化工具集成

YOLOv8日志记录与监控:训练过程可视化工具集成 在深度学习项目中,模型训练常常被视为“黑箱”——代码跑起来后,开发者只能等待最终结果出炉,而无法实时掌握内部状态。这种缺乏透明度的流程,在面对复杂数据、不稳定收…

作者头像 李华
网站建设 2026/4/11 11:26:27

Beta冲刺第1天 - 项目启动与任务分配

SCRUM部分 今日完成工作 成员 完成任务 耗时 剩余时间 代码提交记录 ------ --------- ------ ---------- ------------- 张泽瑞 完成项目代码分析与文档结构搭建 4小时 0小时 屏幕截图 2025-12-31 124944.png 邱温翰 完成Alpha阶段问题总结文档重写 3小时 0…

作者头像 李华
网站建设 2026/4/17 4:09:59

51. Reporting Functions

UVM报告函数与宏:从“函数调用”到“快捷指令”的进阶 🎯 课程目标:10分钟掌握UVM报告的两种使用方式 上次你学会了UVM报告系统的概念,今天我们来深入学习具体的两种使用方法:函数调用和宏调用。就像学会用手机打电话的…

作者头像 李华