Tree-of-Thought(ToT)
探索多条推理路径
Chain-of-Thought 是线性推理(一条路走到底),而 Tree-of-Thought(树状思维,ToT)允许模型在每个推理步骤探索多个分支,评估每个分支的前景,然后选择最有希望的路径继续深入——类似于国际象棋程序的搜索树。
ToT 特别适合需要规划、创意探索、多步问题分解的任务,如:写作规划、代码架构设计、商业策略制定。
# ToT 提示词模板
想象三位不同的专家在一起解决这个问题。
每位专家将分享自己的思考步骤,
然后相互讨论并可以修正自己的想法。
问题:我们公司有一款 B2B SaaS 产品,
月活跃用户 5000,但续约率只有 60%,
请提出改善策略。
专家A(产品角度)的思考:
专家B(运营角度)的思考:
专家C(客户成功角度)的思考:
三位专家讨论后得出的共同建议:
ToT 的程序化实现
def tree_of_thought_solve(problem: str, breadth: int = 3, depth: int = 2) -> str:
"""
ToT 实现:
breadth = 每步探索的分支数
depth = 思考深度(层数)
"""
# 步骤1:生成初始候选方案
propose_prompt = f"""对于问题:{problem}
请提出 {breadth} 种完全不同的解决思路,
每种思路用一段话描述(不要评价优劣):
思路1:
思路2:
思路3:"""
# 步骤2:评估每个候选方案
evaluate_prompt = """对于以上每种思路,从以下维度打分(1-10):
- 可行性:实施难度
- 影响力:预期效果
- 资源需求:所需资源
- 风险:潜在风险
给出每种思路的综合评分,选出最优思路。"""
# 步骤3:对最优思路深化展开
elaborate_prompt = """对最高分的思路,提供详细的实施计划:
1. 具体步骤(时间线)
2. 所需资源
3. 成功指标
4. 风险缓解措施"""
# 实际调用 LLM(此处省略 API 调用代码)
return "[ToT 推理结果]"
ReAct 框架
推理与行动的结合
ReAct(Reasoning + Acting)框架由 Google 和普林斯顿大学提出,让 LLM 交替进行推理(Thought)和行动(Action),通过观察行动结果来调整后续推理。这是现代 AI Agent 系统的核心模式。
# ReAct 格式示例
你是一个能使用工具的研究助手。
每次回应按以下格式:
Thought: 分析当前情况,决定下一步
Action: 工具名称[参数]
Observation: [工具返回的结果]
... (重复 Thought/Action/Observation)
Final Answer: 最终答案
可用工具:
- search[查询]:搜索互联网
- calculate[表达式]:计算数学表达式
- read_file[路径]:读取文件内容
问题:特斯拉 2024 年 Q3 的交付量是多少?
与 Q2 相比增长了多少百分比?
Thought: 我需要查找特斯拉 2024 年 Q3 和 Q2 的交付数据。
Action: search[特斯拉 2024 Q3 交付量]
Observation: 特斯拉 2024 Q3 交付量为 462,890 辆
Thought: 现在需要 Q2 数据。
Action: search[特斯拉 2024 Q2 交付量]
Observation: 特斯拉 2024 Q2 交付量为 443,956 辆
Thought: 现在计算增长率
Action: calculate[(462890 - 443956) / 443956 * 100]
Observation: 4.26
Final Answer: 特斯拉 2024 Q3 交付量为 462,890 辆,
较 Q2 的 443,956 辆增长约 4.26%。
元认知提示(Metacognitive Prompting)
让 AI 检查自己的答案
元认知提示要求模型在给出答案后,主动反思和评估自己的回答质量,类似于人类的"检查作业"。
请回答以下问题,然后按照下方格式进行自我评估:
问题:量子计算机能用来破解 RSA-2048 加密吗?
回答:[你的回答]
自我评估:
1. 确定性:我对这个回答有多确定?(0-100%)
2. 知识边界:有哪些我不确定或知识可能过时的地方?
3. 潜在错误:如果我的回答有误,最可能错在哪里?
4. 建议验证方式:用户应该怎么验证这个回答的准确性?
什么时候使用高级技巧?
- ToT:需要创意探索、有多个可行方案的规划类任务
- ReAct:需要调用外部工具、查询实时数据的 Agent 任务
- 元认知:高风险决策,需要模型明确表达不确定性
- Self-Consistency:有标准答案的推理题,准确率优先于速度
Prompt Chaining:任务分解
将复杂任务分解为链式步骤
对于超出单次上下文能力的复杂任务,可以将其分解为多个链式步骤,每步的输出作为下一步的输入:
步骤1:提取关键信息(文档摘要)
↓ 输出:结构化摘要
步骤2:深度分析(基于摘要)
↓ 输出:分析报告草稿
步骤3:验证与优化(审查草稿)
↓ 输出:最终报告
def prompt_chain(document: str) -> str:
"""多步骤提示链示例"""
# 步骤1:提取关键信息
extract_prompt = f"""从以下文档中提取关键数据点,
以 JSON 格式返回(字段:主题、关键数据、时间范围、结论):
{document}"""
key_info = llm_call(extract_prompt)
# 步骤2:基于提取信息生成分析
analyze_prompt = f"""基于以下关键信息,生成深度分析报告:
{key_info}
重点分析:趋势、风险、机会"""
analysis = llm_call(analyze_prompt)
# 步骤3:生成执行摘要
summary_prompt = f"""将以下分析压缩为 3 个要点的执行摘要,
每点不超过 30 字,适合高管快速阅读:
{analysis}"""
return llm_call(summary_prompt)
各高级技巧的核心原理对比
CoT vs ToT:线性 vs 树状搜索
CoT 是一条确定的推理线(深度优先的单路径),ToT 是宽度优先+剪枝的树状搜索。CoT 成本低、速度快,适合答案路径相对清晰的推理任务;ToT 成本高(N个分支×M层深度次调用),适合探索空间大、创意性强的开放问题。在实践中,"3位专家讨论"的单轮 ToT 是最常用的轻量变体。
ReAct 的 Thought/Action/Observation 循环
Thought 是模型对当前状态的分析和下一步决策;Action 是调用外部工具(搜索、计算、API);Observation 是工具返回结果,成为下一轮 Thought 的上下文。这个循环使模型能够利用实时外部信息,弥补参数知识的截止日期限制。现代 AI Agent 框架(LangChain、LlamaIndex)本质上都是 ReAct 循环的工程化实现。
元认知提示的价值
要求模型明确表达不确定性,而非总是给出自信答案。这在医疗、法律、金融等高风险场景中至关重要——用户需要知道模型在哪些地方"知道自己不知道"。元认知提示还能防止模型"幻觉":当被要求说明验证方式时,模型需要意识到答案是否有明确来源。
Prompt Chaining 与 Agent 的区别
Prompt Chaining 是预先设计的固定流程:每步的提示词由开发者写死,步骤顺序不变。Agent 是动态决策:模型自己决定下一步调用哪个工具、以什么参数调用,循环次数不固定。Chaining 更可预测和安全;Agent 更灵活但更难调试和控制。生产环境中,能用 Chaining 解决的问题尽量不要用 Agent。
ReAct 实现的关键工程细节
最大迭代次数(max_iterations)
ReAct 循环没有自然终止点,必须在代码层面设置上限(通常 5-15 次)。超过上限时强制终止并返回当前最优答案。如果不设置上限,模型可能陷入"工具调用风暴"——每次调用都得到新信息,触发新的工具调用,永远无法输出 Final Answer。生产环境建议:max_iterations=10 + 费用限制双保险。
工具调用的输出截断
工具返回的 Observation 可能非常长(如搜索结果、文件内容)。原始 Observation 直接放入上下文会迅速耗尽 token 限制,且大量无关信息会干扰模型推理。最佳实践:对 Observation 设置 max_tokens(如 500 token 上限),超出时截断并加 "[已截断,如需更多请再次查询]" 提示,让模型主动决定是否需要更细粒度的查询。
工具错误处理
当工具调用失败(网络错误、API 限频、参数错误),不应直接让整个 ReAct 循环崩溃。标准做法:将错误信息作为 Observation 返回给模型("Error: 搜索 API 返回 429,请稍后重试"),让模型自行决定是重试、换用其他工具还是基于已知信息给出答案。模型的自我纠错能力使 ReAct 在工具不稳定时仍能工作。
Thought 的调试价值
ReAct 的 Thought 字段记录了模型的内部推理过程,是 Agent 调试最重要的信息来源。生产日志中应当保存完整的 Thought/Action/Observation 序列(而非只记录 Final Answer),以便分析模型在哪一步决策出错。工具调用日志 + Thought 链是 Agent 系统故障排查的核心依据。
高级技巧的成本评估
# 不同高级技巧的成本对比(以 GPT-4o 为例)
# 假设单次基础调用 = 1 个单位
cost_comparison = {
"基础提示词": 1,
"CoT(单次)": 1.5, # 输出 token 更多
"Self-Consistency N=5": 7.5, # 5次 × 1.5倍
"Self-Consistency N=10": 15, # 用于高精度场景
"ToT(3分支×2层)": 10, # 需要多轮调用
"ReAct(平均5次工具调用)": 8, # 每次循环一次 API 调用
"Prompt Chain(3步)": 4, # 3次独立调用
}
# 建议:根据任务价值选择成本匹配的技巧
# 日常文本生成 → 基础提示词
# 有标准答案的推理 → CoT 或 Self-Consistency
# 创意规划 → ToT(轻量版:单轮3专家)
# 需要实时数据/工具 → ReAct/Agent
# 长文档多步处理 → Prompt Chaining
高级技巧的常见误用
- 对简单问题用 ToT:问"北京的天气怎么样"不需要3个专家讨论,只会增加成本和延迟。
- ReAct 无终止条件:如果没有明确的终止条件或最大循环次数,ReAct 循环可能无限执行,造成高额费用。务必设置 max_iterations。
- Prompt Chain 的错误传播:链式调用中第一步的错误会传递并放大到后续步骤。关键节点需要格式验证,而不是直接将上一步原始输出传入下一步。
- 元认知提示被忽略:要求模型评估自己的答案,但用户实际上忽略了"置信度 40%"的提示,仍然以为答案是确定的。元认知提示需要在 UI/UX 上配合展示,才能真正降低用户风险。
本章小结
本章核心要点
- ToT 的核心思想:在每个推理节点生成多个候选分支,评估每个分支的质量后选择最优路径继续深入。轻量化实现是"多专家讨论"提示词,单次调用即可获得多视角分析。重量级实现需要多次 API 调用组成搜索树,适合需要自动化探索的复杂规划任务。
- ReAct 循环机制:Thought → Action → Observation 的循环让模型能调用外部工具弥补参数知识的局限;循环在模型判断"信息足够"时终止并输出 Final Answer;这是所有现代 AI Agent 框架的底层范式。
- 元认知提示的价值:让模型显式表达不确定性和知识边界;在高风险决策(医疗、法律、财务)场景中必须使用;配合 UI 展示置信度,才能真正提醒用户验证信息。
- Prompt Chaining 的设计原则:每步聚焦单一子任务;每步之间做格式验证防止错误传播;链式分解特别适合上下文窗口不够大的长文档处理;比 Agent 更可预测更安全。
- 技巧选择矩阵:简单回答 → 基础提示词;复杂推理 → CoT;标准答案+高准确率要求 → Self-Consistency;多方案规划 → ToT;需要工具/实时数据 → ReAct;长文档多步处理 → Prompt Chaining。成本随复杂度成比例增加,按任务价值匹配技巧。