BLAST 概述:基本原理、历史与主要应用场景
说起 BLAST,我得先讲个故事。2003 年我刚入行做基因组注释,导师丢给我一个未知基因的 cDNA 序列,说:“去数据库里找找它像谁。”那时候我还不懂什么叫局部比对,只知道把整条序列往数据库里一扔,等着结果。结果跑了一个晚上,啥也没出来。
后来老工程师告诉我:“你那是全局比对,数据库几百 G,不卡死才怪。用 BLAST,它只找局部相似片段,快得多。”从那以后,我再也没离开过 BLAST。今天我们就聊聊这个工具——它的来龙去脉,还有它到底能干什么。
BLAST 是什么?
BLAST 的全称是 Basic Local Alignment Search Tool,中文叫“基本局部比对搜索工具”。说白了,它就是一个能在巨大的序列数据库里快速找到与查询序列相似的片段的程序。注意“局部”两个字——它不要求整条序列从头比到尾,只找那些局部相似的区域。这比全局比对快了好几个数量级。
你想想看,一条核酸序列可能有几千个碱基,数据库里有上亿条序列。如果每条都做全局比对,算到世界末日也算不完。BLAST 的做法是:先把查询序列切成小片段(种子),然后用这些小片段去数据库里“捞”匹配,找到候选后再往两边延伸、打分。后面我们会详细讲它的算法细节。
BLAST 的基本原理
BLAST 的核心流程可以概括为四个字:种子–延伸–评估。具体来说:
- 种子生成:把查询序列切成固定长度的短片段(通常是 2-4 个氨基酸,或 11-12 个碱基)。这些片段叫“种子”。
- 数据库检索:用这些种子在数据库的索引里快速找出所有匹配的位置。
- 延伸比对:对每一个匹配的位置,向两边延伸,计算出比对分数。
- 显著性评估:对每条候选比对计算 E-value(期望值),判断这个匹配是真实的还是随机产生的。
关键区别:BLAST 不是暴力搜索,它利用“种子命中”策略大幅减少计算量。数据库越大,这个策略的优势越明显。
下面这张图展示了我刚才说的核心流程。你可能觉得节点有点多,但跟着箭头走一遍就清楚了。
我曾经在调试一个宏基因组组装项目时,就因为默认的 E-value 阈值太高(1e-5),把一堆低质量的污染序列也当成了同源基因,结果功能注释全乱了。后来把阈值降到 1e-10,问题立刻解决。所以你看,E-value 的设置在 BLAST 里有多关键。
BLAST 的历史
BLAST 最早发表于 1990 年(Altschul 等人),距今已经 30 多年了。它比当时的另一个流行工具 FASTA 快很多,核心创新就是前面说的“种子索引”方法。1997 年推出了改进版(PSI-BLAST 和位置特异性打分矩阵),2009 年又推出了 C++ 重写的 BLAST+ 套件。
我个人习惯直接用 BLAST+,因为它更快、内存占用更低,而且命令行参数更统一。嗯,这里要注意:NCBI 在 2013 年已经停止维护旧版的 C 语言 BLAST,现在都用 blast+。如果你电脑里还装着 legacy BLAST,赶紧换成新版的吧。
主要应用场景
BLAST 的应用场景太广了,几乎每个做序列分析的实验室都用它。我把最常见的场景列出来:
| 应用场景 | 说明 | 常用程序 |
|---|---|---|
| 序列同源性搜索 | 给定一个未知序列,看它跟已知数据库中的哪些序列相似 | blastn(核酸对核酸)、blastp(蛋白对蛋白) |
| 基因预测 | 通过同源比对推断新基因的结构或功能 | blastx(核酸翻译成蛋白后比对蛋白库) |
| 功能注释 | 对测序得到的 ORF 进行功能分类 | blastp、blastx |
| 引物设计与验证 | 检查引物是否会非特异性结合 | blastn(短序列比对) |
| 宏基因组物种鉴定 | 用 16S/18S 或全基因组序列比对到参考数据库 | blastn、megablast |
| 同源建模模板选择 | 寻找已知结构的同源蛋白 | blastp(对 PDB 序列库) |
下面是一个最常用的 blastn 命令行示例——把一条 FASTA 格式的核酸序列跟 nt 数据库比对:
blastn -db nt -query my_sequence.fasta -out result.txt \
-outfmt "6 qseqid sseqid pident length mismatch gapopen evalue bitscore" \
-evalue 1e-10 -num_threads 4
这里 -evalue 1e-10 就是阈值设置。很多新手直接不写这个参数,用默认的 10,结果会得到一大把低质量 hits。我在培训时经常看到有人问:“为什么我 BLAST 出了 500 条结果,但大部分看起来都不像?”多半是 E-value 阈值设太大了。
避坑技巧:我建议做同源搜索时,先把 E-value 设到 1e-5 或 1e-10,看一下结果是否合理。如果明显过严(一条结果都没有),再慢慢放宽到 1e-3。别上来就用默认值 10,除非你存心要海量结果。
注意:BLAST 的数据库必须预先建好索引(用 makeblastdb 命令)。如果你直接拿一个 FASTA 文件当数据库,BLAST 会报错。我曾经遇到过有人把未建索引的基因组文件直接扔给 blastn,结果卡了两小时——索引这一步省不得。