BLAST 简介:算法原理、主要类型与适用场景

做生物信息学这一行,BLAST 算是吃饭的家伙事儿了。我最早接触它的时候还是学生,那时候跑个 blastn 比对,等结果的时候就去泡杯咖啡。现在回过头来看,理解 BLAST 的原理和不同变体,是做结果一致性校验的前提。说白了,你连工具怎么工作的都不知道,怎么判断它给出的结果靠不靠谱?

这一章我们就从原理和类型入手,把 BLAST 这玩意儿的底裤扒清楚。

BLAST 算法的核心思想

BLAST 的全称是 Basic Local Alignment Search Tool。它要解决的核心问题很简单:给定一条查询序列,在庞大的数据库里找到与之相似的序列片段。但你想想看,如果每条序列都去做全局比对,计算量太大了。所以 BLAST 采用了一种启发式算法,用“近似匹配”来换速度。

它的核心流程可以分为三步:

  1. 种子生成:把查询序列拆成短片段,比如长度为 3 的氨基酸片段或者长度为 11 的核酸片段。这些短片段称为“种子”或“单词”。
  2. 种子命中:在数据库里快速查找哪些序列包含与这些种子高度相似的短片段。这一步用到了哈希表或者索引,速度非常快。
  3. 延伸与比对:找到种子命中后,从命中位置向两端延伸,用动态规划或者带空位的延伸算法,生成最终的局部比对结果。

这个策略带来了巨大的速度优势。我记得有一次我需要比对 10,000 条序列到一个大型基因组数据库。如果用全局比对工具,估计要跑一周。但用 BLAST,一天就跑完了。代价是什么呢?BLAST 可能会漏掉一些相似度很低的远缘序列,因为它依赖种子来启动比对。

关键点:BLAST 是启发式算法,它不保证找到所有最优比对。它是在牺牲一点灵敏度的情况下,换取了极高的速度和可扩展性。在一致性校验场景中,我们更关注的是同一工具在相同参数下的结果是否可复现,而不是它的灵敏性有多高。

五类核心 BLAST 程序

我知道很多初学者会混淆这几种 BLAST 的用途。其实记起来不难,核心就是看你输入什么序列,以及你想去数据库里找什么序列。我总结了下面这张表,你一看就明白:

程序名 查询序列类型 数据库类型 典型场景
blastn 核酸(DNA/RNA) 核酸 基因鉴定、引物设计验证、序列比对
blastp 蛋白质 蛋白质 蛋白功能注释、同源蛋白搜索
blastx 核酸(翻译为蛋白质) 蛋白质 预测新基因、寻找跨物种同源蛋白
tblastn 蛋白质 核酸(翻译为蛋白质) 在基因组中找蛋白编码区域
tblastx 核酸(翻译为蛋白质) 核酸(翻译为蛋白质) 探索性比对、远缘物种核苷酸比对

个人小贴士:我最常用的组合是 blastx 和 tblastn。为什么?因为它们把核酸序列翻译成蛋白质后再比对,蛋白质序列的保守性远高于核苷酸。这在大数据量的一致性校验中特别有用,可以减少假阳性。

各程序的适用场景详解

现在我们来逐一拆解。

blastn 与 blastp:最基础的比对

这两个是教科书级别的典型例子。blastn 对 DNA,blastp 对蛋白。如果你做的物种是同一个物种或者近源物种,核苷酸比对就足够了。但如果你要跨物种比对同源基因,我一般建议用 blastp。

我遇到过这样一个案例:做小鼠和大鼠某个基因的直系同源关系分析。最开始我用 blastn 去比 cDNA 序列,结果相似度只有 85%,而且得分不高。换用 blastp 后,蛋白序列相似度一下子到了 95% 以上。这其实是因为核酸序列的差异体现在冗余的密码子上,但蛋白序列被“沉默”了。

blastx:从核酸到蛋白的桥梁

blastx 可能是我个人用得最频繁的一款。它把你输入的核酸序列按六种阅读框(正链 3 种,负链 3 种)翻译成蛋白,再去搜索蛋白数据库。这样做的好处是你可以直接拿 EST、RNA-seq 的转录本序列去比对已知蛋白库,快速判断这个转录本编码什么蛋白。

