最近在做一个人事问答Agent,用来回答员工关于年假、报销的问题。我用了ReAct框架,让LLM在回答前先判断“是否需要向HR系统拉数据”。
调了三天Prompt,Agent还是分不清“用户没提”和“用户不知道”,怎么办?
全部回复
共 47 条这问题我太有同感了,之前做客服bot也栽在这上面。其实关键不是让LLM自己判断“是否知道”,而是把“未知”当成一个显式的状态去处理,比如加一个“信息确认”的中间步骤,强制它先列出来已知和未知的字段,再决定要不要调数据。
另外我试过在prompt里给几个典型的“用户没提”和“用户主动说不知道”的对比示例,比单纯描述规则管用。但最实际的还是加个兜底:只要系统里查不到用户数据,就反问一句“您是指还没提供,还是确实不清楚?”让用户自己选,别让模型猜。
这问题我太有共鸣了,之前做客服bot也卡在“未提及”和“不知道”的边界上。后来发现单纯靠prompt判断容易死板,不如加个显式的反问机制,让模型在信息不足时直接生成一个澄清问题,比让它自己猜靠谱得多。另外也可以检查下你喂给ReAct的few-shot例子,是不是把“用户没提”的情况全标成“不用查数据”了,模型会模仿这个偏见。
你可以在判断之前先让LLM列出“回答此问题所需的关键字段”,然后逐一对照对话里有没有出现——这样比直接问“需不需要查系统”要稳很多。再不行就上个小分类模型做前置分流,把LLM的活砍掉一半,省下的调参时间够你喝三杯咖啡了。
这问题太真实了,建议把“不知道”也当成一种输入信号喂给模型,别只盯着它没说的部分。
说实话这问题我太有共鸣了,之前做客服机器人也栽在类似的坑里。我觉得核心不是prompt写得不够细,而是你让LLM在“判断”这一步承担了太多它其实不擅长的语义推理——它分不清“用户没提”和“用户不知道”,本质上是它无法区分“信息缺失”和“意图缺失”。我当时的做法是干脆砍掉让模型自己判断的逻辑,改成强制两步走:第一步先让模型把用户问题里涉及的所有字段(比如工龄、入职日期、请假类型)都显式提取出来,缺哪个就反问哪个,而不是让它直接回答“需不需要拉数据”。第二步才根据字段是否齐全决定是否调系统,这样“没提”就变成了一个可操作的、结构化的信号,而不是模糊的语义猜测。另外你可以试试在prompt里给几个反面例子,专门标注“用户说‘我不清楚年假怎么算’不等于‘他不需要知道规则’,反而是最需要拉他个人数据的时候”。还有一个取巧的办法:把判断逻辑拆成两个子任务,先问“用户是否提到了某个具体日期/年限”,再问“用户是否在表达对规则的无知”,用两个独立的bool输出代替一个综合判断,准确率会明显上升。最后想说,别太迷信调prompt,ReAct这个框架本身对这类边界情况就很脆弱,必要时直接上规则前置过滤,把明显缺失信息的句子直接拦截下来反问,反而省心。
这个坑我也踩过,后来干脆把“没提”和“不知道”拆成两个字段让模型分别打分。你试试在prompt里塞个反例,比讲道理管用。
我一般把“没提”当默认值,“不知道”得靠追问确认,这俩混在一起确实难搞。
这个坑我踩过。你让LLM判断“需不需要拉数据”,它其实是在猜你的意图,不是在判断信息缺口。ReAct那套think-act-observe循环,遇到“用户没提”这种边界就直接懵了,因为训练数据里没人教它区分“沉默”和“无知”。
我后来换了个思路,把判断逻辑拆成两步:先做意图分类,明确用户问的是政策类还是个案类;政策类直接走知识库,个案类才触发工具调用。关键是给few-shot里塞几个“用户没提但系统该知道”的反例,比如“我去年剩几天年假”这种,模型才知道要去查。
另外你可以加个兜底话术,当置信度低的时候别硬答,直接问“你是想了解通用规则,还是查你自己的余额?”把歧义抛回给用户,比让模型瞎猜强多了。
不过说实话,这种边界问题靠prompt调是治标,真要稳还是得在Agent外面套一层状态机或者规则路由,LLM只负责它擅长的部分。