第3章 输入数据准备:序列文件格式、多序列比对(MSA)生成、模板检索

数据准备这一步,说白了就是给 AlphaFold 喂 "原材料" 。很多人在调参上花了大量精力,结果出问题才发现是输入数据本身就有坑。我做过好几个项目,最终性能瓶颈都卡在 MSA 质量上,而不是模型参数。所以这一章我们把这部分搞清楚。

3.1 序列文件格式——AlphaFold 的入场券

AlphaFold 支持的序列格式就那么几种,但用不对照样跑不起来。

FASTA 格式

最常用的格式,简单到没朋友。一行 >header,接着是序列正文。我个人习惯把 header 写得简短一些,不要夹带特殊符号。AlphaFold 在解析 header 时偶尔会卡住,特别是里面混了中文或空格的时候。

>sp|P00533|EGFR_HUMAN
MRPSGTAGAALLALLAALCPASRALEEKKVCQGTSNKLTQLGTFEDHFLSLQRMFNNCEVVLGNLEITYVQRNYDLSFLKTIQEVAGYVLIALNTVERIPLENLQIIRGNMYYENSYALAVLSNYDANKTGLKELPMRNLQEILHGAVRFSNNPALCNVESIQWRDIVSSDFLSNMSMDFQNHLGSCQKCDPSCPNGSCWGAGEENCQKLTKIICAQQCSGRCRGKSPSDCCHNCAAGCTGPRESDCLVCRKFRDEATCKDTCPPLMLYNPTTYQMDVNPEGKYSFGATCVKKCPRNYVVTDHGSCVRACGADSYEMEEDGVRKCKKCEGPCRKVCNGIGIGEFKDSLSINATNIKHFKNCTSISGDLHILPVAFRGDSFTHTPPLDPQELDILKTVKEITGFLLIQAWPENRTDLHAFENLEIIRGRTKQHGQFSLAVVGLNITSLGLRSLKEISDGDVIISGNKNLCYANTINWKKLFGTSGQKTKIISNRGENSCKATGQVCHALCSPEGCWGPEPRDCVSCRNVSRGRECVDKCNLLEGEPREFVENSECIQCHPECLPQAMNITCTGRGPDNCIQCAHYIDGPHCVKTCPAGVMGENNTLVWKYADAGHVCHLCHPNCTYGCTGPGLEGCPTNGPKIPSIATGMVGALLLLLVVALGIGLFM
小技巧: 如果序列里含有非标准氨基酸字符(比如 B、Z、X),AlphaFold 的预处理脚本会自动把它们映射成未知残基。我建议你在运行前自己检查一遍,用 Python 的 set() 扫一下字符集,避免意外。

A3M 与 STO 格式

这两种格式主要用于存储多序列比对结果。A3M 是 HHblits 的默认输出,带插入状态信息;STO(Stockholm)格式则更通用,Jackhmmer 和 HMMER 家族都用它。

我遇到过不少人直接把 FASTA 塞进模型,结果报错。记住:AlphaFold 的 MSA 模块只吃 A3M 和 STO,不做自动转换。

常见序列格式对比
格式扩展名适用场景备注
FASTA.fa / .fasta输入查询序列最通用,header 要干净
A3M.a3mHHblits 产出带插入状态,文件较小
STO.stoJackhmmer 产出完整保留比对信息
mmCIF.cif模板结构文件PDB 的现代替代格式

3.2 MSA 生成——从单序列到进化信息

AlphaFold 之所以准,很大程度上靠 MSA 里隐含的共进化信息。MSA 质量直接决定预测精度,这个环节值得花功夫。

核心原则: 宁可多跑几分钟,也要拿到足够深、足够多样化的 MSA。浅 MSA 是造成预测置信度虚高的头号元凶。

HHblits vs Jackhmmer

AlphaFold 官方 pipeline 里用了两种工具:HHblits 跑快速 HMM-HMM 比对,Jackhmmer 做迭代式 profile 搜索。它们各有侧重。

工具搜索算法数据库速度灵敏度
HHblitsHMM-HMMUniClust30 / BFD快(分钟级)中等
JackhmmerProfile HMMUniRef90 / MGnify慢(小时级)高(尤其远端同源)

我一般先用 HHblits 快速跑一轮,拿到基础 MSA。如果目标蛋白是孤儿序列(family 里没几个同源物),再补一轮 Jackhmmer 深搜。为什么?因为 HHblits 对远端同源物的召回率有限,而 Jackhmmer 的迭代机制能挖得更深——代价是时间翻好几倍。

关键参数调优

