本节摘要:造智能体需要两把工具——数学和编程。本节把线性代数、概率统计、微积分、离散数学分别「安放」到智能体的感知、决策、学习等环节,再用 Python 把数据类型、运算符、控制流、函数、类逐一过一遍,最后用「感知—决策—行动」的智能体类骨架演示这些基础怎么组合起来。读完本节,你能说出每块数学知识在智能体里管什么,也能用类组织一个最小智能体。
阅读完本节,你应当能够:
很多人被「AI 需要高深数学」劝退。但换个角度想:你把一张图片送进智能体,它内部存的其实是一个大矩阵;你让智能体在不确定环境里做选择,它在算概率;你训练一个模型让它变聪明,过程是反复求梯度、沿梯度下山。数学不是「为了考试」,它就是智能体内部实实在在的数据结构和运算。
同样,编程基础不是为了「会写代码」,而是为了能把上面的抽象概念变成能跑的实体。一个智能体就是一组类和方法的组合:感知方法读环境、决策方法做计算、行动方法改世界。本节的目标不是把数学和编程各讲一遍——那需要好几本书——而是建立「概念 ↔ 工具」的对应关系,让后续章节出现向量、概率、梯度、类时,你心里有底。
智能体里的数据几乎都以向量或矩阵形式存在:状态(机器人的位置速度)是向量,神经网络参数是矩阵,图像本质是像素矩阵。四个核心概念:
直观例子:缩放变换 [[2,0],[0,0.5]] 乘向量 [1,1],x 方向放大 2 倍、y 方向缩小一半,得到 [2, 0.5]。这就是「用矩阵描述环境的几何操作」。
智能体在不确定环境里工作,概率论就是处理不确定性的数学框架。核心概念:
SOURCE 给了一个极好的例子——疾病检测:假设患病先验概率 P(病)=0.01,检测灵敏度 P(阳性|病)=0.95,假阳性率 P(阳性|无病)=0.05。用全概率公式算出 P(阳性),再用贝叶斯定理算后验 P(病|阳性):
P_Disease = 0.01 P_Pos_Given_Disease = 0.95 P_Pos_Given_NoDisease = 0.05 P_Positive = P_Pos_Given_Disease * P_Disease + P_Pos_Given_NoDisease * (1 - P_Disease) P_Disease_Given_Positive = (P_Pos_Given_Disease * P_Disease) / P_Positive print(P_Disease_Given_Positive) # 约为 0.161,远低于直觉
结果只有约 16%——即使检测阳性,真正患病的概率也不高,因为先验患病率太低、假阳性率不低。这个例子说明:智能体做判断必须把先验和证据一起算,不能只看单一信号。这对理解贝叶斯网络、卡尔曼滤波这类感知与决策工具是前置知识。
智能体「变聪明」的过程本质是优化:最小化损失函数、最大化累积奖励。微积分就是做优化的引擎。
x = 10.0 learning_rate = 0.1 for _ in range(50): grad = 2 * x - 4 # 目标函数 x^2-4x+5 的导数 x = x - learning_rate * grad
学习率 learning_rate 决定每步迈多大:太大震荡甚至发散,太小收敛慢。这个「步长权衡」贯穿所有训练类算法,第 6 章强化学习进阶里会再次遇到。反向传播、策略梯度,本质上都是「链式法则算梯度」的应用。
对基于符号的智能体(专家系统、规划器、知识图谱),离散数学是地基:集合论为知识表示打底,图论用于表示关系、网络、状态空间(路径规划、知识图谱都用它),逻辑学(命题逻辑、谓词逻辑)支撑逻辑推理,组合数学用于算法分析与概率计算。深度学习主导的今天,离散数学显得「低调」,但一旦进入混合型或符号型系统,它立刻变成不可缺的工具。
SOURCE 原文的编程部分覆盖了完整的基础集:数据类型(整型/浮点/字符串/布尔)、复合结构(列表/元组/字典/集合)、运算符(算术/比较/逻辑/赋值/成员/身份)、控制流(if-elif-else、for、while)、函数(定义/调用/参数/返回值)、类与对象。这里不逐条展开——它们都是 Python 基础,重点强调两点:
第一,列表和字典是智能体最常用的两个结构。列表存序列数据(时间序列、传感器读数、动作序列);字典存结构化数据(配置、状态描述、知识表示)。SOURCE 里的 agent_state 字典把位置、电量、完成任务数、充电状态装在一起,正是智能体状态的典型表示。
第二,类是组织智能体的自然单位。感知、决策、行动天然是三个方法。把环境的属性和行为也放进一个类,就构成「智能体 + 环境」的结对。面向对象(OOP)的继承、多态能进一步支撑复杂架构——比如不同决策策略继承同一基类。
如果把编程基础看成一个三层结构,理解会清晰很多。底层是基本数据类型与运算符——整数存计数、浮点存概率权重、布尔做条件判断、字符串存自然语言;运算符里算术运算符做计算、比较运算符产出布尔、逻辑运算符组合条件、成员运算符(in、not in)检查元素是否在序列里——后者在智能体里尤其常用,比如检查某个意图关键词是否在用户输入里。中间层是复合结构与控制流——列表存传感器读数序列(sensor_readings = [25.5, 26.0, 25.8]),字典存配置与状态(agent_config = {"model_name": "Transformer", "learning_rate": 0.001}),if-elif-else 把环境状态分派到不同行为分支,for 循环遍历任务列表,while 循环维持智能体主循环。上层是函数与类——函数把「数据预处理」「特征提取」「行为控制」封装成可复用单元;类把智能体的属性和方法绑在一起。
SOURCE 里有个例子:agent_config 字典把 model_name 设为 "Transformer"、learning_rate 设为 0.001——这在真实项目里对应「用配置文件而不是硬编码管理智能体参数」。第 4 章讲部署时,这个习惯会演化成独立的配置文件。现在先记住这个模式:字典是天然的「键值配置容器」,比散落的变量好维护得多。
同样值得注意的还有函数参数与返回值的设计。SOURCE 的 greet_user(username="Guest") 演示了默认参数——不给值就用默认值,这在智能体 API 设计里很常见(比如决策函数默认用规则策略,可传入策略对象覆盖)。process_tasks(task_list) 演示了把任务列表交给函数批量处理——智能体每帧循环处理多个子任务时正是这个写法。函数把「一次逻辑」变成「可复用调用」,类再把这些调用组织成「一个实体」,三层拼装就完成了。
把编程基础组合起来,SOURCE 原文给了一个 SimpleAgent 骨架,核心结构如下:
import time class SimpleAgent: def __init__(self, name): self.name = name self.environment_data = None self.current_task = None def perceive_environment(self): # 模拟从传感器取数,装进字典 self.environment_data = { "temperature": 28, "object_detected": "apple", "agent_location": "Room A" } time.sleep(1) def decide_action(self): temp = self.environment_data.get("temperature") obj = self.environment_data.get("object_detected") if temp > 30: self.current_task = "cooling_down" elif obj == "apple": self.current_task = "collect_apple" else: self.current_task = "idle" time.sleep(1) def execute_action(self): if self.current_task == "cooling_down": print("Activating cooling system.") elif self.current_task == "collect_apple": print("Moving to collect apple.") else: print("Standing by.") time.sleep(1) def run_agent(self): while True: self.perceive_environment() self.decide_action() self.execute_action() time.sleep(2)
这个骨架把「数据类型(字典)、控制流(if-elif-else)、函数(方法)、类」全用上了,而且 run_agent 的无限循环就是 1.1 节讲的「感知—决策—行动」闭环。注意它的决策用的是规则而非学习——它是反射式智能体,但换成任何决策算法,骨架不变,只换 decide_action 的实现。
| 数学分支 | 在智能体中的位置 | 关键工具 |
|---|---|---|
| 线性代数 | 状态/参数/特征表示 | NumPy 数组、矩阵乘法、PCA |
| 概率统计 | 不确定性感知与决策 | 贝叶斯定理、概率分布、期望方差 |
| 微积分 | 模型训练与策略优化 | 梯度、梯度下降、反向传播 |
| 离散数学 | 知识表示与符号推理 | 图论、逻辑、集合 |
| 编程基础 | 智能体载体 | 类、字典、列表、控制流 |
工程上的现实建议:不必等数学学完再写代码。先会「用向量存状态、用贝叶斯做一次更新、用梯度下降训一个小模型」这三件事,就足以支撑本书绝大部分内容。遇到具体算法再回查对应的数学细节,比一次性补完高效得多。
⚠️ 常见坑:把 NumPy 数组和 Python 列表混用导致维度错误。向量运算(点积、矩阵乘法)必须用数组,列表只做普通容器;写成
np.array而不是[1,2,3]能少踩一半坑。
💡 关键直觉:数学和编程的关系是「地图」和「路」——线性代数画地图(状态在哪、怎么变换),概率论标路况(哪条路不确定),微积分告诉你怎样走最近(沿梯度下山),编程负责真正开车(把算法变成循环和调用)。
SOURCE 列出了编程基础之后的进阶方向:深入面向对象(继承、多态)、算法与数据结构(搜索、图算法、树、队列——路径规划和任务调度直接用到)、Python 高级特性(生成器、装饰器、上下文管理器、并发),以及 AI 库(TensorFlow、PyTorch、scikit-learn、NLTK、spaCy)。这些不是本节要讲完的内容,而是通往后续章节的路标——本书第 4 章会直接用到 scikit-learn、spaCy 等库。
预备知识齐了。下一章进入智能体五大核心能力——从感知与输入开始。