大模型速通学习笔记(54)
本集聚焦 Agent 的高阶思维框架 —— 思维树(Tree of Thought, TOT)与 ReAct,核心解决 “复杂任务分步推理不足”“工具调用逻辑混乱” 的痛点。通过 TOT 实现多路径探索与回溯,结合 ReAct 的 “思考 - 行动 - 观察” 闭环,让 Agent 具备类人类的动态决策能力,适配需要深度推理的复杂场景(如逻辑题求解、多步骤任务规划)。
·
LangChain AI Agent 进阶:思维树(TOT)与 ReAct 框架实操
一、核心主题定位
本集聚焦 Agent 的高阶思维框架 —— 思维树(Tree of Thought, TOT)与 ReAct,核心解决 “复杂任务分步推理不足”“工具调用逻辑混乱” 的痛点。通过 TOT 实现多路径探索与回溯,结合 ReAct 的 “思考 - 行动 - 观察” 闭环,让 Agent 具备类人类的动态决策能力,适配需要深度推理的复杂场景(如逻辑题求解、多步骤任务规划)。
二、核心框架解析:TOT 与 ReAct
1. 思维树(TOT):多路径推理与回溯
- 核心逻辑:将复杂任务拆解为多个思维节点,每个节点探索多种可能路径,通过评估筛选最优方向,遇到死胡同可回溯重新选择,突破单一路径的局限性。
- 核心价值:解决 “一步错全错” 的问题,适合需要试错、推理的场景(如 24 点游戏、数学证明、复杂决策)。
- 关键步骤:
- 任务拆解:将目标拆分为可探索的思维节点(如 24 点游戏中 “4 个数字→第一步运算→第二步运算→结果 24”)。
- 路径生成:每个节点生成多种可能的行动(如 24 点中 “1+2”“1×2”“2-1”)。
- 评估筛选:对每条路径的可行性打分(如 “1+2 后剩余数字更易凑 24,打分 8 分;1×2 后难度高,打分 3 分”)。
- 回溯优化:淘汰低分行进,保留高分行进,必要时回溯到上一节点重新选择。
2. ReAct 框架:思考 - 行动 - 观察闭环
- 核心逻辑:模拟人类 “思考→行动→观察结果→再思考” 的行为模式,Agent 每一步先明确 “为什么这么做”(思考),再执行行动(调用工具 / 运算),最后根据结果调整后续策略(观察)。
- 核心价值:工具调用逻辑透明可追溯,减少盲目行动,提升复杂场景下的任务完成率。
- 关键步骤:
- 思考(Reason):分析当前状态与目标差距,明确下一步行动目的(如 “需要查询库存,才能判断是否补货”)。
- 行动(Act):执行具体操作(调用工具、运算、提问用户)。
- 观察(Observe):获取行动结果(如工具返回数据、用户反馈)。
- 循环:基于观察结果重复 “思考 - 行动 - 观察”,直至完成任务。
3. TOT 与 ReAct 的协同关系
- TOT 负责 “宏观路径规划”:确定多路径探索与回溯策略。
- ReAct 负责 “微观步骤执行”:按 “思考 - 行动 - 观察” 落地每一步,确保路径可行。
- 协同优势:既保证多路径探索的灵活性,又确保每一步执行的逻辑性。
三、核心实操示例(TOT+ReAct 协同)
以 “24 点游戏拓展” 和 “复杂库存决策” 为例,演示框架落地。
1. 示例 1:24 点游戏(TOT 核心应用)
场景描述:给定 4 个数字(如 3、4、6、8),通过加减乘除运算得出 24,需探索多路径。
python
运行
from langchain_community.llms import ZhipuAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# 1. 初始化模型
llm = ZhipuAI(model="glm-4", api_key="你的API_KEY", temperature=0.3)
# 2. TOT核心链:路径生成+评估+回溯
# 路径生成链(每个节点生成多种运算可能)
generate_prompt = PromptTemplate(
template="""给定数字{numbers},已完成运算:{history},当前剩余数字:{remaining}。
生成3种可能的下一步运算(仅用加减乘除,每次用2个数字),格式:运算表达式→剩余数字。
示例:3+4=7→剩余[7,6,8]
""",
input_variables=["numbers", "history", "remaining"]
)
generate_chain = LLMChain(llm=llm, prompt=generate_prompt)
# 路径评估链(对生成的路径打分,1-10分)
evaluate_prompt = PromptTemplate(
template="""给定24点任务,当前运算路径:{path},剩余数字:{remaining}。
评估该路径凑出24的可行性,打分(1-10分)并说明理由,仅输出“分数:X,理由:XXX”。
""",
input_variables=["path", "remaining"]
)
evaluate_chain = LLMChain(llm=llm, prompt=evaluate_prompt)
# 3. TOT执行逻辑
def tot_24_game(numbers):
# 初始化状态
history = []
remaining = numbers.copy()
max_depth = 3 # 24点最多3步运算
current_depth = 0
while current_depth < max_depth and len(remaining) > 1:
# 步骤1:生成可能路径
generate_result = generate_chain.invoke({
"numbers": numbers,
"history": "→".join(history),
"remaining": remaining
})["text"]
paths = [p.strip() for p in generate_result.split("\n") if p.strip()]
# 步骤2:评估路径
scored_paths = []
for path in paths:
expr, rem = path.split("→剩余")
rem = eval(rem) # 转为列表
eval_result = evaluate_chain.invoke({
"path": "→".join(history) + "→" + expr,
"remaining": rem
})["text"]
score = int(eval_result.split("分数:")[1].split(",")[0])
scored_paths.append((path, score))
# 步骤3:选择最优路径(分数最高)
scored_paths.sort(key=lambda x: x[1], reverse=True)
best_path, best_score = scored_paths[0]
expr, rem = best_path.split("→剩余")
remaining = eval(rem)
history.append(expr)
current_depth += 1
# 步骤4:判断是否完成
if len(remaining) == 1 and remaining[0] == 24:
return f"成功!路径:{'→'.join(history)}=24"
return f"未找到有效路径,尝试路径:{'→'.join(history)}"
# 测试24点游戏
result = tot_24_game([3, 4, 6, 8])
print(result)
# 输出示例:成功!路径:8-6=2→3×4=12→12×2=24
2. 示例 2:复杂库存决策(TOT+ReAct 协同)
场景描述:结合库存查询、销量分析、补货计算,决策是否补货及补货量,需多步骤推理与工具调用。
python
运行
from langchain_core.tools import Tool
from langchain.agents import initialize_agent, AgentType
from langchain.memory import ConversationBufferMemory
# 1. 定义工具(ReAct行动阶段调用)
def inventory_query(product_id: str) -> str:
"""查询产品库存,输入产品ID"""
mock_data = {"PROD-001": 30, "PROD-002": 150, "PROD-003": 0}
return f"库存结果:产品{product_id}当前库存{mock_data.get(product_id, 0)}件"
def sales_analysis(product_id: str) -> str:
"""分析近3个月销量,输入产品ID"""
mock_data = {"PROD-001": "月均销量60件", "PROD-002": "月均销量30件", "PROD-003": "月均销量45件"}
return f"销量分析:{mock_data.get(product_id, '无数据')}"
def replenish_calc(stock: int, monthly_sales: int) -> str:
"""计算补货量,输入库存和月均销量"""
if stock <= monthly_sales * 0.5:
return f"补货建议:需补货{monthly_sales * 2 - stock}件(库存低于半月销量)"
return "补货建议:库存充足,无需补货"
tools = [
Tool(name="inventory_query", func=inventory_query, description="查询产品库存,仅需产品ID"),
Tool(name="sales_analysis", func=sales_analysis, description="分析近3个月销量,仅需产品ID"),
Tool(name="replenish_calc", func=replenish_calc, description="计算补货量,需输入库存(数字)和月均销量(数字)")
]
# 2. 初始化ReAct+TOT Agent
memory = ConversationBufferMemory(return_messages=True)
# 系统Prompt:融合TOT多路径评估与ReAct思考-行动-观察
system_prompt = """
你是库存决策Agent,需通过TOT+ReAct框架完成决策,规则如下:
1. 思考(Reason):每步先说明“为什么做”(如“需要先查库存,才能判断是否需分析销量”);
2. 行动(Act):调用工具时按格式:{工具名}(参数),仅调用必要工具;
3. 观察(Observe):获取工具结果后,评估是否需要下一步(如“库存30件,需分析销量→调用sales_analysis”);
4. TOT评估:若某路径无结果(如工具调用失败),回溯到上一步换路径(如“库存查询失败→重新确认产品ID”)。
目标:判断产品是否补货及补货量,输出最终决策。
"""
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=memory,
verbose=True,
agent_kwargs={"system_message": system_prompt}
)
# 测试Agent
result = agent.run("帮我决策PROD-001是否需要补货,以及补多少")
print("最终决策:", result)
三、核心应用场景
1. 逻辑推理类任务
- 场景:24 点游戏、数学证明、逻辑题求解、密码破解。
- 价值:TOT 的多路径探索避免单一推理失误,提升解题成功率。
2. 复杂业务决策
- 场景:库存补货、营销方案制定、跨部门项目规划。
- 价值:ReAct 的透明化思考 + TOT 的路径优化,确保决策全面且可追溯。
3. 多工具协同任务
- 场景:数据采集→分析→可视化→报告生成、故障排查→工具调用→修复验证。
- 价值:避免工具调用混乱,每一步行动都有明确思考依据,提升任务闭环效率。
四、实操避坑与优化指南
1. 常见问题与解决方案
- TOT 路径过多导致效率低:生成路径时限制数量(如 “最多 3 条”),评估时提高分数阈值(如 “仅保留≥6 分的路径”)。
- ReAct 思考与行动脱节:Prompt 中强制 “思考必须对应行动”(如 “思考后必须调用工具或输出结果,不允许无行动的思考”)。
- 回溯逻辑缺失:在 Prompt 中明确回溯触发条件(如 “工具返回无数据→回溯到上一步重新确认参数”)。
- 工具参数错误:ReAct 思考阶段需明确参数格式(如 “调用 replenish_calc 需提取库存和销量的数字,避免文本”)。
2. 核心优化技巧
- Prompt 强化引导:明确思考格式(如 “思考:XXX”)、行动格式(如 “行动:XXX (XXX)”),减少模型理解偏差。
- 评估标准量化:TOT 评估时给出具体打分规则(如 “库存<月销 50%→路径分数 8 分,否则 3 分”),避免主观判断。
- 记忆模块优化:用
ConversationTokenBufferMemory限制记忆长度,优先保留 “思考 - 行动 - 观察” 关键节点,避免冗余信息。 - 模型选型适配:复杂推理场景用 GLM-4、GPT-4o 等高性能模型,简单场景用 GLM-3-turbo 平衡效率与成本。
更多推荐


所有评论(0)