以下是 HHblits 和 Jackhmmer 里我最常调的几个参数:

  • -E / --eval:E-value 阈值,控制结果筛选的严格程度。我习惯设 1e-10,如果 MSA 太浅会放宽到 1e-5。
  • -N / --num-iterations:Jackhmmer 的迭代次数。默认 3 次,我至少开到 5 次,有时甚至 8 次。
  • --maxseq:最大序列数。AlphaFold 官方默认 5120,但我遇到过内存爆炸的情况,建议根据你的 GPU 显存适当降低。
  • -diff / --diff:HHblits 的过滤阈值,控制 MSA 的多样性。默认 0.0 不过滤,我常设 0.5 去掉高冗余序列。
# HHblits 快速搜索示例
hhblits -i query.fasta -d uniclust30/uniclust30_2018_08 -oa3m query.a3m -E 1e-10 -n 3 -maxseq 5120

# Jackhmmer 深搜示例
jackhmmer --noali --notextw --tblout query.tbl -N 5 -E 1e-10 query.fasta uniref90.fasta
避坑指南: 我曾经在 Jackhmmer 上踩过一个坑——输出文件里的序列名含有管道符 "|",导致下游脚本解析报错。解决方案是在 --tblout 后加 --noali 避免输出对齐部分,或者跑完后用 sed 清洗一下。

3.3 模板检索——给结构找"参考书"

模板检索的目标是从 PDB 里找出与目标序列相似的结构,作为 AlphaFold 的初始坐标参考。模型会从模板里"借鉴"合理的折叠方式。

检索流程

官方 pipeline 用 HHSearch 在 pdb70 或 pdb_seqres 数据库里搜。核心是两步:

  1. 序列搜索: 用 HMM 或 profile 在 PDB 库里找同源结构。
  2. 结构映射: 把匹配的 PDB 结构转换成 mmCIF 格式,提取坐标信息。

我遇到过模板检索完全没结果的情况——比如目标蛋白是一个全新折叠,PDB 里没有相似结构。这时 AlphaFold 会退化成"无模板"模式,纯靠 MSA 推断。预测精度会下降,但不一定崩,特别是对于小蛋白。

参数设置建议

参数作用我的常用值
--max_template_date限定模板的最新日期,防止数据泄露比目标蛋白的发布日晚 1 年
--template_cutoff模板相似度阈值0.5(宽松)/ 0.9(严格)
--pdb70_databasePDB70 数据库路径指向本地下载好的 pdb70 文件夹
# HHSearch 模板检索命令示例
hhsearch -i query.a3m -d pdb70/pdb70 -o query.hhr -p 80 -Z 1000 -loc -realign -maxmem 8
提速技巧: 如果只是快速验证,可以先用 --max_template_date 限制只搜最近几年的 PDB 结构,减少搜索空间。我在做早期探索时经常用这个办法,一天能多跑好几个蛋白。

3.4 数据准备全流程——把它们串起来

下面这张图展示了从一条 FASTA 序列到模型输入特征的完整数据流。我自己画项目流程图时也用这个框架,帮团队快速定位数据准备的瓶颈。

AlphaFold 数据准备流程 AlphaFold 数据准备流程 输入序列 (FASTA) MSA 生成 HHblits / Jackhmmer 模板检索 HHSearch / PDB MSA 特征 (A3M/STO) 模板特征 (mmCIF) 模型输入特征 最终输入特征 = MSA 特征 + 模板坐标 + 序列特征 + 相对位置编码

从图里可以看得很清楚:所有数据最终汇集成模型输入特征。任何一个上游环节出问题,都会影响最终预测。我总结了一个简单的检查清单,每次跑新蛋白前过一遍:

  • ☐ 序列格式 — header 无特殊符号,序列全大写。
  • ☐ MSA 深度 — 至少 200 条有效序列,太少要检查数据库或放宽 E-value。
  • ☐ 模板数量 — 至少 1 个模板,0 模板时标注预警。
  • ☐ 文件路径 — A3M、STO、mmCIF 路径不含中文和空格。

一句总结: 数据准备的功夫花到位,AlphaFold 的调参空间才能真正发挥出来。否则你调来调去,都是在垃圾数据上浪费算力。

紧急提醒: 别在服务器上直接跑 Jackhmmer 连公共 UniRef 库——我吃过这个亏,跑了 6 小时被告知磁盘配额满了。建议先把数据库下载到本地,用 rsync 做增量同步,离线搜索又快又稳。

好了,数据准备这部分就讲到这里。你的输入数据已经准备好了,下一步就是实际跑预测和调参了。