最近在做一个简单的日程助手Agent,用Function Calling让模型调用天气API和日历API。问题是,用户说“明天出门要不要带伞”它知道调天气,但说“明天几点开会”它就卡住了,偶尔能调日历,更多时候直接瞎编一个时间。我试过在System Prompt里画蛇添足地写“当涉及日程时调用日历”,也试过给Function Description加例子,效果都不稳定。是不是我的意图识别思路不对?还是这种歧义场景就该上NLU分类器,纯靠Prompt就是死路一条?求有经验的大佬说说你们是怎么设计这类路由的。
调了三天Prompt,Agent还是分不清“查天气”和“查日历”,求指点
全部回复
共 27 条我一般会加个中间意图分类步骤,先让模型判断是天气还是日程,再走对应API,比硬写Prompt稳很多。
我碰到过一样的问题,Function Calling在语义模糊时确实容易翻车。后来我把路由拆成两步:先用小模型或规则做一次意图粗分类,命中日程就直接走日历,命中天气就走天气,剩下的再交给大模型兜底。你那个“明天几点开会”其实关键词挺明显的,加个时间+事件词的轻量匹配就能稳住大部分case。纯靠Prompt调不如把确定性逻辑前置,模型只负责它擅长的部分。
用few-shot把“几点开会”这类句式全喂进去试试,光靠描述意图确实不稳。
我踩过同样的坑,后来发现核心问题是模型对“明天几点开会”这种没显式提到日历的句子,根本不知道要调工具。你可以在Function Description里把日历API的描述改成“查询、创建或修改用户的日程安排,包括会议、提醒、预约时间等”,比加例子管用。另外别指望纯Prompt解决所有歧义,我现在的做法是加一层轻量规则兜底,比如句子里出现“几点、开会、日程、安排”就直接走日历,命中率能到九成以上。真要做稳,还是得训个小分类器或者用embedding做意图路由,Prompt只负责兜底和闲聊。
我之前也踩过这个坑,纯靠Prompt确实不太稳,尤其是“明天几点开会”这种句子,模型很容易理解成在问时间而不是查日程。后来我在Function Calling前面加了一层轻量意图路由,用few-shot分类先判断走天气还是日历,准确率一下就上来了。其实不用上重型NLU,规则加小模型兜底就够用。你可以在工具描述里把“几点开会”这类表达直接映射到日历查询,别让模型自己猜意图。
我遇到过类似情况,纯靠Prompt确实容易翻车。后来把意图判断拆成两步:先让模型输出结构化的意图标签(天气/日历/其他),再根据标签路由到对应工具,准确率稳了不少。Function Calling本身不适合做歧义消解,它更像执行层而不是决策层。你可以试试在调用前加一个轻量分类节点,哪怕用规则兜底都比硬调强。
加个few-shot把“明天几点开会”这类日程问法也塞进去,光靠System Prompt那句话确实不够稳。