ARTICLE · 1082048
给AI助手装上30双手:软件功能全量接入function calling实录
上一篇文章讲了原理:AI助手调用软件功能,靠的是本地命令注册表加大模型function calling。文章发出去,有同事看完问:原理懂了,可我们软件里几十个功能入口,怎么知道哪些已经接入、哪些漏了?补一个功能到底要改多少代码?AI又凭什么听懂五花八门的说法?
这三个问题问到了点子上。这篇就用一次真实的扩容实战,把它们全部答一遍。

打开主工具栏代码,功能入口比想象的多:Ribbon工具栏三十个按钮处理器,加上深化设计工具条的八个编程触发器,一共接近四十个入口。入口一多,账就容易乱——注册表是各窗体分散注册的,谁也说不清到底接入了几个、还漏着几个。所以盘点前先立规矩:把所有入口分成三类,逐一过。
具体的对账方法很朴素:先用代码搜索把所有按钮处理方法与触发器列成清单,再和注册语句逐条对照,已注册、漏注册、不该注册三个集合一交,一目了然。这套动作半小时能做完,却避免了凭印象办事的糊涂账。
第一类,已经注册的。 建模页的SAP导入、Midas导入、DXF导入、CAD交互建模、数据互导、模型视窗、去除中间节点、梁合并;节点页的按名插节点、吊耳连续布置;工具页的螺旋楼梯、定尺清单、构件查重、吊耳批量布置、销轴验算、吊耳验算、构件挂钩、局部坐标系、新旧两版汽车吊计算;图纸页的主构件出图、57/65宏自动出图;深化工具条的截面旋转、节点设计、信息输出、启动Tekla——二十一个入口早已有注册,一个都不用动。
第二类,真漏了的。 逐一对账后揪出三个:工具页的随身模型,框选构件就能导出轻量化分享包,发现场很实用却一直没接;图纸页的属性文件设置,功能早就实现,注释却把它错记成占位按钮,属于"被冤枉的";最典型的是捷构CAD系统启动,它只存在于早期的正则命令处理器里,function calling注册表压根没有,属于"被遗忘的"。
第三类,不该注册的。 犀牛导入、智能连接、连接检查三个按钮点了只弹"开发中"提示框,注册进去AI就学会弹废话框了;图纸生成与主构件出图是同一个窗体的两个入口,构件查重在工具页和深化工具条各有一个触发器,打开的是同一个对话框——重复注册反而干扰模型选择。至于AI助手按钮自己,用户都已经在对话框里了,再注册一个"打开AI助手"纯属递归笑话。占位与重复,一概不进菜单。 这是扩容的第一原则:宁可AI会的少,不能AI说的假。

二、三行代码,接入一个功能
注册表当初的设计这回见了真章:加新功能,AI端零改动。每个功能一行注册语句,name给AI按名调用,description写给模型看的说明书,Handler直接指向窗体现成的按钮处理方法:
Reg("portable_model", "随身模型:连接Tekla后框选要分享的构件," + "按空格确认导出轻量化分享包", () => BtnPortableModel_Click(null, null));随身模型需要用户去Tekla里框选构件,注册时打上NeedsPick标记,AI执行前会先提示用户去三维视图操作,不会傻等。捷构CAD的启动逻辑原本私有在正则命令处理器里,把方法签名从private改成internal static,注册表直接复用,一行业务代码没抄。
带参数的工具则要多给一段JSON Schema。以按名插节点为例,参数里声明display字段,模型就会把"梁梁铰接"这样的节点名自动填进来再发起调用;万一查不到这个名字,执行器会把全部可用节点名回传给模型,模型顺口就能告诉你哪些名字有效。参数说明加错误回传,这套组合让带参调用一次通的正确率相当高。
改完编译,一次通过,零错误零警告。两处文件、十来行代码,AI助手从二十七个工具扩到三十个。 菜单厚了,AI能干的事就多了三件,而对话循环、模型接入、界面清单一行没动。
三、AI凭什么听懂人话
扩完容,第三个问题来了:用户嘴上说的可不是工具名。测试的人输入"帮我把选中构件导出成随身模型"——注册表里可没有"随身模型匹配器"这种东西。
答案依然是语义匹配。你的每句话,连同三十个工具的名称、说明、参数定义,一起发给大模型。模型做的不是关键词比对,而是理解:这句话的意图,跟哪份说明书的描述最贴合?贴合上了,输出一段结构化JSON——调用portable_model,无需参数。软件收到后执行真正的按钮处理方法,再把执行结果回填对话,模型据此组织出面向你的最终答复,这个循环最多走四轮,防止模型陷入无限调用的死循环:
模型回传:tool_calls: portable_model{}本地执行:提示用户框选构件结果回填:已执行 → 模型答复"请到Tekla中框选要分享的构件"正则匹配的是字面,大模型匹配的是意图。 所以"导个随身模型""把模型带走""分享轻量化包"各种说法通向同一个工具。这就是当初放弃十几个正则、全面转向function calling的回报:新增工具不需要再维护一套说法词典,说明书本身就是词典。
正则匹配的是字面,大模型匹配的是意图。 所以"导个随身模型""把模型带走""分享轻量化包"各种说法通向同一个工具。这就是当初放弃十几个正则、全面转向function calling的回报:新增工具不需要再维护一套说法词典,说明书本身就是词典。
四、会说话,更要会说"准"
语义匹配有弹性,但也有边界,实操中总结出三条说话规则。
其一,句子里带功能名词。"打开定尺清单"百发百中,"帮我整理一下模型"就得靠模型猜,猜错率随模糊度上升。其二,参数说进句子里。"用65宏出图"比"出个图"多给了枚举值,模型不用反问你用57还是65。其三,一个意图一句话,复合句能拆解,但容易只执行第一个就停下。
记不住说法时不用背:AI助手界面的「可用功能」清单,悬停有预览,单击自动填入输入框,那是每个工具的标准说法,也是兜底方案。
拿这三十个工具实测,"启动Tekla"与"打开模型视窗"不会混,"销轴验算"与"吊耳验算"不会混,最有意思的是吊耳家族:参数对话框、连续布置、批量布置、吊耳验算四个工具,靠"参数、连续、批量、验算"四个词精准分流,实测无一串门。
还有一个容易被忽略的能力:上下文可以继承。上一句刚说"打开节点设计",下一句只说"截面换成箱型",模型知道你在接着聊什么——因为对话历史每次都随请求一起发送,省去重复交代背景的麻烦。
五、验证收尾
重新打开AI助手,可用功能清单自动多出三行。输入"启动捷构CAD系统",弹出确认框,fem.exe启动;输入"导出随身模型",AI先提示去Tekla框选构件,选完按空格,分享包生成——整个链路一气呵成。更省的是沟通成本:新来的工程师不用培训,界面的可用功能清单就是活的说明书;老用户看到清单多出三行,立刻知道又来了三个能干活的帮手。
这次扩容最深的感触是:架构留好了口子,扩展就是填空题。 当初在注册表设计上多花的每一分钟,都变成了今天的十分钟。顺带沉淀三条注册纪律:Description要写成"什么时候该调我",别写成广告词;同名工具注册表只留第一个,别让两个窗体抢一个名字;会阻塞等待拾取的工具务必标NeedsPick,否则AI会在用户不知情时把界面卡住。软件的功能还会继续生长,菜单越厚,AI的双手越多;而我们要做的,只是每接入一个新功能时,别忘了那一行Register。
作者:SnailDing,中铁装配钢结构设计软件开发团队。