Claude Agent SDK(Anthropic)
Anthropic 官方 Agent 编排框架,内置工具集 + 流式循环 + MCP 扩展,支持 Python 和 TypeScript。
将推理与行动交替进行的 Agent 经典范式,让模型能够边想边做、边做边调整。
内容摘要
ReAct 是一种"边思考,边行动"的 Agent 范式。名字来自 **Re**ason(推理)+ **Act**(行动)两个词的组合,由 Yao 等人在 2022 年提出,发表于 ICLR 2023。
ReAct 是一种"边思考,边行动"的 Agent 范式。名字来自 Reason(推理)+ Act(行动)两个词的组合,由 Yao 等人在 2022 年提出,发表于 ICLR 2023。
在 ReAct 出现之前,LLM 解决问题主要有两种路线:一种是"只想不做"——以 Chain-of-Thought(思维链,简称 CoT)为代表,模型能一步步推理,但无法访问外部信息,遇到需要实时数据的问题就容易编造答案;另一种是"只做不想"——模型直接输出动作指令,但缺乏推理能力,遇到复杂任务就容易迷失方向。ReAct 把两者结合起来:模型在推进任务时,先想清楚当前该做什么,再去执行动作,看到结果后继续思考下一步。这种交替循环正是人类解决问题的自然方式。
一句话概括:模型在推理和行动之间来回切换,根据外部反馈持续调整下一步,形成"带外部交互的推理循环"。
ReAct 的核心是 Thought-Action-Observation 循环(简称 TAO 循环),由三个阶段交替运行:
| 模块 | 作用 | 与其他模块的关系 |
|---|---|---|
| Thought(思考) | 根据当前状态判断下一步该做什么 | 驱动 Action 的方向,接收 Observation 的反馈 |
| Action(行动) | 执行具体动作,通常是调用外部工具 | 由 Thought 决定调用什么,执行结果交给 Observation |
| Observation(观察) | 接收 Action 返回的结果 | 为下一轮 Thought 提供新的事实依据 |
Thought 是模型的内部判断过程,不是给用户看的最终答案,而是模型在决定"下一步做什么"时的推理依据。
它通常回答这些问题:
Thought 的价值不在于写出很长的推理文本,而在于帮助模型确定下一步行动方向。
Action 是模型真正执行的动作,最常见的形式是工具调用,例如搜索关键词、调用计算器、查询数据库、请求 API。
Action 是 ReAct 从"只会想"进入"真的去做"的关键环节。它不是机械调用,而是由 Thought 驱动的、带有明确目的的操作。
Observation 是 Action 执行后返回的结果,可能是搜索结果、计算答案、API 响应,也可能是报错信息。
Observation 给模型提供了新的外部事实,让下一轮 Thought 不再只是凭空猜测,而是基于真实反馈继续推进。没有 Observation,ReAct 就失去了闭环特征,行动也就变成了盲目操作。
流程说明:
循环终止条件:模型判断已获得足够信息,或达到系统设定的最大轮次。
用户问:"北京今天的气温多少?需要带伞吗?"
第 1 轮:
第 2 轮:
两轮循环完成任务:第 1 轮获取事实信息,第 2 轮基于事实做出判断并输出最终答案。
以下伪代码展示 ReAct 的核心循环结构:
# ReAct 核心循环伪代码
def react_loop(question, tools, max_steps=5):
"""ReAct 主循环:思考 → 行动 → 观察,重复直到完成"""
context = [question] # 上下文:存放所有历史信息
for step in range(max_steps):
# 阶段 1:Thought —— 模型根据上下文判断下一步
thought = llm.generate(
prompt=f"根据以下信息,判断下一步该做什么:\n{context}"
)
# 如果模型认为信息足够,输出最终答案
if thought.is_final_answer:
return thought.answer
# 阶段 2:Action —— 调用工具执行动作
tool_name, tool_input = thought.next_action
observation = tools[tool_name].run(tool_input)
# 阶段 3:Observation —— 将结果加入上下文
context.append(f"Thought: {thought}")
context.append(f"Action: {tool_name}({tool_input})")
context.append(f"Observation: {observation}")
return "达到最大轮次,未能完成任务。"
代码中的三个阶段对应 ReAct 的 TAO 循环:thought 对应决策判断,tools[tool_name].run() 对应工具执行,observation 对应反馈结果。context 列表持续积累历史信息,供下一轮 Thought 使用。max_steps 防止无限循环。
如果需要在实际项目中使用 ReAct,LangGraph 提供了开箱即用的 create_react_agent 函数:
# 基于 LangGraph 的 ReAct Agent(示意)
# 依赖:langgraph, langchain-openai
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
# 定义工具
def search(query: str) -> str:
"""搜索工具:查询实时信息"""
# 实际项目中替换为真实搜索 API
return f"搜索 '{query}' 的结果..."
# 创建 ReAct Agent
model = ChatOpenAI(model="gpt-4o-mini")
agent = create_react_agent(model, tools=[search])
# 运行
result = agent.invoke({"messages": [("user", "北京今天天气怎么样?")]})
LangGraph 的 create_react_agent 内部实现了完整的 TAO 循环逻辑,开发者只需定义工具和模型即可。
| 优势 | 劣势 |
|---|---|
| 推理与行动协同,减少纯推理时的幻觉 | 多轮循环增加延迟和 token 消耗 |
| 根据外部反馈动态调整,灵活性高 | 上下文随轮次增长,可能超出窗口限制 |
| 推理过程和行动过程透明可追踪 | 工具质量直接影响整体效果 |
| 适合逐步推进的探索型任务 | 缺乏全局规划能力,不适合结构化大任务 |
边界说明:ReAct 的优势在任务需要动态探索时最明显;当任务结构固定、步骤明确时,循环开销反而成为负担。
| 对比维度 | ReAct | Chain-of-Thought(CoT) | Plan-and-Solve |
|---|---|---|---|
| 核心思想 | 推理与行动交替循环 | 逐步内部推理,不与外部交互 | 先制定完整计划,再逐步执行 |
| 外部工具 | 核心特性,必须有工具参与 | 不使用外部工具 | 可选,非必须 |
| 规划能力 | 逐步推进,短期视野 | 无显式规划 | 全局规划,长期视野 |
| 幻觉风险 | 较低——通过工具获取真实信息 | 较高——完全依赖模型内部知识 | 中等 |
| 适用场景 | 需要实时信息和工具调用的任务 | 纯逻辑推理、数学证明 | 复杂多步骤规划任务 |
| 效率 | 中等(多轮交互) | 较高(单次推理) | 较高(计划后批量执行) |
ReAct 原始论文的实验表明:在需要外部知识的任务(如 HotpotQA 事实验证)上,ReAct 明显优于纯 CoT;而在纯逻辑推理任务上,CoT 的效率更高。最佳实践是将 ReAct 与 CoT 结合使用——模型先用内部推理处理能解决的部分,遇到知识缺口时再通过工具获取外部信息。
| 常见误区 | 正确理解 |
|---|---|
| ReAct 就是工具调用 | 工具调用只是 Action 的一种形式,核心是 Thought-Action-Observation 的闭环循环,Thought 环节的推理质量才是关键 |
| ReAct 一定比直接回答更好 | 对简单任务来说,ReAct 反而增加不必要的开销。它的价值体现在需要多步探索和外部信息的场景 |
| ReAct 和 Plan-and-Solve 差不多 | ReAct 强调实时迭代、边走边调整;Plan-and-Solve 强调前期整体规划、按计划执行。适用场景不同 |
| 只要写出 Thought 就算 ReAct | 真正的 ReAct 必须包含 Action 和 Observation 的闭环,三者缺一不可 |
参考答案:
直接回答模式是模型拿到问题后直接基于已有知识生成答案,不调用外部工具,也不根据外部反馈调整。
ReAct 的核心区别在于它把任务拆成一个循环:先思考当前该做什么(Thought),再执行一个动作(Action),再根据返回结果(Observation)继续思考下一步。关键不是"答案写得更长",而是把推理、行动、观察三者连接成了一个持续推进的闭环。
参考答案:
Observation 是把"行动"和"下一轮思考"连接起来的关键环节。Action 执行之后,模型必须看到结果才能判断:当前动作有没有帮助、信息是否足够、下一步继续搜索还是结束。
没有 Observation,ReAct 就退化成"有思考有行动但没有反馈"的模式——模型虽然在调用工具,但无法利用返回信息修正策略,行动变成盲目操作。
参考答案:
当任务需要提前规划整体结构时,例如写完整长报告、设计复杂工作流、处理有明确前后依赖的大型任务。
ReAct 每一步都在做当前最合理的选择,但缺少整体路线图,可能局部合理但整体不够完整。Plan-and-Solve 先把任务拆成全局计划再按计划推进,在结构稳定、步骤明确的复杂任务里更容易保证完整性。
优先展示同分类且标签更接近的内容,方便继续串联学习。
Anthropic 官方 Agent 编排框架,内置工具集 + 流式循环 + MCP 扩展,支持 Python 和 TypeScript。
针对 LLM Agent 非确定性特性设计的分层测试框架,用概率性验证替代精确断言。
Agent 之间按条件主动移交控制权和上下文,实现专业化分工协作