LABS

6 个动手实验

每个实验都是一个可以直接跑的 Python 脚本,不是伪代码。四个离线可跑,两个需要联网(真的去请求 HGNC / UniProt)。

先跑起来

$ git clone https://github.com/Runix-lab/ai4s-for-programmers
$ cd ai4s-for-programmers
$ python3 -m venv .venv && source .venv/bin/activate
$ pip install -r labs/requirements.txt

$ python labs/lab1_read_one_record.py

需要 Python 3.10+。仓库里自带一份 29 条的小样本数据集全部由 RCSB PDB 的公开数据现场构建(构建脚本也在仓库里, labs/data/build_sample.py,可复现)。 所以四个离线实验开箱即跑,不需要你先去下载几十 GB 的东西。

两个实验需要联网:Lab 4 会真的去请求 HGNC 和 UniProt 的公开 API,Lab 6 会真的去访问溯源链接。 这是故意的——它们要教的东西只有在真实网络条件下才会发生 (限流、反爬、查不到)。

六个实验

按课程顺序排列。如果只跑一个,跑 Lab 4。

LAB 1 · 打开一条真实记录

$ python labs/lab1_read_one_record.py

打印一条抗体记录的所有字段,让你把 S1S3 的每个概念在真实数据里逐个找到。

离线可跑 · 约 1 分钟 · 配套 S4

LAB 2 · 给数据做体检

$ python labs/lab2_data_checkup.py

SELECT COUNT(*) ... GROUP BY 的生物版:总量、外键基数、 证据等级分布、字段填充率、QC 标记分布。拿到任何陌生数据的第一件事。

离线可跑 · 约 1 分钟 · 配套 S4

LAB 3 · 亲手复现子串匹配 bug

$ python labs/lab3_substring_bug.py

三类 bug 现场发生:词边界缺失导致的假阳性、 前缀关系导致的误判(加词边界也救不了)、以及正则根本解决不了的语义陷阱。

离线可跑 · 约 1 分钟 · 配套 S7

LAB 4 · 交叉源验证 ★ 最重要

$ python labs/lab4_cross_source.py

把同一个问题问三次(HGNC + 两种 UniProt 查法),把归一化冲突现场打出来。 你会看到两种都「合理」的查法各自以不同方式翻车—— 这比「有个 bug」重要得多。

输入     HGNC      UniProt-A 朴素                      UniProt-B 严谨
CCR4   CCR4      CCR4 P51679 [Homo sapiens]        NOCT Q9UK39      ← 别名劫持
HER2   ERBB2     GTF1 P53260 [Saccharomyces]     ERBB2 P04626     ← 跨物种泄漏
PD-1   PDCD1     PD-1 Q9UMF3 [Homo sapiens]        (查不到)
OX40   TNFRSF4   - O02764 [Oryctolagus]          (查不到)         ← 兔子同源

需要联网 · 约 1 分钟 · 配套 S7

LAB 5 · 从三维结构算出表位

$ python labs/lab5_compute_epitope.py

把两侧原子丢进 KD 树做空间近邻查询,算出表位和互补位残基。 输出里的 SEPTPO 会顺带告诉你这个抗体识别的是磷酸化状态的目标。

离线可跑(结构文件已内置)· 约 1 分钟 · 配套 S7

LAB 6 · 断言式质检

$ python labs/lab6_assert_qc.py

把数据质量写成一组必须成立的断言。里面埋了一个陷阱—— 关于 HTTP 403 该不该判定为「链接坏了」。自己跑出来体会。

需要联网 · 约 2 分钟 · 配套 S7

关于这份样本数据

为了让实验开箱即跑,仓库里带了一份小样本数据集labs/data/)。 关于它你需要知道三件事:

  • 它只来自公开来源:RCSB PDB 的结构、序列与 UniProt 交叉引用, CDR 用 ANARCI/abnumber 本地算,表位用 gemmi 现场算。 构建脚本 labs/data/build_sample.py 就在仓库里,可以自己重跑一遍
  • 它是 29 条的小样本,不是完整数据集:够跑通全部实验、 够看清每一类问题,但不足以训练任何东西。
  • 它包含真实的瑕疵:3 条单域抗体没有轻链、2 条缺 UniProt 交叉引用、 1 条含氨基酸模糊码——全部保留并在 QC_flags 里如实标记。 一份被洗得完美无瑕的教学数据,会让你学到一套在真实世界里不成立的直觉。
  • 它自己就验证了课程里的两个论断:29/29 行的 Kabat 与 Chothia CDRH3 完全相同, 16/29 行的抗原链不是 A。不用信我,跑 Lab 2 自己数。
如果你想在更大的数据上练

公开可获取的起点:SAbDab (抗体结构)、RCSB PDB(全部结构)、 UniProt(蛋白序列与注释)、 IEDB(表位)。
用之前先看各自的使用条款——这正是 S8 第 10 问要你问别人的那件事, 对自己也一样适用。