Self-Ask
Self-Ask(Press et al., 2022)的核心是让模型把“直接回答”改成一个更稳的流程:先判断是否需要补充信息/分解问题 → 生成后续子问题 → 逐个回答子问题 → 汇总回答原问题。它本质上是一种“显式问题分解(question decomposition)”与“自我提问(self-query)”的提示框架,常用于提升多跳推理与复杂问答的可靠性。
在原论文与后续实践中,Self-Ask 还经常与外部工具结合(例如搜索引擎/知识库),即 Self-Ask + Search:模型先提出需要查证的子问题,再去检索回答这些子问题,最后综合。
1) Self-Ask 适用场景
特别适合:
- 多跳问题:需要先求 A 再求 B(人物关系、时间线、组合条件)。
- 事实查证:需要先确认某个事实再推导结论(适合接搜索/RAG)。
- 复杂决策/方案:需要先澄清需求、约束、资源,再输出方案。
- 用户问题信息不足:模型先提出澄清问题,比直接瞎答更好。
不太适合(或要加约束):
- 强结构化输出(纯 JSON):需要把“自问自答”隐藏到内部,或分阶段输出。
- 对延迟极敏感的场景:Self-Ask 可能增加步骤与 token。
2) 标准流程(你可以这样理解)
Self-Ask 通常包含 4 个阶段:
- Need follow-up?:判断是否需要后续问题
- Generate follow-up questions:生成子问题(通常 2-5 个)
- Answer follow-ups:回答子问题(必要时调用检索/工具)
- Final answer:综合子问题答案,回答原问题
什么是Follow-up questions
“Follow-up questions”(后续问题/追问)指的是在你已经提出并得到初步回答之后,为了把事情问得更清楚、更具体或继续深入而提出的补充问题。
常见目的:
- **澄清**:把不明确的地方问清楚
例:你说“可以优化性能”,那具体指哪些优化点?
- **补充信息**:把缺失的关键信息补上
例:如果是在手机端和电脑端表现不一样,该怎么处理?
- **深入细节**:从概念进入可操作步骤
例:能给一个具体的实现步骤或代码示例吗?
- **验证理解/确认结论**:确认自己理解对不对
例:所以你的意思是先做A,再做B,对吗?
- **延伸到相关问题**:从当前话题自然扩展
例:除了这种方案,还有没有更简单/更便宜的替代方案?
一句话:**Follow-up questions 就是基于已有对话的“继续追问”,让答案更准确、更完整或更深入。**
3) Prompt 模板(可复制)
模板 A:纯提示词版(不接工具)
适合:知识主要在模型内部、或是逻辑分解类任务。
你将使用 Self-Ask 方式回答问题。
步骤:
- 判断是否需要后续问题(Need follow-up: Yes/No)。
- 如果需要,提出 2-5 个后续问题(Follow-up questions)。
- 逐个回答这些后续问题(Answers)。
- 最后基于上述回答,给出原问题的最终答案(Final)。
原问题:{question}
模板 B:Self-Ask + 检索/RAG(工程最常用)
适合:事实型、多跳、需要可验证来源。
你将使用 Self-Ask 方式,并且你可以调用检索工具来回答后续问题。
- 先输出:Need follow-up: Yes/No
- 若 Yes:列出 Follow-up questions(每个应当是可检索、可验证的)
- 对每个问题:先检索,再基于检索结果回答
- 最后综合为 Final answer,并标注引用/依据来自哪些检索片段
原问题:{question}
(如果你有特定工具接口,可以把“检索”替换成 search(query) 或你的 RAG 函数。)
模板 C:面向产品的结构化输出(便于控制)
输出 JSON:
{
"need_follow_up": true/false,
"follow_up_questions": ["..."],
"follow_up_answers": ["..."],
"final_answer": "..."
}
4) 应用场景例子 1:多跳事实问题(经典用法)
原问题:
《哈利·波特》的作者出生在哪个国家的哪个城市?
Self-Ask 会分解成:
- Follow-up 1:哈利·波特作者是谁?(J.K. Rowling)
- Follow-up 2:J.K. Rowling 出生城市和国家是什么?(例如:英国,Yate/约特——具体需查证)
- Final:综合给出国家+城市
如果接搜索/维基/RAG,这类问题准确率会明显高于“一步到位凭记忆”。
5) 应用场景例子 2:方案类问题(先澄清再设计)
原问题:
帮我设计一个公司内部知识库的检索系统。
Self-Ask 的后续问题可能是:
- 你的知识源有哪些(Wiki、PDF、工单、代码)?
- 需要哪些权限模型(部门/角色/项目)?
- 主要查询类型(FAQ、排障、政策)?
- 预算与延迟要求?
- 是否需要可追溯引用?
然后模型再给出架构:采集→切分→向量/倒排→重排→权限过滤→评测→监控。
6) 应用场景例子 3:数学/逻辑分解(不一定要检索)
原问题:
一个商店打八折后再减 20 元,原价 200 的商品现在多少钱?
Self-Ask 子问题:
- 先算八折后的价格是多少?(200×0.8=160)
- 再减 20 元得到多少?(140)
Final:140 元
这里 Self-Ask 的价值在于强制“分步”,降低跳步算错。
7) 与相近方法的区别(避免混淆)
- Self-Ask vs CoT(Chain-of-Thought):
CoT 是“直接展开推理步骤”;Self-Ask 是“先提出子问题再回答”,更像显式分治,且更适合接检索。 - Self-Ask vs RaR:
RaR 是“把原问题改写得更清楚再答”;Self-Ask 是“把问题拆成多个可回答子问题再综合”。 - Self-Ask vs S2A:
S2A 主要“去除无关信息/注入”,Self-Ask 主要“分解并补齐信息”。
如果你告诉我:你打算把 Self-Ask 用在 纯对话 还是 RAG/搜索问答,以及你希望输出是“给用户看见的自问自答”还是“内部进行、只给最终答案”,我可以给你一份更贴近你系统的 Prompt 模板(包含字段、最大子问题数、何时必须提问澄清、以及如何把每个子问题变成检索 query)。