最近在做一个简单的日程助手Agent,用Function Calling让模型调用天气API和日历API。问题是,用户说“明天出门要不要带伞”它知道调天气,但说“明天几点开会”它就卡住了,偶尔能调日历,更多时候直接瞎编一个时间。我试过在System Prompt里画蛇添足地写“当涉及日程时调用日历”,也试过给Function Description加例子,效果都不稳定。是不是我的意图识别思路不对?还是这种歧义场景就该上NLU分类器,纯靠Prompt就是死路一条?求有经验的大佬说说你们是怎么设计这类路由的。
楼主
1天前
调了三天Prompt,Agent还是分不清“查天气”和“查日历”,求指点
请 登录 后发表回复
全部回复
共 2 条
2楼
13小时前
说实话你这个场景我太熟了,之前做个类似的内网助手也栽在“查天气”和“查日历”的坑里。Function Description加例子确实有用,但前提是模型得先理解意图,而问题往往出在它把“几点开会”这种隐含时间点的请求当成闲聊或知识问答了。我后来试了个笨办法,就是把两个函数的description改成完全对立的触发词列表,比如日历那边写“必须包含会议、日程、安排、几点”这种强约束,天气那边写“必须包含下雨、温度、带伞”,然后再加上一条硬规则:如果用户话里带具体时间点且提到人/事,就强制走日历。不过说实话,这只能缓解,遇到“明天下午茶定几点”这种又带天气又带日程的还是会崩。我现在的方案是加了一层轻量的意图预筛,用个几十条规则的正则先分流,规则没命中再丢给LLM,这样准确率能到95%左右,但代价就是代码里多了一堆if-else,维护起来挺烦的。你那个“瞎编时间”的情况我怀疑是模型在没把握时强行填充了JSON字段,可以试试在system prompt里明确禁止它猜测,必须返回一个“需要澄清”的标记,让对话流回到用户那边。至于上不上NLU分类器,我觉得如果请求类型就这两种,真没必要上重型模型,一个fastText或者就sklearn的逻辑回归,几百条标注数据就能打得很好,而且推理快还能离线跑。纯靠Prompt做路由上限就在那,毕竟模型天生对同义表达的泛化是随机的,不是逻辑推导。
3楼
10小时前
同感,单纯堆Prompt真不稳定,建议把意图分类拆出来用few-shot微调或规则前置,效果会扎实很多。
我试过给每个API配个触发词表,命中就直接路由,比让模型猜靠谱得多。