Chapter 06

推理模型 × Agent:Plan-and-Execute 架构

将推理模型的规划能力与 Agent 的执行能力结合,构建真正"先想后做"的智能工作流。

为什么推理模型是天然的规划器

传统 ReAct Agent 的问题:每次工具调用都需要重新推理,导致推理不连贯、成本高、容易迷路。推理模型的特性使它成为理想的规划层

传统 ReAct(思考-行动-观察循环): Thought → Action → Observation → Thought → Action → ... 问题:每轮 Thought 是独立的,没有全局规划视野 Plan-and-Execute(规划-执行分离): Step 1: 推理模型完整规划所有步骤 ┌─────────────────────────────┐ │ 思考:要完成这个任务需要: │ │ 1. 搜索 X │ │ 2. 分析结果,提取 Y │ │ 3. 基于 Y 调用 API Z │ │ 4. 汇总生成报告 │ └─────────────────────────────┘ Step 2: 执行模型逐步执行(可以用小模型) Execute step 1 → Execute step 2 → ...

Plan-and-Execute 实现

import anthropic
from typing import List, Dict

client = anthropic.Anthropic()

def reasoning_planner(goal: str, available_tools: List[str]) -> List[Dict]:
    """使用推理模型制定执行计划"""
    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=8000,
        thinking={"type": "enabled", "budget_tokens": 5000},
        system=f"""你是一个任务规划专家。
可用工具:{available_tools}
输出 JSON 格式的执行步骤列表:
[{{"step": 1, "tool": "工具名", "input": "输入", "purpose": "目的"}}]""",
        messages=[{"role": "user", "content": f"目标:{goal}"}]
    )

    # 提取 text block(推理已在 thinking 中完成)
    text = next(b.text for b in response.content if b.type == "text")
    return json.loads(text)

def execute_plan(plan: List[Dict]) -> List[str]:
    """用轻量级模型逐步执行计划"""
    results = []
    context = {}

    for step in plan:
        # 根据工具名调用对应函数
        tool_result = call_tool(
            tool_name=step["tool"],
            tool_input=step["input"].format(**context)
        )
        context[f"step{step['step']}_result"] = tool_result
        results.append(tool_result)

    return results

# 使用示例
goal = "分析 Tesla 最新财报,生成投资建议报告"
tools = ["web_search", "pdf_reader", "data_analyzer", "report_writer"]
plan = reasoning_planner(goal, tools)
results = execute_plan(plan)

ReWOO:推理与观察解耦

ReWOO(Reasoning WithOut Observation)让推理模型一次性规划所有工具调用,然后并行执行,最后综合结果:

async def rewoo_agent(task: str, tools: dict) -> str:
    # Phase 1: Planner — 一次性生成所有工具调用计划
    plan_prompt = f"""为以下任务制定工具调用计划(不执行,只规划):
任务:{task}
可用工具:{list(tools.keys())}
输出格式:#E1 = tool_name[input]
         #E2 = tool_name[input,可引用#E1的结果]"""

    planner_response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=4000,
        thinking={"type": "enabled", "budget_tokens": 3000},
        messages=[{"role": "user", "content": plan_prompt}]
    )
    tool_plan = parse_tool_plan(get_text(planner_response))

    # Phase 2: Worker — 并行执行所有独立工具调用
    import asyncio
    evidence = {}
    tasks = [call_tool_async(t["tool"], t["input"]) for t in tool_plan]
    results = await asyncio.gather(*tasks)
    for i, r in enumerate(results):
        evidence[f"#E{i+1}"] = r

    # Phase 3: Solver — 综合所有证据给出最终答案
    final = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=2000,
        messages=[{"role": "user", "content":
            f"任务:{task}\n工具执行结果:{evidence}\n请综合以上信息给出完整答案。"}]
    )
    return get_text(final)

推理模型在 Agent 中的最佳实践

规划层用推理模型,执行层用快速模型
推理模型负责"想清楚做什么",普通模型(haiku、gpt-4o-mini)负责"按计划执行每一步"。这样在保证规划质量的同时控制成本。
一次性规划优于逐步规划
让推理模型一次性看清全局,比每步推理更稳定。利用推理模型的"长思维链"能力,而不是把它用作普通的 ReAct agent。
复杂决策节点才启用推理
在 Agent 工作流中,只在需要复杂判断的决策节点(如路由分支、策略选择)使用推理模型,其他节点用普通模型。
本章小结 推理模型最适合作为 Agent 的规划层。Plan-and-Execute 将规划与执行分离,ReWOO 实现并行工具调用,两者都能充分利用推理模型的全局视野。下一章解决结构化输出与推理的兼容问题。