LangChain AI Agent 进阶:思维树(TOT)与 ReAct 框架实操

一、核心主题定位

本集聚焦 Agent 的高阶思维框架 —— 思维树(Tree of Thought, TOT)与 ReAct,核心解决 “复杂任务分步推理不足”“工具调用逻辑混乱” 的痛点。通过 TOT 实现多路径探索与回溯,结合 ReAct 的 “思考 - 行动 - 观察” 闭环,让 Agent 具备类人类的动态决策能力,适配需要深度推理的复杂场景(如逻辑题求解、多步骤任务规划)。


二、核心框架解析:TOT 与 ReAct

1. 思维树(TOT):多路径推理与回溯

  • 核心逻辑:将复杂任务拆解为多个思维节点,每个节点探索多种可能路径,通过评估筛选最优方向,遇到死胡同可回溯重新选择,突破单一路径的局限性。
  • 核心价值:解决 “一步错全错” 的问题,适合需要试错、推理的场景(如 24 点游戏、数学证明、复杂决策)。
  • 关键步骤
    1. 任务拆解:将目标拆分为可探索的思维节点(如 24 点游戏中 “4 个数字→第一步运算→第二步运算→结果 24”)。
    2. 路径生成:每个节点生成多种可能的行动(如 24 点中 “1+2”“1×2”“2-1”)。
    3. 评估筛选:对每条路径的可行性打分(如 “1+2 后剩余数字更易凑 24,打分 8 分;1×2 后难度高,打分 3 分”)。
    4. 回溯优化:淘汰低分行进,保留高分行进,必要时回溯到上一节点重新选择。

2. ReAct 框架:思考 - 行动 - 观察闭环

  • 核心逻辑:模拟人类 “思考→行动→观察结果→再思考” 的行为模式,Agent 每一步先明确 “为什么这么做”(思考),再执行行动(调用工具 / 运算),最后根据结果调整后续策略(观察)。
  • 核心价值:工具调用逻辑透明可追溯,减少盲目行动,提升复杂场景下的任务完成率。
  • 关键步骤
    1. 思考(Reason):分析当前状态与目标差距,明确下一步行动目的(如 “需要查询库存,才能判断是否补货”)。
    2. 行动(Act):执行具体操作(调用工具、运算、提问用户)。
    3. 观察(Observe):获取行动结果(如工具返回数据、用户反馈)。
    4. 循环:基于观察结果重复 “思考 - 行动 - 观察”,直至完成任务。

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 平衡效率与成本。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