核心思想:观察 - 思考 - 行动
ReAct = Reasoning(推理)+ Acting(行动)
说白了,就是让 AI 一边想一边做,而不是想完了再做。
🔄 ReAct Agent 的工作方式
ReAct Agent 的工作方式其实挺像人类解决问题的过程。它不是一次性把整个流程都规划好,而是在有一个整体目标的前提下,走一步看一步:
观察 → 思考 → 行动 → 再观察 → 再思考 → 再行动 → ... → 任务完成
🚗 类比理解
| 传统方式 | ReAct 方式 |
|---|---|
| 出门前查好完整路线,严格按路线走 | 出门后走一段、看环境、再决定下一步 |
| 提前规划所有步骤,执行时难以调整 | 边走边找,根据路牌动态决策 |
| 适合简单、确定性高的任务 | 适合复杂、有不确定性的任务 |
💡 比如去一家没去过的咖啡店:
- 传统方式:提前查好所有转弯路口
- ReAct 方式:走到路口看路牌,再决定左转还是右转
📋 实际例子:查天气 + 穿衣建议
任务:帮我查"北京今天天气怎么样,适合穿什么衣服"
ReAct 执行流程
- 观察:看到用户的问题,历史上下文为空
-
思考:
"我需要知道北京今天的天气"(思考是可选输出,类似人的内化思考) -
行动:调用天气查询工具,查询
"北京今天天气" - 观察:获取到天气数据:温度 25°C,晴天,湿度 60%,风速 3m/s
-
思考:
"现在我知道天气了,需要查询穿衣建议知识库" -
行动:调用穿衣建议知识库工具,查询
"25度晴天适合穿什么衣服" - 观察:获取建议:短袖 T 恤/薄长袖 + 薄外套 + 帽子 + 防晒霜
-
思考:
"我已获取完整信息,应该写入文件保存" -
行动:调用
writeToFile工具,将完整建议写入文件 -
观察:建议已写入到文件
weather_suggestion.md
✨ 整个过程是 观察 - 思考 - 行动 - 再观察 的循环,每一步都根据当前上下文动态决策。
❓ 为什么需要 ReAct?
| 问题 | ReAct 的优势 |
|---|---|
| 现实任务复杂多变 | ✅ 能根据中间结果灵活调整策略 |
| API 可能返回错误/异常 | ✅ 遇到意外可尝试备选方案 |
| 数据格式不确定 | ✅ 动态解析并适配处理 |
| 需要多工具协同 | ✅ 按需调用,避免冗余操作 |
⚠️ 代价:行为可预测性略低,偶尔可能"犯傻"
✅ 收益:处理复杂、不确定任务时,灵活性和鲁棒性显著提升
⚙️ ReAct 是怎么实现的?
关键要素
| 要素 | 说明 | 作用 |
|---|---|---|
| 📜 历史上下文(History) | 记录之前所有的思考、行动和观察 | 避免重复操作,支撑连贯推理 |
| 🌍 当前环境信息 | 用户输入、系统状态、外部数据等 | 作为 LLM 推理的实时输入 |
| 🧠 语言模型(LLM Thinking) | 负责推理和决策的"大脑" | 根据上下文生成下一步行动计划 |
| 🛠️ 工具/动作(toolcall) | 搜索、API 查询、文件读写等"手脚" | 执行具体操作,完成实际工作 |
| 👁️ 观察结果 | 工具执行后的返回数据/错误信息 | 反馈给 LLM,驱动下一轮决策 |
💡 注:实际输出中
think过程通常是隐藏的,最终表现形式为toolcall
📊 执行流程示例(表格版)
任务:帮我查一下北京今天天气怎么样,适合穿什么衣服
| 轮次 | 历史上下文 | 当前环境信息 | 提示词核心内容 | 行动 (toolcall) | 观察结果 |
|---|---|---|---|---|---|
| Round 1 | 无 | 空 | 已知:{历史上下文} {当前环境信息} 用户目标:"..." 做出下一步决策,必须最少使用一个工具 |
天气查询:"北京今天天气"
|
25°C,晴天,湿度 60%,风速 3m/s |
| Round 2 | 已获取北京天气数据 | 天气工具:无额外信息 | 同上(提示词模板不变) | 穿衣建议查询:"25度晴天适合穿什么衣服"
|
短袖 T 恤/薄长袖 + 薄外套 + 帽子 + 防晒霜 |
| Round 3 | 天气数据 + 穿衣建议 | 两工具均无额外信息 | 同上 |
writeToFile:写入完整建议 |
建议已写入 weather_suggestion.md |
🎯 核心提示词模板
已知:
当前历史上下文:{history}
当前环境信息:{env_info}
用户目标:"{user_goal}"
做出下一步的决策:
你必须最少使用一个工具来实现该决策。
🔁 从这个例子可以看出:ReAct 不是一开始就知道所有步骤,而是根据每轮观察结果动态决策。如果 Round 1 搜索失败,它可能尝试其他关键词或换策略——这种灵活性正是 ReAct 的核心优势。
💻 伪代码:ReAct 执行逻辑
单轮执行函数
def 执行一个轮次(用户目标, 历史上下文):
# 1. 获取当前环境信息
当前环境信息 = 获取当前环境信息()
# 2. 构建提示词(替换占位符)
提示词模板 = """
已知:
当前历史上下文:{history}
当前环境信息:{env_info}
用户目标:"{user_goal}"
做出下一步的决策:
你必须最少使用一个工具来实现该决策
"""
完整提示词 = 提示词模板.format(
history=历史上下文,
env_info=当前环境信息,
user_goal=用户目标
)
# 3. 调用 LLM 进行推理(思考过程隐藏,直接输出 toolcall)
下一步工具调用决策 = 调用语言模型(完整提示词, 历史上下文)
# 4. 解析工具调用
工具名称 = 解析工具名称(下一步工具调用决策)
工具参数 = 解析工具参数(下一步工具调用决策)
# 5. 执行工具调用
观察结果 = 执行工具(工具名称, 工具参数)
# 6. 更新历史上下文
新历史上下文 = 追加到历史上下文(历史上下文, {
"行动": 工具调用结果,
"观察结果": 观察结果
})
# 7. 返回结果
return {
"观察结果": 观察结果,
"新历史上下文": 新历史上下文
}
主循环流程
def 执行 ReAct 流程(用户目标, 最大轮次=10):
历史上下文 = ""
当前轮次 = 1
while 当前轮次 <= 最大轮次:
结果 = 执行一个轮次(用户目标, 历史上下文)
历史上下文 = 结果["新历史上下文"]
# 判断任务是否完成(可由 LLM 或规则判断)
if 判断任务已完成(结果["观察结果"]):
break
当前轮次 += 1
return 历史上下文
✅ 总结:ReAct 的本质是让 Agent 具备 "边推理、边行动、边调整" 的能力,通过
观察→思考→行动的闭环循环,在复杂、动态、不确定的真实场景中实现更鲁棒、更智能的任务执行。