Skip to content

附录 B:杂项与资源

本附录目标:汇总 GenAI 学习与实践过程中积累的周边知识——从模型索引、学习资料,到 AI 交叉应用、数据可视化、算法笔记、开发工具,再到 Vibe Coding 方法论。这些内容虽不构成 GenAI 的核心技术栈,但在日常工程实践中反复被用到,是"把事情做成"的基础设施。


B.1 模型索引与资源汇总

快速定位主流模型、代码仓库与高质量学习资料,建立个人知识导航。

B.1.1 Embedding 模型速查

在语义检索和 RAG 系统中,选择合适的 Embedding 模型是第一步。下表列出在多个项目中实际使用过的模型:

模型特点典型用途
sentence-transformers/all-mpnet-base-v2通用语义相似度,均衡精度与速度语义检索、RAG 向量化、文本聚类

使用方式:

python
import sentence_transformers

st_model = sentence_transformers.SentenceTransformer(
    'sentence-transformers/all-mpnet-base-v2'
)
embeddings = st_model.encode(texts, show_progress_bar=False)

选型建议all-mpnet-base-v2 在通用英文场景下表现稳定,是快速原型开发的默认选择。如果需要多语言支持或更高精度,可考虑 multilingual-e5-largebge 系列,但要注意模型体积与推理延迟的权衡。

B.1.2 必读代码仓库

以下仓库按"从零理解 LLM → 数据准备 → 系统工程 → Agent 应用"的学习路径组织:

LLM 基础与从零实现

仓库作者内容定位
Hands-On-Large-Language-ModelsJay Alammar可视化理解 LLM 内部机制,适合建立直觉
LLMs-from-scratchSebastian Raschka从零用 PyTorch 实现 GPT,代码即教材
reasoning-from-scratchSebastian Raschka从零实现推理模型,覆盖 CoT 等推理策略
nanoGPTAndrej Karpathy极简 GPT 实现(约 600 行),最佳入门代码

数据、基础设施与 Agent

仓库内容定位
llm-datasetsLLM 训练数据集汇总与质量分析
rag-from-scratch基于 LangChain/LangGraph 的 RAG 从零实现
Awesome-ML-SYS-TutorialML 系统与 Infra 教程汇总,涵盖分布式训练、推理优化

阅读建议:先通读 nanoGPT 建立对 Transformer 训练流程的整体认知,再用 LLMs-from-scratch 补充细节,最后通过 Awesome-ML-SYS-Tutorial 了解工程化部署的挑战。


B.2 AI+ 交叉应用(化学等)

AI 技术正在渗透到自然科学的各个分支。本节以化学分子识别为例,展示"结构化知识 + 视觉-语言模型"的数据构建范式。

B.2.1 化学分子识别:SMILES 与 RDKit

DeepSeek-OCR 项目在化学公式识别任务上提供了一个值得参考的数据构建方案:

  1. 数据源:从 PubChem 获取 SMILES(Simplified Molecular-Input Line-Entry System)格式的分子表示
  2. 渲染:使用 RDKit 将 SMILES 字符串渲染为分子结构图像
  3. 规模:构建了 5M 图文训练对

整体流水线可以概括为:

SMILES 字符串  →  RDKit.Draw  →  分子结构图  →  (图, SMILES) 训练对

这种"结构化知识 → 渲染为图像 → 训练视觉-语言模型"的范式在 AI+科学领域具有广泛适用性——只要目标领域存在可程序化渲染的结构化表示(如化学式、电路图、乐谱),就可以用类似方法大规模合成训练数据。

B.2.2 文档识别(OCR)

POINTS-Reader(腾讯)是一个面向复杂文档(含公式、表格、图表)的高精度 OCR 模型。

其架构由三个模块组成:

模块功能
LLM基于提取的特征生成文本描述
vision_encoder提取图像的视觉特征
vision_projector将视觉特征对齐到语言模型的嵌入空间

这是典型的"视觉编码器 + 投影层 + LLM"三段式多模态架构,与 LLaVA 等模型的设计思路一致。理解这一架构有助于快速上手其他多模态模型。


B.3 数据科学可视化

掌握对数坐标轴(Log Scale)的直觉理解与 Matplotlib 常用图表技巧,是分析模型 Scaling 曲线、Benchmark 对比等场景的基础能力。

