引导智能体通过思维链(Chain-of-Thought)等方法进行推理有助于结构化其内部思考过程,但许多任务要求智能体不仅仅是一次性地将问题想清楚。为了有效地进行交互或使用工具来获取信息,智能体通常需要采取行动,观察发生的事情,然后决定下一步该怎么做。这种思考和行动的迭代过程是 ReAct 这一广为人知且高效的框架的核心。ReAct 代表“推理和行动”(Reason and Act)。它是一种方法,让大型语言模型(LLM)智能体能够以结构化的方式结合推理和行动。ReAct 智能体不是试图从头到尾制定一个完整的计划并盲目执行,而是将任务分解为一系列小步骤。在每一步,它都会经历一个循环:对当前情况进行推理,决定一个行动,执行该行动,然后观察结果。ReAct 循环:思考、行动、观察ReAct 框架的核心是一个包含三个主要部分的迭代循环:思考: LLM 会生成一段文本推理过程。这个“思考”解释了它当前对目标的理解,迄今为止学到了什么,下一步需要做什么,以及为什么下一步是合适的。这使得智能体的决策过程更加清晰。行动: 基于其思考过程,LLM 决定采取一个具体的行动。这个行动通常包括选择一个可用的工具(例如搜索引擎、计算器或你提供的自定义函数),并指定该工具的输入。例如,一个行动可能是 search("柏林当前温度") 或 calculator("125 * 4.5")。观察: 智能体系统执行所选行动并获得一个观察结果。这个观察结果是来自工具的(例如搜索结果、计算出的数字)或来自环境的反馈。这条新的信息随后被反馈给 LLM。这个“思考-行动-观察”循环会重复进行。上一步的观察结果会告诉 LLM 下一步的思考方向,使其能够评估进展,必要时调整计划,并决定后续的行动。循环持续进行,直到智能体判定整体目标已经实现,届时它可能会采取最终行动来提供答案或完成任务。让我们来看看这个流程图:digraph ReActCycle { rankdir=TB; graph [fontname="Arial", fontsize=10]; node [shape=box, style="filled", fontname="Arial", fontsize=10, color="#495057", fillcolor="#e9ecef", margin=0.1]; edge [fontname="Arial", fontsize=9, color="#495057"]; Start [label="用户请求 / 目标", shape=ellipse, fillcolor="#a5d8ff"]; Thought [label="思考\nLLM 根据目标和之前的观察结果\n推理下一步要做什么。", fillcolor="#96f2d7", peripheries=1]; Action [label="行动\nLLM 选择工具及其输入。", fillcolor="#ffec99", peripheries=1]; Observation [label="观察\n智能体执行行动并获得结果\n(例如,来自工具或环境)。", fillcolor="#ffc9c9", peripheries=1]; End [label="任务完成\n(最终答案)", shape=ellipse, fillcolor="#b2f2bb"]; Start -> Thought; Thought -> Action [label=" 生成 "]; Action -> Observation [label=" 导致 "]; Observation -> Thought [label=" 提供信息给下一步 "]; Thought -> End [label=" 如果目标实现 "]; }ReAct 框架以循环方式运行,智能体在此过程中思考、行动、观察结果,然后根据新信息再次思考。ReAct 在实践中如何运作想象一下,你问智能体:“2023年国际足联女足世界杯冠军队最后一场比赛的比分是多少?”ReAct 智能体可能会按以下方式进行(简化版):思考: “问题要求两件事:首先,谁赢得了2023年国际足联女足世界杯;其次,他们最后一场比赛的比分。我需要先找出获胜者。” 行动: search("2023年国际足联女足世界杯冠军")观察: “西班牙赢得了2023年国际足联女足世界杯。”思考: “好的,西班牙是冠军。现在我需要找到西班牙最后一场比赛的比分。问题暗示的是他们踢的最后一场比赛,如果此后他们又踢了比赛,那可能不是决赛。我应该搜索‘西班牙女足国家队最后一场比赛比分’。” 行动: search("西班牙女足国家队最后一场比赛比分")观察: (假设找到结果,例如)“西班牙 2 - 0 瑞典,2024-02-28。”思考: “我已经找到了冠军(西班牙)和他们最后一场比赛的比分(2024年2月28日对阵瑞典2-0)。我已经掌握了回答问题所需的所有信息。” 行动: finish("2023年国际足联女足世界杯的冠军队是西班牙。他们最后一场比赛的比分是西班牙2-0瑞典。")在这个例子中,LLM 不仅仅是一次性生成最终答案。它明确地表达其计划(“思考”部分),选择工具(“行动”部分,这里是 search 和 finish),然后整合新信息(“观察”部分)来指导其后续步骤。运行 LLM 的智能体系统负责解析 Action 字符串,调用相应的工具,然后通过将其包含在下一个提示中,将 Observation 反馈给 LLM。ReAct 为何高效?ReAct 方法为构建更强大的智能体提供了以下几个优势:改善问题解决能力: 通过将复杂问题分解为更小、更易于处理的思考-行动-观察步骤,智能体可以处理仅通过一次 LLM 调用难以解决的任务。动态适应: 如果一个行动失败或工具返回意外结果(例如“未找到信息”),智能体可以“观察”到这次失败,“思考”出了什么问题,并尝试不同的方法或工具。这使得智能体更具韧性。高效利用工具: ReAct 提供了一种自然的方式,让智能体决定何时以及如何使用外部工具,显著扩展了它们在文本生成方面的能力。智能体可以推理出它需要某条信息,然后选择合适的工具来获取它。可解释性: “思考”过程的痕迹为观察智能体的推理过程提供了一个窗口。这对于调试智能体为何做出某个决定,或者理解其策略来说,非常有价值。如果智能体卡住或犯了错误,你通常可以通过检查思考日志来确定其推理在哪里出了问题。与思维链(CoT)提示等技术相比,后者主要侧重于在生成最终输出之前产生连贯的推理过程,ReAct 则在一个持续的循环中结合了推理、行动和环境反馈。CoT 帮助 LLM“理清思路”,而 ReAct 则帮助它“思考、行动、并迭代学习”。通过围绕这个推理、行动和观察的循环来构建智能体的运作方式,ReAct 框架使我们能够构建更具交互性、适应性强、并且能够处理需要外部信息或行动的多步骤任务的智能体。在后续内容中,你将看到这种模式是如何成为许多类型 LLM 智能体的基本构成要素的。