主题
面试速答(先看这里)
**一句话结论:**针对用户的提问,LLM会先进行思考( Thought) ,指定行动计划,行动计划中包括使用哪些工具,接着进行工具执行( Action) ,在工具执行之后,观察( Observation) 工具执行的结果,基于结果继续思考后续的行动计划。
60秒标准回答:
ReAct Agent是一种在解决问题的时候,参考人类的 思考 + 行动 + 观察 → 再思考 → 再行动……这一过程,让 LLM 在每一步交替输出
针对用户的提问,LLM会先进行思考( Thought) ,指定行动计划,行动计划中包括使用哪些工具,接着进行工具执行( Action) ,在工具执行之后,观察( Observation) 工具执行的结果,基于结果继续思考后续的行动计划。如果需要执行工具就继续执行,直到LLM认为所有行动都做完了为止
想要实现ReAct Agent,有两个关键点
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **ReAct Prompt:**想要让你的Agent能够按照思考 + 行动 + 观察的思路运行,提示词必须要给出说明,这是至关重要的一步,如果没有这一步,别的做了再多都是白搭。
- **ReAct Agent:**通过以上Prompt约束之后,模型的输出结果,如果是要调用工具的话,那么就要继续执行,代码做工具调用,把调用结果组装给大模型,然后继续运行。
**记忆锚点:**LLM → ReAct → Agent → Prompt → Observation → Thought
加分表达:
- 如果需要执行工具就继续执行,直到LLM认为所有行动都做完了为止。
- 想要实现ReAct Agent,有两个关键点: 1、要让LLM按照ReAct的方式运行。
- ReAct Prompt 想要让你的Agent能够按照思考 + 行动 + 观察的思路运行,提示词必须要给出说明,这是至关重要的一步,如果没有这一步,别的做了再多都是白搭。
追问准备:
- 围绕「LLM」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「ReAct」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「Agent」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
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 :
plain
你是一个基于React架构(Reasoning-Act-Observation)的智能助手,你擅长使用工具帮我解决问题。
你的工作流程是:
思考:基于当前获得的信息进行推理和反思,明确下一步行动的目标。
行动:用于表示需要调用的工具,每一步行动必须是以下两种之一:
1、工具调用 [Function Calling]:根据任务需要,确定调用工具。
2、输出答案 [Finish]:得出明确答案后使用此操作,返回答案并终止任务。
观察:记录前一步行动的结果。
你可以进行多轮推理和检索,但必须严格按照上述格式进行操作,尤其是每一步“行动”只能使用上述两种类型之一。按照以上提示词运行的话,一个LLM每一轮的运行输出结果有两种情况:
1、工具调用
2、得到最终解决
如果解决问题的过程中,LLM认为还需要调用工具,则返回具体要调用的工具。如果LLM认为可以回答了,则返回 Finish的答案
ReAct Agent
通过以上Prompt约束之后,模型的输出结果,如果是要调用工具的话,那么就要继续执行,代码做工具调用,把调用结果组装给大模型,然后继续运行。
直到最终大模型输出不需要工具调用的时候,就可以返回了。那么整个运行过程就有以下流程:
plain
while (true) {
// 1、(Thought)大模型调用,根据大模型输出,判断是否需要工具调用,调用哪个工具,入参是什么
if(无需工具调用) {
break;
}
// 2、(Action)工具调用
// 3、(Observation)拿到工具调用的执行结果,追加到prompt中,回到1,进行下一轮LLM调用
}这部分需要靠代码实现的,因为我们前面讲过的,LLM不会具体调用工具,他只会告诉我们调用哪个工具和入参,所以,整个编排的过程需要靠代码实现。