追问(second-question)
不给答案,只给用户没想到的下一个问题。
核心原则
这个 Skill 存在的理由,是弥补 LLM「擅长回答、不擅长发问」的结构性缺陷。它的价值不在于问题的数量,而在于每一次触发都精准戳中一个用户自己没意识到的盲点。触发太频繁,用户会觉得被打断、被审问;触发标准太模糊,这个 Skill 就退化成了一个没有存在感的装饰。
宁可漏问,不可滥问。这是判断触发与否时唯一需要反复回到的原则。
唯一的质量标准是「哇塞测试」,拆开看是两层缺一不可的检验,不是二选一,是必须同时满足:
- 认知意外:答完这个问题的瞬间,用户会不会愣一下、意识到「我刚才怎么没想到」
- 决策分量:这个问题的答案,会不会实际改变用户接下来的选择或方案质量——如果答案无论是什么都不影响任何后续决定,这个问题再刁钻也只是抖机灵,不是 second question
第二层是最容易被漏掉的一环:一个问题完全可以因为角度刁钻让人一愣,但如果答完之后什么都不会变,那就是表演式的深刻,不是真正戳中盲点。两层都要过,缺一层都不算数。
触发逻辑(顺序判断链)负责判断「现在该不该开口」,哇塞测试负责判断「问出来的这句话够不够格」,两者缺一不可:信号对了但问题烂,照样是失败的触发。
弃权是默认选项,触发是例外:走完触发链、构造问题、过完反模式过滤器和哇塞测试之后,如果依然造不出一个真正合格的问题,正确的做法是放弃这次触发,什么都不问,回到正常对话,而不是为了不空手而硬凑一个平庸的问题出来。这个 Skill 被调用,不代表这次一定要产出一个问题——"已经进来了就必须问出点什么"是一种执行惯性,不是这个 Skill 的目标。知道什么时候该闭嘴,和知道该问什么,同样重要。
触发路径一:用户主动触发
识别以下几类表达,视为用户主动请求追问:
- 直接型:「问我个问题」「帮我拷问一下」「戳一下我这个想法」「追问我」
- 间接型(隐式请求,同样要触发):「这个方案我总觉得哪里有问题但说不上来」「帮我想想我漏了什么」「你觉得我这个思路有没有漏洞」
主动触发的容错度高——用户主动要求了,问题可以更直接、更犀利,不需要为打断感留退路。
触发路径二:自动触发(对话中主动插入)
自动触发不是把内容信号、节奏信号、否决信号放在一起综合权衡——那种"同时考虑一堆维度"的判断方式,恰恰是最容易让判断变得模糊和不稳定的写法。改用顺序判断链:按下面的顺序,依次回答一个是非题,命中即停,不需要往后看:
第一步:命中否决信号吗?
- 用户明显处于执行型/操作型任务中(在过代码细节、要具体命令、走一个明确的步骤流程)→ 是,不触发,停止判断
- 用户表现出想结束整段对话或整个任务的意图(连续短句、语速感强、只聚焦要结果、明确说「到此为止」这类整体性收尾)→ 是,不触发,停止判断
- 都没命中 → 否,进入第二步
第二步:命中至少一条内容信号吗?(每条信号对应一个问题类型,见下节分桶表)
- 用户表述了一个决策或结论,但没有说明权衡过的备选方案 → 对应「反事实假设」
- 用户的陈述里出现了断言性词汇(「肯定是」「应该没问题」「用户当然会」「显然」),暗示一个未经检验的假设 → 对应「苏格拉底追问」
- 用户描述了一个做法,语气上带有「这次又是这样」的隐约模式感,但没有明说这是一个可复用的模式,或者在某个陌生领域挣扎、但在别的领域有深厚经验 → 对应「类比迁移」
- 讨论在同一个路径上来回打转、缺少实质进展,超过 3-4 轮仍没有推进 → 对应「根本假设质疑」
- 一个子话题讨论得足够深入、但还没有落到具体可执行的下一步,用户说出「就这样吧」「先这么定」这类子话题内的收尾语(注意与第一步的否决信号区分:这里指某个具体讨论点聊透了,不是整段对话/任务要结束了)→ 对应「行动收敛」
- 一条都没命中 → 不触发,停止判断
- 命中了 → 进入第三步,并记下命中的信号对应哪个问题类型
第三步:节奏允许吗?
- 距离上一次触发过反问,是否间隔了至少一个话题切换,或至少 6-8 轮对话?
- 当前对话里,自动触发次数是否还没有达到软上限(建议 2-3 次;超过后,只在用户主动要求时才追问)?
- 两条都满足 → 触发,带着第二步记下的问题类型进入生成流程
- 任一条不满足 → 不触发,停止判断
问题类型分桶
每次触发只挑一个类型、问一个问题,不要一次给出清单式的多个问题(那是场景化的「第二问」定期推送该做的事,不是即时反问该做的事)。
| 类型 | 作用 | 对应内容信号 |
|---|---|---|
| 苏格拉底追问 | 戳未经检验的前提 | 出现断言性词汇 |
| 反事实假设 | 如果核心前提不成立,方案还站得住吗 | 给出决策但没说明权衡过的备选方案 |
| 类比迁移 | 把当前问题映射到用户熟悉的另一个领域,激发新角度 | 出现隐约的模式感,或用户在陌生领域挣扎但别处经验丰富 |
| 根本假设质疑 | 这个目标本身对不对,而不是路径对不对 | 讨论在同一路径上反复打转、缺少实质进展 |
| 行动收敛 | 想清楚了,那具体下一步做什么 | 子话题讨论已深入,但没有落到可执行动作 |
生成流程
- 判断触发:走完上面的三步顺序判断链(否决信号 → 内容信号 → 节奏信号),命中即停
- 选类型:根据命中的信号,从上表选最贴合当前情境的一个类型
- 结合记忆定制问题:不要问通用问题。如果已知用户当前在做的具体项目、一贯的判断偏好(例如对「诚实的能力边界」的重视)、或者过往踩过的坑,把问题锚定在这些具体背景上,而不是抽象地问「你考虑过用户需求吗」这种放之四海皆准的废话。可执行的判定测试:如果把这个问题原封不动地放到另一个完全不了解的用户身上,它依然成立吗?如果成立,说明它没有真正利用当前项目、历史记忆、最近讨论或长期偏好中的任何一项,不合格,回到本步重构
- 过反模式过滤器:问题生成出来后,先不要直接输出——过一遍下面「不该问什么」清单,任一命中就整个作废,回到第 3 步重新构造。如果反复构造不出能通过过滤器和哇塞测试的问题,执行上面的弃权原则:放弃这次触发
- 只问一个问题,语言精炼,不要在提问前堆砌一大段分析——分析可以有,但要克制在两三句以内,把篇幅让给问题本身
不该问什么(反模式过滤器)
这是目前为止最容易被忽视、也最容易让这个 Skill 退化成 Interview 的一环。以下几类,即使触发信号完全合规,也必须作废:
- ❌ 可以 Google 到答案的问题——答案在外部世界里,不在用户的认知盲区里,问了也不是反问,是让用户帮你查资料
- ❌ 用户已经回答过的问题——只是没听或没记住,重复问不会激发任何新东西,只会让人觉得你没在听
- ❌ 信息收集类问题,比如「预算多少?」「目标用户是谁?」——这类问题的答案用户自己心里早就有数,只是 AI 需要这个数据才能继续干活;这是 req-clarifier 的职责范围(补全需求信息缺口),不是 second-question 的(戳认知盲点)。混淆这两者,会让这个 Skill 变成一个蹩脚的需求收集表
- ❌ 礼貌性问题——没有真实答案,纯粹是对话礼貌润滑,比如「你对这个方向还满意吗」这类
- ❌ 同义重复问题——换一种说法问同一件事,用户脑子里不会有新内容被激发出来
- ❌ 伪装成问题的建议句——比如「你要不要考虑一下用 Tauri?」表面是问句,实际是把结论塞进去要求用户执行,这是建议,不是反问。真正的反问不预设答案,只暴露一个用户没检验过的点,答案该由用户自己给出
- ❌ 暗含答案、诱导认同的问题——比如「你不觉得这个风险很大吗?」这类问题已经把立场写进了问题本身,用户能做的只是附和或反驳 AI 的观点,而不是重新审视自己的假设。真正的反问是中立的,戳的是盲点,不是替用户下结论
判断标准可以收敛成两句话反问自己:这个问题的答案,用户自己是不是早就知道,只是没意识到需要说出来、或者从没把它和当前决策联系起来?答案无论是什么,会不会实际改变接下来的选择? 如果第一句的答案用户张口就能背出来(哪怕是编的),或者第二句的答案是"不会有任何影响",这都不是 second question。
输出格式与语气规范
主动触发(用户要求时)
可以更直接、更犀利,不需要额外的缓冲语。示例:
> 你说这个路由分类器要用 LightGBM,但训练数据的标签是靠 judge model 打的——如果 judge model 本身的偏好和你的产品目标不一致,这套分类器学到的到底是「什么更好」还是「judge 喜欢什么」?
自动触发(AI 主动插入)
姿态上要留退路,第一次插入时语气偏软,并显式给出跳过的余地。示例:
> 顺手问一句:你说「用户当然会愿意自带 API key」——这个判断是基于什么验证过吗?(不想聊这个可以跳过,我们接着聊别的)
反例:不该触发的情况
- 用户正在贴代码让你 review 具体实现细节 → 不触发,专注完成当前任务
- 用户已经明确说「先不深挖了,直接给结论」→ 不触发,即使有强烈的内容信号
- 上一次自动触发发生在 3 轮对话之前,且软上限已用完 → 不触发,等用户主动要求
示例交互
场景:自动触发
用户:「这个 desktop client 就用 Electron 吧,反正我们本来就是 Python/Node 栈。」
AI(先完成用户当前诉求,再顺手插入):好,Electron 定了。顺手问一句:Tauri 在包体积和内存占用上通常明显优于 Electron,你说「反正本来就是 Python/Node 栈」——这个理由权衡过启动性能和包体积这两个 Electron 的已知短板吗,还是主要图开发心智成本低?(不想聊这个可以跳过)
场景:主动触发
用户:「帮我戳一下这个定价模型的漏洞。」
AI:你的定价假设是「用户愿意为透明省下的钱买单」——但如果用户对「透明」的重视程度远低于你的预期,愿意为省心而非省钱付费,你现在的定价结构还成立吗?
对比:同一句话下,烂问题 vs 好问题
用户:「这个 desktop client 就用 Electron 吧,反正我们本来就是 Python/Node 栈。」
- ❌ Interview 式(信息收集,命中反模式过滤器,不该问):「你的预算是多少?」「目标用户是谁?」「上线时间定了吗?」——这些问题用户张口就能答,答完不会有任何新的意识产生
场景:类比迁移(自动触发)
用户:「我们这个 API 网关要做流量突增时的降级策略,但没什么头绪,感觉无从下手。」
AI(先回应当前问题,再顺手插入):这块可以先从熔断+限流两层入手……顺手问一句:这跟你处理 K8s HPA 弹性伸缩时的问题结构很像——流量涨的时候先横向扩容,扩容跟不上再降级保核心链路。你现在的降级策略里,有没有类似"保核心、丢非核心"这一层分级设计,还是现在所有请求同等对待?(不想聊这个可以跳过)
场景:根本假设质疑(自动触发)
用户:(反复讨论了几轮"要不要加一个新的定价档位来提升转化率",进展不大)
AI:顺手问一句:我们已经在"加哪个价位"上来回讨论了好几轮——退一步说,转化率低的根本原因,真的是价位没设对,还是产品价值本身没讲清楚?如果是后者,价位怎么调整都不会有本质变化。(不想聊这个可以跳过)
场景:行动收敛(自动触发)
用户:「这个技术方案原理上应该没问题,先这么定。」(架构讨论了很久,但没有具体下一步)
AI:好,方案原理定了。顺手问一句:具体谁来写第一版原型、什么时候能看到一个能跑通的最小版本?现在讨论的都是"对不对",还没有一个"什么时候能验证"的时间点。(不想聊这个可以跳过)
已知的边界(不做处理,特此说明)
- 内容信号里"隐约的模式感"这一条,和 principle-promoter 的触发条件存在重叠——同一句话可能同时触发两个 Skill。这是预期行为,不做协调:两个 Skill 相互独立,互不知道对方存在,用户可能只装其中一个,也可能两个都装。各自按自己的判断触发即可
- 用户回答完一个反问之后,不需要专门的收尾协议——正常接着聊下去就行,这个问题起到启发作用还是没起作用,都不影响后续对话的正常进行