引言
ReAct(Reasoning + Acting)框架是由普林斯顿大学和谷歌研究团队于2022年提出的智能体框架,通过推理与行动的协同打破了传统大语言模型的局限。该框架将复杂的任务分解为一个持续的循环过程,使AI从被动的问答机器转变为能够主动思考、决策并执行复杂任务的智能代理。
1. ReAct框架核心概念
1.1 什么是ReAct?
ReAct = Reasoning(推理)+ Acting(行动),是一种融合推理与行动的AI框架。它通过"思考-行动-观察"(Thought-Action-Observation)循环,让智能体能够像人类一样逐步解决复杂问题:
- 思考(Thought):分析问题,制定策略
- 行动(Action):执行某个步骤
- 观察(Observation):查看结果
- 再思考(Thought):根据结果调整策略
1.2 与Chain of Thought的区别
| 特征 | Chain of Thought (CoT) | ReAct |
|---|---|---|
| 核心机制 | 纯内部推理,逐步展开思考过程 | 推理与外部行动相结合 |
| 环境交互 | 无外部环境交互 | 通过工具调用与外部环境交互 |
| 反馈机制 | 无实时反馈 | 通过Observation获得实时反馈 |
| 应用场景 | 数学计算、逻辑推理等封闭任务 | 需要外部数据获取的开放任务 |
| 知识时效性 | 依赖训练时的知识 | 可获取实时信息 |
2. ReAct核心机制详解
2.1 Thought(思考)- 推理与决策环节
Thought步骤相当于ReAct Agent的"大脑思考"过程,其作用包括:
- 任务分析:接收任务后进行分析和拆解
- 推理规划:明确下一步行动的目标和方向
- 策略制定:决定使用哪个工具以及如何使用
- 状态评估:判断当前进展和下一步计划
# Thought示例
Thought: 我需要查找明天北京到上海的航班信息。首先需要明确明天的具体日期,
然后调用航班查询工具。用户要求最便宜的经济舱,我需要获取所有航班信息后进行比较。
2.2 Action(行动)- 工具调用环节
Action是Thought的直接执行结果,通常表现为结构化的工具调用命令:
- 工具选择:根据Thought决定调用哪个工具
- 参数构造:根据需求构建工具调用参数
- 格式规范:遵循JSON格式或其他约定格式
# Action示例
{
"action": "search_flights",
"parameters": {
"from_city": "北京",
"to_city": "上海",
"date": "2026-04-30",
"class": "economy"
}
}
2.3 Observation(观察)- 反馈收集环节
Observation是工具执行后的结果反馈,作为下一轮思考的输入:
- 结果处理:接收工具执行的返回数据
- 状态更新:更新当前任务状态
- 信息整合:将新信息与已有知识结合
- 决策支撑:为下一步思考提供依据
# Observation示例
Observation: 查询到以下航班信息:
1. CA1831 08:00-10:15 价格:1200元
2. MU5137 09:30-11:45 价格:980元
3. HU7606 14:00-16:20 价格:1050元
3. ReAct工作流程
3.1 完整循环示例
以"帮我查找明天北京到上海最便宜的航班"为例:
Input: 帮我查找明天北京到上海最便宜的航班
Thought 1: 我需要获取明天北京到上海的航班信息,然后比较价格选择最便宜的。
Action 1: {"tool": "get_date", "format": "YYYY-MM-DD"}
Observation 1: 2026-04-30
Thought 2: 现在知道了具体日期,我可以查询航班信息。
Action 2: {"tool": "search_flights", "from": "北京", "to": "上海", "date": "2026-04-30"}
Observation 2: [CA1831: 1200元, MU5137: 980元, HU7606: 1050元]
Thought 3: 我已经获取了航班信息,MU5137是最便宜的航班,价格980元。
Final Answer: 已为您找到最便宜的航班:MU5137,明天上午09:30起飞,价格980元。
3.2 为什么需要Thought步骤?
没有Thought的Agent就像一个不经思考就行动的人,虽然看似快速,但错误率很高:
无Thought的执行过程:
- 直接输出
{"tool": "search_flight", "from": "北京", "to": "上海", "date": "明天"} - 由于"明天"是相对概念,工具可能报错
- 需要重新尝试,增加token消耗
- 可能跳过比价环节,随机选择航班
有Thought的执行过程:
- 先思考:需要先获取准确日期
- 执行:调用日期获取工具
- 观察:获得准确日期
- 思考:现在可以用准确日期查询航班
- 执行:查询航班信息
- 观察:获得航班列表
- 思考:需要比较价格选择最便宜的
- 执行:返回最便宜航班信息
4. ReAct实现原理
4.1 系统提示词设计
ReAct Agent的"大脑"需要在系统提示中明确定义循环格式:
你是智能代理,使用ReAct框架(Thought-Action-Observation循环)解决问题。
始终遵循以下格式:
Thought: [你的推理过程]
Action: [工具调用JSON]
Observation: [等待工具执行结果]
...(重复循环直到任务完成)
Final Answer: [最终答案]
4.2 核心循环实现
def react_loop(user_input, tools):
history = f"Input: {user_input}\n"
while True:
# 获取LLM的下一步输出
response = llm_call(history + "\nThought:")
# 解析Thought
if "Thought:" in response:
thought = extract_thought(response)
print(f"Thought: {thought}")
history += f"Thought: {thought}\n"
# 解析Action并执行
if "Action:" in response:
action_json = extract_action(response)
print(f"Action: {action_json}")
history += f"Action: {action_json}\n"
# 执行工具
try:
result = execute_tool(action_json, tools)
observation = f"Observation: {result}"
print(observation)
history += f"{observation}\n"
except Exception as e:
observation = f"Observation: Error - {str(e)}"
history += f"{observation}\n"
# 检查是否完成任务
if "Final Answer:" in response:
final_answer = extract_final_answer(response)
return final_answer
5. ReAct的优势与挑战
5.1 主要优势
- 降低幻觉:通过工具调用获取真实数据,减少模型编造信息
- 知识时效性:可获取实时信息,不受训练数据限制
- 复杂任务分解:将复杂任务分解为多个简单步骤
- 可解释性强:思考过程透明,便于调试和理解
5.2 面临挑战
- Prompt设计复杂:需要精心设计系统提示词
- 上下文管理:长对话中需要有效管理上下文
- 解析脆弱性:需要可靠的输出格式解析机制
- 成本控制:多次LLM调用增加计算成本
6. 实际应用场景
6.1 适用场景
- 信息检索:实时查询天气、新闻、股票等
- 电商助手:商品搜索、比价、下单
- 旅行规划:航班预订、酒店查询、行程安排
- 数据分析:调用计算工具进行复杂运算
- 文档处理:读取文件、提取信息、生成报告
6.2 不适用场景
- 简单问答:无需外部信息的常识性问题
- 纯创作任务:创意写作、故事生成等
- 性能敏感应用:对响应速度要求极高的场景
结论
ReAct框架通过Thought-Action-Observation循环机制,成功将静态的大语言模型转化为可交互、可调用工具的智能体。虽然增加了token消耗,但显著提升了复杂任务的完成准确率和可靠性。随着AI Agent技术的发展,ReAct作为经典的推理与行动结合框架,将继续在智能代理系统中发挥重要作用。