返回博客列表

工程师的 AI 学习指南:从数学基础到生产落地

·AI

工程师的 AI 学习指南:从数学基础到生产落地

过去两年,我从一个大数据工程师逐步转型到 AI Agent 工程和推理优化方向。这个过程中,我踩过不少弯路——要么一头扎进论文里出不来,要么只停留在调 API 的层面。回头看,最有效的学习路径是从第一性原理出发,沿着"数学 → 模型 → 训练 → 推理 → 工程"这条链路逐层打通

这篇文章把我的学习路径和工程经验整理成一份系统的指南,希望能帮到想进入 AI 领域的工程师。


一、数学基础:没你想象的那么难

很多工程师看到数学公式就打退堂鼓,但实际上 LLM 涉及的数学只需要三块基础,而且都可以通过代码来理解。

1.1 线性代数:一切计算的根基

LLM 的本质是矩阵运算。一个 token 是一个向量,一层网络就是一次矩阵乘法。你只需要掌握以下几个概念:

矩阵乘法——神经网络的核心操作。矩阵 W 对向量 x 做变换,把 x 投影到新的空间:

import torch

W = torch.randn(4, 3)   # 权重矩阵: 3维 → 4维
x = torch.randn(3)       # 输入向量
y = W @ x                # 一次线性变换,这就是一个"线性层"

点积——衡量两个向量的相似度。这是 Attention 机制的数学基础:

a · b = |a| · |b| · cos(θ)

点积越大,两个向量方向越一致。Attention 本质上就是用点积来衡量"两个 token 有多相关"。

直觉:矩阵乘法就是对数据做空间变换——拉伸、旋转、投影。神经网络的每一层都在做这样的变换,把原始数据一步步变换到我们需要的表示空间。

1.2 微积分与梯度:模型如何学习

训练神经网络 = 找损失函数的最小值,工具就是梯度下降

θ_new = θ_old - η · ∇L(θ)

θ = 模型参数(矩阵 W 里的数字)
η = 学习率(步长,通常 1e-4 ~ 1e-3)
∇L = 损失对参数的梯度(指向函数增长最快的方向)

沿梯度反方向走一小步,损失就会减小。PyTorch 的 autograd 帮你自动完成了梯度计算:

x = torch.tensor(5.0, requires_grad=True)
for _ in range(100):
    loss = (x - 3) ** 2       # 最小值在 x=3
    loss.backward()            # 自动求梯度
    with torch.no_grad():
        x -= 0.1 * x.grad     # 梯度下降
        x.grad.zero_()
# x ≈ 3.0

链式法则是反向传播的数学基础——它告诉我们如何把最终误差逐层传回去,让每一层知道自己该怎么调整。作为工程师,你不需要手推每个公式,但要理解这个过程。

1.3 概率论:LLM 的输出本质

LLM 的输出就是概率分布——"下一个 token 是什么"的概率。

Softmax 把原始分数变成概率分布:

softmax(z_i) = exp(z_i) / Σ_j exp(z_j)

交叉熵损失衡量预测分布和真实分布的差距:

L = -log(模型给正确答案的概率)

模型给正确答案的概率越高,损失越低。整个训练过程就是在不断降低这个损失。

困惑度(Perplexity) 是评估语言模型的核心指标:

PPL = exp(平均交叉熵损失)

PPL=1 表示完美预测,GPT-4 级别模型在通用文本上大约 5-15。

学习建议:不要先啃教科书。推荐 3Blue1Brown 的 线性代数的本质微积分的本质 视频系列,结合 PyTorch 代码动手验证,3-5 天就能建立足够的直觉。


二、LLM 核心原理:Transformer 全链路

2.1 从文本到向量

LLM 不直接处理文字。文本首先被 Tokenizer 切分为子词单元,然后通过 Embedding 层映射为高维向量:

"我喜欢深度学习"  [3421, 8765, 12003, 9087]  4个4096维向量

Embedding 本质是一个查找表——一个 (vocab_size, d_model) 的矩阵,每个 token ID 对应表中的一行。训练过程中,语义相近的词会自动聚集到向量空间中相近的位置。

2.2 Self-Attention:核心中的核心

Attention 解决的核心问题是:让每个 token "看到"其他 token,建立长距离依赖。

每个 token 通过三个矩阵生成 Query、Key、Value:

Q = X · W_Q    → "我在找什么信息?"
K = X · W_K    → "我能提供什么信息?"
V = X · W_V    → "我的实际内容"

Attention 计算:

Attention(Q, K, V) = softmax(Q · K^T / √d_k) · V

分解来看:

  1. Q · K^T → 计算每对 token 之间的关联分数
  2. / √d_k → 缩放,防止点积过大导致 softmax 饱和
  3. softmax → 归一化为注意力权重(概率分布)
  4. · V → 用权重对 Value 加权求和
def self_attention(X, W_Q, W_K, W_V):
    Q, K, V = X @ W_Q, X @ W_K, X @ W_V
    d_k = Q.shape[-1]
    scores = Q @ K.transpose(-2, -1) / math.sqrt(d_k)
    weights = F.softmax(scores, dim=-1)
    return weights @ V

