本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。
一、ReAct 模式:AI 代理的"思考-行动"循环
ReAct(Reasoning + Action)是一种让大语言模型(LLM)自主完成任务的核心架构。与传统直接生成答案的模式不同,ReAct 要求代理交替执行以下两步:
- 推理(Reasoning):分析当前状态,规划下一步行动
- 行动(Action):调用工具(Tools)获取信息或执行操作

二、为什么需要 ReAct?突破 LLM 的固有局限
传统 LLM 缺陷 | ReAct 解决方案 |
---|---|
依赖预训练知识,无法获取实时数据 | 调用搜索引擎/API 获取最新信息 |
复杂计算容易出错 | 集成计算工具执行精确运算 |
多步骤任务逻辑混乱 | 拆解为"思考-行动"链式决策 |

典型案例:
用户问:"特斯拉当前股价是多少?相比去年同期涨了多少百分比?" 传统 LLM 可能直接编造数据,而 ReAct 代理会:
- 调用金融API获取当前股价
- 查询历史数据库找出去年同期股价
- 使用计算工具执行百分比运算
三、推理+行动:ReAct 代理的工作原理
ReAct 代理以"思考 → 行动 → 观察"的循环方式运行,重复进行直到找到解决方案或最终答案。

这与人类解决问题的方式类似:
- 我们思考该做什么
- 执行某项操作(例如查找某些内容或进行计算),
- 观察结果
- 然后将其融入到我们的下一个想法中。
ReAct 框架使用提示工程来强制执行这种结构化方法,交替模型的思想和行动/观察。
以下是ReAct 循环的逐步分解:
思考:由法学硕士 (LLM) 驱动的代理会分析用户的查询和内部语境,并用自然语言生成推理步骤。这通常不会向最终用户展示,而是代理自言自语的一部分。例如:"问题询问一个国家的人口数量;我应该使用网络搜索来查找最新数据。"

动作:基于想法,代理决定执行哪个外部工具或操作。它会输出指示操作的指定格式。例如:Action: WebSearch("population of Canada 2023")。代理本质上是通过名称"调用"某个函数(工具),通常会附带一些输入参数。

观察:代理的环境(我们的代码)执行请求的操作,并将结果(观察)返回给代理。例如,网页搜索工具可能会返回:" Observation: The population of Canada in 2023 is 38 million."。此观察结果会被输入到代理的上下文中。

智能体获取新信息后返回第一步(另一个思考)。它会利用新数据进行推理。在我们的例子中,它可能会想:"现在我有了人口数据;我可以回答这个问题了。"

这个"思考/行动/观察"循环不断重复,允许代理根据需要,串联使用多种工具(例如搜索,然后进行计算,再进行一次搜索等等)。最终,代理决定可以回答用户的问题。此时,它不再输出"行动",而是输出"最终答案"。
正如我们将在从头开始的实施中看到的那样,在整个过程中,代理维持对话及其自己的中间步骤。
每个想法和观察都可以附加到对话上下文中,以便 LLM 记住当中所做的任何操作。

这对于连贯性至关重要。最终结果是,代理能够有效地动态规划其方法,将推理与执行相结合。
这种动态方法比僵化的脚本或单轮响应更具适应性。它能够处理不可预见的子任务,类似于人在出现新信息时进行及时的调整。
四、工具调用:代理的"双手"
工具是实现行动的关键,需满足 3 个设计原则:
- 原子性:每个工具只做一件事(如 Calculator 仅负责计算)
- 强契约:明确定义输入/输出格式(如 JSON Schema)
- 安全性:隔离高风险操作(如数据库写入需权限控制)
常用工具示例:
python
from math import sqrt
tools = [
Tool(
name="GoogleSearch",
func=search_api, # 对接搜索引擎API
description="获取实时信息,输入:搜索关键词"
),
Tool(
name="Calculator",
func=lambda x: eval(x), # 注意:生产环境需替换为安全计算库
description="执行数学计算,输入:数学表达式"
),
Tool(
name="DataPlotter",
func=generate_chart, # 数据可视化工具
description="生成折线图,输入:{x:[1,2,3], y:[4,5,6]}"
)
]
五、Prompt 工程:驱动推理的核心
ReAct 的思考质量取决于 Prompt 设计,经典模板如下:
markdown
你是一个自主代理,请通过以下步骤解决问题:
1. 思考:分析当前需要什么信息
2. 行动:调用工具获取信息(格式:ACTION: 工具名(参数))
3. 观察:记录工具返回结果
4. 循环直到得出最终答案
当前任务:{query}
历史记录:
{memory}
请输出下一步指令:
实际生成示例:
vbnet
思考:需要知道2024年奥斯卡最佳影片
ACTION: GoogleSearch("2024 Oscar best picture winner")
观察:"《奥本海默》获得2024年奥斯卡最佳影片"
思考:用户还要求主演名单
ACTION: GoogleSearch("Oppenheimer cast")
观察:"基里安·墨菲、艾米莉·布朗特..."
思考:答案已完整
FINAL_ANSWER: 最佳影片是《奥本海默》,主演包括...
六、优化:超越基础实现
原生实现后需考虑五大增强方向:
- 短路机制:当工具返回明确结果时跳过冗余思考
bash
if "答案直接可见" in tool_result:
return tool_result # 提前终止循环
- 错误回退:工具调用失败时尝试替代方案
- 令牌压缩:用摘要替代完整历史记录减少 token 消耗
- 动态工具加载:运行时按需加载工具降低内存占用
- 置信度阈值:低置信度时要求人工干预
七、与框架的共生关系
原生实现 | CrewAI/LangChain |
---|---|
✅ 完全掌控底层逻辑 | ✅ 快速构建生产系统 |
✅ 适合研究/定制化场景 | ✅ 内置负载均衡、容错机制 |
❌ 需自行处理并发/监控 | ❌ 抽象层掩盖关键细节 |
推荐策略:
用原生实现理解原理 → 在 CrewAI 中实践复杂任务 → 定制框架扩展点
ReAct 不仅是工具调用模式,更是 LLM 实现"自驱动"的认知框架。关注我,我们下期见。如果本次分享对你有所帮助,记得点个小红心,你的鼓励就是我更新的动力,更多AI大模型应用开发学习视频内容和资料,尽在聚客AI学院。