Self-Ask(自我提问)是一种提示词工程技术,通过引导大语言模型在回答复杂问题前显式地提出并回答一系列中间子问题,从而提升多跳推理和事实性问答的准确率。该方法由 Ofir Press、Muru Zhang、Sewon Min 等研究者于 2023 年在 EMNLP 论文《Measuring and Narrowing the Compositionality Gap in Language Models》中提出。Self-Ask 的结构化输出格式使其能够无缝接入搜索引擎等外部工具,进一步减少模型幻觉,在企业知识库问答、智能客服等场景中具有广泛的落地价值。
Self-Ask 通过在提示词末尾插入固定短语"Are follow up questions needed here:"来触发模型的自提问行为。模型首先判断当前信息是否足以直接回答原始问题:若认为需要补充信息,则输出一条或多条以"Follow up:"开头的子问题;每提出一个子问题后,模型随即给出"Intermediate answer:"格式的中间答案,再继续判断是否需要更多追问。当模型认为信息充分时,输出"So the final answer is:"引出最终答案。
思维链(Chain-of-Thought, CoT)要求模型输出连续的推理步骤,但步骤之间没有明确的结构边界,本质上是一种自由格式的"内心独白"。Self-Ask 则强制模型将推理过程拆分为结构化的问答对,每个子问题都是独立可验证的信息单元。这种显式分解使得中间结果可以被外部工具(如搜索引擎、数据库查询)替代或校验,而 CoT 的隐式推理步骤难以与工具对接。
该方法的提出源于对"组合性差距"(compositionality gap)现象的观察:大语言模型在多跳问答任务中,往往能正确回答各个子问题,却无法将这些正确答案组合成最终的复合答案。研究表明,随着 GPT-3 系列模型规模增大,单跳问答性能的提升速度远快于多跳问答,这意味着更大的模型只是记住了更多事实,并未真正改善组合推理能力。Self-Ask 通过将组合推理显式化——先拆解、再逐个求解、最后合成——有效缩小了这一差距。
将一个复杂的多跳问题拆解为多个简单的单跳子问题后,模型每一步只需处理较低认知负荷的任务。例如面对"贾斯汀·比伯出生那年的大师赛冠军是谁?"这一问题,Self-Ask 会将其拆为"贾斯汀·比伯哪年出生?"和"某年大师赛冠军是谁?"两个独立子问题,每个子问题的回答难度远低于原始问题。
每个"Follow up — Intermediate answer"问答对构成推理链上的一个节点,这些节点彼此独立且可被单独验证。这种透明性带来了两个好处:一是开发者可以精确定位推理过程中哪一步出错,便于调试和优化;二是中间答案可以作为审计依据,在法律、医疗等高合规要求场景中尤为重要。
由于子问题以结构化格式呈现,系统可以在模型生成子问题后拦截它,转而调用搜索引擎、企业知识库或 API 来获取中间答案,再将结果反馈给模型进行下一步推理。这种"模型提问 + 工具作答"的模式大幅降低了因模型内部知识过时或不准确导致的错误。在生产环境中,可基于腾讯云 TI-ONE 等平台集成搜索工具链,构建高可信的问答系统。
Self-Ask 的原始实现完全基于提示词工程,不需要任何额外的模型训练或微调。只需在用户问题前添加少量示例(few-shot prompting),展示"问题 → 自提问 → 中间答案 → 最终答案"的格式范式,即可让现有大语言模型(如混元、GPT-4o、Claude 等)立即具备自提问能力。这使得该方法可以零成本部署到已有的 LLM 应用中。
主流 Agent 开发框架已将 Self-Ask 作为内置设计模式。LangChain 提供了 create_self_ask_with_search_agent 接口,开发者只需传入大模型实例和搜索工具(如 TavilyAnswer),即可快速搭建具备自提问能力的智能代理。腾讯云 TI-ONE 平台也支持类似的 Agent 编排能力,允许用户通过可视化方式将 Self-Ask 逻辑与向量数据库、API 网关等组件组合,构建企业级推理流水线。
虽然 Self-Ask 本身无需训练,但后续研究探索了通过微调进一步提升其效果的路径。例如,可以用高质量的自提问推理链数据对模型进行监督微调(SFT),或使用偏好优化算法(如 DPO)让模型学会生成更有效的子问题。这类方法属于锦上添花,基础版 Self-Ask 在大多数场景下已能直接使用。
在原始 Self-Ask 设计中,停止条件完全由模型自行决定。当模型评估当前累积的中间答案已足够推导最终结论时,它会跳过"Follow up:"分支,直接输出"So the final answer is:"。这种自适应机制的优势在于不同复杂度的问题会自动产生不同深度的推理链,无需人工预设规则。
为防止模型陷入无限追问或产生过多冗余子问题,工程实践中通常会设置最大追问轮次(如最多 3–5 个子问题)。一旦达到上限,系统强制模型基于已有中间答案生成最终回复。这个阈值的选取需要在推理完整性和响应延迟之间权衡。
更精细的实现会引入两种辅助判停机制:一是置信度评分,当模型对某个中间答案的置信度低于阈值时触发外部工具查询而非继续追问;二是依赖图分析,跟踪子问题之间的引用关系,检测到循环依赖(A 依赖 B、B 又依赖 A)时主动终止。这两种机制能有效避免推理链偏离轨道。
对于单跳事实性问题(如"珠穆朗玛峰海拔多少米?"),模型通常不需要任何追问即可直接作答;对于两跳问题(如"奥巴马夫人出生在哪座城市?"),一般需要 1–2 个子问题;对于更复杂的多跳推理(如涉及三个以上事实的组合),追问深度可能达到 3–5 层。实际部署时可设置分级策略:简单问题走直通路径,复杂问题启用多层追问。
每一层追问都会增加模型的输出 token 数量和推理延迟。行业实践表明,Self-Ask 相比直接提问会显著增加 token 消耗,具体幅度取决于问题的复杂度和追问深度。在高并发生产场景中,建议对追问总 token 数设置预算上限,超出后降级为直接回答或返回"需要更多信息"的友好提示。
最优实践是根据意图识别结果动态选择是否启用 Self-Ask。对于数学计算、逻辑推理、多跳事实查询等场景开启自提问;对于情感分析、文本分类、创意写作等任务则跳过该步骤。这种路由机制可以在保证准确率的同时最大化系统吞吐效率。
在原始论文的实验中,Self-Ask 在多个权威多跳问答数据集上均取得了显著优于直接提问和思维链的成绩。以下是关键数据(精确匹配率 EM,百分比):
方法 | Bamboogle | 2WikiMultiHopQA | MuSiQue |
|---|---|---|---|
直接提问 | 17.6 | 25.4 | 5.6 |
思维链(CoT) | 46.4 | 29.8 | 12.6 |
Self-Ask | 57.6 | 30.0 | 13.8 |
Self-Ask + 搜索引擎 | 60.0 | 40.1 | 15.2 |
Self-Ask 相比直接提问在 Bamboogle 上提升了 42.4 个百分点,在 2WikiMultiHopQA 上提升了 14.7 个百分点,在 MuSiQue 上提升了 9.6 个百分点。接入搜索引擎后,2WikiMultiHopQA 的准确率进一步提升至 40.1%,较纯 Self-Ask 高出 10.1 个百分点。
Self-Ask 在最困难的 Bamboogle 数据集上比思维链高出 11.2 个百分点,这一差距说明在高度组合性的推理任务中,结构化的子问题分解比连续的自由推理更为有效。在较简单的数据集上两者差距较小,表明 Self-Ask 的难度优势主要体现在问题复杂度较高的场景。
除准确率外,Self-Ask 在推理效率上也优于同类方法。与 Least-to-Most prompting 相比,Self-Ask 在取得相当或更好准确率的同时,token 消耗减少约 30%,推理速度更快。这是因为 Self-Ask 在一次前向传播中完成问题分解和求解,而 Least-to-Most 需要对每个子问题分别发起独立的模型调用。
最常用的评估指标包括精确匹配(Exact Match, EM)和 F1 分数。EM 要求预测答案与标准答案完全一致(经过标准化处理后),适合有唯一正确答案的事实性问题;F1 分数衡量预测答案与标准答案之间的词级别重叠度,对部分正确的答案给予一定宽容。
除了最终答案的正确性,还可以评估推理链本身的质量:子问题是否覆盖了回答主问题所需的全部关键信息?中间答案是否准确?是否存在冗余或偏离主题的子问题?这类评估通常需要人工标注或使用更强的大模型作为评判者(LLM-as-Judge)。
当 Self-Ask 与搜索引擎等外部工具结合时,可以额外追踪工具调用的成功率:模型提出的子问题是否能被搜索引擎有效理解?返回的结果是否包含正确答案?这些信息有助于定位系统瓶颈是在模型的问题生成环节还是在工具的检索环节。
这是 Self-Ask 最核心的适用场景。当一个问题需要串联两个或以上独立事实才能得出答案时(如"哪位导演执导了获得奥斯卡最佳影片的那部电影,而该片上映年份恰好是某位名人出生的年份?"),Self-Ask 的结构化拆解能显著提升准确率。
在阅读理解和开放域问答中,答案往往分散在多篇文档的不同段落里。Self-Ask 可以将"找到所有相关事实并综合"这一模糊任务转化为一系列明确的子查询,每个子查询对应一篇文档或一个段落的信息抽取。
涉及数值计算、排序、比较的问题(如"A 公司和 B 公司哪家的年营收增长率更高?")也适合 Self-Ask 模式:先分别查询两家公司的营收数据,再进行比较运算。这种方式避免了模型在单步推理中同时执行检索和计算的认知负担。
多跳问答中最常见的类型是"桥接实体"推理:问题中提到的实体 A 与答案实体 C 之间没有直接关联,需要通过中间实体 B 建立连接。例如"特斯拉 CEO 的妻子出演过哪部漫威电影?"需要先找出"特斯拉 CEO = 埃隆·马斯克",再查"埃隆·马斯克的妻子",最后查"她出演的漫威电影"。Self-Ask 天然适合这类任务,因为每个"Follow up"正好对应一跳推理。
Self-Ask 在处理多跳问题时采用迭代累积策略:每解决一个子问题,其中间答案就被追加到上下文历史中,作为下一轮推理的已知条件。这种设计确保了推理链的连续性——后面的子问题可以引用前面已经求得的答案,逐步逼近最终结论。
Self-Ask 在多跳问答中的主要失败模式有两种:一是子问题生成偏差,即模型提出了错误的拆解方向,导致后续推理全部偏离;二是中间答案错误传播,即某一步的子问题回答有误,污染了最终合成。缓解措施包括:设置最大追问深度、对中间答案进行交叉验证、以及引入回溯机制允许模型修正之前的错误判断。
Self-Ask 最有效的抗幻觉机制是将子问题的答案获取权交给外部可信源。当一个子问题被发送至搜索引擎或企业知识库时,返回的是客观存在的文档片段而非模型生成的文本,这从根本上切断了幻觉的产生路径。实验表明,Self-Ask 配合搜索引擎后,在 Bamboogle 数据集上的准确率从 57.6% 进一步提升至 60.0%。
每个中间答案都有明确的来源标记——无论是来自模型内部知识还是外部工具——这使得最终答案的每个组成部分都可以被追溯到具体的证据。在金融、法律、医疗等高风险领域,这种可追溯性比单纯的准确率数字更为重要,因为它允许人类专家对推理过程进行逐段审核。
Self-Ask 主要针对事实性幻觉(编造不存在的事实)有效,对逻辑幻觉(推理过程中的谬误)和语义幻觉(曲解用户意图)的抑制作用较弱。此外,如果外部工具本身返回了错误信息(如搜索引擎返回了不相关的页面),Self-Ask 无法自动识别这类"工具侧幻觉",仍需配合人工审核或多源交叉验证机制。
典型的企业级 Self-Ask 问答系统包含以下组件:意图识别模块负责判断用户问题是否需要多跳推理;Self-Ask 引擎负责生成子问题序列;工具层包含企业搜索引擎、向量数据库(如腾讯云向量数据库)、知识图谱等知识源;合成模块负责将各子问题的答案整合为最终回复。整个流程可部署在腾讯云容器服务上,通过 API 网关对外提供服务。
企业知识库中的信息往往以非结构化文档和结构化数据两种形态并存。Self-Ask 可以与知识图谱形成互补:对于涉及实体关系的查询(如"A 产品的供应商 B 的工厂位于哪个园区?"),Self-Ask 先生成子问题,再由知识图谱执行精确的关系查询;对于需要阅读长文档的场景,则由 RAG 管道提供答案。这种混合架构兼顾了精确性和覆盖面。
传统智能客服在面对复合型用户咨询时(如"我上个月购买的产品还在保修期内吗?"需要先查购买日期、再查保修政策)容易给出笼统或错误的回复。引入 Self-Ask 后,客服机器人会将此类问题拆解为"用户的购买日期是什么?""该产品的保修期限是多久?""当前日期距离购买日期是否在保修期内?"等子问题,逐一求解后给出精准答复。
在金融投资领域,分析师经常需要回答涉及多家公司、多个财务指标的复杂问题。Self-Ask 系统可以自动拆解问题、从 Wind、Bloomberg 或企业内部数据库中检索各项数据,最后生成带有数据来源标注的分析报告,大幅提升研究效率。
当运维人员提交一个复杂的故障描述时,Self-Ask 驱动的工单系统可以自动生成诊断子问题序列:先确认故障影响范围,再检查最近的变更发布记录,然后核对监控指标异常时间点,最终给出可能的根因分析和修复建议。
知识图谱擅长存储和查询结构化的实体关系,但在面对自然语言形式的复杂问题时,需要先有人将问题翻译成图查询语句(如 Cypher 或 SPARQL)。Self-Ask 恰好填补了这一空白:它可以将自然语言问题拆解为一系列原子化的子问题,每个子问题要么可以直接映射为知识图谱上的单跳查询,要么可以通过 RAG 从非结构化文档中获取答案。
一种可行的融合架构是:Self-Ask 作为顶层推理控制器,负责问题拆解和答案合成;知识图谱作为底层知识源之一,负责回答涉及实体关系的子问题。当 Self-Ask 生成一个子问题后,系统先尝试在知识图谱上执行精确查询;若图谱中没有相关信息,则回退到向量检索或大模型内部知识。这种"图谱优先、文本兜底"的策略在实践中已被证明能有效提升多跳问答的准确率。
国内已有企业在知识管理系统中探索与 Self-Ask 理念相似的路径——通过问题拆解和多跳推理提升问答质量。例如中国铁塔信息技术研究院构建了融合大模型与知识图谱的垂域知识库,支持跨文档的多轮推理与证据整合;腾讯乐享平台也采用了"任务规划器 + 私域知识萃取 + 模型推理"的双驱模式,在检索前对复杂问题进行意图识别与子任务拆解。这些实践验证了自提问式推理方法在企业知识管理场景中的可行性。
LangChain 框架原生提供了 Self-Ask 的实现。开发者可以通过 create_self_ask_with_search_agent 函数快速创建一个自提问代理,只需传入大模型实例和搜索工具列表。框架内置了标准的 Self-Ask 提示模板(可通过 hub.pull("hwchase17/self-ask-with-search") 加载),开箱即用。
论文作者 Ofir Press 在 GitHub 上开源了 Self-Ask 的参考代码仓库(github.com/ofirpress/self-ask),包含了完整的提示词模板、评估脚本以及在多个基准数据集上的实验配置。该仓库使用 OpenAI API 作为默认推理引擎,同时也支持替换为其他兼容的大模型接口。
围绕 Self-Ask 的核心思想,社区还衍生出了多种变体实现:有的将其与 ReAct 框架结合,在自提问的基础上增加行动执行能力;有的将其集成到 AutoGen、LlamaIndex 等 Agent 框架中,作为多智能体协作的一种通信协议。这些扩展进一步丰富了 Self-Ask 的应用生态。
思维链的输出是一段连续的、自由格式的推理文本,类似于人类的"内心独白",步骤之间没有明确的格式标记。Self-Ask 的输出则是严格结构化的问答序列,每个推理步骤都以"Follow up:"开头、以"Intermediate answer:"结尾,形成了机器可读的固定模式。
由于 CoT 的推理步骤是自由文本,很难在不干扰模型思路的前提下插入外部工具调用。Self-Ask 的结构化格式则天然支持工具拦截——每当模型输出一个"Follow up:"子问题时,系统可以暂停模型生成,将该子问题发送给搜索引擎或数据库,再将结果作为"Intermediate answer:"反馈回去。这种"问—答—再问—再答"的节奏使 Self-Ask 成为连接大模型与外部世界的理想桥梁。
思维链在数学推理、符号逻辑、代码生成等需要连续演绎的任务上表现更佳,因为这些任务的推理步骤之间存在强依赖关系,不适合被割裂为独立的问答对。Self-Ask 则在事实性多跳问答、跨文档信息综合、需要外部知识验证的场景中占据优势,因为这些场景的核心挑战正是"找到正确的信息碎片并正确组合",而这恰好是自提问机制最擅长解决的问题。