Multi-Head Attention 把维度拆分成多个头,每个头独立学习不同的关注模式——有的关注语法关系,有的关注语义,有的关注位置。

因果遮罩(Causal Mask) 确保 GPT 类模型只能看到前面的 token,不能偷看未来:

     a  b  c  d
a  [ 1  0  0  0 ]
b  [ 1  1  0  0 ]
c  [ 1  1  1  0 ]
d  [ 1  1  1  1 ]

2.3 完整的 Transformer Block

一个 Transformer Block 包含两个子层,都有残差连接:

x → LayerNorm → Multi-Head Attention → + (残差) → LayerNorm → FFN → + (残差) → 输出

现代 LLM 的关键设计选择:

  • Pre-Norm(先 Norm 再 Attention,比 Post-Norm 训练更稳定)
  • RMSNorm 替代 LayerNorm(LLaMA 的选择,计算更快)
  • SwiGLU 替代 ReLU 作为 FFN 激活(效果更好)
  • RoPE 旋转位置编码(相对位置编码,支持长度外推)

2.4 训练流程

预训练的目标极其简单——给定前面的 token,预测下一个:

def compute_loss(model, token_ids):
    logits = model(token_ids[:, :-1])      # 输入:除最后一个
    targets = token_ids[:, 1:]              # 标签:除第一个
    return F.cross_entropy(logits.reshape(-1, logits.size(-1)), targets.reshape(-1))

规模感受:LLaMA 用 1.4 万亿 token 训练,数千张 GPU 跑数月,成本数千万美元。

对齐(Alignment) 让模型从"预测下一个词"变成"有用的助手":

  • SFT:用指令-回答数据微调,只在回答部分计算损失
  • RLHF:训练奖励模型,用 PPO 强化学习优化
  • DPO:直接从人类偏好数据优化,不需要单独的奖励模型

混合精度训练是现代 LLM 训练的标配:

  • 权重主副本用 FP32(精确更新)
  • 前向/反向用 BF16(快、省显存)
  • BF16 比 FP16 更不容易溢出,是首选精度格式

学习建议:跟着 Andrej Karpathy 的 Let's build GPT from scratch 从零实现一个 mini GPT,然后阅读 nanoGPT 源码(约 300 行核心代码)。这是理解 Transformer 最高效的方式。


三、推理优化:从理论到生产

推理是 AI Infra 中我花精力最多的方向。模型训练好了只是第一步,如何高效地为用户提供服务才是真正的工程挑战。

3.1 KV Cache:避免重复计算

自回归生成每一步都要过完整个模型。没有 KV Cache 时,之前 token 的 K、V 会被重复计算:

无 Cache:step 3 要重算 token 123 的 K/V
有 Cache:step 3 只算 token 3 的 K/V,与缓存拼接

KV Cache 的显存开销不可忽视——LLaMA-7B 处理 2048 tokens 约占 1GB 显存。这也是为什么长序列推理很吃显存。

3.2 vLLM 与 PagedAttention

vLLM 的核心创新是借鉴操作系统虚拟内存的分页思想来管理 KV Cache:

  • 传统方式:为每个请求预分配最大长度的连续内存,浪费严重
  • PagedAttention:按需分配固定大小的 block,允许非连续存储

好处:减少内存浪费、提高并发、支持 prefix 共享。

python -m vllm.entrypoints.openai.api_server \
  --model /path/to/model \
  --tensor-parallel-size 2 \
  --gpu-memory-utilization 0.9 \
  --max-num-batched-tokens 8192

关键调优参数:

参数 说明 建议
gpu-memory-utilization 显存利用率 0.85-0.95
max-num-batched-tokens 最大批处理 token 数 根据显存调整
max-num-seqs 最大并发序列数 匹配业务 QPS

3.3 量化部署

量化把高精度权重映射到低精度(FP16 → INT8/INT4),在精度损失可控的情况下显著降低显存和提升速度:

scale = max(|W|) / 127
W_int8 = round(W / scale)
推理还原:W ≈ W_int8 × scale

我在实际项目中使用 GPTQModel 做 4-bit 量化:

from gptqmodel import GPTQModel, QuantizeConfig

quantize_config = QuantizeConfig(bits=4, group_size=128, desc_act=True)
model = GPTQModel.from_pretrained(model_name, quantize_config=quantize_config)
model.quantize(calibration_dataset)
model.save_quantized(output_dir)

3.4 推理优化全景

技术 原理 效果
KV Cache 缓存已计算的 K/V 避免重复计算
PagedAttention 分页管理 KV Cache 吞吐量 2-4x
Continuous Batching 动态合并请求 比 static batching 提升数倍
Flash Attention IO-aware Attention 速度 2-4x
量化(GPTQ/AWQ) 低精度权重 显存减半+
Speculative Decoding 小模型猜,大模型验 速度 2-3x

生产环境必须关注的核心指标:TTFT(首 token 延迟)、TPS(吞吐量)、GPU 利用率KV Cache 使用率


四、AI Infra 技术栈:工程师的主战场

如果你是大数据或后端工程师,AI Infra 是最自然的切入方向。分布式系统、数据 Pipeline、高并发优化这些能力可以直接迁移。

