ReAct(Reasoning + Acting)是一种将推理和行动相结合的 Agent 范式。在这个范式中,Agent 会:
- 思考(Reasoning):分析当前情况,决定下一步该做什么
- 行动(Acting):执行工具调用或生成最终答案
- 观察(Observation):接收工具执行的结果
- 迭代:基于观察结果继续思考和行动,直到完成任务
这个循环使 Agent 能够:
- 将复杂问题分解为多个步骤
- 动态调整策略基于中间结果
- 处理需要多次工具调用的任务
- 在不确定的环境中做出决策
Spring AI Alibaba 中的ReactAgent 基于 Graph 运行时构建。Graph 由节点(steps)和边(connections)组成,定义了 Agent 如何处理信息。Agent 在这个 Graph 中移动,执行如下节点:
- Model Node (模型节点):调用 LLM 进行推理和决策
- Tool Node (工具节点):执行工具调用
- Hook Nodes (钩子节点):在关键位置插入自定义逻辑

ReAct Agent 的工作方式其实挺像人类解决问题的过程。它不是一次性把整个流程都规划好,而是在有一个整体目标的前提下,走一步看一步。
具体来说,它会先观察当前的情况,然后思考下一步该做什么,接着执行这个动作,再观察结果,根据结果决定下一步。
这个过程会一直循环,直到任务完成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| 函数 执行一个轮次(用户目标, 历史上下文): // 1. 获取当前环境信息 当前环境信息 = 获取当前环境信息() // 2. 构建提示词(替换占位符) 提示词模板 = "已知:\n当前历史上下文:${历史上下文}\n当前环境信息:${当前环境信息}\n用户目标:\"${用户目标}\"\n\n做出下一步的决策\n\n你必须最少使用一个工具来实现该决策" 完整提示词 = 替换占位符(提示词模板, { 历史上下文: 历史上下文, 当前环境信息: 当前环境信息, 用户目标: 用户目标 }) // 3. 调用 LLM 进行推理(思考过程隐藏,直接输出 toolcall) 工具调用结果 = 调用语言模型(完整提示词, 历史上下文) // 4. 解析工具调用 工具名称 = 解析工具名称(工具调用结果) 工具参数 = 解析工具参数(工具调用结果) // 5. 执行工具调用 观察结果 = 执行工具(工具名称, 工具参数) // 6. 更新历史上下文 新历史上下文 = 追加到历史上下文(历史上下文, { 行动: 工具调用结果, 观察结果: 观察结果 }) // 7. 返回结果 返回 { 观察结果: 观察结果, 新历史上下文: 新历史上下文 } 结束函数
// 主循环 函数 执行ReAct流程(用户目标): 历史上下文 = 空 当前轮次 = 1 最大轮次 = 10 当 当前轮次 <= 最大轮次 且 未完成任务: 结果 = 执行一个轮次(用户目标, 历史上下文) 历史上下文 = 结果.新历史上下文 如果 判断任务已完成(结果.观察结果): 中断循环 当前轮次 = 当前轮次 + 1 结束循环 返回 历史上下文 结束函数
|