AI全景图与学习路线:从问题到产品
把“学会 AI”当成目标,往往会学得很散;把“解决一个问题并交付成产品”当成目标,知识会自然聚拢成一张地图。本章要做的,就是把这张地图先搭起来:你将看到人工智能(AI)、机器学习(ML)、深度学习(DL)的边界与关系;常见任务各自解决什么问题、如何评估、在行业里以什么形态落地;以及贯穿全书的工程闭环——“数据—模型—算力—评估—部署”。最后,我们用一个微型案例走完端到端流程,让你对“从数据到上线推理”形成可操作的直觉。
1. AI、ML、DL:三者关系与常见误区
很多入门者把“AI=深度学习=大模型”画上等号,结果在选方案、配资源、做评估时容易走偏。更稳妥的方式是把它们当成三层集合关系:
```mermaid graph LR A[人工智能 AI<br/>让机器表现出智能行为] --> B[机器学习 ML<br/>从数据中学习规律] B --> C[深度学习 DL<br/>用多层神经网络学习表示] ```
1.1 人工智能(AI):目标层
AI 关注“智能行为”本身:感知、理解、决策、生成、交互。它可以用规则、搜索、概率图模型,也可以用机器学习实现。比如:
- 规则系统:银行反欺诈的规则引擎(阈值、黑名单、专家规则)。
- 搜索与规划:路径规划、博弈搜索(象棋、围棋早期系统)。
- 学习系统:推荐、语音识别、图像识别、文本生成等。
误区:以为所有 AI 都必须“训练一个神经网络”。实际上,工程上常见的是“规则+统计+模型”的组合拳:规则兜底、模型提效、监控回滚。
1.2 机器学习(ML):方法层
ML 的核心是:给定数据 $X$ 与目标 $y$,学习一个函数 $f_\theta$,使得在未来数据上也能表现良好。用更工程化的话说:用数据替代手写规则。
机器学习常见范式:
- 监督学习:有标签(分类/回归)。
- 无监督学习:无标签(聚类/降维)。
- 自监督学习:用数据自身构造监督信号(语言模型、对比学习)。
- 强化学习:在环境交互中最大化回报(策略学习)。
1.3 深度学习(DL):表征层
DL 使用深层神经网络,从原始数据中自动学习“表示”(representation),在高维复杂任务上优势明显(图像、语音、文本、多模态)。但它也带来工程代价:更高的算力需求、更复杂的训练与部署、更敏感的数据质量问题。
初学者最该建立的判断:
- 数据少、解释性要求高、上线资源有限:先用传统 ML(线性模型、树模型)做强基线。
- 数据量大、任务复杂(文本/图像/语音/生成):再考虑 DL/大模型方案。
- 不论选哪种,都必须围绕评估与部署闭环做工程。
> 侧边栏:为什么“先做基线”很重要? > 因为基线是你的“物理参照系”。没有基线,你不知道后续复杂模型带来的提升是否真实、是否值得付出算力与迭代成本。
2. 常见任务地图:你到底在解什么题?
把任务分类清楚,能直接决定:数据长什么样、输出是什么、用什么指标、怎么上线。
2.1 分类(Classification)
目标:输出离散类别 $y \in \{1,2,\dots,K\}$ 例子:垃圾邮件识别、情感正负面、缺陷检测、是否违约。 常用指标:
- 准确率 Accuracy:类别均衡时直观。
- 精确率/召回率 Precision/Recall:类不均衡时更关键。
- F1:Precision 与 Recall 的折中。
- AUC:排序能力(尤其二分类、风控场景)。
2.2 回归(Regression)
目标:输出连续值 $y \in \mathbb{R}$ 例子:房价预测、销量预测、到达时间 ETA、温度预测。 常用指标:
- MAE:平均绝对误差,易解释。
- RMSE:更惩罚大误差。
- $R^2$:解释方差比例(注意可能被数据分布“美化”)。
2.3 聚类(Clustering)
目标:把样本分组(无标签)。 例子:用户分群、异常模式发现、文档主题粗分。 常用指标:
- 轮廓系数 Silhouette(仅作参考)。
- 业务可解释性:每群是否可命名、是否可行动。
2.4 生成(Generation)
目标:生成文本/图像/代码/语音等内容。 例子:客服回复草稿、营销文案、代码补全、图像生成。 常用评估:
- 自动指标:BLEU/ROUGE(文本)、FID(图像)等(往往不足以代表真实体验)。
- 人评与偏好评估:更接近产品质量。
- 安全与合规:敏感内容、幻觉、版权、隐私。
2.5 检索(Retrieval)
目标:给定查询 $q$,从候选集合中找最相关的 $k$ 个。 例子:搜索引擎、知识库问答、相似商品查找。 常用指标:
- Recall@K、Precision@K
- MRR、NDCG(考虑排序位置)
2.6 推荐(Recommendation)
目标:为用户 $u$ 选择物品 $i$,最大化点击/转化/留存等。 推荐往往是“检索+排序+重排”的系统工程: 1) 召回(检索):从海量物品中找候选 2) 排序(预测):估计点击率/转化率 3) 重排(策略):多样性、探索、约束(库存/合规)
> 侧边栏:任务 ≠ 模型 > “推荐”不是一个模型名,而是一类业务目标;它可能用协同过滤、GBDT、深度双塔、甚至大模型来实现。先定义任务与指标,再选模型。
3. 行业落地形态:离线训练、在线推理、边缘推理
同一个模型,在不同落地形态下的“正确做法”差别极大。
3.1 离线训练(Offline Training)
离线训练是大多数 ML 系统的起点:定期从数据仓库抽取数据、训练、产出模型文件。关键点:
- **可复现**:同一份代码与数据,能否训练出同等质量模型?
- **数据版本**:训练集/特征/标签的时间窗口与过滤条件要可追溯。
- **基线与回归**:每次训练要能对比历史模型,避免“悄悄变差”。
3.2 在线推理(Online Inference)
在线推理关心的是:延迟、吞吐、稳定性、成本。典型要求:
- 延迟(p95/p99):例如 50ms、200ms 等(因产品而异)
- 高可用:熔断、降级、灰度、回滚
- 观测性:日志、指标、追踪(定位慢与错)
常见架构:API 服务(如 FastAPI)+ 模型加载 + 特征处理 + 返回预测。
3.3 边缘推理(Edge Inference)
边缘推理发生在手机、摄像头、IoT 设备上,约束更强:
- 算力与内存有限:需要轻量模型、量化(INT8)、剪枝、蒸馏。
- 隐私与合规优势:数据不出端,适合人脸、语音唤醒等。
- 更新困难:模型发布与版本管理更像“客户端发版”。
4. 工程闭环:数据—模型—算力—评估—部署
把 AI 做成产品,本质是一条不断迭代的闭环流水线。你可以把它理解为“从一次性训练”升级为“持续交付(Continuous Delivery)”。
```mermaid graph TD D[数据 Data<br/>采集/清洗/标注/特征] --> M[模型 Model<br/>算法选择/训练/调参] M --> C[算力 Compute<br/>CPU/GPU/分布式/成本] C --> E[评估 Evaluate<br/>离线指标/鲁棒性/公平性] E --> P[部署 Deploy<br/>服务化/灰度/监控] P --> R[反馈 Feedback<br/>线上数据/漂移/错误分析] R --> D ```
下面逐一拆开,建立你今后做项目的“检查清单”。
4.1 数据:决定上限的不是模型,而是数据质量
数据工作通常占项目的大头,尤其是第一次落地时。
核心概念:
- 样本(sample):一条训练记录(特征+标签)。
- 特征(feature):模型输入,可数值/类别/文本/图像。
- 标签(label):监督学习的目标。
- 数据泄漏(leakage):训练时不该知道的信息被塞进特征,导致线下高分、线上崩盘。
- 切分(split):训练/验证/测试集合。时间序列任务要按时间切分,避免“未来信息”泄漏。
工程建议:
- 先画清“数据从哪里来”:业务系统、埋点、第三方、人工标注?
- 先做 EDA(探索性数据分析):缺失值、异常值、分布漂移。
- 标签定义要可落地:例如“情感”如何标?“成交价”用哪个口径?
4.2 模型:从可解释的基线开始
模型选择不是“谁最先进用谁”,而是“在约束下最大化指标”。
建议顺序: 1) 规则/启发式(能快速建立底线) 2) 线性/逻辑回归(可解释、训练快) 3) 树模型(XGBoost/LightGBM/随机森林,强基线) 4) 深度学习/大模型(数据与算力充足再上)
偏差-方差直觉(入门必备):
- 欠拟合:训练集都做不好(模型太弱、特征不足)。
- 过拟合:训练好、验证差(模型太强、数据太少、正则不足)。
4.3 算力:把“能训出来”变成“训得起、训得稳”
算力不仅是 GPU 数量,更是训练效率与成本控制。
- 批大小(batch size):影响显存与收敛。
- 混合精度(FP16/BF16):常见的提速省显存手段(DL 里尤其重要)。
- 训练时间预算:决定你能做多少次实验与迭代。
对初学者来说,最现实的策略是:先用 CPU/小数据做通流程,再扩到 GPU/大数据。流程通了,才谈规模。
4.4 评估:离线指标只是起点
评估至少分三层: 1) 离线指标:MAE、AUC、F1 等,保证“模型在静态数据上有效”。 2) 鲁棒性评估:噪声、缺失、分布变化、极端样本。 3) 线上效果:A/B 测试或灰度观测,关注业务指标(转化、投诉、时延)。
很多失败项目都败在:离线指标很好,但线上出现数据漂移、延迟暴涨、或预测不可解释导致业务不信任。
4.5 部署:让模型成为可用的服务
部署不是“把模型文件丢到服务器”,而是把它变成一个可运维系统:
- 模型打包:模型文件 + 特征处理器(非常关键)+ 版本号
- 服务化:HTTP/gRPC 接口
- 灰度发布:小流量试运行,监控指标
- 监控与报警:错误率、延迟、输入分布漂移、输出分布异常
- 回滚策略:新模型不行就快速切回旧版本
> 侧边栏:为什么“特征处理器”要和模型一起保存? > 因为训练时的编码方式(如 OneHot、标准化)必须与线上完全一致。只保存模型权重,线上重写预处理,很容易出现“训练-推理不一致(train-serving skew)”。
5. 本书的项目驱动学习路线(从技能到交付)
学习路线建议按“交付能力”组织,而不是按“算法大全”组织。你最终要掌握的是一套可迁移的方法:定义问题 → 准备数据 → 训练基线 → 迭代提升 → 部署上线 → 监控优化。
5.1 三段式路线:通流程、提效果、做工程
- 第一段:**通流程**
会读数据、能训练、会评估、能推理(哪怕模型一般)。
- 第二段:**提效果**
特征工程、调参、模型选择、误差分析、数据迭代。
- 第三段:**做工程**
版本管理、可复现、服务化、监控、灰度与回滚。
5.2 工具清单(建议从小到全)
语言与环境
- Python 3.10+(生态成熟)
- `venv`/Conda/`uv`(环境隔离与依赖管理)
- Jupyter / VS Code(实验与调试)
数据与建模
- `numpy`、`pandas`(数据处理)
- `scikit-learn`(传统 ML、流水线、评估)
- 深度学习:PyTorch(进阶章节使用)
实验与版本
- Git(代码版本)
- MLflow(实验记录/模型登记,可选)
- DVC(数据版本,可选但很强)
部署与服务化
- FastAPI(Python API 服务)
- Docker(镜像与环境一致性)
- ONNX/量化工具(边缘/性能优化,进阶)
> 电子版提示:工具官方文档入口 > - scikit-learn:https://scikit-learn.org/ > - PyTorch:https://pytorch.org/ > - FastAPI:https://fastapi.tiangolo.com/ > - MLflow:https://mlflow.org/ > - DVC:https://dvc.org/
6. 微型实践:房价预测端到端(数据读取→训练→评估→推理)
这一节用一个“可在本地直接跑通”的最小案例,刻意把数据做得小而清晰:你要练的是流程与工程习惯,而不是追求分数。
6.1 问题定义与数据格式
任务:根据房屋特征预测成交价(回归)。 输入特征(示例):
- `area_m2`:面积(数值)
- `bedrooms`:卧室数(数值/整数)
- `distance_km`:距市中心距离(数值)
- `district`:区域(类别)
输出标签:
- `price_wan`:总价(单位:万元)
我们用 CSV 存一份小数据,并用 scikit-learn 建立“预处理+模型”的流水线(Pipeline),确保训练与推理一致。
6.2 代码:从零到可推理模型
把下面代码保存为 `mini_house_price.py`,在本地执行即可(只依赖常见库)。
安装依赖(如未安装): ```bash pip install pandas scikit-learn joblib ```
完整脚本: ```python import os import joblib import pandas as pd
from sklearn.compose import ColumnTransformer from sklearn.model_selection import train_test_split from sklearn.pipeline import Pipeline from sklearn.preprocessing import OneHotEncoder from sklearn.metrics import mean_absolute_error, mean_squared_error from sklearn.ensemble import RandomForestRegressor
DATA_PATH = "house_price_demo.csv" MODEL_PATH = "house_price_model.joblib"
def prepare_demo_csv(path: str) -> None: if os.path.exists(path): return df = pd.DataFrame( { "area_m2": [45, 60, 80, 90, 120, 70, 55, 110, 95, 130, 75, 85], "bedrooms": [1, 2, 2, 3, 3, 2, 1, 3, 3, 4, 2, 3], "distance_km": [2.0, 5.0, 8.0, 6.0, 12.0, 7.0, 3.0, 10.0, 4.5, 15.0, 6.5, 9.0], "district": ["A", "A", "B", "B", "C", "B", "A", "C", "A", "C", "B", "B"], "price_wan": [320, 420, 520, 560, 680, 500, 350, 640, 590, 720, 510, 540], } ) df.to_csv(path, index=False)
def train_and_evaluate(df: pd.DataFrame) -> Pipeline: X = df.drop(columns=["price_wan"]) y = df["price_wan"]
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.25, random_state=42 )
numeric_features = ["area_m2", "bedrooms", "distance_km"] categorical_features = ["district"]
preprocessor = ColumnTransformer( transformers=[ ("num", "passthrough", numeric_features), ("cat", OneHotEncoder(handle_unknown="ignore"), categorical_features), ] )
model = RandomForestRegressor( n_estimators=200, random_state=42, n_jobs=-1 )
pipe = Pipeline(steps=[("prep", preprocessor), ("model", model)]) pipe.fit(X_train, y_train)
preds = pipe.predict(X_test) mae = mean_absolute_error(y_test, preds) rmse = mean_squared_error(y_test, preds, squared=False)
print("评估结果(仅示例数据,不代表真实效果)") print(f"MAE : {mae:.2f} 万") print(f"RMSE : {rmse:.2f} 万") print("测试集真实值 vs 预测值:") print(pd.DataFrame({"y_true": y_test.values, "y_pred": preds}).reset_index(