B.3.1 对数坐标轴的直觉

对数坐标轴的核心思想:将刻度间距从绝对差改为倍数比

Plog(x)=log10(x)

线性 vs 对数坐标的区别

  • 线性坐标关注"加法"——1→2 和 8→9 的间距相同(都是 +1)
  • 对数坐标关注"乘法"——1→2 的间距约 0.301(翻倍),8→9 的间距仅约 0.051(增长 12.5%)

何时使用 Log Scale

  • 数据跨越多个数量级(如模型参数量从 1M 到 100B)
  • 关注增长率/倍数而非绝对值(如 AI Scaling Law 曲线)
  • 底层关系服从 y=alog(x)+b 时,Log 坐标下曲线显示为直线,便于判断趋势

下面的代码演示了"收益递减"曲线在两种坐标下的表现——线性坐标下看到弯曲,对数坐标下看到直线:

python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0.1, 100, 500)
y = 50 * np.log10(x) + 100    # Diminishing Returns:x 翻 10 倍,y 仅 +50

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))

# 线性坐标:收益递减曲线看起来是弯曲的
ax1.plot(x, y, color='#00ff00', linewidth=2)
ax1.set_title("Linear Scale: 收益递减曲线")
ax1.set_ylabel("Performance Score")
ax1.grid(True, alpha=0.3)

# 对数坐标:同一曲线变为直线,揭示线性规律
ax2.plot(x, y, color='#00aaff', linewidth=2)
ax2.set_xscale('log')          # 关键:对数 X 轴
ax2.set_title("Log Scale: 同一曲线变为直线")
ax2.set_xlabel("Cost / Input ($)")
ax2.set_ylabel("Performance Score")
ax2.grid(True, which="both", alpha=0.3)

一个常见困惑:Log Scale 轴 vs Log 变换数据

初学者容易混淆"设置对数坐标轴"和"对数据取对数":

  • Log Scale 轴ax.set_xscale('log')):坐标轴按对数间距排列,但标签显示的仍然是原始值($0.1, $1, $10)
  • Log 变换数据np.log10(x)):数据本身被变换,标签变成了 -1, 0, 1,失去了原始含义

前者保留了数据的可读性,是绑大多数情况下的正确做法。

Log Scale 轴 vs Log 变换数据的对比

B.3.2 箱线图(Boxplot)

箱线图是展示数据分布的经典工具,通过 5 个关键统计量刻画数据:

  • 下边缘Q11.5×IQR(低于此为异常值)
  • Q1(下四分位数,第 25 百分位)
  • 中位数Q2,第 50 百分位)
  • Q3(上四分位数,第 75 百分位)
  • 上边缘Q3+1.5×IQR(高于此为异常值)

其中 IQR=Q3Q1 为四分位距。

箱线图结构示意

应用场景:在实验结果分析中,箱线图适合对比多次运行的模型性能分布。相比单纯汇报均值和标准差,箱线图能直观展示中位数偏移、分布偏斜和异常值,更真实地反映模型稳定性。


B.4 LeetCode 算法笔记

梳理技术面试中的高频算法考点,重点覆盖动态规划和堆两类核心题型。

B.4.1 动态规划(Dynamic Programming)

高频考点:背包问题、编辑距离、二叉树 DP。

DP 问题的通用解题框架(三步法):

  1. 定义状态:明确 dp[i](或 dp[i][j])表示什么——这是最关键的一步,状态定义错了后面全白费
  2. 写出转移方程:如何从已知子问题推导到当前问题
  3. 确定初始条件和计算顺序:哪些 dp 值是已知的,应该按什么方向遍历

经验总结:DP 题的难点不在编码,而在状态定义。拿到题目后先花时间想清楚"什么信息需要被记住",状态定义对了,转移方程通常自然浮现。

B.4.2 堆(Heap)

堆是完全二叉树,天然适合用数组存储——0 号为根,按层序编码。

数组索引关系(0-indexed):

关系公式
节点 k 的左子节点2k+1
节点 k 的右子节点2k+2
节点 k 的父节点(k1)÷2

最小堆性质:任意节点的值 其子节点的值,因此 data[0] 永远是全局最小值。

核心操作

  • 插入(Sift Up):将新元素追加到数组末尾,然后向上调整直到满足堆性质
  • 删除堆顶(Sift Down):将末尾元素移到堆顶,然后向下调整

