前言
在AI Agent的推理架构中,ReAct主打边思考边执行,而Self-Ask(自问式推理)则是以逐层拆解、追根溯源为核心的推理范式。
该范式由Google Research在论文《Measuring and Narrowing the Compositionality Gap in Language Models》中提出,主要用于解决大模型存在的组合性鸿沟:模型能够答对单个子问题,却难以整合多段信息完成复杂问题作答,同时有效缓解模型幻觉问题。
本文从核心定义、运行流程、架构拆解、代码实战、优缺点、范式对比、场景选型等维度,全面讲解 Self-Ask,帮你理清它与 ReAct 的区别及落地边界。
一、Self-Ask 是什么?
1. 名词释义
Self-Ask = Self(自我) + Ask(提问),直译自问自答,是一种显式子问题驱动的迭代推理范式。
核心思想:面对复杂问题,模型不直接输出答案,而是主动识别信息缺口、拆分出子问题,逐一查询验证后,再整合所有中间结果给出最终答案,整个推理过程透明可追溯。
2. 解决的核心痛点
原生大模型与 ReAct 范式在多跳问答、事实核查场景中存在明显缺陷:
- 直接推理容易产生幻觉,凭空编造中间结论;
- 缺乏标准化问题拆解逻辑,复杂问答容易偏离主题;
- 多步骤信息整合能力弱,无法突破组合性鸿沟。
Self-Ask 的核心价值:强制模型结构化拆分问题、显化推理链路,依靠外部工具获取客观事实,从源头降低幻觉,提升复杂问答的准确率。
3. 核心特征
- 优先拆分问题,主动识别信息缺口,而非直接执行动作;
- 遵循「主问题→子问题→中间答案→最终答案」的固定推理链路;
- 以外部工具获取事实为依据,不依赖模型主观推理;
- 侧重问题拆解,不做全局任务规划。
二、Self-Ask 完整运行闭环
Self-Ask 拥有高度标准化的执行流程,整体分为五步闭环:
1. 接收主问题
获取用户提出的复杂问题,作为推理起点。
2. 信息缺口判断
模型判断当前信息是否足以直接作答:
- 信息充足,直接输出最终答案,流程结束;
- 信息不足,生成精准的子问题,定位缺失内容。
3. 调用工具回答子问题
借助搜索、知识库等外部工具,查询子问题对应的客观答案。
4. 迭代追问
将子问题与对应答案补充至上下文,重复判断、提问、查询流程,不断补全信息,直到所有缺口被填满。
5. 整合输出最终答案
汇总全部子问题与中间结果,梳理逻辑后生成完整回答。
流程示意图
用户主问题 Q₀ ↓ 缺口判断 → 无法直接回答 ↓ 生成子问题 Q₁ → 工具执行 → 中间答案 A₁ ↓ 生成子问题 Q₂ → 工具执行 → 中间答案 A₂ ↓ (迭代追问,直到信息充足) ↓ 整合所有结果 → 输出最终答案循环终止条件
- 信息完整,可直接回答主问题;
- 达到预设最大追问轮次,防止无限循环;
- 子问题无法查询到有效结果,任务中断。
三、Self-Ask 核心组成模块
整套架构结构简单、耦合度低,主要由四大模块构成:
- LLM 大模型:负责判断信息缺口、生成子问题、整合最终答案,是推理核心;
- Tool 工具:以搜索、知识库查询为主,用于获取客观事实;
- Parser 解析器:识别子问题与最终答案标记,标准化解析模型输出;
- Memory 记忆模块:存储历史子问题与中间答案,保证上下文连贯。
四、极简可落地代码实战
代码无第三方框架依赖,兼容 OpenAI、Ollama 及各类私有化大模型接口。
fromopenaiimportOpenAI# 接口配置client=OpenAI(base_url="http://localhost:11434/v1",api_key="sk-dummy")# 定义搜索工具defsearch(query:str)->str:mock_data={"特斯拉2025年营收最高的业务是什么?":"电动汽车销售","特斯拉电动汽车业务的CEO是谁?":"埃隆·马斯克","埃隆·马斯克的毕业院校是哪所?":"宾夕法尼亚大学"}returnmock_data.get(query,"未查询到相关信息")# Self-Ask 提示词SELF_ASK_PROMPT=""" 你是Self-Ask推理助手,严格遵循以下规则: 1. 收到问题后,先判断能否直接回答; 2. 不能直接回答,必须生成1个精准子问题(以"Follow-up Question:"开头); 3. 子问题聚焦1个信息缺口,不生成无关问题; 4. 信息充足时,以"Final Answer:"开头输出最终答案; 5. 禁止编造答案,必须依赖搜索结果。 示例: Q:法国首都的天气怎么样? Follow-up Question:法国的首都是什么? (工具返回:巴黎) Follow-up Question:巴黎今天的天气怎么样? (工具返回:晴,25℃) Final Answer:法国首都是巴黎,今天天气晴,25℃。 """# Self-Ask 核心逻辑defself_ask_agent(user_query:str,max_round:int=5)->str:context=f"{SELF_ASK_PROMPT}\n用户问题:{user_query}"round_cnt=0whileround_cnt<max_round:round_cnt+=1print(f"\n【第{round_cnt}轮 - 缺口判断/生成子问题】")resp=client.chat.completions.create(model="qwen2.5",messages=[{"role":"user","content":context}])content=resp.choices[0].message.content.strip()print("模型输出:\n",content)# 输出最终答案,结束任务ifcontent.startswith("Final Answer:"):print("\n✅ 任务完成,输出最终答案")returncontent.replace("Final Answer:","").strip()# 无法生成有效子问题,终止任务ifnotcontent.startswith("Follow-up Question:"):return"无法生成有效子问题,任务终止"# 提取子问题并调用工具sub_question=content.replace("Follow-up Question:","").strip()print("\n【执行工具 - 搜索子问题】")search_result=search(sub_question)print("工具返回:",search_result)# 更新上下文,进入下一轮迭代context+=f"\n子问题:{sub_question}\n工具结果:{search_result}\n请继续分析。"return"达到最大追问轮次,任务终止"# 测试运行if__name__=="__main__":result=self_ask_agent("特斯拉2025年营收最高的业务,其CEO的毕业院校是哪所?")print("\n最终结果:",result)五、Self-Ask 核心优势
1. 大幅降低模型幻觉
固定「子问题 + 事实查询」的推理链路,中间结论均来自外部工具,而非模型主观编造,答案可信度更高。
2. 推理链路透明可溯源
每一轮的子问题、查询结果、推理过程完整留存,便于问题排查、调试与复盘。
3. 解决组合性推理难题
专门针对多跳嵌套问答设计,有效弥补大模型拆分复杂问题、整合多段信息能力不足的短板。
4. 实现成本低、易落地
依靠提示词工程即可实现,无需复杂调度模块,LLM 调用次数可预判,资源消耗可控。
六、Self-Ask 存在的短板
1. 应用场景局限性大
仅适配事实类问答场景,不适合创意生成、复杂工具操作、长流程自动化等任务。
2. 效果依赖模型拆解能力
小模型或能力较弱的模型容易生成冗余、无关的子问题,直接影响整体推理效果。
3. 容错率低,强依赖工具质量
子问题答案完全依靠搜索 / 知识库,一旦工具返回错误、过时信息,最终答案也会出错,缺少纠错机制。
4. 灵活性不足,无全局规划能力
流程固定死板,不支持分支判断、优先级调度、异常兜底,难以处理非结构化的复杂任务。
七、Self-Ask vs ReAct 范式对比
| 对比维度 | Self-Ask(自问推理) | ReAct(推理行动) |
|---|---|---|
| 核心定位 | 事实拆解型推理 | 任务执行型交互 |
| 推理逻辑 | 先拆分子问题,查询后再作答 | 思考、行动、观察循环执行 |
| LLM 职责 | 缺口判断、生成子问题、结果整合 | 决策判断、工具选择、答案生成 |
| 工具依赖 | 强依赖搜索类工具 | 支持全类型工具,适配范围广 |
| 幻觉控制 | 能力极强 | 能力中等 |
| 灵活性 | 低,流程标准化 | 高,动态适配各类场景 |
| 适用场景 | 多跳问答、事实核查、信息检索 | 智能客服、工具调用、实时交互 |
选型口诀:事实拆解用 Self-Ask,交互执行用 ReAct。
八、落地场景选型
✅ 适合使用 Self-Ask
- 多跳嵌套类问答、长链路事实查询;
- 内容核查、信息溯源、知识库问答系统;
- 行业调研、数据整理、资料检索类需求;
- 对答案真实性、可追溯性要求高的问答场景。
❌ 不适合使用 Self-Ask
- 自动化操作、接口调用、办公流程等工具类任务;
- 文案创作、脑洞生成、主观论述类内容创作;
- 多分支、多依赖的长流程业务;
- 复杂数学运算、代码调试、数据处理场景。
九、全文总结
1. Self-Ask 是以自问自答、逐层拆解为核心的推理范式,核心目标是解决大模型组合性推理缺陷与幻觉问题。。
2. 它的优势是推理链路清晰、答案可信度高、上手简单,是事实类问答场景的优选方案。
3. 受限于设计逻辑,该范式场景单一、灵活性差,无法胜任复杂执行类任务。
4. Self-Ask 与 ReAct 属于互补关系,可根据业务需求单独使用,也可在复杂场景下组合搭配。
掌握 Self-Ask 的原理与落地方式,能够进一步完善你对 AI Agent 推理体系的认知,也是问答类智能体开发与面试的重要知识点。
(注:博文是作者学习记录,文档部分内容可能由 AI 生成)