多步骤复杂任务处理的核心理念
本题考察 Agent 智能层级结构与任务规划能力的核心差异。
底层原理:
核心能力:
示例场景:导航系统需要规划从 A 到 B 的路线,中途可能需要加油、避开拥堵,这需要多步规划。
A. Reflex Agent (反射型 Agent) - 您的选择
B. Model-based Agent (基于模型的 Agent)
D. Simple Response Agent (简单响应 Agent)
让我们用一个旅行规划助手的代码示例来对比不同 Agent 类型:
class ReflexAgent:
def perceive_and_act(self, perception):
# 简单的条件-动作规则,没有规划
if perception == "需要机票":
return "订机票"
elif perception == "需要酒店":
return "订酒店"
# ⚠️ 问题: 不知道先后顺序,无法处理依赖关系
# 如果同时需要机票和酒店,它无法规划最优顺序
class GoalBasedAgent:
def __init__(self):
self.goal = None
self.current_state = {}
def set_goal(self, goal):
"""设置目标:完成整个旅行安排"""
self.goal = goal # 例如: "完成北京3日游安排"
def plan(self, goal, current_state):
"""核心:规划能力 - 生成行动序列"""
plan = []
# 分析目标,分解为子目标
if goal == "完成北京3日游安排":
# 通过搜索算法确定最优顺序
plan = [
("查询航班", "确定出行日期"),
("预订机票", "锁定出行时间"),
("预订酒店", "确保有住宿,位置靠近景点"),
("规划行程", "制定每日游览路线"),
("预订景点门票", "避免现场排队"),
("租车或规划交通", "提高出行效率")
]
return plan
def execute(self):
"""执行规划的行动序列"""
plan = self.plan(self.goal, self.current_state)
for action, reason in plan:
print(f"执行: {action} (原因: {reason})")
self.current_state[action] = "已完成"
# 检查是否达到目标
if self.goal_reached():
print("✅ 目标达成!")
break
def goal_reached(self):
"""检查目标是否达成"""
required_tasks = ["查询航班", "预订机票", "预订酒店",
"规划行程", "预订景点门票"]
return all(task in self.current_state for task in required_tasks)
# 使用示例
agent = GoalBasedAgent()
agent.set_goal("完成北京3日游安排")
agent.execute()
# 输出:
# 执行: 查询航班 (原因: 确定出行日期)
# 执行: 预订机票 (原因: 锁定出行时间)
# 执行: 预订酒店 (原因: 确保有住宿,位置靠近景点)
# ...
# ✅ 目标达成!
关键区别:
错误想法:反射型 Agent 反应迅速,应该能处理复杂任务。
真相:速度 ≠ 智能。复杂任务需要的是规划能力,而非反应速度。就像下棋,高手需要深思熟虑,而非冲动落子。
错误想法:Model-based Agent 有内部模型,应该也能规划。
真相:有地图(模型) ≠ 会导航(规划)。Model-based Agent 知道"世界是什么样",但 Goal-based Agent 知道"如何改变世界以达成目标"。
错误想法:用多个 Reflex Agent 组合起来就能处理复杂任务。
真相:任务间存在依赖关系和约束条件,需要统一的规划协调。例如,订酒店必须在确定航班后进行,这种时序关系需要中央规划。
关键理解:"多步骤"不仅指步骤数量多,更重要的是步骤间存在逻辑依赖和条件分支。Goal-based Agent 能够:
Utility-based Agent (效用导向)
不仅能规划,还能根据效用函数选择"最优"方案(考虑成本、时间、舒适度等多维度)
Goal-based Agent (目标导向) ⭐ 本题答案
能进行规划,生成达成目标的行动序列
Model-based Reflex Agent (基于模型的反射)
维护内部状态,能处理部分可观测环境,但仍是反应式
Simple Reflex Agent (简单反射)
基于当前感知的条件-动作规则
Simple Response Agent (简单响应)
最基础的输入-输出映射
核心思想:将问题建模为状态图,通过搜索算法找到从初始状态到目标状态的路径。
# 经典的 A* 搜索算法示例
import heapq
def a_star_search(start, goal, get_neighbors, heuristic):
"""
A* 搜索算法 - Goal-based Agent 的核心
参数:
start: 初始状态
goal: 目标状态
get_neighbors: 函数,返回当前状态的所有可达邻居状态
heuristic: 启发式函数,估计从当前状态到目标的代价
"""
# 优先队列: (f值, 状态, 路径)
frontier = [(0, start, [])]
explored = set()
while frontier:
f_cost, current, path = heapq.heappop(frontier)
# 找到目标
if current == goal:
return path + [current]
if current in explored:
continue
explored.add(current)
# 扩展邻居节点
for neighbor, cost in get_neighbors(current):
if neighbor not in explored:
g_cost = len(path) + cost # 实际代价
h_cost = heuristic(neighbor, goal) # 启发式估计
f_cost = g_cost + h_cost # 总代价
heapq.heappush(frontier,
(f_cost, neighbor, path + [current]))
return None # 无解
# 旅行规划示例
def plan_trip():
start = "家"
goal = "完成旅行准备"
def get_neighbors(state):
# 定义状态转移
transitions = {
"家": [("查机票", 1)],
"查机票": [("订机票", 2), ("放弃出行", 0)],
"订机票": [("订酒店", 2)],
"订酒店": [("规划行程", 1)],
"规划行程": [("完成旅行准备", 0)]
}
return transitions.get(state, [])
def heuristic(state, goal):
# 简单的启发式: 估计剩余步骤数
steps_to_goal = {
"家": 4,
"查机票": 3,
"订机票": 2,
"订酒店": 1,
"规划行程": 0,
"完成旅行准备": 0
}
return steps_to_goal.get(state, 999)
plan = a_star_search(start, goal, get_neighbors, heuristic)
return plan
# 执行规划
print("旅行规划路径:", plan_trip())
# 输出: ['家', '查机票', '订机票', '订酒店', '规划行程', '完成旅行准备']
核心思想:将复杂任务递归分解为更小的子任务,直到可以直接执行。
class HTNPlanner:
def __init__(self):
# 定义任务分解规则
self.decomposition = {
"完成旅行": [
"安排交通",
"安排住宿",
"规划行程"
],
"安排交通": [
"查询航班",
"比较价格",
"预订机票",
"确认订单"
],
"安排住宿": [
"搜索酒店",
"筛选位置",
"预订酒店"
],
"规划行程": [
"列出景点",
"优化路线",
"预订门票"
]
}
# 定义原子操作(不可再分解)
self.primitive_tasks = {
"查询航班", "比较价格", "预订机票", "确认订单",
"搜索酒店", "筛选位置", "预订酒店",
"列出景点", "优化路线", "预订门票"
}
def plan(self, task, depth=0):
"""递归分解任务"""
indent = " " * depth
# 如果是原子任务,直接执行
if task in self.primitive_tasks:
print(f"{indent}✓ 执行: {task}")
return [task]
# 否则递归分解
if task in self.decomposition:
print(f"{indent}📋 分解任务: {task}")
plan = []
for subtask in self.decomposition[task]:
plan.extend(self.plan(subtask, depth + 1))
return plan
return []
# 使用示例
planner = HTNPlanner()
print("=== HTN 规划过程 ===")
final_plan = planner.plan("完成旅行")
print("\n=== 最终执行计划 ===")
for i, action in enumerate(final_plan, 1):
print(f"{i}. {action}")
核心思想:使用前提条件和效果来描述行动,通过逻辑推理生成计划。
class STRIPSAction:
"""STRIPS 风格的行动表示"""
def __init__(self, name, preconditions, effects):
self.name = name
self.preconditions = preconditions # 前提条件
self.effects = effects # 执行效果
def is_applicable(self, state):
"""检查行动是否可在当前状态执行"""
return all(cond in state for cond in self.preconditions)
def apply(self, state):
"""执行行动,产生新状态"""
new_state = state.copy()
for effect in self.effects:
if effect.startswith("NOT_"):
new_state.discard(effect[4:])
else:
new_state.add(effect)
return new_state
# 定义旅行规划的行动
actions = [
STRIPSAction(
"查询航班",
preconditions={"有出行意图"},
effects={"知道航班信息"}
),
STRIPSAction(
"预订机票",
preconditions={"知道航班信息", "有支付能力"},
effects={"已预订机票", "NOT_有支付能力"}
),
STRIPSAction(
"预订酒店",
preconditions={"已预订机票"},
effects={"已预订酒店"}
),
STRIPSAction(
"规划行程",
preconditions={"已预订机票", "已预订酒店"},
effects={"旅行准备完成"}
)
]
# 初始状态
initial_state = {"有出行意图", "有支付能力"}
goal = {"旅行准备完成"}
# 简单的前向搜索规划器
def forward_search(initial, goal, actions):
queue = [(initial, [])]
explored = set()
while queue:
state, plan = queue.pop(0)
if goal.issubset(state):
return plan
state_tuple = tuple(sorted(state))
if state_tuple in explored:
continue
explored.add(state_tuple)
for action in actions:
if action.is_applicable(state):
new_state = action.apply(state)
queue.append((new_state, plan + [action.name]))
return None
plan = forward_search(initial_state, goal, actions)
print("STRIPS 规划结果:", plan)
# 输出: ['查询航班', '预订机票', '预订酒店', '规划行程']
# LangChain Agent 示例
from langchain.agents import initialize_agent
from langchain.tools import Tool
tools = [
Tool(name="搜索", func=search_engine),
Tool(name="计算器", func=calculator),
Tool(name="数据库", func=query_db)
]
agent = initialize_agent(
tools, llm,
agent="zero-shot-react-description"
)
# Agent 会自动规划使用哪些工具
result = agent.run(
"找出2023年销售额最高的产品"
)
# 规划: 数据库查询 → 计算器排序 → 返回结果
# 游戏 NPC 的 GOAP 规划
class NPCAgent:
def plan_behavior(self):
goal = "消灭敌人"
current_state = {
"有武器": False,
"有弹药": False,
"知道敌人位置": True
}
# 规划行动序列
# 1. 寻找武器
# 2. 获取弹药
# 3. 前往敌人位置
# 4. 攻击敌人
return self.goap_planner.plan(
current_state, goal
)
基础理论
Russell & Norvig 《人工智能:一种现代方法》第2-4章 (Agent 理论基础)
搜索与规划算法
学习 A*、Dijkstra、BFS/DFS、STRIPS、HTN 等算法
实践项目
实现一个简单的路径规划系统、游戏 AI 或机器人控制器
前沿技术
研究强化学习 Agent、Multi-Agent System、LLM-based Agent
✅ 复杂多步骤任务的本质: 需要前瞻性规划、全局优化、处理依赖关系
✅ Goal-based Agent 的核心能力: 状态空间搜索、目标分解、行动序列生成
✅ 与其他 Agent 的区别: 反射型只能反应,基于模型只有记忆,只有目标导向才能规划
✅ 实际应用广泛: 从游戏 AI 到自动驾驶,从 LLM Agent 到工业机器人
记忆口诀:"反射快但盲,模型知但呆,目标慧能谋,效用更精明"