Python heapq 常用操作

python
import heapq

data = [3, 1, 4, 1, 5, 9]
heapq.heapify(data)            # O(n) 原地建堆
min_val = heapq.heappop(data)  # O(log n) 弹出最小值
heapq.heappush(data, 2)        # O(log n) 插入新元素
heapq.heapreplace(data, 7)     # heappop + heappush 的高效合并(一次 sift down)

建堆时间复杂度为什么是 O(n) 而不是 O(n log n)heapify 从最后一个非叶子节点开始自底向上调整。底层节点多但调整距离短,顶层节点少但调整距离长,数学上求和后总工作量为 O(n)。

典型应用场景:Top-K 问题、任务调度(最早空闲 Worker 优先)、合并 K 个有序链表、中位数维护(对顶堆)。


B.5 实用工具(Clash、Cursor、文档识别)

汇总 GenAI 开发日常所需的网络代理、编辑器配置、文档处理等实用工具。

B.5.1 网络代理与 IP 检测

Clash for Linux

在服务器上配置代理是访问外部模型 API 和下载 HuggingFace 资源的前提。Clash 提供了命令行代理方案:

bash
# 1. 配置订阅地址(编辑 .env 文件)
# 2. 启动 Clash
sudo bash start.sh          # 启动后会输出 secret 信息
source /etc/profile.d/clash.sh
proxy_on                     # 开启代理(设置环境变量)

# 3. Dashboard 管理(浏览器打开设置节点)
# http://<服务器IP>:9090/ui
# 填写 secret,add 后进入管理页面(label 随意填写)

# 4. 关闭代理
proxy_off

Clash 工作模式与规则:

概念说明
Rule Mode(规则模式)默认模式,按规则匹配流量走向
Global Mode(全局模式)所有流量走代理,global 组仅在此模式下生效
节点选择走代理节点
全球直连直接连接,不走代理
漏网之鱼未匹配任何规则时的兜底策略

IP 检测

bash
curl https://ipinfo.io            # 查看当前出口 IP 基本信息
curl -L ping0.cc/geo              # 查看 IP 纯净度、带宽类型、是否原生 IP、共享人数

B.5.2 Cursor 远程服务器配置

在无法联网的服务器上使用 Cursor Remote,需要手动安装 Cursor Server:

bash
# 1. 从 Cursor 的 Output 日志中找到 commit ID
COMMIT=b3573281c4775bfc6bba466bf6563d3d498d1070

# 2. 在有网络的机器上下载
curl -L -o vscode-reh-linux-x64.tar.gz \
  "https://cursor.blob.core.windows.net/remote-releases/${COMMIT}/vscode-reh-linux-x64.tar.gz"

# 3. 传到服务器后解压安装
mkdir -p ~/.cursor-server/cli/servers/Stable-${COMMIT}/server
tar -xvzf ~/vscode-reh-linux-x64.tar.gz \
  -C ~/.cursor-server/cli/servers/Stable-${COMMIT}/server \
  --strip-components=1

推荐插件

  • Git Blame 类插件:在编辑器右侧显示每行代码的提交记录,方便追溯变更历史

B.5.3 PDF 与文档处理

Python 轻量 PDF 解析(基于 pypdf):

python
from pypdf import PdfReader

reader = PdfReader("document.pdf")
for page in reader.pages:
    text = page.extract_text()
    print(text)

pypdf 适合纯文本提取。如需处理含公式/表格的复杂 PDF,可考虑 B.2.2 提到的 POINTS-Reader 等多模态 OCR 方案。

B.5.4 终端图片显示

在 macOS iTerm2 中,可通过 imgcat 在命令行直接显示图片:

bash
curl -L https://iterm2.com/utilities/imgcat > imgcat
chmod +x imgcat
sudo mv imgcat /usr/local/bin/

# 使用
imgcat screenshot.png

B.5.5 Ubuntu 常用配置

在 Ubuntu 服务器上开发时的一些常用工具和配置备忘,可根据实际需求选装。


B.6 Vibe Coding 与 Spec 驱动开发

AI 辅助编程已成为日常,但"怎么用"比"用不用"更重要。本节讨论两种对立的 AI 编程范式——Vibe Coding 和 Spec 驱动开发——以及如何在效率与能力保持之间找到平衡。

B.6.1 Vibe Coding 的问题

