一套从零开始、动手实现的大语言模型学习笔记。从 Tokenizer 到 Transformer,从训练技巧到推理加速,从 VLM 前沿到生产部署,循序渐进,亲手写代码理解每一个核心概念。
本项目中的 Notebook 内容并非原创,是基于以下开源教程进行的个人学习笔记整理:
- 📖 在线阅读地址:walkinglabs / modern-llm-notebook
- 🔗 GitHub 仓库:github.com/walkinglabs/modern-llm-notebook
使用目的:本仓库仅用于 个人学习与练习,所有代码、结构、讲解思路均参考自上述原始项目。 如需将内容用于其他用途,请以原作者发布的版本为准,并遵守原项目的许可证协议。
本项目是一套完整的大语言模型(LLM)自学实践教程,采用 Jupyter Notebook 形式组织。每个 Notebook 聚焦一个主题,包含原理讲解、可运行的代码实现、以及配套的练习题(作业)。
学习路径设计原则:
- 由浅入深:先掌握基础组件(Tokenizer / Embedding / Transformer Block),再串成完整模型
- 动手优先:每个概念都有对应的最小可运行实现,不只是"讲原理"
- 注释详尽:代码中包含大量中文注释,方便对照理解
LLM-NOTEBOOK/
├── part1-foundation/ # 第一部分 · 基础
│ ├── 01-tokenizer-basics.ipynb # Tokenizer 基础(字符级 / 词级 / 子词级)
│ ├── 02-bpe-tokenizer.ipynb # 从零实现 BPE 子词算法
│ ├── 03-embedding.ipynb # 词嵌入(Embedding)原理与实现
│ ├── 04-position-encoding.ipynb # 位置编码(Sinusoidal / Learnable)
│ ├── 05-transformer-block.ipynb # Transformer Block:自注意力 + FFN
│ ├── 06-mini-gpt.ipynb # 实现 Mini-GPT:Decoder-only 语言模型
│ ├── 07-bert-encoder.ipynb # 实现 BERT Encoder:双向编码模型
│ ├── karpathy_models.py # 参考模型代码(Karpathy 风格)
│ └── data/
│ └── shakespeare_char/input.txt # 莎士比亚字符级语料
│
├── part2-training/ # 第二部分 · 训练技巧
│ ├── 08-gpt2-to-modern-models.ipynb # GPT-2 架构演进到现代 LLM
│ ├── 09-model-config.ipynb # 模型配置与超参管理
│ ├── 10-moe.ipynb # 混合专家模型(Mixture of Experts)
│ ├── 11-training-loss.ipynb # 训练损失函数与优化技巧
│ ├── 12-scaling-laws.ipynb # Scaling Laws:模型规模定律
│ ├── 13-distributed-training.ipynb # 分布式训练(DDP / ZeRO)
│ ├── 14-data-engineering.ipynb # 数据工程:清洗、混合、打包
│ ├── 15-lora.ipynb # LoRA:低秩适配微调
│ ├── 16-function-calling.ipynb # Function Calling 工具调用
│ ├── 17-rlhf-alignment.ipynb # RLHF 对齐(SFT / RM / PPO)
│ └── 18-mla-kv-cache.ipynb # MLA 与 KV Cache 优化
│
├── part3-inference/ # 第三部分 · 推理加速
│ ├── 19-generation.ipynb # 生成策略(Greedy / Beam / Top-p / Top-k)
│ ├── 20-inference-acceleration.ipynb# 推理加速技巧总览
│ ├── 21-quantization.ipynb # 量化(GPTQ / AWQ / INT8)
│ ├── 22-speculative-decoding.ipynb # 投机解码
│ └── 23-inference-systems.ipynb # 推理系统:vLLM / TensorRT-LLM
│
├── part4-frontiers/ # 第四部分 · 前沿方向
│ ├── 24-long-context.ipynb # 长上下文技术(RoPE / YaRN / ALiBi)
│ ├── 25-cot-thinking.ipynb # 思维链与推理型模型
│ ├── 26-vlm.ipynb # 视觉语言模型(VLM):Patchify + Projector + CLIP
│ └── 27-efficient-attention.ipynb # 高效注意力机制
│
├── part5-production/ # 第五部分 · 生产部署
│ ├── 28-evaluation.ipynb # 模型评估指标与基准
│ ├── 29-distillation.ipynb # 知识蒸馏
│ ├── 30-opd.ipynb # OPD:按需推理优化
│ └── 31-llm-deployment.ipynb # LLM 部署实战
│
└── appendix-advanced/ # 附录 · 高级主题
├── A-gpu-hardware.ipynb # GPU 硬件架构与显存
├── B-flops-memory-accounting.ipynb # FLOPs 与显存占用估算
├── C-mixed-precision-training.ipynb# 混合精度训练(FP16 / BF16)
├── D-collective-communications.ipynb# 集合通信(AllReduce / AllGather)
├── E-parallelism-strategies.ipynb # 并行策略(TP / PP / EP)
├── F-flash-attention.ipynb # Flash Attention 原理
├── G-advanced-kernels.ipynb # 高级 CUDA Kernel 基础
└── H-probability-information.ipynb # 概率论与信息论基础
| 项目 | 最低版本 | 推荐版本 |
|---|---|---|
| Python | 3.10+ | 3.11 |
| PyTorch | 2.0+ | 2.3+ |
| Jupyter Lab | 3.6+ | 4.0+ |
# 克隆项目
git clone <repository-url>
cd LLM-NOTEBOOK
# 推荐使用 conda 创建虚拟环境
conda create -n llm-notebook python=3.11
conda activate llm-notebook
# 安装核心依赖
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install jupyterlab matplotlib numpy tiktoken transformers datasets accelerate sentencepiece
# 启动 Jupyter Lab
jupyter lab建议按照目录编号顺序学习:Part 1 → Part 2 → Part 3 → Part 4 → Part 5,附录可按需穿插查阅。
每个 Notebook 末尾均附有 作业题,建议亲手完成以加深理解。
本章节为项目贡献者和维护者提供统一的图片风格规范。所有插入 Notebook 或项目文档中的图片、图表、示意图均应遵循以下规范,以确保视觉风格的一致性和专业性。
项目采用 科技蓝 + 深紫 的配色体系,传达「专业、理性、创新」的技术调性。
| 用途 | 色名 | Hex 代码 | RGB | 示例 |
|---|---|---|---|---|
| 主色 · 标题 / 主元素 | Deep Blue | #1E3A8A |
30, 58, 138 | 标题文字、核心模块边框 |
| 主色 · 强调 | Brand Blue | #3B82F6 |
59, 130, 246 | 按钮、链接、关键标注 |
| 辅色 · 渐变 | Violet | #8B5CF6 |
139, 92, 246 | 渐变终点、高级强调 |
| 辅色 · 背景 | Light Indigo | #EEF2FF |
238, 242, 255 | 区块背景、浅色底纹 |
用于图表和示意图中的类别区分。
| 语义 | 色名 | Hex 代码 | 适用场景 |
|---|---|---|---|
| 正确 / 通过 | Success Green | #10B981 |
验证通过、正向指标 |
| 警告 / 注意 | Warning Amber | #F59E0B |
注意事项、中间状态 |
| 错误 / 损失 | Error Red | #EF4444 |
错误路径、Loss 曲线 |
| 信息 / 次要 | Info Slate | #64748B |
辅助信息、次要曲线 |
| 中性 / 文本 | Neutral Gray | #334155 |
正文文字、坐标轴 |
图表中超过 4 条曲线时使用以下有序调色板:
Palette 1 (8色):
#3B82F6 → #8B5CF6 → #10B981 → #F59E0B → #EF4444 → #06B6D4 → #EC4899 → #6366F1
Palette 2 (渐变色):
蓝色渐变: #DBEAFE → #93C5FD → #3B82F6 → #1D4ED8 → #1E3A8A
紫色渐变: #EDE9FE → #C4B5FD → #8B5CF6 → #6D28D9 → #4C1D95
- ❌ 高饱和荧光色:如
#FF00FF、#00FFFF等刺眼配色 - ❌ 彩虹渐变无序使用:多色图必须使用有序调色板,不可随机配色
- ❌ 纯黑纯白边框:使用
#1E293B替代纯黑,#F8FAFC替代纯白 - ❌ 红绿障碍配色:不可仅用红/绿区分对比,需同时辅以形状或纹理
| 规则 | 说明 | 示例 |
|---|---|---|
| 留白充足 | 图片四周保留 8%~12% 的边距,避免内容触边 | 图表四周留空,不贴边 |
| 信息聚焦 | 单张图片只表达一个核心信息,不堆砌过多内容 | 一张架构图只画一个模块 |
| 对齐对称 | 元素沿网格线对齐,同类元素间距一致 | 框图左右/上下对称排布 |
| 层次分明 | 通过大小、颜色、透明度表达主次关系 | 主路径粗线深色,旁路细线浅色 |
┌─────────────────────────────────────┐
│ ← 8% margin │ ← 标题区(12~16 pt 字重 600)
│ ┌───────────────────────────────┐ │
│ │ │ │ ← 内容区(占图面 70%~80%)
│ │ 核心示意图 / 图表 │ │
│ │ │ │
│ └───────────────────────────────┘ │
│ 图例 / 标注 / 来源(9~10 pt) │ ← 说明区
│ ← 8% margin │
└─────────────────────────────────────┘
架构图/流程图的箭头方向应保持一致:
- 横向图:从左到右(输入 → 处理 → 输出)
- 纵向图:从上到下(输入 → 处理 → 输出)
- 禁止:同一图中出现双向混乱的箭头流向,除非明确标注回流路径
图片内所有文字统一使用以下字体优先级:
| 平台 | 中文首选 | 英文首选 | 数字首选 |
|---|---|---|---|
| Windows | 微软雅黑 (Microsoft YaHei) | Segoe UI | Segoe UI Semibold |
| macOS | PingFang SC | SF Pro Text | SF Mono |
| 导出 SVG | Source Han Sans CN | Inter | JetBrains Mono |
字号阶梯(按 1.25 比例递增):
标注: 9pt → 图例: 10pt → 轴标: 11pt → 正文: 12pt → 小标题: 14pt → 标题: 16/18pt
| 元素类型 | 线宽 | 颜色 | 圆角 |
|---|---|---|---|
| 主路径 / 主边框 | 2.0 px | #1E3A8A |
8 px |
| 次要路径 / 分区线 | 1.25 px | #64748B |
6 px |
| 辅助线 / 网格线 | 0.75 px | #CBD5E1,虚线 4-2 |
0 px |
| 连接线 / 箭头 | 1.5 px | #3B82F6 |
— |
- 矩形框图:统一圆角 8px,不使用尖锐直角
- 圆形节点:描边 1.5px,内填充使用主色系的浅色(10%~15% 透明度)
- 箭头:统一使用实心箭头,箭头大小 ≈ 线宽 × 6
- 图标风格:统一使用线性风格(stroke),禁止线性与面性(filled)图标混用
- 推荐图标库:Lucide Icons、Tabler Icons
- 图标描边宽度:1.5px ~ 2px
- 代码片段插图:使用浅色背景
#F1F5F9,边框#E2E8F0,代码字体 JetBrains Mono 10pt - 数学公式:使用 LaTeX 渲染,统一 Computer Modern 字体;公式编号居右
- 高亮标注:红框/黄框标注代码行时,边框 2.5px,不填充,层内透明
| 图片类型 | 推荐分辨率 | 最低分辨率 | DPI |
|---|---|---|---|
| Notebook 内联示意图 | 1600 × 900 px | 1200 × 675 px | 150 |
| 架构图 / 模块图 | 1920 × 1080 px | 1440 × 810 px | 150 |
| 实验结果图表(曲线图) | 2000 × 1200 px | 1600 × 960 px | 200 |
| 对比表格截图 | 宽度 ≥ 1200 px | 宽度 ≥ 900 px | 150 |
| Banner / 封面图 | 2400 × 1350 px | 1920 × 1080 px | 150 |
| 用途 | 宽高比 | 说明 |
|---|---|---|
| 横向架构图 / 流程图 | 16 : 9 | 通用默认比例 |
| 纵向流程图 / 对比图 | 3 : 4 | 多步骤纵向展开 |
| 方形对比图 / 缩略图 | 1 : 1 | 网格排列的示例图 |
| 曲线图(单图) | 5 : 3 | Matplotlib 默认优化比例 |
- 单张图片文件大小 ≤ 500 KB(Notebook 内联场景)
- 超过 1MB 的图片必须进行压缩(可使用 Squoosh / TinyPNG 等工具)
| 格式 | 扩展名 | 适用场景 | 说明 |
|---|---|---|---|
| 可缩放矢量图形 | .svg |
✅ 架构图 / 流程图 / 示意图 | 首选格式,放大不失真,体积小 |
| 便携式网络图形 | .png |
✅ 截图 / 图表 / 带透明背景 | 无损压缩,推荐用于曲线图、结果图 |
| WebP 格式 | .webp |
✅ 照片 / 示例图片 / 高压缩场景 | 同等质量下比 PNG 小 30%~50% |
| PDF 矢量 | .pdf |
📌 论文插图 / 高质量打印 | 高清导出使用 |
| JPEG | .jpg |
禁止用于截图、文字、图表(产生伪影) | |
| GIF | .gif |
颜色限制 256 色,仅用于简单流程演示 | |
| BMP / TIFF | — | ❌ 不允许 | 体积过大,禁止使用 |
是否包含文字 / 线条 / 几何图形?
├── 是 → 使用 SVG(首选) 或 PNG
└── 否(实景照片 / 真实图像)
├── 是否需要透明背景?
│ ├── 是 → PNG
│ └── 否 → WebP(首选)或 JPG
| 场景章节 | 推荐图片类型 | 推荐格式 | 分辨率 | 示例内容 |
|---|---|---|---|---|
| Part 1 基础 · Transformer 结构 | 模块架构图 | SVG | 1920×1080 | Self-Attention QKV 数据流 |
| Part 1 基础 · 位置编码 | 3D 曲面图 / 热力图 | PNG | 2000×1200 | Sinusoidal PE 可视化 |
| Part 2 训练 · Loss 曲线 | 折线图 + 置信区间 | SVG / PNG | 2000×1200 | 训练 / 验证 Loss 对比 |
| Part 2 训练 · Scaling Laws | 双对数坐标图 | PNG | 2000×1200 | Loss vs 参数规模曲线 |
| Part 3 推理 · 量化对比 | 分组柱状图 | SVG / PNG | 2000×1200 | FP16 / INT8 / INT4 精度对比 |
| Part 4 前沿 · VLM | 多模态数据流图 | SVG | 1920×1080 | 图片→Patch→Token→LLM 流程 |
| Part 4 前沿 · 注意力热力图 | 热力图 + 颜色条 | PNG | 1600×900 | Attention Weight 可视化 |
| Part 5 生产 · 部署架构 | 系统部署拓扑图 | SVG | 1920×1080 | Client → Gateway → Model Worker |
| 附录 · GPU 硬件 | 硬件结构示意图 | SVG + PNG | 1600×900 | SM / 显存 / 带宽结构图 |
专业 · 清晰 · 克制 · 技术美感
| 原则 | 具体要求 |
|---|---|
| 专业感 | 不使用卡通风格、手绘风格、表情包式插图;使用简洁几何图形表达技术概念 |
| 清晰度 | 所有文字 9pt 以上(150 DPI 下),线条不小于 0.75px;导出后缩放到 50% 仍可读 |
| 克制原则 | 每张图最多使用 3 种主色 + 2 种辅色;不添加无意义的装饰元素(渐变阴影、立体浮雕等) |
| 技术美感 | 黄金分割 / 网格对齐 / 对称布局;元素间距统一,体现秩序感 |
- 项目内部图片 不添加水印
- 引用外部图片必须在右下角注明来源(8pt,
#64748B,格式:© Source / CC BY-SA) - 原创架构图如需对外发布,可在右下角添加项目标识(不超过图面 5%)
提交新图片前,请确认:
- 色彩使用了规范中的主 / 辅 / 功能色,未出现荧光色 / 纯黑
- 文字字体、字号符合规范,最小字号 ≥ 9pt
- 线条宽度 ≥ 0.75px,主路径 ≥ 2.0px
- 四周留白 ≥ 8%,内容未触边
- 分辨率达到最低要求(示意图 ≥ 1200×675)
- 文件格式正确(架构图用 SVG,曲线图用 PNG/ SVG)
- 文件体积 ≤ 500KB(已压缩)
- 箭头方向一致,元素对齐,布局平衡
- 引用图片已标注来源,无版权风险
- 同类图片(如多张 Loss 曲线图)配色方案统一
以下是符合本规范的优秀示例,供创作时参考:
| 编号 | 类型 | 参考链接 | 符合点说明 |
|---|---|---|---|
| 01 | Transformer 架构图 | The Illustrated Transformer | 模块化布局、蓝紫色调、清晰箭头流向 |
| 02 | Self-Attention 热力图 | Attention is All You Need 可视化 | 有序颜色渐变、标注清晰 |
| 03 | VLM 多模态架构 | LLaVA 论文 Figure 1 | 左右分栏、模块分明、配色克制 |
| 04 | Loss 训练曲线 | Karpathy nanoGPT 示例图 | 5:3 比例、双轴标注、浅网格线 |
| 05 | GPU 架构图 | NVIDIA A100 Whitepaper 第 8 页 | 专业硬件示意图风格、分区清晰 |
| 06 | 矩阵运算流程图 | Visualizing Matrix Multiplication | 色块表示矩阵、配色专业、对齐严谨 |
注意:以上外部图片版权归原作者所有,仅用于风格参考。请勿直接复制使用,应自行重新绘制。
| 工具 | 适用场景 | 格式输出 | 成本 | 推荐度 |
|---|---|---|---|---|
| draw.io / diagrams.net | 架构图 / 流程图 / 数据流图 | SVG / PNG / PDF | 免费 | ⭐⭐⭐⭐⭐ |
| Excalidraw | 手绘风格技术示意图(需调至线性风格) | SVG / PNG | 免费 | ⭐⭐⭐⭐ |
| Figma | 精细排版的架构图 / Banner | SVG / PNG | 免费版可用 | ⭐⭐⭐⭐⭐ |
| Matplotlib / Seaborn | 曲线图 / 柱状图 / 热力图(代码生成) | SVG / PNG | 免费 | ⭐⭐⭐⭐⭐ |
| Plotly | 交互式图表导出静态图 | SVG / PNG | 免费 | ⭐⭐⭐⭐ |
| Graphviz / Mermaid | 代码生成流程图 / 依赖图 | SVG / PNG | 免费 | ⭐⭐⭐⭐ |
| Inkscape | 专业 SVG 矢量编辑 | SVG / PNG | 免费 | ⭐⭐⭐⭐ |
| Squoosh.app | 图片压缩 / WebP 转换 | 任意 | 免费 | ⭐⭐⭐⭐⭐ |
将以下代码加入 Notebook 顶部,即可全局使用规范配色:
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib import font_manager
# =============== 项目统一绘图风格模板 ===============
# 1. 字体设置(优先顺序:微软雅黑 → 思源黑体 → 默认)
font_candidates = ['Microsoft YaHei', 'Source Han Sans CN', 'PingFang SC', 'Noto Sans CJK SC']
for font in font_candidates:
try:
mpl.rcParams['font.sans-serif'] = [font]
break
except:
pass
mpl.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
mpl.rcParams['font.family'] = 'sans-serif'
# 2. 项目配色规范
BRAND_COLORS = {
'blue': '#3B82F6',
'violet': '#8B5CF6',
'green': '#10B981',
'amber': '#F59E0B',
'red': '#EF4444',
'cyan': '#06B6D4',
'pink': '#EC4899',
'indigo': '#6366F1',
}
PALETTE_8 = list(BRAND_COLORS.values()) # 8 色有序调色板
GRADIENT_BLUE = ['#DBEAFE', '#93C5FD', '#3B82F6', '#1D4ED8', '#1E3A8A'] # 蓝渐变
GRADIENT_PURPLE = ['#EDE9FE', '#C4B5FD', '#8B5CF6', '#6D28D9', '#4C1D95'] # 紫渐变
# 3. 全局样式
plt.style.use('seaborn-v0_8-whitegrid')
mpl.rcParams.update({
'figure.dpi': 150, # 输出分辨率 150 DPI
'savefig.dpi': 200, # 导出分辨率 200 DPI
'savefig.bbox': 'tight', # 导出时自动紧凑裁剪
'savefig.pad_inches': 0.15, # 导出边距
'axes.linewidth': 1.25, # 坐标轴线宽
'axes.edgecolor': '#64748B', # 坐标轴颜色
'axes.labelcolor': '#334155', # 轴标签颜色
'axes.titleweight': 600, # 标题字重
'axes.titlesize': 14, # 标题字号
'axes.labelsize': 11, # 轴标签字号
'axes.prop_cycle': mpl.cycler(color=PALETTE_8), # 默认曲线配色
'xtick.color': '#475569', # x 轴刻度颜色
'ytick.color': '#475569', # y 轴刻度颜色
'xtick.labelsize': 10, # x 轴刻度字号
'ytick.labelsize': 10, # y 轴刻度字号
'grid.color': '#CBD5E1', # 网格颜色
'grid.linewidth': 0.75, # 网格线宽
'grid.linestyle': '--', # 网格虚线
'grid.alpha': 0.6, # 网格透明度
'legend.fontsize': 10, # 图例字号
'legend.framealpha': 0.95, # 图例透明度
'legend.edgecolor': '#E2E8F0', # 图例边框
'lines.linewidth': 2.0, # 默认曲线粗细
'lines.markersize': 6, # 默认标记大小
'patch.linewidth': 1.25, # 柱形 / 形状边框
})
# 4. 推荐输出尺寸(5:3 比例)
FIG_SIZES = {
'small': (8, 4.8), # 单图小尺寸
'medium': (10, 6), # 默认尺寸(推荐)
'large': (13, 7.8), # 多子图 / 大图
'wide': (16, 9), # 16:9 架构流程对比
}
# 5. 保存辅助函数
def save_figure(fig, name, path='./figures/', formats=('svg', 'png')):
"""
按规范保存图片:同时导出 SVG 和 PNG 两种格式
使用示例: save_figure(plt.gcf(), 'loss_curve')
"""
import os
os.makedirs(path, exist_ok=True)
for fmt in formats:
fig.savefig(f"{path}/{name}.{fmt}", dpi=200 if fmt == 'png' else 150)
print(f"已保存: {path}/{name}.svg + .png")
print("✅ LLM Notebook 绘图风格模板已加载")创建新图时使用以下初始设置:
画布尺寸: 1920 × 1080 px(默认 16:9)
网格: 启用,网格间距 10 px,对齐网格
背景色: #FFFFFF (纯白,不使用灰色/渐变背景)
导出: SVG(首选) + PNG(备份),缩放 200%
常用形状样式预设:
| 形状 | 填充色 | 边框 | 圆角 | 文字样式 |
|---|---|---|---|---|
| 输入/输出模块 | #EEF2FF(浅蓝) |
#3B82F6 / 2px |
8px | 12pt / #1E3A8A / 600 |
| 处理模块 | #F5F3FF(浅紫) |
#8B5CF6 / 2px |
8px | 12pt / #4C1D95 / 600 |
| 模型模块 | #ECFDF5(浅绿) |
#10B981 / 2px |
8px | 12pt / #065F46 / 600 |
| 损失/损失函数 | #FEF2F2(浅红) |
#EF4444 / 2px |
8px | 12pt / #991B1B / 600 |
| 数据存储 | #FFFBEB(浅黄) |
#F59E0B / 2px |
8px | 12pt / #92400E / 600 |
用于 VLM、CV 相关章节的示例照片素材(注意遵守各站授权协议):
| 站点 | URL | 授权 | 说明 |
|---|---|---|---|
| Unsplash | https://unsplash.com | 免费商用,无需署名 | 高质量实景照片 |
| Pexels | https://www.pexels.com | 免费商用,无需署名 | 照片 + 视频素材 |
| Pixabay | https://pixabay.com | 免费商用,无需署名 | 照片 + 插画 + 矢量 |
| Wikimedia Commons | https://commons.wikimedia.org | CC BY-SA 为主 | 需标注来源,适合学术场景 |
| Hugging Face Datasets | https://huggingface.co/datasets | 各数据集自带许可 | VLM 示例图推荐从 COCO / Flickr30k 截取 |
提交前对图片进行压缩,推荐以下流程:
# 方案 A:使用 Squoosh CLI(Node.js)
npm install -g @squoosh/cli
squoosh-cli --webp '{quality: 80}' figure.png # PNG → WebP 80%
squoosh-cli --oxipng '{level: 6}' figure.png # PNG 无损压缩
# 方案 B:使用 Pillow(Python,Notebook 内直接执行)
from PIL import Image
def compress_png(input_path, output_path, quality=85):
img = Image.open(input_path)
img.save(output_path, optimize=True, quality=quality)
# 方案 C:SVG 优化(使用 svgo)
npm install -g svgo
svgo input.svg -o output.svg --precision=2欢迎提交 Issue 和 Pull Request 来完善本项目:
- 新增内容:请遵循现有 Notebook 结构(原理讲解 → 代码实现 → 作业练习)
- 插入图片:必须严格遵循本 README 第 7 节的 图片风格规范
- 代码风格:Python 代码遵循 PEP 8,中文注释完整清晰
- 作业设计:每个作业提供小提示和
assert验证代码,确保可自测
本项目代码采用 MIT License,文档与原创图片采用 CC BY-SA 4.0。
引用第三方内容时请遵守其原始许可协议,并在文档中注明来源。
如有问题或建议,欢迎通过项目 Issue 区反馈。
最后更新:2026-08-20 · LLM Notebook Team