4.1 主要方向

方向 核心工作 与传统后端的关联
分布式训练平台 多机多卡训练、集群调度 分布式经验直接迁移
推理服务 模型部署、在线推理 高并发/低延迟经验可迁移
MLOps/ML 平台 Pipeline 编排、实验管理 数据 Pipeline 经验匹配
GPU/异构计算 CUDA 编程、Kernel 优化 需要较多新知识

4.2 分布式训练

训练 LLM 需要成百上千张 GPU,关键技术:

数据并行:每张卡持有完整模型,训练不同的数据子集,梯度通过 AllReduce 聚合。

模型并行

  • Tensor Parallelism:把单个矩阵拆到多张卡
  • Pipeline Parallelism:把不同层分到不同卡

DeepSpeed ZeRO:把优化器状态、梯度、参数分片到多张卡,显著降低单卡显存需求。三个阶段逐步优化:

  • ZeRO-1:分片优化器状态
  • ZeRO-2:+ 分片梯度
  • ZeRO-3:+ 分片参数

4.3 GPU 编程基础

不需要成为 CUDA 专家,但要理解核心概念:

  • SM(Streaming Multiprocessor):GPU 的基本计算单元
  • Warp:32 个线程组成的调度单位
  • 内存层级:寄存器 → 共享内存 → L2 Cache → HBM(全局显存)
  • 关键瓶颈:通常是显存带宽,不是算力(memory-bound vs compute-bound)

Flash Attention 的成功就证明了这一点——它没有减少计算量,而是通过减少 HBM 访问次数来提速。

4.4 MLOps 与部署

生产级 AI 系统需要完整的工程体系:

  • 模型版本管理:训练、评估、上线的完整链路
  • Kubernetes 调度:GPU 资源管理、弹性伸缩
  • 监控告警:Prometheus + Grafana 追踪推理延迟、GPU 利用率、错误率
# K8s HPA 根据 GPU 利用率自动伸缩
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

五、AI Agent 工程实践

Agent 是我当前最核心的方向。把 LLM 从"问答工具"变成"能执行任务的智能体",这中间有大量的工程问题。

5.1 ReAct 模式

ReAct(Reasoning + Acting)让 LLM 交替进行推理和行动:

def react_loop(query, tools, max_steps=10):
    context = [{"role": "user", "content": query}]
    for step in range(max_steps):
        response = llm.chat(context, tools=tools)
        if response.is_final_answer:
            return response.content
        tool_result = execute_tool(response.tool_call)
        context.append({"role": "tool", "content": tool_result})

5.2 工程落地的关键挑战

工具设计——好的工具是 Agent 成功的前提:

  • 接口定义清晰,参数描述准确
  • 返回有意义的错误信息
  • 保证幂等性

上下文管理——Token 限制是核心约束:

  • 滑动窗口策略
  • 关键信息摘要
  • 只传递相关的 Schema(比如 NL2SQL 场景只传相关表的元数据)

可观测性——生产环境必须看得见:

  • 每一步的推理过程和工具调用链路
  • Token 消耗和延迟追踪
  • 异常告警(死循环、工具调用失败)

5.3 NL2SQL Agent

这是我在实际项目中实现的一个典型 Agent 应用:

  1. 用户用自然语言描述查询需求
  2. Agent 理解意图,结合表 Schema 生成 SQL
  3. 执行查询,格式化结果返回

关键优化:

  • Schema 感知:不把所有表都塞进 prompt,只传相关的
  • Few-shot:提供领域相关的查询示例
  • 安全校验:执行前检查 SQL,防止注入和误操作
  • 多步修正:SQL 执行失败时,把错误信息反馈给 LLM 让它修正

六、学习路径与资源推荐

基于我自己的经验,推荐以下学习路径:

阶段一:数学直觉(3-5 天)

别啃教科书,用视觉化的方式建立直觉:

阶段二:从零实现(5-7 天)

这是最关键的一步,没有捷径:

  • Andrej Karpathy Let's build GPT from scratch 视频
  • 阅读并跑通 nanoGPT(约 300 行核心代码)
  • 在自己机器上训练一个字符级语言模型
  • 理解每一行代码对应的数学公式

阶段三:阅读真实代码(5-7 天)

从玩具实现过渡到生产级代码:

阶段四:推理与 Infra(持续)

阶段五:Agent 实践(持续)

  • 基于 ReAct 模式实现一个完整的 Agent
  • 在实际场景中落地(NL2SQL、代码生成、文档问答等)
  • 关注工程问题:可观测性、容错、成本控制

推荐资源清单

必读论文

课程

书籍

开源项目


写在最后

AI 这个领域变化极快,但底层的数学和系统设计原理是稳定的。与其追逐每一个新框架和新模型,不如把 Transformer 的每一个组件理解透,把分布式系统的基本功打扎实。

对于工程师来说,最大的优势是我们知道如何把东西做出来。理解了原理之后,从 prototype 到 production 的路径,是我们最熟悉的领域。

不要等到完全准备好才动手。边学边做,边做边学,这是工程师学 AI 最有效的方式。