尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

.NET+AI | MEAI | Function Caling 实操(4)

.NET+AI | MEAI | Function Caling 实操(4)
📅 发布时间:2026/6/20 7:43:55

.NET+AI | MEAI | Function Caling 实操

TL;DR

  • ✅ 注册你的方法为工具(Tool)
  • ✅ 启用中间件 UseFunctionInvocation()
  • ✅ 设置 ChatOptions.ToolMode = Auto
  • ✅ 发起对话,MEAI 自动完成:请求 → 调用 → 回填 → 作答

🏢 场景与价值

  • 💬 智能助理需要可控访问后端:天气/库存/知识库/工单
  • 📦 MEAI 用统一“工具”抽象,屏蔽模型/厂商差异
  • 🛡️ 可控、可观测、可扩展(日志/缓存/限流易接入)

🌏 核心概念速记

  • 📦 ToolCollection/AITool:把你的方法包装成“可被调用的工具”
  • 🎚️ ChatOptions.ToolMode:控制模型是否/如何调用工具(None/Auto/Require)
  • 💬 FunctionCallContent / FunctionResultContent:调用意图与函数结果的消息载体
  • 📦 FunctionInvokingChatClient:自动完成调用循环的中间件

🚀 快速上手(4 步)

1)获取 ChatClient

// 方式 A:课程辅助类(推荐)
var chatClient = AIClientHelper.GetDefaultChatClient();// 方式 B:自行创建(示意)
// var chatClient = new OpenAIChatClient(apiKey: "...", model: "gpt-4o-...");

2)注册工具(Tool)

using Microsoft.Extensions.AI;// 最小示例:无入参,返回字符串
string GetCurrentWeather() => Random.Shared.NextDouble() > 0.5 ? "It's sunny" : "It's raining";
var tools = AIFunctionFactory.Create(GetCurrentWeather, name: "GetCurrentWeather", description: "查询当前天气");

稍复杂(带描述/类型)

using System.ComponentModel;public record WeatherReport(string City, int TemperatureCelsius, bool WillRain);public class TravelToolset
{[Description("查询指定城市的实时天气")]public WeatherReport QueryWeather(string city)=> new(city, 25, willRain: false);
}var travelTools = AIFunctionFactory.CreateFromMethods(new TravelToolset());

3)启用函数调用中间件

var client = chatClient.AsBuilder().UseFunctionInvocation() // 🔧 关键:启用自动函数调用.Build();

4)配置并对话

var messages = new List<ChatMessage>
{new(ChatRole.System, "你是出行助手,善于调用工具给出穿搭建议。"),new(ChatRole.User,   "帮我查看今天北京的天气,要不要带伞?")
};var options = new ChatOptions
{ToolMode = ChatToolMode.Auto,Tools = [ tools ] // 或 travelTools
};var response = await client.GetResponseAsync(messages, options);
Console.WriteLine(response.Text);

💻 可运行最小示例

依赖:Microsoft.Extensions.AI(以及选用的提供方实现,如 Microsoft.Extensions.AI.OpenAI 或 Azure.AI.OpenAI)

using System;
using System.Collections.Generic;
using Microsoft.Extensions.AI;class Program
{static async System.Threading.Tasks.Task Main(){// 1) 获取 ChatClientvar chatClient = AIClientHelper.GetDefaultChatClient();// 2) 注册工具string GetCurrentWeather() => Random.Shared.NextDouble() > 0.5 ? "It's sunny" : "It's raining";var tools = AIFunctionFactory.Create(GetCurrentWeather, name: "GetCurrentWeather", description: "查询当前天气");// 3) 启用函数调用var client = chatClient.AsBuilder().UseFunctionInvocation().Build();// 4) 配置与对话var messages = new List<ChatMessage>{new(ChatRole.System, "你是出行助手,善于调用工具给出穿搭建议。"),new(ChatRole.User,   "帮我查看今天北京的天气,要不要带伞?")};var options = new ChatOptions { ToolMode = ChatToolMode.Auto, Tools = [ tools ] };var result = await client.GetResponseAsync(messages, options);Console.WriteLine(result.Text);}
}

🔄 执行流程图(Mermaid)

📊 ToolMode 速查表

模式 含义 适用场景
None 禁用工具调用 只对话,不走工具
Auto 模型自行决定是否调用 通用推荐,灵活强
RequireAny 必须调用任意一个工具 强制走工具流程
RequireSpecific("name") 必须调用指定工具 固定关键步骤

❓ 常见问题与解决

  • 模型没调用工具?
    • 🔍 检查 ToolMode 是否为 Auto/Require*
    • 🔍 工具名称/描述/参数是否清晰、可推断
  • 传参不匹配/解析失败?
    • 📝 明确参数类型与描述,避免模糊命名
    • 🛡️ 约束输入(枚举/范围),必要时抛出可读异常
  • 多次工具调用链过长?
    • 🎯 收敛任务目标,提供清晰系统提示与结果格式
    • 🎚️ 需要一步到位时,用 RequireSpecific 强制关键工具

✅ 最佳实践

  • ✍️ 工具命名与描述精炼,面向“模型读者”
  • 🧩 工具只做一件事;返回结构化结果(record/class)更稳
  • 📦 基于 UseFunctionInvocation 叠加中间件:日志/缓存/限流
  • ♻️ 通用能力注册到全局 AdditionalTools,场景内复用
  • 🧯 设置兜底回答与失败重试,提升健壮性

✨ 总结

MEAI 的函数调用把“模型 + 你的业务能力”无缝拼起来:声明工具、打开开关、开始对话,剩下的交给中间件自动编排。

👆面向.NET开发者的AI Agent 开发课程【.NET+AI | 智能体开发进阶】已上线,欢迎扫码加入学习。👆
关注我的公众号『向 AI 而行』,我们微信不见不散。
阅罢此文,如果您觉得本文不错并有所收获,请【打赏】或【推荐】,也可【评论】留下您的问题或建议与我交流。你的支持是我不断创作和分享的不竭动力!
作者:『圣杰』
出处:http://www.cnblogs.com/sheng-jie/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

相关新闻

  • Java中HashMap的核心原理与使用注意事项
  • MinIo介绍 - 努力-
  • 南昌航空大学-ptajava

最新新闻

  • 2026赢客网络综合实力风云榜,价格透明口碑推荐不踩雷 - mypinpai
  • 商用车电泳漆品牌哪家靠谱 2026年市场口碑解析 - 品牌排行榜
  • OpCore Simplify:10分钟搞定黑苹果配置的智能工具终极指南
  • MC68HC912BD32串行通信与Byteflight协议深度解析
  • Switch虚拟Amiibo终极指南:免费解锁游戏隐藏内容
  • 2026年初中毕业学西点推荐好的学校用户力荐 - mypinpai

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号