在当今人工智能领域,智能体(Agent)系统正成为连接大语言模型与现实应用的重要桥梁。本章将深入探讨三种经典的智能体构建范式:ReAct、Plan-and-Solve和Reflection。这些范式代表了不同的设计哲学和工程实践,能够帮助开发者构建更加智能、灵活和可靠的AI系统。
作为一名长期从事AI系统开发的工程师,我发现理解这些范式的本质差异和适用场景,对于设计高效的智能体系统至关重要。通过亲手实现这些范式,我们不仅能够掌握其技术细节,更能体会到智能体系统在实际工程中面临的挑战与解决方案。
ReAct(Reasoning and Acting)范式将"思考"与"行动"紧密结合,形成"思考-行动-观察"的实时循环。这种范式特别适合需要与环境动态交互的任务场景。
在实现ReAct智能体时,我特别注意了以下几个关键组件:
python复制REACT_PROMPT_TEMPLATE = """
请注意,你是一个有能力调用外部工具的智能助手。
可用工具如下:
{tools}
请严格按照以下格式进行回应:
Thought: 你的思考过程
Action: 工具调用或Finish指令
问题: {question}
历史: {history}
"""
工具调用是ReAct范式的核心能力之一。在我的实现中,ToolExecutor类负责统一管理工具注册和执行:
python复制class ToolExecutor:
def __init__(self):
self.tools = {}
def registerTool(self, name, description, func):
"""注册新工具"""
self.tools[name] = {
"description": description,
"func": func
}
def execute(self, tool_name, input):
"""执行指定工具"""
if tool_name not in self.tools:
return f"错误:工具{tool_name}不存在"
return self.tools[tool_name]["func"](input)
重要提示:工具描述的质量直接影响模型调用工具的准确性。描述应当清晰说明工具的功能边界和使用场景。
让我们通过一个实际案例来理解ReAct的工作流程。假设我们需要查询"华为最新手机型号":
python复制# 注册搜索工具
tool_executor.registerTool(
"Search",
"网页搜索引擎,用于查询最新信息",
search_function
)
# 运行智能体
agent.run("华为最新的手机是哪一款?它的主要卖点是什么?")
执行过程输出示例:
code复制思考:需要查找华为最新发布的手机信息
行动:Search[华为最新手机型号及卖点]
观察:HUAWEI Mate 70 Pro主要卖点:麒麟9100芯片...
思考:根据搜索结果整理信息
行动:Finish[华为最新手机是HUAWEI Mate 70 Pro...]
Plan-and-Solve范式采用"三思而后行"的策略,先通过规划阶段生成完整的执行计划,再严格按照计划执行。这种范式特别适合:
在我的实现中,规划器(Planner)生成的计划示例:
code复制1. 查询北京到上海的航班
2. 选择合适时间的航班
3. 查询目的地附近酒店
4. 选择评分高的酒店
5. 完成机票和酒店预订
Plan-and-Solve智能体的核心架构包含两个主要组件:
python复制class PlanAndSolveAgent:
def __init__(self, llm_client):
self.llm_client = llm_client
def generate_plan(self, question):
"""生成执行计划"""
prompt = f"请将以下任务分解为可执行的步骤:{question}"
response = self.llm_client.think(prompt)
return self._parse_plan(response)
def execute_plan(self, plan):
"""执行计划"""
results = []
for step in plan:
result = self.execute_step(step, results)
results.append(result)
return self.generate_final_answer(results)
在实际应用中,静态计划可能遇到执行失败的情况。为此,我设计了动态重规划机制:
python复制def handle_step_failure(self, failed_step, completed_steps):
"""处理步骤失败情况"""
prompt = f"""
原始任务:{self.question}
已完成步骤:{completed_steps}
失败步骤:{failed_step}
请重新规划剩余步骤:
"""
new_plan = self.llm_client.think(prompt)
return self._parse_plan(new_plan)
Reflection范式在传统执行流程后增加了反思与优化环节,形成迭代改进的闭环。这种范式特别适合:
典型工作流程:
以生成素数查找算法为例:
python复制# 初始版本
def is_prime(n):
if n < 2: return False
for i in range(2, int(n**0.5)+1):
if n % i == 0: return False
return True
# 反思反馈
"""
1. 算法效率可以提升
2. 考虑使用埃拉托斯特尼筛法
3. 添加边界条件处理
"""
# 优化版本
def primes_up_to(n):
sieve = [True] * (n+1)
sieve[0:2] = [False, False]
for i in range(2, int(n**0.5)+1):
if sieve[i]:
sieve[i*i::i] = [False]*len(sieve[i*i::i])
return [i for i, is_p in enumerate(sieve) if is_p]
对于复杂任务如论文写作,可以设计多维度的反思机制:
python复制class AcademicReflection:
def reflect(self, paper):
dimensions = {
'logic': '检查论证逻辑',
'innovation': '评估创新点',
'language': '审查语言表达',
'citation': '检查引用格式'
}
feedback = {}
for dim, desc in dimensions.items():
feedback[dim] = self.get_feedback(paper, dim)
return feedback
| 范式 | 核心思想 | 优势 | 局限 | 适用场景 |
|---|---|---|---|---|
| ReAct | 边想边做 | 灵活适应环境 | 可能陷入循环 | 动态交互任务 |
| Plan-and-Solve | 先规划后执行 | 执行稳定 | 缺乏灵活性 | 结构化任务 |
| Reflection | 迭代优化 | 提升质量 | 计算成本高 | 高质量输出要求 |
根据我的工程经验,以下是一些选型建议:
需要实时交互:选择ReAct范式
任务结构明确:选择Plan-and-Solve
输出质量关键:选择Reflection
在实际项目中,可以组合使用多种范式。例如:
python复制class HybridAgent:
def run(self, task):
# 高层规划
plan = self.planner.generate_plan(task)
# 动态执行
for step in plan:
result = self.react_agent.run(step)
# 关键步骤优化
if needs_reflection(step):
result = self.reflection_agent.improve(result)
return final_result
在实现工具系统时,我总结了以下几点经验:
python复制# 良好的工具描述示例
"""
股票查询工具:提供实时股票价格和基本信息。
输入:股票代码(如AAPL)
输出:当前价格、涨跌幅、市值等
使用场景:当用户询问股票行情时使用
"""
有效的提示设计能显著提升智能体性能:
python复制PROMPT_TEMPLATE = """
请按以下格式回答:
思考:<你的推理过程>
行动:<工具调用或Finish>
示例:
问题:北京天气如何?
思考:需要查询实时天气信息
行动:WeatherTool[北京]
"""
在实际部署中,需要考虑以下性能因素:
python复制class CachedToolExecutor(ToolExecutor):
def __init__(self):
super().__init__()
self.cache = {}
def execute(self, tool_name, input):
cache_key = f"{tool_name}:{input}"
if cache_key in self.cache:
return self.cache[cache_key]
result = super().execute(tool_name, input)
self.cache[cache_key] = result
return result
问题:模型输出格式不符合预期
解决方案:
python复制def parse_response(text):
# 尝试多种解析方式
for parser in [parse_json, parse_text, parse_markdown]:
try:
return parser(text)
except:
continue
return ask_for_clarification(text)
问题:工具数量增多时选择效率下降
解决方案:
python复制class ToolManager:
def recommend_tools(self, query):
# 计算查询与工具描述的相似度
query_embedding = self.encoder.encode(query)
similarities = [
cosine_similarity(query_embedding, tool_embedding)
for tool_embedding in self.tool_embeddings
]
return sorted(zip(self.tools, similarities),
key=lambda x: -x[1])
问题:何时停止优化循环
解决方案:
python复制def should_stop_reflection(history):
# 最近3轮改进幅度小于5%
if len(history) < 3:
return False
last_3 = history[-3:]
improvements = [abs(b-a)/a for a,b in zip(last_3, last_3[1:])]
return sum(improvements)/3 < 0.05
对于复杂任务,可以设计分层规划系统:
python复制class HierarchicalPlanner:
def plan(self, goal):
# 生成高层计划
high_level = self.plan_high_level(goal)
# 展开每个高层步骤
detailed = []
for step in high_level:
detailed.append(self.plan_detail(step))
return detailed
将不同范式的智能体组合使用:
python复制class MultiAgentSystem:
def solve(self, problem):
# 规划阶段
plan = self.planner_agent.plan(problem)
# 执行阶段
results = []
for step in plan:
result = self.executor_agent.execute(step)
results.append(result)
# 评审阶段
return self.reviewer_agent.review(results)
为智能体添加记忆能力:
python复制class MemoryEnhancedAgent:
def __init__(self):
self.memory = VectorDatabase()
def solve(self, problem):
# 首先查询记忆
similar = self.memory.search(problem)
if similar:
return similar[0].solution
# 正常解决流程
solution = super().solve(problem)
# 存储到记忆
self.memory.store(problem, solution)
return solution
通过系统学习和实践这三种智能体范式,开发者可以构建出适应不同场景的AI系统。在实际项目中,往往需要根据具体需求灵活组合这些范式,才能发挥最大价值。