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

.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

/* by 01130.hk - online tools website : 01130.hk/zh/menstrual.html */
// 方式 A:课程辅助类(推荐)
var chatClient = AIClientHelper.GetDefaultChatClient();

// 方式 B:自行创建(示意)
// var chatClient = new OpenAIChatClient(apiKey: "...", model: "gpt-4o-...");

2)注册工具(Tool)

/* by 01130.hk - online tools website : 01130.hk/zh/menstrual.html */
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) 获取 ChatClient
        var 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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
内容概要:本文介绍了一个基于多传感器融合的定位系统设计方案,采用GPS、里程计和电子罗盘作为定位传感器,利用扩展卡尔曼滤波(EKF)算法对多源传感器数据进行融合处理,最终输出目标的滤波后位置信息,并提供了完整的Matlab代码现。该方法有效提升了定位精度与稳定性,尤其适用于存在单一传感器误差或信号丢失的复杂环境,如自动驾驶、移动采用GPS、里程计和电子罗盘作为定位传感器,EKF作为多传感器的融合算法,最终输出目标的滤波位置(Matlab代码现)机器人导航等领域。文中详细阐述了各传感器的数据建模方式、状态转移与观测方程构建,以及EKF算法的具体现步骤,具有较强的工程践价值。; 适合人群:具备一定Matlab编程基础,熟悉传感器原理和滤波算法的高校研究生、科研人员及从事自动驾驶、机器人导航等相关领域的工程技术人员。; 使用场景及目标:①学习和掌握多传感器融合的基本理论与现方法;②应用于移动机器人、无人车、无人机等系统的高精度定位与导航开发;③作为EKF算法在际工程中应用的教学案例或项目参考; 阅读建议:建议读者结合Matlab代码逐行理解算法现过程,重点关注状态预测与观测更新模块的设计逻辑,可尝试引入真传感器数据或仿真噪声环境以验证算法鲁棒性,并进一步拓展至UKF、PF等更高级滤波算法的研究与对比。
内容概要:文章围绕智能汽车新一代传感器的发展趋势,重点阐述了BEV(鸟瞰图视角)端到端感知融合架构如何成为智能驾驶感知系统的新范式。传统后融合与前融合方案因信息丢失或算力需求过高难以满足高阶智驾需求,而基于Transformer的BEV融合方案通过统一坐标系下的多源传感器特征融合,在保证感知精度的同时兼顾算力可行性,显著提升复杂场景下的鲁棒性与系统可靠性。此外,文章指出BEV模型落地面临大算力依赖与高数据成本的挑战,提出“数据采集-模型训练-算法迭代-数据反哺”的高效数据闭环体系,通过自动化标注与长尾数据反馈现算法持续进化,降低对人工标注的依赖,提升数据利用效率。典型企业案例进一步验证了该路径的技术可行性与经济价值。; 适合人群:从事汽车电子、智能驾驶感知算法研发的工程师,以及关注自动驾驶技术趋势的产品经理和技术管理者;具备一定自动驾驶基础知识,希望深入了解BEV架构与数据闭环机制的专业人士。; 使用场景及目标:①理解BEV+Transformer为何成为当前感知融合的主流技术路线;②掌握数据闭环在BEV模型迭代中的关键作用及其工程现逻辑;③为智能驾驶系统架构设计、传感器选型与算法优化提供决策参考; 阅读建议:本文侧重技术趋势分析与系统级思考,建议结合际项目背景阅读,重点关注BEV融合逻辑与数据闭环构建方法,并可延伸研究相关企业在舱泊一体等场景的应用践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值