"Vibe Coding"指让 AI 一气呵成地写代码,不加审视地接受输出。这种方式在原型开发阶段很有效率,但存在根本性风险:

  • 思维能力退化:无脑 LLM input/output 会极大降低自己的架构能力与工程能力
  • 缺乏全局视角:AI 生成的代码适合局部实现,但缺乏系统级设计考量
  • 核心能力被掩盖:问题的关键是找到关键的问题——提炼问题的能力比让 AI 生成答案更重要

Reasoning(深度思考)和 Design(设计)应当前置到 prompt 中,而不是后置到 review 中。先想清楚要什么,再让 AI 去实现。

B.6.2 Spec 驱动开发(SDD)

SDD(Spec-Driven Development)的核心理念:先思考,后编码

工作流程

新需求 → 充分理解需求 → 给出实现思路 → 与团队讨论 → 确认决策点 → 开始编码

关键实践

  1. 在 Prompt 中前置 reasoning 和 design:让 AI 先分析需求、给出方案,而非直接写代码
  2. 使用 PRD(Product Requirements Document):将需求结构化,减少歧义和遗漏
  3. 在 Cursor Rule / System Prompt 中明确约束
新需求首次沟通时,末尾强调:
"不要急着写代码!先理解需求,给出实现思路,我们先讨论,
看还有什么需要我决策的点?ultrathink"

或更简洁的 Cursor Rule:

不明白的地方反问我,先不着急编码

B.6.3 AI 辅助编程的分工原则

适合交给 AI应当自己把控
样板代码(Boilerplate)系统架构设计
单元测试编写技术选型与取舍
代码格式化与重构需求拆解与优先级排序
文档生成性能瓶颈定位
调试线索收集边界情况处理策略

核心观点:AI 工具是"放大器"——它放大你已有的工程能力,而无法替代你没有的判断力。数据结构、系统设计、调试能力这些基础功在 AI 时代比以往更有价值,因为它决定了你能否看出 AI 的输出哪里是错的。


本章小结

本附录覆盖了 GenAI 工程师所需的周边知识与资源地图:

  1. 模型与资源(B.1):all-mpnet-base-v2 是通用 Embedding 的默认选择;nanoGPT 和 LLMs-from-scratch 是从零理解 LLM 的最佳代码资产;Awesome-ML-SYS-Tutorial 汇聚了 ML 系统进阶资料。

  2. AI+科学(B.2):DeepSeek-OCR 在化学分子识别上采用"SMILES → RDKit 渲染 → 图文对"的数据构建方法,展示了 AI 与领域知识融合的通用范式;POINTS-Reader 提供了多模态文档 OCR 能力。

  3. 数据可视化(B.3):Log Scale 将倍数关系映射为等间距,是解读 Scaling Law 曲线的必备工具;箱线图通过 5 分位统计量刻画分布,比均值更能反映实验的真实稳定性。

  4. 算法基础(B.4):DP 三步法(定状态 → 写转移 → 定初值)是动态规划的通用框架;堆的数组实现利用完全二叉树的索引规律,heapqheapreplace 是合并操作的高效技巧。

  5. 实用工具(B.5):Clash for Linux 解决服务器网络代理问题;Cursor Server 手动安装应对离线场景;pypdf 提供轻量 PDF 文本提取。

  6. Spec 驱动开发(B.6):SDD 要求在 prompt 中前置 reasoning 与 design,先讨论再编码;Vibe Coding 虽然高效,但保持架构能力和问题提炼能力才是 AI 时代的核心竞争力。


延伸阅读

  • Matplotlib 官方教程:Python 数据可视化的核心库文档,覆盖 Figure/Axes 模型、样式定制和子图布局,配合本附录 B.3 节使用。Matplotlib Tutorials
  • Statistics Done Wrong:Alex Reinhart 著,以实际案例讲解常见统计误用(p-hacking、多重比较、样本量不足等),适合 AI 实验结果分析的批判性阅读。statisticsdonewrong.com
  • Sentence Transformers 文档:语义检索和 Embedding 模型的使用指南,覆盖模型选型、微调和评估,配合本附录 B.1 节阅读。SBERT Docs
  • Writing in the Sciences (Stanford Online):斯坦福学术写作课程,讲解科学论文的结构、用词精简和数据呈现技巧。Coursera