典型回答

ReAct Agent是一种在解决问题的时候,参考人类的 思考 + 行动 + 观察 → 再思考 → 再行动……这一过程,让 LLM 在每一步交替输出:

  • Thought(思考):分析当前状态、制定下一步计划
  • Action(行动):调用工具(如搜索、计算、API)
  • Observation(观察):接收工具返回的结果

针对用户的提问,LLM会先进行思考(Thought),指定行动计划,行动计划中包括使用哪些工具,接着进行工具执行(Action),在工具执行之后,观察(**Observation)**工具执行的结果,基于结果继续思考后续的行动计划。如果需要执行工具就继续执行,直到LLM认为所有行动都做完了为止。

想要实现ReAct Agent,有两个关键点:

1、要让LLM按照ReAct的方式运行。

2、我们需要通过代码让Agent的"思考结果"、“行动"等串起来。

ReAct Prompt

想要让你的Agent能够按照思考 + 行动 + 观察的思路运行,提示词必须要给出说明,这是至关重要的一步,如果没有这一步,别的做了再多都是白搭。

以下是一个典型的ReAct System Prompt :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
你是一个基于React架构(Reasoning-Act-Observation)的智能助手,你擅长使用工具帮我解决问题。

你的工作流程是:
思考:基于当前获得的信息进行推理和反思,明确下一步行动的目标。
行动:用于表示需要调用的工具,每一步行动必须是以下两种之一:
  1、工具调用 [Function Calling]:根据任务需要,确定调用工具。
  2、输出答案 [Finish]:得出明确答案后使用此操作,返回答案并终止任务。
观察:记录前一步行动的结果。

你可以进行多轮推理和检索,但必须严格按照上述格式进行操作,尤其是每一步“行动”只能使用上述两种类型之一。

按照以上提示词运行的话,一个LLM每一轮的运行输出结果有两种情况:

1、工具调用

2、得到最终解决

如果解决问题的过程中,LLM认为还需要调用工具,则返回具体要调用的工具。如果LLM认为可以回答了,则返回 Finish的答案

ReAct Agent

通过以上Prompt约束之后,模型的输出结果,如果是要调用工具的话,那么就要继续执行,代码做工具调用,把调用结果组装给大模型,然后继续运行。

直到最终大模型输出不需要工具调用的时候,就可以返回了。那么整个运行过程就有以下流程:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
while (true) {
  // 1、(Thought)大模型调用,根据大模型输出,判断是否需要工具调用,调用哪个工具,入参是什么

  if(无需工具调用) {
    break;
  }

  // 2、(Action)工具调用

  // 3、(Observation)拿到工具调用的执行结果,追加到prompt中,回到1,进行下一轮LLM调用
}

这部分需要靠代码实现的,因为我们前面讲过的,LLM不会具体调用工具,他只会告诉我们调用哪个工具和入参,所以,整个编排的过程需要靠代码实现。