1. 为什么酶和蛋白质需要"专用"生成模型
生成式AI在分子设计里最有意思的落地场景之一,就是酶与蛋白质设计专用模型。这个主题在"生成式AI与分子设计"整个知识体系里,属于非常关键的一节——因为小分子设计积累的那套经验,搬到蛋白质上基本行不通,而酶设计比普通蛋白质设计还要再难一个量级。
我最早接触这个方向,是跟着某个合成生物学项目做的。当时团队想改造一个工业酶,让它能扛住高温和高浓度底物的双重压力。一开始大家走的还是传统定向进化路线,一轮一轮做随机突变、构建文库、筛选,光是建库和初筛的周期就接近三个月。后来换成生成式AI方案,模型先生成几百条候选序列,再用结构工具逐层过滤,最后送湿实验验证。结果当然是AI方案快得多,但也暴露了非常多只有真刀真枪跑过才懂的问题。这篇文章我想把"酶与蛋白质设计专用模型"这件事拆开聊透,从模型原理到工程落地,顺带把踩过的坑也一并说了。
1.1 小分子设计的经验,拿到蛋白质上会失效
生成式AI做小分子药物设计已经很成熟,图生成、分子生成、SMILES生成这些技术大家都很熟悉。小分子是一个相对小的化学空间,只要控制好原子类型、价键规则和手性约束,生成出来的分子基本就具备"可合成、可测活性"的雏形。哪怕不完美,后续也只需要做一些局部优化。
蛋白质完全不是这么回事。一个300残基的酶,序列空间是20的300次方,这个数字已经没法用"非常大"来形容了,纯暴力采样毫无意义。更麻烦的是,蛋白质生成出来的不是成品,只是一段字符串。这段字符串要能正确折叠成三维结构,才能在生物体内或试管里干活。从"写出一段氨基酸序列"到"拿到一个有活性的酶",中间隔着折叠、稳定性、可溶性、催化机理等一连串关卡。
所以,小分子生成模型解决的是"这个化学结构合不合理",而酶设计专用模型要解决的是"这个序列能不能折叠、折叠之后能不能结合底物、结合之后能不能催化反应"。完全是两种复杂度。
1.2 酶的催化能力,依赖一整套"结构上下文"
再聊一个我在实践早期犯过的错。我一开始以为,酶的催化活性主要看活性位点那十几个残基,把它们改对了就行。真做了才发现,酶不是活性位点的孤立拼图,而是整条多肽链把催化残基精确地"钉"在特定空间位置上的结果。
举个最直观的例子,很多水解酶有一个催化三联体,三个残基在序列上可能隔得很远,但折叠之后必须凑在一起形成氢键网络。只要其中一个残基的侧链方向偏了零点几纳米,整个催化机制就塌了。除此之外,还有底物通道、辅因子结合位点、构象变化开关——这些全都依赖全局结构支撑。
这个特点直接决定了为什么需要专用模型。一个只学氨基酸共现规律的语言模型,看不见三维坐标,理解不了"这俩残基在空间上要凑到多近"。而专用模型之所以叫专用,就在于它的输入、生成目标和评价函数都围绕"结构上下文"来设计。
1.3 专用模型到底"专"在哪里
我习惯把酶设计专用模型的"专用性"拆成三个层面,正好对应数据、表示、目标。
数据层面:普通语言模型用海量天然蛋白序列训练就够了,但酶专用模型还需要同源家族的多序列比对信息、结构数据库里的三维构象、功能注释库里的酶分类信息,以及湿实验积累的突变效应数据。简单说,训练数据里必须包含"功能维度",而不是只有序列。
表示层面:有的模型以序列为输入输出,有的以残基距离图作为生成对象,有的直接把主链三维坐标当作扩散的目标。不同的表示方式,决定了模型能表达什么约束、生成什么形式的产物。
目标层面:通用蛋白设计模型追求"能折叠成稳定结构"就差不多了,酶专用模型还要额外追求,底物能不能对接进活性口袋,催化残基的几何构型对不对,过渡态能不能被稳定,甚至还要考虑大肠杆菌里能不能表达、热稳定性够不够。
这三点是理解后面所有技术的总抓手。
1.4 一个让我印象极深的对比
我在模拟项目X里做过一个很直接的对比实验,目标是把一个酯酶的耐热性从55℃提升到75℃。
第一轮,团队直接用通用的序列生成模型做采样,生成了几百条候选。这批候选在序列层面看起来相当合理,多样性也够,结构预测出来的置信度也都不错。结果湿实验一做,绝大多数候选在大肠杆菌里根本不表达,少数表达了的,活性比野生型还低。
第二轮换成带结构约束的专用方案,同样数量规模的候选池里,拿到了三四个在高温条件下活性保留超过80%的突变体。这个对比让我彻底明白一件事:模型能生成出"看起来合理"的序列,和能生成出"实验里能用的蛋白",是完全两回事。
2. 酶与蛋白质设计专用模型的技术谱系
现在领域里的技术路线虽然百花齐放,但归纳起来主要是四类底子:自回归序列生成、结构扩散生成、序列-结构联合生成,以及面向特定指标的判别或优化式方法。先分别搞清楚它们的原理和边界,再聊选型。
2.1 自回归序列生成:把蛋白质当"长句"来写
第一种路线是最直观的:把蛋白质序列看作一个由20种氨基酸"字母"写成的长句子,模型从左到右逐位预测下一个最可能的残基。训练语料是海量天然蛋白序列,模型从中学习的是进化沉淀下来的"语法"——哪些残基组合倾向共现,哪些位置不能出现疏水残基,跨膜区大概长什么样,等等。
这类模型的好处是生成速度快,序列的天然度和整体流畅度很高。特别适合做同源序列挖掘和多样性生成,也就是"先给我一大池子看起来合理的序列"。
但它的软肋也很明显:对空间关系只有隐式的理解,没有显式的坐标概念。打个比方,一个语言模型知道"这个位置通常放甘氨酸才会让链转弯",但它并不知道这个转弯曲率精确是多少、旁边哪个残基的侧链会不会撞上底物分子。如果你想让某两个原本不相邻的残基在空间上互相靠近,纯序列模型几乎没办法直接约束。
所以我的定位是,自回归模型适合当第一道发生器,后面必须接结构和能量筛选,千万别把它当终点。
2.2 基于扩散的结构生成:先搭骨架,再填序列
第二种路线是结构扩散生成,这个概念玩图像的读者应该不陌生。大致思路是:给蛋白质主链坐标不断增加高斯噪声,直到完全变成一团随机点,然后训练一个去噪网络学会逆向还原过程。推理时从纯噪声出发,逐步"雕刻"出合理的蛋白质主链骨架。
一个更生活化的类比是雕塑。模型从一块均匀的石头(噪声)出发,每次去噪相当于敲掉多余的碎屑,最后露出一座立体的骨架雕像。这个过程中还可以往里去噪网络里塞条件信息,比如底物分子结构、辅因子形状、活性口袋的大致轮廓,让它按需求雕刻。
这类模型输出的通常不是完整的氨基酸序列,而是主链坐标或者残基间的距离图。拿到骨架之后,还要用独立的"序列设计"模块把每个位置填上合适的氨基酸,再做侧链优化。
结构扩散生成最大的优点是空间约束是显式的,设计出来的骨架通常有很好的可折叠性,这是纯序列模型完全比不上的。缺点是计算开销大,采样慢。更麻烦的是,生成的骨架如果后续序列设计做得不够细,侧链冲突和原子空间上的能量瑕疵会非常突出。它不是"答题机",是一根北极星,给你指出方向上正确的大致区域。
2.3 序列-结构联合生成:让两者互相印证
第三种路线是序列和结构的联合生成。既然序列决定结构、结构又反过来约束序列,那索性不要把它们拆成两个阶段,而是放到同一个生成过程里交替迭代。
用大白话说,模型在生成的时候先大致规划一个结构轮廓,填入一部分序列,再看序列与结构是否自洽,如果不自洽,就反向修正结构,再修正序列,来回几次,直到收敛到一个大家都满意的结果。
联合方法的优势是候选解的整体自洽性高,不会出现序列单独看很好、但塞进结构里全是空间冲突的尴尬情况。代价是实现复杂度高,需要的数据量大,而且训练时要把序列数据、结构数据、功能数据都对齐到一个统一空间里。大多数团队不会自己从零训练这种模型,更现实的路径是直接用别人的预训练框架做微调。
2.4 四类路线的适用边界
| 路线 | 核心原理 | 生成对象 | 优势 | 适合场景 | 主要限制 |
|---|---|---|---|---|---|
| 自回归序列生成 | 从左到右预测下一个残基 | 氨基酸序列 | 速度快、多样性高 | 同源改造、候选池生成 | 结构可控性弱 |
| 结构扩散生成 | 坐标去噪 | 主链坐标/距离图 | 结构约束显式、可从头设计 | 新折叠、口袋重新设计 | 计算量大,需序列设计补全 |
| 序列-结构联合生成 | 潜空间交替采样 | 序列+结构 | 自洽性好 | 高精度候选生成 | 实现复杂,数据要求高 |
| 判别/优化式方法 | 能量函数或判别器引导 | 满足特定指标的序列 | 与湿实验反馈闭环好 | 定向优化特定功能指标 | 每个项目基本要重训练 |
实际项目里这些路线不是非此即彼,而是流水线关系。我通常的做法是:先用结构扩散生成器确定大方向上的骨架和口袋形状,再用序列生成模型在骨架上填出候选氨基酸,最后用物理能量函数做一轮精修。整个过程下来,候选质量远好过用任何一个单一模型。
3. 怎么把"催化能力"写进生成模型
生成模型本身不懂什么叫催化,什么叫底物特异性。要把这些业务需求翻译成模型能理解的语言,得靠条件控制和后续打分两条腿走路。
3.1 生成阶段的命题方式
给模型命题,就是条件控制。常见的工程做法有几种。
标签条件:把底物名称、最适pH、目标温度、所需辅因子等信息编码成一串向量,在模型输入端拼进去。相当于写作文之前先给定主题词。这个方式最简单,但表达力有限,没法描述复杂的空间关系。
结构条件:把已知骨架或者活性口袋的坐标作为额外输入。比如你知道野生型酶的大致折叠方式,但想改口袋形状,就让模型在生成时尽量贴合这个已知骨架,只在指定的局部区域自由发挥。这个方式工程上非常实用,是做局部改造的首选。
底物结构条件:把底物分子的化学结构转换成向量表示,拼接到生成网络里,甚至让底物结构信息与序列token之间做交叉注意力。目的是让模型感知到"这个活性口袋要装下一个这么大的分子"。对底物特异性改造来说,这条路几乎是必须的,因为它逼着生成器去理解口袋的立体形态与底物是否匹配。
多模态交叉注意力听起来玄,本质上就是让蛋白质序列和底物结构两段信息在同一个语义空间里互相参考。你搞一个对接姿态或者一个底物口袋三维网格作为查询,序列作为键值,注意力机制会自动找出"哪些残基和底物关系最密切",然后重点优化这些位置。
3.2 生成之后的硬筛选:能量与机理双重把关
不管条件控制做得多好,生成模型仍然只是"提出假设",它不会天然知道"这个假设能不能催化反应"。所以生成之后必须套上筛选流水线。
第一级是物理合理性过滤。用基于物理的能量函数计算候选序列折叠到目标骨架上的能量,再检查结构预测置信度,如果大量残基落在低置信度区间,直接淘汰。还会看核心残基的溶剂可及性——催化位点附近如果被水分子大量占据,反应多半没法进行。
第二级是机理相关性检查。把底物分子对接到候选结构的口袋里,算结合打分、接触距离、催化残基与底物关键原子之间的距离。这一步没有通用标准答案,需要结合你做的具体反应类型定义几何约束。比如做酯酶,至少要保证亲核残基与底物被水解键的空间距离在可反应范围内;做转氨酶就盯磷酸吡哆醛结合位点和底物氨基的接近程度。
我建议每一轮筛选都记录各环节的淘汰比例。如果某个环节把九成候选都淘汰了,说明上游生成方向已经很偏了,优先回去调生成条件,而不是硬调阈值。
3.3 判别器模型:让"评委"参与生成
除了物理打分器,很多项目还会额外训练一个判别器模型。输入是一条候选序列加条件标签,输出一个概率分数,表示"这条序列到底像不像一个有活性的酶"。本质上是个二分类器,正样本来自酶活性数据库和功能注释良好的序列,负样本来自随机序列、已知失活的突变体,以及结构预测后明显错乱的假阳性候选。
判别器的价值在于它可以嵌入到生成阶段,做拒绝采样或者强化学习奖励信号。我之前在模拟项目X里试过用判别器打分作为奖励,去微调序列生成模型,候选库的整体平均质量确实能快速上推。
但这里有个大坑:判别器非常容易过拟合训练集正样本。一旦它记住了已知酶的统计模式,就会给那些与已知高活性酶高度相似的序列打高分,而这些序列在湿实验里往往没有任何新意。怎么破?每轮湿实验的真实反馈必须持续汇入判别器训练数据,尤其是把"设计出来、但实验失活"的负样本加进去。没有持续反馈的判别器,只会变成一只复读机。
4. 衡量"能用"的指标:从能量分数到湿实验验证
很多人会问,生成出一堆候选之后,凭什么决定先做哪几条的湿实验?答案是多层次打分排序,从序列、结构、功能三个维度层层扣。
4.1 序列层面的初步筛查
序列层面,我最常用两个指标:进化保守性和序列一致性。
进化保守性通过多序列比对计算每个位置的保守性分数。一个位置在现有物种里几乎不变,说明它在结构和功能上有不可替代的作用,随便乱改大概率出事。反过来,如果某个位置在进化里很随意、频繁变来变去,那它就是潜在的改造自由区。
序列一致性衡量生成序列和野生型的相似度。太相似说明你实际上没探索到多少新空间,只是原序列附近的小扰动;太疏远又可能掉进"完全不表达"的深渊。关键是要在"贴近目标区域重点变异、其他区域保持稳定"之间找平衡。我习惯先保留一个同源骨架作为锚点,只对指定区域做高强度变异生成。
4.2 结构层面的关键检查
这个阶段要看三个东西:结构置信度、二级结构合理性、核心残基的包埋程度。
结构置信度是结构预测工具给每个残基的可信度评分。一个新序列拿去预测结构,如果整体置信度偏低,说明序列很可能无法折叠成规则结构;如果某些关键环或活性位点区域置信度低,那么这些地方的真实构象很可能是乱糟糟的。遇到这种情况我会直接淘汰,不值得浪费湿实验名额。
二级结构合理性比较简单,就是看预测出来的螺旋、折叠、无规卷曲分布是否符合蛋白质常识。如果一个溶菌酶里出现了一大段不应该出现的跨膜螺旋,那基本可以判断这条序列有问题。
还有一个偏冷门但很有用的指标叫"结构可设计性":把生成的结构拿去做反向序列设计,如果反推出来的序列和你原本生成的序列高度一致,说明这个结构信息量充足、可编码。如果反向设计的序列和你生成的完全对不上,说明这个结构本身就模棱两可,后续实验大概率失败。
4.3 功能评估永远以湿实验为终点
序列和结构指标都是软性预判,终极标尺永远是湿实验。这里特别想强调一个误区:很多人看到结构置信度满分、能量打分最低,就以为稳了,结果湿实验一做完全不表达,或者表达出来是一团包涵体。
原因在于,这些计算指标衡量的是"这个蛋白在理论上能不能折叠成一个稳定构象",不等于"它在表达系统中能不能顺利折叠、能不能在反应条件下正确组装、能不能在实际环境中发挥催化活性"。表达过程受密码子偏好、折叠速率、分子伴侣协助等多重因素影响,计算工具根本预测不了。
所以我在项目里的做法是,小步快跑做闭环:第一轮只挑十到二十个候选做小规模表达测试,确认有可溶性、有基础活性之后,再扩大候选池做详细的动力学和热稳定性表征。千万不要把几百条候选一次性全送去做全套验证,时间和试剂成本都受不了。慢即是快这个说法,在这种场景下是真的。
5. 从零到一:一个酶改造项目的实操路径
聊完原理和指标,我把一个真实酶改造项目的完整路径捋一遍。如果你正准备开展类似工作,可以直接拿这份清单当模板。
5.1 启动前,把业务目标翻译成模型条件
这是最容易被跳过的关键一步。业务目标说"我想提高酶的底物耐受浓度",模型听不懂这句话。你得把它翻译成分子层面的可计算条件。
举个例子,"提高热稳定性"翻译成模型语言通常是"增加盐桥网络、优化核心残基包埋、降低表面疏水残基暴露";"拓宽底物谱"翻译成"活性口袋需要变大、底物通道出入口需要调整形状";"提升对映选择性"则要翻译成"手性口袋周围的空间互补性和静电环境要改变"。
我建议项目启动第一天,先写一张"目标翻译表",左边是业务语言,右边是模型可执行条件。这张表会直接决定你选择哪条技术路线、给模型塞什么条件信息。跳过这一步的团队,最常见的结局是生成了大量好看的序列,但与业务目标毫无关联,纯属自嗨。
5.2 数据准备与模型选型
绝大多数团队不会从零训练大模型,更合理的是基于预训练模型做微调。微调需要多少数据?我自己的经验是,数据量不一定要大,但质量要精准。
需要的数据至少包括三类:目标酶家族的同源序列,用于微调序列生成器,让它学会这个家族的"方言";已经发表的突变数据,格式最好整理成"序列-标签"对,标签可以是活性提升、热稳定性提升、底物偏好改变等;结构数据,至少要保证目标酶家族里有几个高分辨率的三维结构做参照。
如果公开突变数据太少,建议退而求其次,先做无标签微调,只让模型适应目标家族的自然语言分布,效果也比直接拿通用模型硬跑强。
不管你手里数据多还是少,强烈建议自建一个小型评估集:二十到五十个已知功能正确的突变体,同样数量的已知失活突变体。这个集合固定不变,每次模型改动之后都跑一遍,确保模型没有变笨。没有回归测试集的生成式项目,后期完全是玄学。
5.3 生成、筛选、排序的流水线示例
一个标准的候选生成流水线可以用伪代码描述如下:
# 伪代码:酶序列生成与初筛 candidates = [] for i in range(2000): seq = generator.sample( condition={ "family": "esterase", "substrate": "model_substrate", "target_temperature": 75, "pocket_expansion": True, } ) # 第一级过滤:序列自然度和家族相似度 if evolutionary_score(seq) < threshold: continue # 第二级过滤:结构预测 struct = predict_structure(seq) if struct.confidence < threshold: continue if struct.secondary_structure_anomaly_detected(seq): continue # 第三级过滤:口袋几何与催化残基检查 if pocket_geometry_check(struct, catalytic_residues) == False: continue candidates.append((seq, struct)) # 综合排序:物理能量打分 + 判别器打分 ranked = rank(candidates, energy_fn=physical_energy, discriminator=disc) # 输出前100条供人工复查这条流水线里,每个过滤环节最好保留至少5%的候选,不然最后可能剩不下什么东西可做实验。如果某个环节淘汰比例异常高,说明上游条件设置有问题,先调整条件,而不是硬放宽阈值。
5.4 迭代闭环:湿实验反馈是终极裁判官
生成模型是假设发生器,不是真理发生器。湿实验给出的真实活性数据,每一轮都要回喂到模型里,构成"生成-筛选-实验-学习-再生成"的闭环。
具体来说,把湿实验结果里表现好的突变体标记为正样本、表现差的标记为负样本,重新微调判别器和序列生成器,然后进行下一轮采样。这个循环多跑几轮,候选池的质量会有明显跃升。
这里有一个很现实的经验:不要一把梭把几千条候选全部送进湿实验。候选池应按照"小批量、多轮次"推进,每批之间留出模型学习更新和策略调整的时间窗口。看起来每轮只验证几十条,比一次性验证几百条慢,但长期算下来,命中率和收敛速度都要好很多。
6. 过来人的避坑清单
这个领域水很深,有些坑不亲自踩一遍,光看论文根本发现不了。我集中写几个最典型的。
6.1 坑:结构预测分数高,不代表有催化活性
这是目前误解最深的一件事。结构预测分数衡量的是折叠置信度,和催化活性没有直接关系。一个模型生成出来的序列,完全可以预测出一个高度可信、能量合理的结构,但这个结构只是静态构象。催化活性还取决于底物结合后的诱导契合、过渡态稳定化、构象变化自由度,这些全都不是静态结构打分能反映的。
我在项目里吃过一次亏,候选序列的结构置信度全线拉满,当时觉得稳到不行,结果湿实验活性全灭。后来加了一道底物对接和粗粒度动力学筛选,把明显不合理的口袋构象过滤掉之后,命中率才慢慢回升。现在我的原则是:结构分数高只是必要条件,不是充分条件。
6.2 坑:天然序列数据库带来的统计偏置
用天然蛋白序列训练出来的生成模型,会学到很强的"系统发育偏置"。说白了,某个位置在天然蛋白里强烈偏好某一种氨基酸,可能只是自然进化没有探索到其他更好选项,而不代表那个氨基酸在功能上必须如此。
被这种偏置带偏的生成模型,表面上看产物多样性很高,深层统计里和天然蛋白其实非常接近。这时候你再去做新功能空间的探索,会发现怎么采样都跳不出原有序列族的舒适区。
破解办法是显式控制"创新比例":让一部分候选刻意偏离天然序列偏好分布。我们内部习惯把生成池里20%到30%的配额留给高偏离候选,这些序列往往看起来有点怪,但经常是惊喜的源头。
6.3 坑:训练集污染会让判别器变成复读机
如果判别器训练数据里混入了目标酶本身的序列,它会直接给出满分——因为它只是背出了标准答案,而不是学到了规则。这个问题在微调阶段特别隐蔽。
我在项目里为此单独设了一个"污染检查"流程:把野生型序列、已知高活性突变体全部从训练集里拿出来,放进独立的评估集。每次模型更新之后,先跑一遍评估集,看看模型对这些关键序列的输出是什么。如果模型只是机械地复现高分,说明它根本没有学到设计规律,只是记住了答案。这时候需要赶紧修正训练集划分和采样策略。
6.4 坑:把"生成"当"设计",把"设计"当"完工"
最后是认知层面的坑。生成模型输出的是起点,不是终点。一条被模型高分选出的序列,还要经过序列设计校验、拼接、表达优化、动力学表征,每一步都可能在最后关头枪毙掉它。
我自己目前的心态是:模型生成一千条序列,最后真正能进实验室测试的只有几十条;进入湿实验之后,能稳定获得目标性能提升的,可能就只有一两条。这很正常,不值得气馁。反过来,要珍惜那些在湿实验里特别争气的候选,把它们的数据反馈给模型,下一轮生成质量会有一个肉眼可见的提升。
我个人的体会是,酶与蛋白质设计专用模型这个方向,最大的门槛从来不是模型结构有多新颖,而是能不能把生成、过滤、验证、反馈这条链路真正闭环。模型再强,也只解决了"提出更好的假设"这一环,实验依然是终极裁决者。做这个方向,需要同时具备分子生物学直觉和生成式模型的工程思维,缺一边都会卡住。如果你正准备切入这个领域,先把一个具体的小型酶改造项目从模型生成到湿实验验证完整跑通一遍,比堆砌再多的算法概念都有用。