Agent的核心能力在于能将大语言模型的推理能力与外部世界联通。它能够自主地理解用户意图、拆解复杂任务,并通过调用代码解释器、搜索引擎、API等一系列"工具",来获取信息、执行操作,最终达成目标。 然而,Agent并非万能,它同样面临着来自大模型本身的"幻觉"问题、在复杂任务中可能陷入推理循环、以及对工具的错误使用等挑战,这些也构成了Agent的能力边界。
为了更好地组织Agent的"思考"与"行动"过程,业界涌现出了多种经典的架构范式。
ReAct (Reasoning and Acting)
ReAct 范式是一种将"思考"和"行动"紧密结合的范式,让Agent边想边做,动态调整。大名鼎鼎的 Claude code 编程AI工具就是使用的ReAct范式实现的。
ReAct的巧妙之处在于,它认识到思考与行动是相辅相成的。思考指导行动,而行动的结果又反过来修正思考。为此,ReAct范式通过一种特殊的提示工程来引导模型,使其每一步的输出都遵循一个固定的轨迹:
- Thought (思考): 这是Agent的"内心独白"。它会分析当前情况、分解任务、制定下一步计划,或者反思上一步的结果。
- Action (行动): 这是Agent决定采取的具体动作,通常是调用一个外部工具,例如
Search['华为最新款手机']。 - Observation (观察): 这是执行
Action后从外部工具返回的结果,例如搜索结果的摘要或API的返回值。
Agent将不断重复这个 Thought -> Action -> Observation 的循环,将新的观察结果追加到历史记录中,形成一个不断增长的上下文,直到它在Thought中认为已经找到了最终答案,然后输出结果。这个过程形成了一个强大的协同效应:推理使得行动更具目的性,而行动则为推理提供了事实依据。
系统提示词:
react_system_prompt_template = """
你需要解决一个问题。为此,你需要将问题分解为多个步骤。对于每个步骤,首先使用 <thought> 思考要做什么,然后使用可用工具之一决定一个 <action>。接着,你将根据你的行动从环境/工具中收到一个 <observation>。持续这个思考和行动的过程,直到你有足够的信息来提供 <final_answer>。
所有步骤请严格使用以下 XML 标签格式输出:
- <question> 用户问题
- <thought> 思考
- <action> 采取的工具操作
- <observation> 工具或环境返回的结果
- <final_answer> 最终答案
⸻
例子 1:
<question>成都天气怎么样?</question>
<thought>我需要找到成都的天气。可以使用搜索工具。</thought>
<action>get_weather("成都")</action>
<observation>成都今天有大暴雨</observation>
<thought>搜索结果显示了成都天气。我已经得到答案了。</thought>
<final_answer>成都今天有大暴雨,记得带伞。</final_answer>
⸻
请严格遵守:
- 你每次回答都只能包含两个标签,第一个是 <thought>,第二个是 <action> 或者 <final_answer>
- 输出 <action> 后立即停止生成,等待真实的 <observation>,擅自生成 <observation> 将导致错误
- 如果 <action> 中的某个工具参数有多行的话,请使用 \n 来表示,如:<action>write_to_file("/tmp/test.txt", "a\nb\nc")</action>
- 工具参数中的文件路径请使用绝对路径,不要只给出一个文件名。比如要写 write_to_file("/tmp/test.txt", "内容"),而不是 write_to_file("test.txt", "内容")
⸻
本次任务可用工具:
${tool_list}
⸻
Plan-and-Solve
为了解决思维链在处理多步骤、复杂问题时容易"偏离轨道"的问题。与 ReAct 将思考和行动融合在每一步不同,Plan-and-Solve 将整个流程解耦为两个核心阶段,
- 规划阶段 (Planning Phase) : 首先,Agent会接收用户的完整问题。它的第一个任务不是直接去解决问题或调用工具,而是将问题分解,并制定出一个清晰、分步骤的行动计划。这个计划本身就是一次大语言模型的调用产物。
- 执行阶段 (Solving Phase) : 在获得完整的计划后,Agent进入执行阶段。它会严格按照计划中的步骤,逐一执行。每一步的执行都可能是一次独立的 LLM 调用,或者是对上一步结果的加工处理,直到计划中的所有步骤都完成,最终得出答案。
这种"先谋后动"的策略,使得Agent在处理需要长远规划的复杂任务时,能够保持更高的目标一致性,避免在中间步骤中迷失方向。
整个流程可以让AI 扮演两个角色,一个PLAN ,一个Solve。
PLAN
PLANNER_PROMPT_TEMPLATE = """
你是一个顶级的AI规划专家。你的任务是将用户提出的复杂问题分解成一个由多个简单步骤组成的行动计划。
请确保计划中的每个步骤都是一个独立的、可执行的子任务,并且严格按照逻辑顺序排列。
问题: {question}
请严格按照以下格式输出你的计划:
["步骤1", "步骤2", "步骤3", ...]
"""
Solve
EXECUTOR_PROMPT_TEMPLATE = """
你是一位顶级的AI执行专家。你的任务是严格按照给定的计划,一步步地解决问题。
你将收到原始问题、完整的计划、以及到目前为止已经完成的步骤和结果。
请你专注于解决"当前步骤",并仅输出该步骤的最终答案,不要输出任何额外的解释或对话。
# 原始问题:
{question}
# 完整计划:
{plan}
# 历史步骤与结果:
{history}
# 当前步骤:
{current_step}
请仅输出针对"当前步骤"的回答:
"""
Reflection
Reflection 机制的灵感来源于人类的学习过程:我们完成初稿后会进行校对,解出数学题后会进行验算。
-
执行 (Execution):首先,Agent使用我们熟悉的方法(如 ReAct 或 Plan-and-Solve)尝试完成任务,生成一个初步的解决方案或行动轨迹。这可以看作是"初稿"。
-
反思 (Reflection)
:接着,Agent进入反思阶段。它会调用一个独立的、或者带有特殊提示词的大语言模型实例,来扮演一个"评审员"的角色。这个"评审员"会审视第一步生成的"初稿",并从多个维度进行评估,例如:
- 事实性错误:是否存在与常识或已知事实相悖的内容?
- 逻辑漏洞:推理过程是否存在不连贯或矛盾之处?
- 效率问题:是否有更直接、更简洁的路径来完成任务?
- 遗漏信息 :是否忽略了问题的某些关键约束或方面? 根据评估,它会生成一段结构化的反馈 (Feedback),指出具体的问题所在和改进建议。
-
优化 (Refinement):最后,Agent将"初稿"和"反馈"作为新的上下文,再次调用大语言模型,要求它根据反馈内容对初稿进行修正,生成一个更完善的"修订稿"。
参考Plan-and-Solve 让AI 扮演3个角色,Execution ,Reflection,Refinement
Execution
INITIAL_PROMPT_TEMPLATE = """
你是一位资深的java程序员。请根据以下要求,实现功能。
要求: {task}
请直接输出代码,不要包含任何额外的解释。
Reflection
EFLECT_PROMPT_TEMPLATE = """
你是一位极其严格的代码评审专家和资深算法工程师,对代码的可读性,编码规范极致的要求。
你的任务是审查以下java代码,并专注于找出其在可读性,编码规范上的问题。
# 原始任务:
{task}
# 待审查的代码:
```python
{code}
```
请直接输出你的反馈,不要包含任何额外的解释。
"""
Refinement
REFINE_PROMPT_TEMPLATE = """
你是一位资深的java程序员。你正在根据一位代码评审专家的反馈来优化你的代码。
# 原始任务:
{task}
# 你上一轮尝试的代码:
{last_code_attempt}
评审员的反馈:
{feedback}
请根据评审员的反馈,生成一个优化后的新版本代码。
请直接输出优化后的代码,不要包含任何额外的解释。
"""
多种范式可以在一个Agent里面融会贯通的使用,agent核心功能就是管理,组织与大模型交互的上下文,通过多种范式的组合解决不同场景下的问题。