避坑指南:我曾经踩过一个坑——把一条很长的基因组序列直接扔进 blastx 里跑。结果耗时超长,而且很多无意义的短读码框产生了大量假阳性比对。后来我学聪明了,先做基因预测或者至少用 RepeatMasker 屏蔽重复序列,再跑 blastx。

tblastn:找蛋白的逆过程

tblastn 是用一个已知蛋白序列,去搜索基因组或转录组的核苷酸数据库(数据库会被实时翻译成蛋白)。这个工具在做基因组注释的时候特别有用。比如你有一个人的蛋白序列,想去看看小鼠的基因组里有没有可能的直系同源基因,tblastn 是最直接的办法。

tblastx:最慢但最灵活

tblastx 把查询序列和数据库序列都翻译成蛋白再比对。它的灵敏度最高,但速度最慢。我一般只在探索性分析中使用它,或者当以上四种方法都找不到任何结果的时候。

举个例子,你有一个新测序的细菌基因组,要去比对远缘的真核生物数据库。直接用 blastn 可能什么都找不到。但用 tblastx,通过蛋白层面的保守性,也许还能发现一些高度保守的基因片段。

如何在实际项目中选择 BLAST 类型

我给大家一个简单的操作流程,帮你在实际项目中快速决策:

  1. 你先看你的查询序列是核酸还是蛋白质。
  2. 再看你的目标数据库是核酸库还是蛋白库。
  3. 如果两者类型相同(核酸对核酸,或蛋白对蛋白),优先选 blastn 或 blastp。
  4. 如果查询是核酸,数据库是蛋白 → blastx。
  5. 如果查询是蛋白,数据库是核酸 → tblastn。
  6. 如果两者都是核酸但你要做远缘比对 → tblastx。

一张图看懂 BLAST 家族

下面是我手绘的一张结构图,帮你把这五类 BLAST 的查询-数据库逻辑理清楚。当你面对一个实际的比对需求时,闭上眼睛对照着这张图看一眼,就能马上确定该用哪个程序。

BLAST 五类程序逻辑图 查询序列类型 核酸(N) 蛋白质(P) 目标数据库类型 核酸(N) 蛋白质(P) 选择对应的 BLAST 程序 blastn N→N blastp P→P blastx N→P tblastn P→N tblastx N→N(都翻译) 💡 解读说明: 从左到右:先确定查询序列类型(核酸/蛋白),再确定数据库类型。 两条路径的交点,就是你应该选择的 BLAST 程序。 例如:查询是核酸,数据库是蛋白 → blastx。

从图中你可以看到,blastn 和 blastp 是“同类型”比对,blastx 和 tblastn 是“跨类型”比对,tblastx 是最复杂的双边翻译比对。这五类涵盖了几乎所有的序列比对需求。

BLAST 结果的初步理解

不管跑哪种 BLAST,输出结果一般都包含以下几个核心字段:

  • query:你的查询序列标识符。
  • subject:数据库中被比中的目标序列标识符。
  • identity:匹配的百分比。
  • alignment length:比对长度。
  • mismatches:错配数。
  • gap opens:空位开放数。
  • e-value:期望值,表示随机情况下出现这样的比对结果的概率。值越小越好。
  • bit score:比特分,分数越高说明比对越可靠。

举个例子,一个典型的 blastn 命令行运行结果长这样:

blastn -query my_gene.fasta -db nt -out my_gene_blast.txt -outfmt 6 -num_alignments 10

这条命令的意思是:用 my_gene.fasta 文件里的核酸序列,去搜索 NCBI 的 nt 核酸数据库,输出格式为制表符分隔的表格(-outfmt 6),只保留前 10 个最佳匹配结果。

我建议:在做一致性校验的时候,一定要把 -outfmt 6 配合 stdout 重定向到一个固定格式的文件里。这样比对两个 BLAST 版本或者参数组合的结果时,可以直接用 sort 和 diff 来比较,省去很多手动排查的麻烦。