设计客服机器人:怎么做到「不知道就说不知道」?
谁在问:二面高频;几乎所有做过客服/问答产品的面试官都会问,因为这是上线前最后一道坎
口语化问法
- 怎么让它别瞎编?知识库里没有的就老实说没有。
- 拒答的阈值你怎么定?
- 它说『根据文档』,但文档里根本没这句话,怎么办?
考察意图
这道题看着简单,实际是上线前最后一道坎,考四件事:
- 你知不知道拒答是系统属性不是提示词属性。回答「在 prompt 里写『不知道就说不知道』」的,一句话就出局——那句话确实要写,但它只是最弱的一层。
- 你的阈值是怎么定出来的。用 F1 最优点定阈值的人没考虑代价不对称;用业务代价定阈值的人做过。
- 你知不知道过度拒答同样是失败。只防幻觉不防「什么都不敢答」,产品会没人用。
- 你怎么验证它真的在拒答。这一层最难,因为幻觉的表现形式恰恰是「看起来很有依据」。
参考答案
60 分答案(及格线)
在 prompt 里明确要求「只根据给定资料回答,资料里没有就回答不知道」,加 few-shot 示例。检索时设一个相似度阈值,低于阈值就直接返回兜底话术,不调模型。答案里要求给引用,没有引用的不返回。再准备一批标准的兜底话术,引导用户转人工。
这是及格线,而且是相当扎实的及格线——三层都碰到了。缺的是:阈值怎么定没说、引用是否真实没校验、拒答率高了怎么办没说,以及最关键的——没有区分「检索没召回」和「召回了但答案不在里面」这两种完全不同的情况。
90 分答案(有生产经验的回答)
① 先问四个问题:答错的代价是什么——是用户多问一句,还是涉及资费、承诺、法律?覆盖率现状如何——知识库能覆盖多少比例的真实问题?有没有人工兜底通道、成本能承受多少?以及:这个产品是替代人工还是分流人工——替代的话拒答率必须压得很低,分流的话拒答是正常出口,设计完全不同。
② 基线:混合检索 + 重排 + 「只依据给定资料回答」的提示词 + 强制引用 + 低分直接不调模型。这套能挡掉大部分「凭空编造」,但挡不住最危险的那一类——检索召回了相关但不对口的文档,模型基于它编出一个看起来很有依据的答案。
③ 加挂:拒答要做成三层,而不是一个阈值。
第 1 层 检索侧 最高分低于阈值 / top-k 分数分布过平 → 直接兜底,不调模型 第 2 层 生成侧 要求模型先判断「证据是否足够」再回答,不足则拒答 第 3 层 输出后 引用一致性校验:答案里的每个关键断言必须能回指到引用原文三层各自解决不同的问题,缺一层就漏一类:第 1 层挡「库里没有」,第 2 层挡「召回了但答不上」,第 3 层挡**「答得有模有样但原文里没有」**——第三类是最危险的,因为它带着引用,用户更容易相信。第 3 层的实现不必很重:把答案里的数字、日期、金额、专有名词抽出来,回原文做精确匹配,对不上就降级为「我找到一些相关资料,但不能确认这个具体数值」。
阈值不用 F1 最优点定,用代价不对称定:设答错一次的代价是 C_错、多转一次人工的代价是 C_转,阈值应该取在 C_错 / C_转 这个比值决定的位置上。资费和承诺类问题 C_错 极高,阈值要拉得很保守;使用说明类问题 C_错 很低,可以放松。所以阈值不该是全局一个值,应该按问题类型分档——这是这道题最容易拉开差距的一句。
拒答的表达同样是设计:只说「我不知道」是失败的拒答。合格的拒答要给三样东西——说明边界(我能查到的是产品手册和资费说明)、给下一步(这个问题我帮你转人工/你可以在某处查到)、保留已获得的信息(转人工时把用户原始诉求和已尝试内容带过去)。
④ 评测:要同时测两个方向,只测一个方向必然翻车。
- 该答的答了吗——正常问题集,测覆盖率;
- 不该答的拒了吗——专门构造一个「知识库外」测试集:库里没有的问题、库里有相似但不相同的问题(最重要)、以及诱导性提问(「你们是不是承诺过三年质保?」)。断言是负向的:不得出现具体承诺、具体数值。
- 线上零成本信号:拒答率、转人工率、重问率(用户换个说法再问一遍,往往说明上一次答得不对或没答)、以及用户在拒答后是否继续对话。
- 特别要监控**「该拒没拒」的比例**,靠抽样人工标注。只监控答对率等于在奖励它硬答。
⑤ 演进:拒答率长期偏高且集中在某几类 → 扩知识库,不是降阈值;某类问题的线上答对率长期稳定且样本充足 → 才可以对那一类单独放松阈值;出现「用户诱导式提问导致越界承诺」→ 增加黑名单主题和强制拒答规则。退路:任何一次线上出现越界承诺,对应问题类型立刻回到强制转人工。
追问链
拒答阈值具体怎么定?
期望别用 F1 最优点,用代价不对称定:① 按C_错/C_转分三档(资费承诺 / 操作指引 / 一般咨询);② 每档单独扫,取错答率可接受的最松位置;③ 看 top-k 分数分布:都很平说明检索没把握,最高分过线也别信;④ 分数不可跨模型比,换 embedding 就得重扫信号说出「按问题类型分档」→ 做过真实产品;只说「一般设 0.7」→ 背来的数字,换模型就失效模型说了「根据文档」,但文档里没这句话,怎么发现?
期望这类幻觉自带可信外观,最危险。① 引用一致性校验:抽出关键断言(数字、日期、金额、专名、承诺表述)回原文精确匹配,对不上就降级;② 引用要精确到句,文档级引用等于没引用;③ 线上专抽「带引用却被追问的会话」,命中率最高;④ 必须在输出后做,模型自查的依据还是它自己的生成信号提出「抽关键断言回指原文」→ 做过溯源校验;答「让模型自己检查一遍」→ 没意识到自查的循环性拒答率多少算合适?太高了怎么办?
期望没有普适数字,只有三种读法:突然升高 → 检索侧或上游数据出问题;长期偏高 → 覆盖面不够,该扩知识库不是降阈值;过低反而是危险信号,它在硬答。太高的处理顺序:先看集中在哪几类(结构比总量重要)→ 缺内容就补内容 → 没召回就改检索(切块、查询改写、召回数)→ 最后才调阈值信号第一反应「降阈值」→ 不及格;说出「先看结构再看总量」「过低才是危险信号」→ 运营过真实系统用户问范围外的问题(闲聊、竞品对比、法律咨询)怎么办?
期望不是「不知道」,是「不该答」,两条线分开。① 主题边界分类器(规则为主)命中黑名单走固定话术,不进检索不调生成;② 黑名单覆盖法律合规、医疗建议、竞品评价、承诺表述、金额期限;③ 话术要说明这是策略不是能力不足,否则用户会换说法试;④ 防多轮绕过:先问无关再回指前文,得在会话级查信号能区分「不知道」和「不该答」→ 做过合规评审;想到多轮绕过 → 处理过真实的诱导案例业务方说拒答太多影响体验,要求把阈值降下来,你怎么谈?
期望① 先拆「体验差」:是拒答本身还是表达方式?补边界说明与下一步引导不牺牲准确性,先做 → ② 降阈值同时抬高答对率与错答率,两条曲线连同业务代价(错一次资费承诺赔多少、多少客诉工时)摆同一张表 → ③ 分档不全局:使用说明、门店位置放松,资费、承诺、合约期限不动 → ④ 小流量灰度 + 事先约定回退条件 → ⑤ 数据若显示错答成本低于拒答流失,业务方是对的信号硬顶「不能降」或直接照做 → 缺协作或缺主张;提「先改表达再谈阈值」加「分档 + 灰度 + 回退条件」→ 真跟业务方谈过
评分要点
- 拒答做成三层(检索侧 / 生成侧 / 输出后),并说得出每层挡哪一类
- 知道最危险的是**「带引用但原文没有」**,并给出关键断言回指校验
- 阈值用代价不对称定,且按问题类型分档,不是全局一个值
- 知道相似度分数不可跨模型比较,换模型要重扫阈值
- 拒答的表达含边界说明、下一步、上下文保留
- 评测双向:正常集测覆盖,库外集测拒答,且含「相似但不相同」样本
- 监控**「该拒没拒」**的比例,知道拒答率过低是危险信号
- 区分「不知道」与「不该答」,且考虑多轮绕过