AI Agent入门教程:零基础理解智能体的核心概念与工作流程
AI Agent入门教程:零基础理解智能体的核心概念与工作流程
1. 引入与连接:智能体的崛起与我们的未来
1.1 一场正在发生的变革
想象一下这样的场景:清晨,你的个人AI助手已经根据你的睡眠质量、日程安排和交通状况调整了闹钟时间,同时为你准备了基于健康数据推荐的早餐食谱;上班路上,它帮你重排了会议顺序,因为交通拥堵会让你迟到;到了公司,一个商务智能体已经帮你整理了会议材料,分析了竞争对手最新动态,并草拟了回复策略;晚上回家,另一个教育智能体已经根据你孩子的学习进度调整了辅导计划,而家庭管理智能体则优化了能源使用,确保你的家既舒适又节能。
这不是科幻小说,而是AI Agent(智能体)技术正在逐步实现的现实。在ChatGPT、GPT-4等大语言模型引发全球关注之后,AI Agent被认为是下一个技术革命的引爆点。它不仅能理解和生成内容,更能感知环境、做出决策、执行任务,并从经验中学习——简单来说,AI Agent是能"行动"的AI。
1.2 为什么AI Agent如此重要?
要理解AI Agent的重要性,我们可以回顾一下AI发展的几个阶段:
-
规则驱动的AI:早期的AI系统,如下棋程序、专家系统,完全依赖人类预设的规则。它们在特定领域表现出色,但缺乏适应性和泛化能力。
-
机器学习驱动的AI:随着大数据和计算能力的提升,AI系统开始从数据中学习模式,如推荐系统、图像识别。这些系统能处理复杂模式,但仍然是"被动"的——它们等待输入,然后给出输出。
-
大语言模型时代:ChatGPT等模型展示了惊人的语言理解和生成能力,能进行多轮对话、创作内容、解答问题。但它们本质上仍然是"反应式"的,没有自主目标和持续行动能力。
-
AI Agent时代:现在,我们正在进入AI Agent时代。AI Agent不仅能理解和生成,还能设定目标、制定计划、执行任务、适应变化——它们是"主动"的AI。
这种从"被动响应"到"主动行动"的转变,为什么如此重要?因为现实世界中的大多数问题都需要持续的互动和决策,而不是一次性的问答。
1.3 你将从这篇教程中学到什么
无论你是AI领域的新手,还是有一定经验的从业者,这篇教程都将为你提供一个全面、系统的AI Agent入门指南。我们将:
- 从最基础的概念开始,确保你能建立直观的理解
- 深入AI Agent的核心组件和工作流程
- 通过实际例子和代码,让你亲手构建简单的AI Agent
- 探索AI Agent的应用场景和未来发展
- 提供最佳实践和进阶路径
我们的学习路径将像攀登金字塔一样,从基础的直观理解开始,逐步深入到原理机制,最后达到多维整合和实践应用的高度。
现在,就让我们开始这段AI Agent探索之旅吧!
2. 概念地图:建立AI Agent的整体认知框架
在深入探讨AI Agent的细节之前,让我们先构建一个整体的概念框架,帮助你理解AI Agent是什么,它由哪些部分组成,以及它与其他AI概念的关系。
2.1 什么是AI Agent?
让我们从一个简单但准确的定义开始:
**AI Agent(智能体)**是一个能够感知环境、做出决策并执行行动,以实现特定目标的自主系统。
这个定义包含了几个关键词,让我们逐一解析:
- 自主系统:AI Agent能够在没有持续人工干预的情况下运行
- 感知环境:通过传感器或API获取关于环境的信息
- 做出决策:基于感知到的信息和内部状态,决定下一步行动
- 执行行动:通过执行器或API对环境产生影响
- 实现特定目标:所有行动都是为了实现一个或多个预设目标
为了让这个概念更直观,让我们用一个生活化的类比:AI Agent就像一个虚拟的"员工"或"助手",你给它一个目标,它会自己想办法完成。
2.2 AI Agent的核心概念与关键术语
在深入学习之前,让我们先熟悉一些AI Agent领域的核心概念和关键术语:
| 概念/术语 | 简洁定义 | 类比 |
|---|---|---|
| 智能体(Agent) | 能感知环境并做出行动的实体 | 一个员工 |
| 环境(Environment) | 智能体存在和交互的外部世界 | 办公室和市场 |
| 感知(Perception) | 获取环境信息的过程 | 看、听、阅读 |
| 行动(Action) | 智能体对环境的操作 | 写邮件、打电话 |
| 目标(Goal) | 智能体试图实现的状态 | 完成销售任务 |
| 策略(Policy) | 从感知到行动的映射规则 | 员工的工作流程 |
| 状态(State) | 环境和智能体的当前情况 | 项目进展、待办事项 |
| 奖励(Reward) | 对行动结果的反馈 | 绩效奖金 |
| 规划(Planning) | 预先确定行动序列的过程 | 制定项目计划 |
| 推理(Reasoning) | 从信息中得出结论的过程 | 分析数据做出判断 |
| 学习(Learning) | 随着时间推移改进性能的能力 | 从经验中成长 |
| 多智能体系统(Multi-Agent System) | 多个智能体交互的系统 | 一个团队 |
2.3 AI Agent的分类与边界
AI Agent可以根据不同的维度进行分类,了解这些分类有助于我们理解不同类型Agent的特点和应用场景:
2.3.1 按智能程度分类
-
简单反射型Agent:仅基于当前感知做出决策,不考虑历史
- 例子:简单的恒温器,只根据当前温度决定开关
- 特点:简单但缺乏适应性
-
基于模型的反射型Agent:维护内部状态,跟踪历史信息
- 例子:自动驾驶汽车,需要了解车辆和道路的历史状态
- 特点:能处理部分可观察的环境
-
基于目标的Agent:不仅考虑当前状态,还考虑目标状态
- 例子:导航系统,规划从A到B的路径
- 特点:有明确的方向性
-
基于效用的Agent:在多个目标中选择最优解,最大化效用
- 例子:电商推荐系统,平衡用户满意度和商业目标
- 特点:能处理复杂的权衡决策
-
学习型Agent:能够从经验中学习,改进自身性能
- 例子:个性化推荐系统,根据用户反馈不断优化
- 特点:适应性强,性能随时间提升
2.3.2 按功能分类
-
信息Agent:收集、处理和提供信息
- 例子:新闻聚合器、研究助手
-
任务Agent:执行特定任务
- 例子:日程管理、旅行预订
-
交互Agent:与用户或其他Agent交互
- 例子:聊天机器人、游戏NPC
-
协作Agent:与其他Agent协作完成任务
- 例子:团队项目管理、分布式计算
2.4 AI Agent与相关概念的关系
为了更清晰地理解AI Agent,让我们看看它与其他几个常见AI概念的关系:
2.4.1 AI Agent vs. 大语言模型(LLM)
大语言模型(如GPT-4)是AI Agent的重要组件,但不等同于Agent:
- LLM:擅长理解和生成自然语言,是一个强大的"大脑",但缺乏感知环境和执行行动的能力
- AI Agent:可以包含LLM作为其推理和决策组件,但还需要感知模块、行动模块和记忆模块等,是一个完整的"系统"
可以这样类比:LLM就像一个超级聪明但没有手脚和感官的大脑,而AI Agent则是给这个大脑装上了眼睛、耳朵、手脚,并给了它目标和记忆。
2.4.2 AI Agent vs. 机器人
机器人是AI Agent的一种物理实现形式:
- 机器人:有物理实体,通过物理传感器感知环境,通过物理执行器作用于环境
- AI Agent:可以是物理的(如机器人),也可以是纯软件的(如聊天机器人、推荐系统)
2.4.3 AI Agent vs. 传统软件
传统软件和AI Agent的主要区别在于自主性和适应性:
- 传统软件:按照预设的规则和流程运行,处理预期内的情况
- AI Agent:能够处理不确定性,自主做出决策,适应环境变化
2.5 AI Agent的概念图谱
为了更直观地理解AI Agent的概念体系,让我们构建一个概念图谱:
这个概念图谱展示了AI Agent的核心概念、主要组件、类型、应用领域和技术基础,为我们后续的深入学习提供了一个导航图。
3. 基础理解:建立AI Agent的直观认识
现在我们已经有了AI Agent的整体概念框架,接下来让我们深入理解它的核心要素和工作原理。我们将从最简单的模型开始,逐步增加复杂度。
3.1 AI Agent的核心循环
在最基本的层面上,所有AI Agent都遵循一个简单的循环模式:感知-决策-行动(Perceive-Decide-Act)循环。
让我们用一个日常生活中的例子来说明这个循环:
想象你正在开车。这个场景中,你就是一个Agent:
- 感知:你通过眼睛观察道路、交通信号灯、其他车辆;通过耳朵听喇叭声;通过身体感受车辆的状态
- 决策:基于感知到的信息,你决定是加速、减速、刹车、还是转弯
- 行动:你踩油门、刹车或转动方向盘来执行你的决策
- 反馈:你的行动改变了环境(车辆位置、速度),而新的环境状态又成为下一轮感知的输入
这个循环不断重复,直到你到达目的地(实现目标)。
AI Agent的工作原理完全相同,只不过它是通过传感器(如摄像头、麦克风、API)来感知,通过算法来决策,通过执行器(如电机、API调用)来行动。
3.2 AI Agent的基本架构:从简单到复杂
让我们从最简单的Agent架构开始,逐步增加复杂度,了解不同类型Agent的工作原理。
3.2.1 简单反射型Agent
这是最简单的Agent类型,它的决策完全基于当前感知,不考虑历史信息。
工作原理:
- 当前感知 → 条件规则 → 行动
生活中的例子:
- 恒温器:如果温度低于设定值,就打开暖气;如果温度高于设定值,就关闭暖气
- 简单的垃圾邮件过滤器:如果邮件包含某些关键词,就标记为垃圾邮件
优点:
- 简单易实现
- 响应速度快
局限性:
- 无法处理部分可观察的环境
- 缺乏适应性,无法处理未预见的情况
- 不能从经验中学习
让我们用Python代码实现一个简单的反射型Agent:
class SimpleReflexAgent:
def __init__(self, rules):
self.rules = rules # 规则库:{感知: 行动}
def perceive(self, environment):
"""感知环境,获取当前状态"""
return environment.get_state()
def decide(self, perception):
"""根据感知和规则决定行动"""
return self.rules.get(perception, "default_action")
def act(self, action, environment):
"""执行行动,改变环境"""
environment.update(action)
def run(self, environment, steps=10):
"""运行Agent的主循环"""
for step in range(steps):
perception = self.perceive(environment)
action = self.decide(perception)
self.act(action, environment)
print(f"Step {step+1}: Perceived '{perception}', took action '{action}'")
# 环境类
class SimpleEnvironment:
def __init__(self, initial_state):
self.state = initial_state
def get_state(self):
return self.state
def update(self, action):
# 环境根据行动更新状态(这里简化处理)
if action == "heat":
self.state = "warm"
elif action == "cool":
self.state = "cool"
elif action == "default_action":
# 随机变化
import random
self.state = random.choice(["cold", "warm", "hot"])
# 使用示例
if __name__ == "__main__":
# 定义规则
temp_rules = {
"cold": "heat",
"hot": "cool",
"warm": "default_action"
}
# 创建Agent和环境
agent = SimpleReflexAgent(temp_rules)
environment = SimpleEnvironment("cold")
# 运行Agent
agent.run(environment, steps=5)
这个简单的例子展示了反射型Agent的核心工作原理:感知环境状态,根据预定义规则选择行动,执行行动并改变环境。
3.2.2 基于模型的反射型Agent
简单反射型Agent的一个主要问题是它们不能处理部分可观察的环境——当Agent无法直接感知到所有相关信息时,它们就会遇到困难。
基于模型的反射型Agent通过维护一个内部状态来解决这个问题,这个状态记录了Agent的历史感知,从而让Agent能够推断出无法直接观察到的信息。
工作原理:
- 当前感知 + 内部状态 → 更新内部状态 → 条件规则 → 行动
生活中的例子:
- 当你在开车时,另一辆车从你的视野中消失(进入盲点),你仍然会记得它的存在,并据此做出驾驶决策
- 一个对话机器人,需要记住之前的对话内容,才能进行有意义的多轮对话
架构组成:
- 感知模块:获取环境信息
- 状态管理模块:根据新的感知更新内部状态
- 世界模型:描述环境如何随时间变化,以及行动如何影响环境
- 决策模块:基于更新后的状态选择行动
- 执行模块:执行选定的行动
让我们用一个简单的例子来说明:假设我们有一个清洁机器人,它在一个有两个房间(A和B)的环境中工作。机器人可以感知当前所在的房间是否有灰尘,但不能直接感知另一个房间的状态。
class ModelBasedReflexAgent:
def __init__(self, initial_state, world_model, rules):
self.state = initial_state # 内部状态
self.world_model = world_model # 世界模型
self.rules = rules # 规则库
def perceive(self, environment):
"""感知环境,获取当前观察"""
return environment.get_observation()
def update_state(self, perception, action):
"""根据感知和上一个行动更新内部状态"""
self.state = self.world_model(self.state, perception, action)
def decide(self, state):
"""根据状态和规则决定行动"""
return self.rules.get(state, "default_action")
def act(self, action, environment):
"""执行行动,改变环境"""
environment.update(action)
def run(self, environment, steps=10):
"""运行Agent的主循环"""
action = "start" # 初始行动
for step in range(steps):
perception = self.perceive(environment)
self.update_state(perception, action)
action = self.decide(self.state)
self.act(action, environment)
print(f"Step {step+1}: State '{self.state}', Perceived '{perception}', took action '{action}'")
# 两房间清洁环境
class TwoRoomEnvironment:
def __init__(self, agent_location, a_dirty, b_dirty):
self.agent_location = agent_location # 机器人位置: 'A' 或 'B'
self.room_states = {'A': a_dirty, 'B': b_dirty} # 房间状态: True(脏) 或 False(干净)
def get_observation(self):
"""返回当前观察:(位置, 当前房间是否脏)"""
return (self.agent_location, self.room_states[self.agent_location])
def update(self, action):
"""根据行动更新环境状态"""
if action == "left":
self.agent_location = "A"
elif action == "right":
self.agent_location = "B"
elif action == "suck":
self.room_states[self.agent_location] = False
# 环境也可能自主变化(例如,干净的房间可能变脏)
import random
if random.random() < 0.1: # 10%的概率房间变脏
room = random.choice(['A', 'B'])
self.room_states[room] = True
# 世界模型:预测下一个状态
def vacuum_world_model(state, perception, action):
location, is_dirty = perception
a_dirty, b_dirty, last_location = state
# 更新位置信息
if action == "left":
last_location = "A"
elif action == "right":
last_location = "B"
# 根据感知更新当前房间的清洁状态
if location == "A":
a_dirty = is_dirty
else:
b_dirty = is_dirty
return (a_dirty, b_dirty, last_location)
# 使用示例
if __name__ == "__main__":
# 初始状态:(A是否脏, B是否脏, 上一个位置)
initial_state = (True, True, "A")
# 规则库:状态 -> 行动
# 状态格式:(A是否脏, B是否脏, 当前位置)
vacuum_rules = {
(True, True, "A"): "suck",
(True, True, "B"): "suck",
(True, False, "A"): "suck",
(True, False, "B"): "left",
(False, True, "A"): "right",
(False, True, "B"): "suck",
(False, False, "A"): "right", # 巡视
(False, False, "B"): "left" # 巡视
}
# 创建Agent和环境
agent = ModelBasedReflexAgent(initial_state, vacuum_world_model, vacuum_rules)
environment = TwoRoomEnvironment("A", True, True)
# 运行Agent
agent.run(environment, steps=10)
这个例子展示了基于模型的反射型Agent如何通过维护内部状态来处理部分可观察的环境。即使机器人无法直接看到另一个房间的状态,它仍然可以通过内部状态来跟踪两个房间的清洁情况。
3.2.3 基于目标的Agent
基于模型的反射型Agent可以处理部分可观察的环境,但它们仍然缺乏明确的目标导向——它们的决策是基于当前状态和规则,而不是基于它们想要达到的未来状态。
基于目标的Agent通过引入目标概念来解决这个问题。目标描述了Agent想要达到的状态,Agent会根据行动是否有助于实现目标来选择行动。
工作原理:
- 当前感知 + 内部状态 → 更新内部状态 → 考虑目标 → 规划行动序列 → 选择行动
生活中的例子:
- 导航应用:不仅知道当前位置,还知道目的地(目标),并规划出从当前位置到目的地的路径
- 下棋程序:不仅知道当前棋局,还知道目标(赢棋),并会考虑每一步对实现目标的影响
关键组件:
- 目标表示:明确表示Agent想要达到的状态
- 搜索与规划:找出从当前状态到目标状态的行动序列
- 状态空间:所有可能状态的集合
让我们用一个经典的"8数码谜题"来说明基于目标的Agent是如何工作的。8数码谜题是一个3x3的网格,包含数字1-8和一个空格,目标是通过移动数字将拼图从初始状态转换到目标状态。
from collections import deque
import copy
class EightPuzzleState:
"""表示8数码谜题的状态"""
def __init__(self, tiles):
self.tiles = tiles # 3x3的二维列表表示拼图状态
self.blank_pos = self._find_blank() # 空格位置
def _find_blank(self):
"""找到空格的位置"""
for i in range(3):
for j in range(3):
if self.tiles[i][j] == 0:
return (i, j)
return None
def get_possible_actions(self):
"""获取当前状态下的所有可能行动"""
actions = []
i, j = self.blank_pos
# 上
if i > 0:
actions.append("up")
# 下
if i < 2:
actions.append("down")
# 左
if j > 0:
actions.append("left")
# 右
if j < 2:
actions.append("right")
return actions
def apply_action(self, action):
"""应用行动,返回新状态"""
i, j = self.blank_pos
new_tiles = copy.deepcopy(self.tiles)
if action == "up":
new_tiles[i][j], new_tiles[i-1][j] = new_tiles[i-1][j], new_tiles[i][j]
elif action == "down":
new_tiles[i][j], new_tiles[i+1][j] = new_tiles[i+1][j], new_tiles[i][j]
elif action == "left":
new_tiles[i][j], new_tiles[i][j-1] = new_tiles[i][j-1], new_tiles[i][j]
elif action == "right":
new_tiles[i][j], new_tiles[i][j+1] = new_tiles[i][j+1], new_tiles[i][j]
return EightPuzzleState(new_tiles)
def is_goal(self, goal_state):
"""检查是否达到目标状态"""
return self.tiles == goal_state.tiles
def __eq__(self, other):
return self.tiles == other.tiles
def __hash__(self):
return hash(tuple(tuple(row) for row in self.tiles))
def __str__(self):
return '\n'.join([' '.join(map(str, row)) for row in self.tiles])
class GoalBasedAgent:
"""基于目标的Agent"""
def __init__(self, initial_state, goal_state):
self.current_state = initial_state
self.goal_state = goal_state
self.plan = [] # 规划好的行动序列
def bfs_search(self):
"""使用广度优先搜索找到从当前状态到目标状态的行动序列"""
if self.current_state.is_goal(self.goal_state):
return []
# 队列中的元素:(状态, 行动序列)
queue = deque([(self.current_state, [])])
visited = set([self.current_state])
while queue:
state, actions = queue.popleft()
for action in state.get_possible_actions():
next_state = state.apply_action(action)
if next_state not in visited:
visited.add(next_state)
next_actions = actions + [action]
if next_state.is_goal(self.goal_state):
return next_actions
queue.append((next_state, next_actions))
return None # 无解
def plan_action(self):
"""规划行动序列"""
if not self.plan: # 如果没有规划或规划已完成
self.plan = self.bfs_search()
if self.plan:
return self.plan.pop(0)
else:
return None # 无解
def execute_action(self, action):
"""执行行动"""
if action:
self.current_state = self.current_state.apply_action(action)
def run(self):
"""运行Agent,直到达到目标或确定无解"""
steps = 0
print("初始状态:")
print(self.current_state)
print("\n目标状态:")
print(self.goal_state)
print("\n开始求解...")
while not self.current_state.is_goal(self.goal_state):
action = self.plan_action()
if action is None:
print("无解!")
return
self.execute_action(action)
steps += 1
print(f"\n步骤 {steps}: 执行行动 '{action}'")
print(self.current_state)
print(f"\n成功!共使用 {steps} 步。")
# 使用示例
if __name__ == "__main__":
# 初始状态
initial_tiles = [
[1, 2, 3],
[4, 0, 5],
[7, 8, 6]
]
# 目标状态
goal_tiles = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 0]
]
initial_state = EightPuzzleState(initial_tiles)
goal_state = EightPuzzleState(goal_tiles)
agent = GoalBasedAgent(initial_state, goal_state)
agent.run()
这个例子展示了基于目标的Agent如何通过搜索和规划来找到实现目标的行动序列。Agent首先规划出从初始状态到目标状态的完整行动序列,然后逐步执行这些行动。
3.2.4 基于效用的Agent
基于目标的Agent可以实现目标,但当有多个可能的目标或多个实现同一目标的路径时,它们无法选择"最好"的那一个。
基于效用的Agent通过引入效用函数来解决这个问题。效用函数衡量每个状态的"好坏"程度,Agent的目标是最大化期望效用。
工作原理:
- 当前感知 + 内部状态 → 更新内部状态 → 考虑目标和效用 → 评估可能的行动序列 → 选择能最大化效用的行动
生活中的例子:
- 旅行规划:不仅考虑到达目的地(目标),还考虑时间、费用、舒适度等多个因素,选择总体效用最高的方案
- 投资决策:在风险和收益之间进行权衡,选择期望效用最高的投资组合
关键概念:
- 效用函数:将状态映射到一个数值,表示该状态的可取程度
- 期望效用:在不确定环境下,行动结果的加权平均效用
- 决策理论:在不确定情况下进行决策的数学框架
让我们用一个简单的旅行规划例子来说明基于效用的Agent是如何工作的:
class TravelState:
"""表示旅行状态"""
def __init__(self, location, time, money, comfort):
self.location = location # 当前位置
self.time = time # 已用时间(小时)
self.money = money # 已花费(美元)
self.comfort = comfort # 舒适度(0-10)
def __str__(self):
return f"Location: {self.location}, Time: {self.time}h, Money: ${self.money}, Comfort: {self.comfort}/10"
class TravelAction:
"""表示旅行行动"""
def __init__(self, name, destination, time_cost, money_cost, comfort_change):
self.name = name
self.destination = destination
self.time_cost = time_cost
self.money_cost = money_cost
self.comfort_change = comfort_change
class UtilityBasedAgent:
"""基于效用的Agent"""
def __init__(self, initial_state, goal_location, time_importance, money_importance, comfort_importance):
self.current_state = initial_state
self.goal_location = goal_location
self.time_importance = time_importance
self.money_importance = money_importance
self.comfort_importance = comfort_importance
def utility_function(self, state):
"""计算状态的效用"""
# 归一化各项指标(简化处理)
normalized_time = 1 - (state.time / 24) # 时间越少越好,假设最多24小时
normalized_money = 1 - (state.money / 1000) # 费用越少越好,假设最多1000美元
normalized_comfort = state.comfort / 10 # 舒适度越高越好
# 计算加权平均效用
utility = (
self.time_importance * normalized_time +
self.money_importance * normalized_money +
self.comfort_importance * normalized_comfort
) / (self.time_importance + self.money_importance + self.comfort_importance)
return utility
def get_possible_actions(self, state):
"""获取当前状态下的所有可能行动"""
# 这里简化处理,实际应用中可能需要更复杂的逻辑
if state.location == "Home":
return [
TravelAction("Drive", "Airport", 1, 20, 7),
TravelAction("Bus", "Airport", 2, 5, 5),
TravelAction("Train", "Airport", 1.5, 15, 8)
]
elif state.location == "Airport":
return [
TravelAction("First-Class Flight", "Destination", 5, 800, 9),
TravelAction("Economy Flight", "Destination", 5, 300, 5),
TravelAction("Connecting Flight", "Destination", 8, 200, 4)
]
elif state.location == "Destination":
return [
TravelAction("Taxi", "Hotel", 0.5, 30, 7),
TravelAction("Shuttle", "Hotel", 1, 10, 5)
]
else:
return []
def apply_action(self, state, action):
"""应用行动,返回新状态"""
return TravelState(
action.destination,
state.time + action.time_cost,
state.money + action.money_cost,
max(0, min(10, state.comfort + action.comfort_change))
)
def lookahead(self, state, depth=3):
"""使用有限深度的搜索评估每个行动的效用"""
if depth == 0 or state.location == "Hotel":
return None, self.utility_function(state)
possible_actions = self.get_possible_actions(state)
if not possible_actions:
return None, self.utility_function(state)
best_action = None
best_utility = -float('inf')
for action in possible_actions:
next_state = self.apply_action(state, action)
_, next_utility = self.lookahead(next_state, depth - 1)
if next_utility > best_utility:
best_utility = next_utility
best_action = action
return best_action, best_utility
def choose_action(self):
"""选择能最大化效用的行动"""
action, _ = self.lookahead(self.current_state)
return action
def execute_action(self, action):
"""执行行动"""
if action:
self.current_state = self.apply_action(self.current_state, action)
def run(self):
"""运行Agent,直到到达酒店"""
steps = 0
print("初始状态:")
print(self.current_state)
print(f"效用值: {self.utility_function(self.current_state):.2f}")
while self.current_state.location != "Hotel":
action = self.choose_action()
if action is None:
print("没有可用的行动!")
return
self.execute_action(action)
steps += 1
print(f"\n步骤 {steps}: 执行行动 '{action.name}'")
print(self.current_state)
print(f"效用值: {self.utility_function(self.current_state):.2f}")
print(f"\n到达目的地!共使用 {steps} 步。")
# 使用示例
if __name__ == "__main__":
# 初始状态
initial_state = TravelState("Home", 0, 0, 8)
# 创建不同偏好的Agent
print("=== 注重时间的旅客 ===")
time_sensitive_agent = UtilityBasedAgent(initial_state, "Hotel", 0.7, 0.2, 0.1)
time_sensitive_agent.run()
print("\n=== 注重费用的旅客 ===")
money_sensitive_agent = UtilityBasedAgent(initial_state, "Hotel", 0.1, 0.7, 0.2)
money_sensitive_agent.run()
print("\n=== 注重舒适度的旅客 ===")
comfort_sensitive_agent = UtilityBasedAgent(initial_state, "Hotel", 0.2, 0.1, 0.7)
comfort_sensitive_agent.run()
这个例子展示了基于效用的Agent如何根据不同的偏好选择不同的行动序列。即使是在相同的环境中,具有不同效用函数的Agent也会做出不同的决策。
3.2.5 学习型Agent
前面介绍的各种Agent类型都有一个共同的局限性:它们的行为是由初始设计决定的,无法随着时间的推移而改进。学习型Agent通过引入学习组件来解决这个问题,使其能够从经验中学习,不断提高性能。
工作原理:
- 感知环境 → 更新状态 → 选择行动 → 执行行动 → 获得反馈 → 学习改进 → 下一轮循环
关键组件:
- 学习元素:负责从经验中学习,改进Agent的知识
- 评论元素:评估Agent的行动,并提供反馈(奖励或惩罚)
- 问题生成器:探索新的行动和状态,以发现更好的策略
- 知识库:存储Agent学到的知识
学习类型:
- 监督学习:从标注数据中学习
- 无监督学习:从未标注数据中学习模式
- 强化学习:通过试错和奖励信号学习
让我们用一个经典的强化学习例子——Q学习算法来实现一个学习型Agent。我们将使用经典的"Cliff Walking"环境:
import numpy as np
import random
class CliffWalkingEnvironment:
"""Cliff Walking环境"""
def __init__(self):
self.height = 4
self.width = 12
self.start_state = (3, 0) # 起始位置
self.goal_state = (3, 11) # 目标位置
self.cliff = [(3, i) for i in range(1, 11)] # 悬崖位置
self.current_state = self.start_state
def reset(self):
"""重置环境到初始状态"""
self.current_state = self.start_state
return self.current_state
def step(self, action):
"""执行行动,返回(下一个状态, 奖励, 是否结束)"""
row, col = self.current_state
# 执行行动
if action == 0: # 上
row = max(0, row - 1)
elif action == 1: # 下
row = min(self.height - 1, row + 1)
elif action == 2: # 左
col = max(0, col - 1)
elif action == 3: # 右
col = min(self.width - 1, col + 1)
next_state = (row, col)
# 计算奖励
if next_state == self.goal_state:
reward = 0
done = True
elif next_state in self.cliff:
reward = -100
done = True
else:
reward = -1
done = False
self.current_state = next_state
return next_state, reward, done
def render(self):
"""渲染环境"""
for i in range(self.height):
for j in range(self.width):
if (i, j) == self.current_state:
print("A", end=" ") # Agent
elif (i, j) == self.goal_state:
print("G", end=" ") # Goal
elif (i, j) in self.cliff:
print("C", end=" ") # Cliff
else:
print(".", end=" ") # Empty
print()
print()
class QLearningAgent:
"""Q学习Agent"""
def __init__(self, env, learning_rate=0.1, discount_factor=0.99, exploration_rate=1.0, max_exploration_rate=1.0, min_exploration_rate=0.01, exploration_decay_rate=0.001):
self.env = env
self.learning_rate = learning_rate # 学习率
self.discount_factor = discount_factor # 折扣因子
self.exploration_rate = exploration_rate # 探索率
self.max_exploration_rate = max_exploration_rate # 最大探索率
self.min_exploration_rate = min_exploration_rate # 最小探索率
self.exploration_decay_rate = exploration_decay_rate # 探索衰减率
# 初始化Q表
self.state_size = (env.height, env.width)
self.action_size = 4 # 上、下、左、右
self.q_table = np.zeros(self.state_size + (self.action_size,))
def choose_action(self, state):
"""根据当前状态选择行动(ε-贪婪策略)"""
# 探索:随机选择行动
if random.uniform(0, 1) < self.exploration_rate:
return random.randint(0, self.action_size - 1)
# 利用:选择Q值最大的行动
else:
return np.argmax(self.q_table[state])
def update_q_table(self, state, action, reward, next_state):
"""更新Q表"""
self.q_table[state][action] = self.q_table[state][action] + \
self.learning_rate * (reward + self.discount_factor * np.max(self.q_table[next_state]) - self.q_table[state][action])
def train(self, num_episodes):
"""训练Agent"""
rewards_all_episodes = []
for episode in range(num_episodes):
state = self.env.reset()
done = False
rewards_current_episode = 0
while not done:
# 选择行动
action = self.choose_action(state)
# 执行行动
next_state, reward, done = self.env.step(action)
# 更新Q表
self.update_q_table(state, action, reward, next_state)
# 更新状态
state = next_state
# 记录奖励
rewards_current_episode += reward
# 衰减探索率
self.exploration_rate = self.min_exploration_rate + \
(self.max_exploration_rate - self.min_exploration_rate) * np.exp(-self.exploration_decay_rate * episode)
# 记录奖励
rewards_all_episodes.append(rewards_current_episode)
# 打印训练进度
if (episode + 1) % 100 == 0:
print(f"Episode {episode + 1}/{num_episodes}, Average Reward: {np.mean(rewards_all_episodes[-100:]):.2f}")
return rewards_all_episodes
def test(self, num_episodes=10):
"""测试Agent"""
for episode in range(num_episodes):
state = self.env.reset()
done = False
print(f"Test Episode {episode + 1}:")
self.env.render()
while not done:
# 选择Q值最大的行动(不探索)
action = np.argmax(self.q_table[state])
# 执行行动
state, reward, done = self.env.step(action)
# 渲染环境
self.env.render()
# 使用示例
if __name__ == "__main__":
# 创建环境和Agent
env = CliffWalkingEnvironment()
agent = QLearningAgent(env)
# 训练Agent
print("开始训练...")
rewards = agent.train(num_episodes=1000)
# 测试Agent
print("\n开始测试...")
agent.test(num_episodes=3)
这个例子展示了学习型Agent如何通过与环境互动来学习最佳策略。Agent使用Q学习算法,通过试错和奖励信号不断更新其Q表,最终学会了在Cliff Walking环境中找到最优路径。
3.3 AI Agent的核心组件
通过上面的例子,我们已经看到了不同类型的Agent是如何工作的。现在让我们总结一下AI Agent的核心组件:
3.3.1 感知模块
感知模块负责从环境中获取信息。它的功能类似于生物的感觉器官(眼睛、耳朵等)。
常见的感知方式:
- 视觉感知:通过摄像头或图像处理API获取视觉信息
- 听觉感知:通过麦克风或语音识别API获取听觉信息
- 文本感知:通过API或文件读取获取文本信息
- 数据感知:通过数据库或API获取结构化数据
关键挑战:
- 部分可观察性:无法感知到所有相关信息
- 噪声:感知到的信息可能包含误差
- 高维数据:处理图像、音频等高维数据的复杂性
3.3.2 状态表示
状态表示负责将感知到的信息和Agent的内部知识组织成一种有用的形式。
常见的状态表示方式:
- 原子表示:将状态视为不可分割的整体(如8数码谜题中的状态)
- 因素化表示:将状态表示为一组变量或特征(如旅行状态中的时间、费用、舒适度)
- 结构化表示:使用关系、对象、逻辑等更复杂的结构表示状态
关键挑战:
- 状态空间大小:随着变量数量的增加,状态空间可能呈指数级增长
- 部分可观察性:如何从有限的感知中推断出完整的状态
- 抽象:如何在不同层次上表示状态
3.3.3 推理与规划
推理与规划模块负责根据当前状态和目标决定下一步行动。
常见的推理方法:
- 逻辑推理:使用逻辑规则进行推理
- 概率推理:使用概率模型进行推理
- 因果推理:推断因果关系
常见的规划方法:
- 状态空间搜索:在状态空间中搜索从当前状态到目标状态的路径
- 规划域定义语言(PDDL):一种用于描述规划问题的标准语言
- 分层规划:将复杂问题分解为子问题,逐层解决
关键挑战:
- 组合爆炸:随着问题规模的增加,可能的计划数量呈指数级增长
- 不确定性:在不确定环境中进行规划
- 实时性:在有限时间内找到好的
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)