用 ReAct 模式构建简单智能体
背景
大模型本身只能基于训练数据生成文本,无法获取实时信息,也不能直接操作外部系统。为了让模型解决更复杂的问题,研究者提出了“智能体”(Agent)的概念:让模型在一个循环中交替进行推理(Reasoning)和行动(Acting),即 ReAct 模式。
这个思路让我非常兴奋:如果能让模型自己决定“下一步该查什么资料”或“该调用哪个工具”,很多繁琐的自动化任务就能交给它处理。于是我决定从一个简单的待办事项管理场景入手,亲手实现一个 ReAct 智能体。
核心思路
ReAct 的核心是一个“思考—行动—观察”的循环。每一步,模型都会根据当前状态生成一段内部推理,然后决定调用哪个工具、传入什么参数。工具执行后的结果会作为新的观察反馈给模型,模型再据此进行下一轮推理。
- 1 Thought:模型分析当前任务,明确下一步需要做什么。
- 2 Action:模型输出工具调用,包含工具名和参数。
- 3 Observation:执行工具,获得结果并追加到上下文中。
- 4 循环:重复上述步骤,直到任务完成或达到最大步数。
示例
在待办事项管理场景中,我为智能体提供了三个工具:add_todo、list_todos 和 complete_todo。当用户说“帮我添加一个买牛奶的任务,并看看现在还有哪些待办”时,智能体会这样运行:
用户:帮我添加一个买牛奶的任务,并看看现在还有哪些待办。
Thought:用户想新增一个待办,并查看全部待办列表。我需要先调用 add_todo,再调用 list_todos。
Action: add_todo{"content": "买牛奶"}
Observation: 待办已添加,ID 为 3。
Thought:现在需要把当前所有待办展示给用户。
Action: list_todos{}
Observation: [1] 写周报 (pending), [2] 整理笔记 (pending), [3] 买牛奶 (pending)
Thought:任务已完成,可以给出最终回复。
Final Answer:已为你添加“买牛奶”,当前共有 3 项待办:写周报、整理笔记、买牛奶。
为了让模型稳定输出 Action 行,我在 Prompt 中严格规定了输出格式,并使用了 Few-shot 示例演示完整的循环过程。
总结
ReAct 模式让我第一次感受到“模型在主动解决问题”。虽然这个待办示例很简单,但它已经涵盖了智能体的关键要素:工具定义、状态管理、循环控制和终止条件。
接下来我想尝试更复杂的场景,比如让智能体根据错误日志自动检索文档、定位问题并给出修复建议。为此,我需要更健壮的工具参数校验和更清晰的错误反馈机制。