Least-to-Most详解
关键词:Least-to-Most、逐步分解、问题拆解、层次化推理、复杂问题、子问题分解、两阶段、降维、渐进推理、智能拆解
一、Least-to-Most概述
Least-to-Most(由易到难)是由Google研究院和卡内基梅隆大学的研究者于2023年提出的一个创新性提示词框架。Least-to-Most的核心思想是:将复杂问题分解为一系列简单的子问题,然后按从易到难的顺序逐一解决,最终组合这些子问题的答案来解决原始问题。
与CoT的显式推理链不同,Least-to-Most强调”先分解后解决”的两阶段过程。与ToT的树状探索不同,Least-to-Most的子问题分解是线性的、顺序依赖的。这种方法特别适合那些”整体难以直接解决,但分解后的子问题可以逐步攻克”的复杂任务。
Least-to-Most的核心洞见
复杂问题的难点往往不在于单个子问题的难度,而在于不知道如何将问题分解。通过先教模型如何分解问题,再让模型按照分解方案逐步解决,可以显著提升模型处理复杂任务的能力。
二、核心原理与工作机制
2.1 两阶段流程
Least-to-Most包含两个核心阶段:
阶段1:问题分解
原始问题 → 子问题列表
↓
阶段2:顺序解决
子问题1 → 中间答案1
↓
子问题2(+答案1) → 中间答案2
↓
...
↓
最终答案
2.2 阶段一:问题分解
问题分解阶段的目标是将原始复杂问题拆解为可管理的子问题序列。
分解原则
- 独立性原则:尽可能保证子问题之间的独立性
- 可解决性原则:每个子问题都应该能够被直接回答
- 顺序依赖性:子问题应该按照逻辑顺序排列,前面的问题是后面的基础
- 完整性原则:所有子问题的解答组合起来应该能够回答原问题
分解模板
# 问题分解模板
## 原始问题
{original_question}
## 分解过程
将上述问题分解为以下子问题:
### 子问题1
[最简单的子问题,通常是基础信息查询]
### 子问题2
[基于子问题1答案的进阶问题]
### 子问题3
[基于子问题1、2答案的进一步问题]
...
### 子问题N
[最终问题,通常包含综合分析]
## 分解验证
- [ ] 所有子问题都能被直接回答
- [ ] 子问题按顺序可以逐步解答
- [ ] 解答所有子问题后可以回答原始问题2.3 阶段二:顺序解决
顺序解决阶段按照分解的顺序逐一解决子问题。
解决策略
- 渐进累积:每个子问题的解决都基于前面问题的答案
- 上下文传递:将中间答案作为后续问题的上下文
- 循环验证:最终答案需要能够回溯验证所有中间步骤
解决模板
# 顺序解决模板
## 子问题1:{问题描述}
**解答**:{详细解答}
**中间答案**:{可被后续使用的答案}
## 子问题2:{问题描述}
**上下文**:基于子问题1的答案是...
**解答**:{详细解答}
**中间答案**:{可被后续使用的答案}
## 子问题3:{问题描述}
**上下文**:基于子问题1、2的答案是...
**解答**:{详细解答}
**中间答案**:{可被后续使用的答案}
...
## 最终问题:{原始问题}
**上下文**:基于以上所有子问题的解答...
**最终答案**:{综合所有分析的回答}2.4 为什么Least-to-Most有效
Least-to-Most的有效性源于以下几个方面:
降低认知负荷
复杂问题往往需要同时处理多个信息维度,这对工作记忆造成很大压力。分解后,每个子问题只需关注有限的维度,降低了单次处理的难度。
激活相关知识
每个子问题都可能激活与该子问题相关的特定知识模块。这种分步激活比试图同时激活所有相关知识更加高效和准确。
提供中间检查点
子问题的中间答案是检查推理正确性的”锚点”。如果某个中间答案明显错误,可以及时发现和修正,而不是等到最终答案才暴露问题。
增强可解释性
分解过程本身就是一个解释框架。用户可以清楚地看到问题是如何被拆解的,每个结论是如何得出的。
三、提示词模板
3.1 基础模板
# Least-to-Most基础模板
## 问题
{user_question}
## 任务
请首先将问题分解为简单的子问题,然后逐一解答。
## 第一阶段:问题分解
让我将这个问题分解为以下子问题:
1. [子问题1]
2. [子问题2]
3. [子问题3]
...
## 第二阶段:逐一解答
### Q1: {子问题1}
A1: {解答}
### Q2: {子问题2}
A2: {解答}
### Q3: {子问题3}
A3: {解答}
## 最终答案
基于以上分析,{原始问题}的答案是:{最终答案}3.2 增强模板
# Least-to-Most增强模板
## 问题描述
{original_question}
## 复杂度评估
这个问题涉及:{涉及的领域/维度}
难度评估:{简单/中等/困难/极难}
## 第一阶段:系统分解
### 分解策略
我将采用以下分解策略:{分解策略说明}
### 子问题列表
按照由易到难的顺序排列:
**子问题1(最基础)**:[描述]
需要的信息:{需要的输入}
**子问题2(进阶)**:[描述]
需要的信息:{需要的输入}
**子问题3(综合)**:[描述]
需要的信息:{需要的输入}
...
**子问题N(最终)**:[描述]
需要的信息:{需要的输入}
## 第二阶段:顺序求解
### 第一步:解答子问题1
**问题**:{子问题1}
**分析**:[详细分析]
**答案**:{子问题1答案}
**置信度**:{置信度评估}
### 第二步:解答子问题2
**问题**:{子问题2}
**已有关键信息**:{子问题1答案}
**分析**:[详细分析]
**答案**:{子问题2答案}
**置信度**:{置信度评估}
[继续其他子问题...]
### 最终整合
**原始问题**:{原始问题}
**所有中间答案**:
- {子问题1答案}
- {子问题2答案}
- ...
**综合分析**:[整合所有答案的完整分析]
**最终答案**:{最终答案}
**验证说明**:[验证最终答案的逻辑]3.3 自动分解模板
# 自动分解+求解模板
## 输入问题
{question}
## 自动分解执行
请自动识别问题中的关键要素,并按逻辑顺序分解为子问题。
分解依据:
- 问题包含哪些基本要素?
- 这些要素之间的逻辑关系是什么?
- 解答的顺序应该是什么?
## 输出格式
### 分解方案
1. {子问题1}
2. {子问题2}
3. {子问题3}
...
### 顺序求解
**步骤1** → {子问题1}
结果:{答案1}
**步骤2** → {子问题2}
输入:{答案1}
结果:{答案2}
**步骤3** → {子问题3}
输入:{答案1} + {答案2}
结果:{答案3}
...
**最终答案** → {原始问题}
输入:{所有中间答案}
结果:{最终答案}四、实战应用
4.1 数学问题应用
# 数学问题Least-to-Most示例
## 问题
一家商店有两种套餐。A套餐包含3个汉堡和2杯可乐,标价49元;B套餐包含2个汉堡和3杯可乐,标价41元。请问单个汉堡和单个可乐的单价是多少?
## 第一阶段:问题分解
这个问题可以分解为:
1. 建立方程
- 如何用代数表示A套餐和B套餐?
- 应该设什么变量?
2. 列出方程组
- 基于A套餐的信息列什么方程?
- 基于B套餐的信息列什么方程?
3. 求解方程组
- 如何求解二元一次方程组?
- 汉堡和可乐的单价分别是多少?
4. 验证答案
- 如何验证答案是否正确?
## 第二阶段:顺序求解
### 步骤1:建立方程
设汉堡单价为x元,可乐单价为y元。
根据题意:
- A套餐:3x + 2y = 49
- B套餐:2x + 3y = 41
### 步骤2:求解方程组
**方法1:消元法**
(3x + 2y = 49) × 2 → 6x + 4y = 98
(2x + 3y = 41) × 3 → 6x + 9y = 123
相减:(6x + 4y) - (6x + 9y) = 98 - 123
-5y = -75
y = 15
代入求x:3x + 2(15) = 49
3x = 19
x = 19/3 ≈ 6.33
**方法2:代入法**
从第一个方程:x = (49 - 2y)/3
代入第二个方程:2(49-2y)/3 + 3y = 41
...(计算过程)
### 步骤3:验证答案
- A套餐:3×(19/3) + 2×15 = 19 + 30 = 49 ✓
- B套餐:2×(19/3) + 3×15 = 38/3 + 45 = 49 ✓
## 最终答案
汉堡单价:19/3 ≈ 6.33元
可乐单价:15元4.2 商业分析应用
# 商业分析Least-to-Most示例
## 问题
评估一家新茶饮店是否应该开在写字楼附近,分析需要考虑的关键因素。
## 第一阶段:问题分解
### 维度分解
这个问题需要从多个维度分析:
1. 目标客群分析
- 写字楼人群的特征是什么?
- 他们的消费能力和习惯如何?
2. 竞争环境分析
- 附近有哪些同类竞争者?
- 市场竞争程度如何?
3. 选址条件分析
- 写字楼附近的商铺条件如何?
- 租金和成本如何?
4. 经济效益预测
- 预估收入和成本如何?
- 投资回报期多长?
5. 风险评估
- 主要风险因素有哪些?
- 如何降低风险?
## 第二阶段:顺序分析
### 1. 目标客群分析
**写字楼人群特征**:
- 年龄:25-40岁为主
- 收入:中高层白领
- 消费习惯:追求品质、便利性
**关键洞察**:
- 早高峰和午休是黄金时段
- 偏好外带和快速服务
- 对价格敏感度中等
### 2. 竞争环境分析
**周边竞争者**:
- 现有茶饮店2家
- 奶茶店3家
- 咖啡店1家
**竞争程度**:中等
**差异化机会**:高品质原料、独特口味
### 3. 选址条件分析
**可选位置**:
- A点:写字楼底商,人流量大,租金较高
- B点:步行街拐角,人流量中等,租金适中
### 4. 经济效益预测
**预估数据**(A点):
- 日均客流量:200人
- 平均客单价:28元
- 日营收:5600元
- 月营收:16.8万
- 月成本:约12万(租金+人工+原料)
- 月利润:约4.8万
**投资回报期**:约8-12个月
### 5. 风险评估
**主要风险**:
- 竞争加剧
- 租金上涨
- 客流量低于预期
**风险缓解策略**:
- 差异化经营
- 签订长期租约
- 建立会员体系
## 最终建议
基于以上分析,建议:
1. **选址**:优先考虑A点,如果A点租金过高则考虑B点
2. **定位**:高品质茶饮,主打健康概念
3. **策略**:聚焦早高峰和午休时段,提供快速服务
4. **预期**:8-12个月收回投资4.3 研究分析应用
# 研究分析Least-to-Most示例
## 问题
分析人工智能对劳动力市场的影响,以及个人应该如何应对。
## 第一阶段:问题分解
这个问题包含两个层面,需要分别处理:
### 层面A:影响分析
1. AI当前能替代哪些类型的工作?
2. AI难以替代的工作特征是什么?
3. 哪些行业/岗位受影响最大?
4. 新的工作机会在哪里?
### 层面B:应对策略
1. 个人技能如何重新定位?
2. 终身学习的重要性
3. 具体的转型路径建议
## 第二阶段:分析执行
### 层面A分析
#### 1. AI能替代的工作类型
- 重复性、规律性强的工作
- 数据处理和简单决策
- 标准化服务流程
#### 2. AI难以替代的工作
- 需要创造力和社会洞察
- 复杂人际互动
- 非结构化环境应对
#### 3. 受影响最大的领域
- 制造业:流水线工人
- 服务业:基础客服
- 金融业:基础分析
#### 4. 新的工作机会
- AI训练师和标注师
- 人机协作设计师
- AI伦理和治理专家
### 层面B分析
#### 1. 技能重新定位
- 从执行技能转向策略技能
- 发展AI难以替代的软技能
- 培养人机协作能力
#### 2. 终身学习
- 建立成长型思维
- 保持对新技术的好奇心
- 定期更新知识和技能
#### 3. 转型路径
- 路径1:成为AI使用者
- 路径2:成为AI协作者
- 路径3:成为AI创造者
## 最终结论
[综合以上分析给出建议]五、与CoT/ToT的对比
5.1 核心差异
| 维度 | CoT | ToT | Least-to-Most |
|---|---|---|---|
| 结构 | 线性链 | 树状 | 线性+分层 |
| 分解 | 隐式 | 显式树状 | 显式列表 |
| 依赖 | 步骤依赖 | 路径独立 | 顺序依赖 |
| 探索 | 单路径 | 多路径 | 单路径顺序 |
| 适用 | 推理链清晰 | 多种可能 | 子问题明确 |
5.2 互补关系
Least-to-Most可以与其他技术结合使用:
Least-to-Most + CoT
# 组合模式
## 分解阶段(Least-to-Most)
将问题分解为子问题列表。
## 解决阶段(CoT)
对每个子问题使用CoT进行详细推理。Least-to-Most + ToT
# 组合模式
## 分解阶段(Least-to-Most)
将复杂问题分解为子问题。
## 探索阶段(ToT)
对于复杂的子问题,使用ToT进行树状探索。六、最佳实践与注意事项
6.1 分解质量是关键
分解质量决定整体效果
好的分解应该:
- 子问题之间逻辑清晰
- 顺序易于理解
- 每个子问题可独立回答
- 不遗漏关键要素
6.2 常见问题与解决
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 子问题数量过多 | 分解过细 | 合并相关子问题 |
| 子问题顺序混乱 | 逻辑关系不清晰 | 重排顺序,确保依赖关系 |
| 中间答案累积误差 | 子问题过多 | 增加验证步骤 |
| 分解不完整 | 分析不够深入 | 重新审视原始问题 |
6.3 适用场景
Least-to-Most特别适合以下场景:
- 多维度问题:需要从多个角度分析的问题
- 层次分明的问题:问题本身具有自然的层次结构
- 需要中间验证:希望验证中间步骤的正确性
- 教学场景:需要展示推理过程的问题
- 复杂计算:需要分步计算的问题
6.4 不适用场景
- 简单问题:不需要分解的简单问题
- 高度非线性:子问题之间高度耦合
- 创意任务:需要整体性思维而非分解的任务
七、提示词优化技巧
7.1 分解优化
# 优化分解质量的提示
## 分解要求
1. 子问题应该"刚好"可以回答:不要太简单(无需思考),也不要太复杂(需要进一步分解)
2. 每个子问题应该有一个明确的"正确答案"
3. 子问题的排列应该体现逻辑递进关系
## 检查清单
- [ ] 子问题是否覆盖了原始问题的所有关键要素?
- [ ] 子问题之间是否有清晰的依赖关系?
- [ ] 是否存在循环依赖或前置条件缺失?7.2 上下文传递优化
# 优化上下文传递
## 显式传递
每个子问题的回答应该包含:
- 该子问题的答案
- 对后续问题可能有帮助的关键信息
- 可能影响后续分析的注意事项
## 格式规范
建议使用以下格式组织答案:
**核心答案**:[直接回答问题]
**支撑信息**:[支持答案的证据或推理]
**前瞻信息**:[可能对后续问题有用的洞察]7.3 验证机制
# 添加验证机制
## 子问题验证
每个子问题回答后,添加:
"这个答案是否符合常识?如果发现异常,请重新检查。"
## 最终验证
在最终答案后,添加:
"请验证:最终答案是否能够合理推导出每个子问题的答案?"八、代码实现参考
8.1 Python实现
class LeastToMostSolver:
def __init__(self, model):
self.model = model
def decompose(self, question: str) -> list:
"""问题分解"""
prompt = f"""
将以下问题分解为简单的子问题序列。
子问题应该从易到难排列,每个子问题应该能够被直接回答。
问题:{question}
请按以下格式输出:
1. [第一个子问题]
2. [第二个子问题]
...
"""
response = self.model.generate(prompt)
sub_questions = self.parse_sub_questions(response)
return sub_questions
def solve_sequentially(self, question: str, sub_questions: list) -> dict:
"""顺序求解"""
context = ""
results = []
for i, sq in enumerate(sub_questions):
# 构建带有上下文的提示
prompt = f"""
问题:{sq}
已知信息:{context}
请详细解答上述问题。
"""
answer = self.model.generate(prompt)
# 更新上下文
context += f"\n子问题{i+1}答案:{answer}"
results.append({
"question": sq,
"answer": answer
})
# 最终整合
final_answer = self.integrate(question, results, context)
return {
"sub_results": results,
"final_answer": final_answer
}
def integrate(self, original_question: str, results: list, context: str) -> str:
"""整合所有答案"""
prompt = f"""
原始问题:{original_question}
已解答的子问题及其答案:
{context}
请综合以上信息,给出原始问题的最终答案。
"""
return self.model.generate(prompt)
def run(self, question: str) -> dict:
"""运行完整的Least-to-Most流程"""
# 阶段1:分解
sub_questions = self.decompose(question)
# 阶段2:顺序求解
results = self.solve_sequentially(question, sub_questions)
return results