AbLang 完整教學

Repository: https://github.com/oxpig/AbLang Stars: 165 | Forks: 31 | License: BSD 3-Clause Tags: antibody, language-model, semantic, protein-sequences Language: Python | Version: 0.2.4 Paper: AbLang: An antibody language model for completing antibody sequences (Olsen et al., 2022)

2. 核心架構

2.1 模型整體架構


graph TD
    subgraph Input["輸入層 Input Layer"]
        SEQ["抗體序列
Antibody Sequence
e.g. EVQLVESGPG..."] TOK["ABtokenizer
20 AA + 特殊 token
(<start> <end> <pad> <mask>)"] end subgraph AbRep["AbRep 表徵模型"] EMB["AbEmbeddings
AA Embedding + Position Embedding
→ LayerNorm → Dropout"] ENC["EncoderBlocks
N 層 Transformer Encoder
(MultiHeadAttention + IntermediateLayer)"] HST["Last Hidden States
768-dim per residue"] end subgraph AbHead["AbHead 預測頭"] DENSE["Dense Layer (768 → 768)"] ACT["Activation (GELU)"] LN["LayerNorm"] DEC["Decoder (768 → vocab_size)"] LOGIT["Token Logits
每個位置的 AA 機率分布"] end subgraph Outputs["四種輸出模式"] SEQC["seqcoding
Mean pooling → 768-dim/seq"] RESC["rescoding
768-dim/residue"] REST["restore
MLM 預測填回 mask"] LIKE["likelihood
20 AA 機率矩陣"] end SEQ --> TOK --> EMB --> ENC --> HST HST --> SEQC HST --> RESC HST --> AbHead DENSE --> ACT --> LN --> DEC --> LOGIT LOGIT --> REST LOGIT --> LIKE style Input fill:#e8f4f8,stroke:#2c3e50 style AbRep fill:#fdf2e9,stroke:#e67e22 style AbHead fill:#f5eef8,stroke:#8e44ad style Outputs fill:#eafaf1,stroke:#27ae60

2.2 原始碼模組結構

 1ablang/
 2├── __init__.py          # 匯出 ABtokenizer, AbLang, AbRep, AbHead, pretrained
 3├── tokenizers.py        # ABtokenizer — AA 字元 ↔ token ID 雙向轉換
 4├── embedding.py         # AbEmbeddings — AA 嵌入 + 位置嵌入 + LayerNorm + Dropout
 5├── encoderblocks.py     # EncoderBlocks → EncoderBlock → MHA + IntermediateLayer
 6├── fairseq_mha.py       # MultiheadAttention(改自 fairseq,支援逐 head 權重輸出)
 7├── extra_fns.py         # 啟動函數對照表 ACT2FN(GELU 等)
 8├── model.py             # AbLang = AbRep + AbHead;AbRep = Embeddings + Encoder
 9├── pretrained.py        # pretrained class — 模型下載、推論介面、四種模式
10└── model-weights-*/     # 自動下載的預訓練權重(heavy / light 各一組)

2.3 Transformer Encoder 內部結構

每個 EncoderBlock 包含:

  1. MultiHeadAttention (MHA; 多頭注意力) — 使用改造過的 fairseq MHA,支援逐 head 注意力權重輸出
  2. Residual Connection (殘差連接) + Dropout + LayerNorm
  3. IntermediateLayer (中間層) — Expand (768 → intermediate_size) → GELU → Dense (intermediate_size → 768) → Dropout → LayerNorm + Residual

2.4 序列修復的 Align 機制

當啟用 align=True 時,AbLang 使用 ANARCI 進行 IMGT 編號對齊,為每條序列產生 11 個不同偏移量 (spread=11) 的候選序列,然後選擇預測信心最高的版本作為修復結果。這解決了末端缺失長度未知的問題。


3. 安裝與設定

3.1 基本安裝

1# 建議使用 uv 建立獨立虛擬環境
2uv venv ablang-env --python 3.10
3source ablang-env/bin/activate
4
5# 從 PyPI 安裝
6uv pip install ablang
7
8# 或從 GitHub 安裝最新版
9uv pip install git+https://github.com/oxpig/AbLang.git

3.2 相依套件

1requests        # 模型權重下載
2torch>=1.6      # PyTorch 後端
3numpy           # 數值計算
4pandas          # 資料處理(rescoding align 模式使用)
5numba           # JIT 加速(spread sequence 生成)

3.3 可選相依:ANARCI

若需使用 align=True 功能(修復末端未知長度的缺失),需額外安裝 ANARCI:

1# 透過 bioconda 安裝
2conda install -c bioconda anarci
3
4# 或從 GitHub 安裝
5uv pip install git+https://github.com/oxpig/ANARCI.git

3.4 模型權重自動下載

首次執行時,AbLang 會自動從 Oxford 伺服器下載對應鏈型的權重檔案:

  • Heavy chain: https://opig.stats.ox.ac.uk/data/downloads/ablang-heavy.tar.gz
  • Light chain: https://opig.stats.ox.ac.uk/data/downloads/ablang-light.tar.gz

權重儲存於 ablang/model-weights-heavy/ablang/model-weights-light/,包含:

  • amodel.pt — 模型權重
  • hparams.json — 超參數設定
  • vocab.json — 字彙表

3.5 GPU 支援

1import ablang
2
3# 使用 GPU(需安裝 CUDA 版 PyTorch)
4heavy_ablang = ablang.pretrained("heavy", device='cuda')
5heavy_ablang.freeze()

4. 使用方式與程式碼範例

4.1 範例一:抗體序列修復 (Sequence Restoration)

這是 AbLang 最核心的應用場景 — 修復因定序錯誤或技術限制而缺失的殘基。

 1import ablang
 2
 3# ---- 初始化重鏈模型 ----
 4heavy_ablang = ablang.pretrained("heavy")
 5heavy_ablang.freeze()  # 切換為推論模式 (eval mode)
 6
 7# ---- 範例序列 ----
 8# * 代表遮蔽位置 (masked position),即缺失/未知的殘基
 9seqs = [
10    # 完整序列(作為對照)
11    'EVQLVESGPGLVQPGKSLRLSCVASGFTFSGYGMHWVRQAPGKGLEWIALIIYDESNKYYADSVKGRFTISRDNSKNTLYLQMSSLRAEDTAVFYCAKVKFYDPTAPNDYWGQGTLVTVSS',
12    # 有零星缺失 + 末端大段缺失的序列
13    '*************PGKSLRLSCVASGFTFSGYGMHWVRQAPGKGLEWIALIIYDESNK*YADSVKGRFTISRDNSKNTLYLQMSSLRAEDTAVFYCAKVKFYDPTAPNDYWGQGTL*****',
14]
15
16# ---- 基本修復(已知缺失位置)----
17restored = heavy_ablang(seqs, mode='restore')
18print("基本修復結果:")
19for i, seq in enumerate(restored):
20    print(f"  序列 {i+1}: {seq[:30]}...")
21
22# ---- 對齊修復(末端缺失長度未知)----
23seqs_unknown_end = [
24    'EVQLVESGPGLVQPGKSLRLSCVASGFTFSGYGMHWVRQAPGKGLEWIALIIYDESNKYYADSVKGRFTISRDNSKNTLYLQMSSLRAEDTAVFYCAKVKFYDPTAPNDYWGQGTLVTVSS',
25    # 前後截斷、缺失長度不明
26    'PGKSLRLSCVASGFTFSGYGMHWVRQAPGKGLEWIALIIYDESNK*YADSVKGRFTISRDNSKNTLYLQMSSLRAEDTAVFYCAKVKFYDPTAPNDYWGQGTL',
27]
28
29restored_aligned = heavy_ablang(seqs_unknown_end, mode='restore', align=True)
30print("\n對齊修復結果(自動推斷缺失長度):")
31for i, seq in enumerate(restored_aligned):
32    print(f"  序列 {i+1}: {seq[:30]}...")

輸出範例:

1基本修復結果:
2  序列 1: EVQLVESGPGLVQPGKSLRLSCVASGFTFS...
3  序列 2: QVQLVESGGGVVQPGKSLRLSCVASGFTFS...
4
5對齊修復結果(自動推斷缺失長度):
6  序列 1: EVQLVESGPGLVQPGKSLRLSCVASGFTFS...
7  序列 2: QVQLVESGGGVVQPGKSLRLSCVASGFTFS...

4.2 範例二:序列表示提取與下游預測

利用 AbLang 產生的序列嵌入作為 feature (特徵) 進行下游機器學習任務。

 1import ablang
 2import numpy as np
 3from sklearn.ensemble import RandomForestClassifier
 4from sklearn.model_selection import cross_val_score
 5
 6# ---- 初始化 ----
 7heavy_ablang = ablang.pretrained("heavy")
 8heavy_ablang.freeze()
 9
10# ---- 抗體序列資料(實際應用中從資料庫讀取)----
11antibody_sequences = [
12    'EVQLVESGPGLVQPGKSLRLSCVASGFTFSGYGMHWVRQAPGKGLEWIALIIYDESNKYYADSVKGRFTISRDNSKNTLYLQMSSLRAEDTAVFYCAKVKFYDPTAPNDYWGQGTLVTVSS',
13    'QVQLVQSGAEVKKPGSSVKVSCKASGGTFSSYAISWVRQAPGQGLEWMGGIIPIFGTANYAQKFQGRVTITADESTSTAYMELSSLRSEDTAVYYCARRGYSGSFYYYAMDVWGQGTTVTVSS',
14    'EVQLLESGGGLVQPGGSLRLSCAASGFTFSSYAMSWVRQAPGKGLEWVSAISGSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAKYYDILTGYYPFDYWGQGTLVTVSS',
15    # ... 更多序列
16]
17# 假設的結合活性標籤(0=不結合, 1=結合)
18labels = [1, 0, 1]  # 範例標籤
19
20# ---- 方法 A: 序列層級編碼 → 直接用於分類 ----
21seq_embeddings = heavy_ablang(antibody_sequences, mode='seqcoding')
22print(f"序列編碼維度: {seq_embeddings.shape}")
23# → (3, 768)  —— 每條序列一個固定長度的向量
24
25# 使用 sklearn 進行分類(範例)
26# clf = RandomForestClassifier(n_estimators=100, random_state=42)
27# scores = cross_val_score(clf, seq_embeddings, labels, cv=3)
28
29# ---- 方法 B: 殘基層級編碼 → 用於位置特異性預測 ----
30res_embeddings = heavy_ablang(antibody_sequences, mode='rescoding')
31print(f"殘基編碼:每條序列為 list,第一條維度 = {res_embeddings[0].shape}")
32# → (seq_len, 768)  —— 每個殘基一個向量
33
34# ---- 方法 C: 似然度矩陣 → 突變掃描 ----
35likelihoods = heavy_ablang(antibody_sequences, mode='likelihood')
36print(f"似然度矩陣維度: {likelihoods.shape}")
37# → (3, max_len+2, 20)  —— 每個位置 20 種 AA 的機率
38
39# 找出特定位置最可能的突變
40position = 50  # 查看第 50 個殘基
41aa_order = 'ARNDCQEGHILKMFPSTWYV'  # AbLang 字彙順序
42top3_idx = np.argsort(likelihoods[0, position+1, :])[::-1][:3]  # +1 for start token
43print(f"\n位置 {position} 最可能的 3 個殘基:")
44for idx in top3_idx:
45    print(f"  {aa_order[idx]}: {likelihoods[0, position+1, idx]:.4f}")

4.3 範例三:批次處理與 BCR Repertoire 分析

在生物製藥 (Biologics; 生物製劑) 開發中,處理大規模 BCR repertoire 資料的實務範例。

 1import ablang
 2import numpy as np
 3import pandas as pd
 4
 5# ---- 初始化(可指定 CPU 核心數加速 ANARCI)----
 6heavy_ablang = ablang.pretrained("heavy", ncpu=8)
 7heavy_ablang.freeze()
 8
 9# ---- 從 OAS 格式檔案讀取序列(模擬)----
10# 實際場景:從 OAS bulk download 或內部 NGS pipeline 輸出讀取
11repertoire_df = pd.DataFrame({
12    'sequence_heavy': [
13        'EVQLVESGPGLVQPGKSLRLSCVASGFTFSGYGMHWVRQAPGKGLEWIALIIYDESNKYYADSVKGRFTISRDNSKNTLYLQMSSLRAEDTAVFYCAKVKFYDPTAPNDYWGQGTLVTVSS',
14        '*************PGKSLRLSCVASGFTFSGYGMHWVRQAPGKGLEWIALIIYDESNKYYADSVKGRFTISRDNSKNTLYLQMSSLRAEDTAVFYCAKVKFYDPTAPNDYWGQGTLVTVSS',
15        'PGKSLRLSCVASGFTFSGYGMHWVRQAPGKGLEWIALIIYDESNK*YADSVKGRFTISRDNSKNTLYLQMSSLRAEDTAVFYCAKVKFYDPTAPNDYWGQGTL',
16    ],
17    'has_missing': [False, True, True],
18    'v_gene': ['IGHV1-2', 'IGHV3-30', 'IGHV1-69'],
19})
20
21print(f"Repertoire 大小: {len(repertoire_df)} 條序列")
22print(f"缺失序列比例: {repertoire_df['has_missing'].mean():.1%}")
23
24# ---- Step 1: 修復所有缺失序列 ----
25seqs_to_restore = repertoire_df['sequence_heavy'].tolist()
26
27# splitSize 控制批次大小,避免 OOM
28restored_seqs = heavy_ablang(
29    seqs_to_restore,
30    mode='restore',
31    align=True,      # 處理末端未知長度缺失
32    splitSize=50      # 每批 50 條
33)
34
35repertoire_df['restored_heavy'] = restored_seqs
36print("\n修復完成!")
37print(repertoire_df[['v_gene', 'has_missing', 'restored_heavy']].head())
38
39# ---- Step 2: 產生序列嵌入用於聚類 ----
40embeddings = heavy_ablang(
41    repertoire_df['restored_heavy'].tolist(),
42    mode='seqcoding'
43)
44
45print(f"\n嵌入矩陣維度: {embeddings.shape}")
46# 後續可接 UMAP / t-SNE 降維 + HDBSCAN 聚類
47# 用於 clonotype clustering / 功能性分群
48
49# ---- Step 3: CDR3 區域突變景觀 (Mutational Landscape) ----
50# 利用 likelihood 模式做 in-silico 飽和突變掃描
51target_seq = repertoire_df['restored_heavy'].iloc[0]
52likelihoods = heavy_ablang([target_seq], mode='likelihood')
53
54# 計算每個位置的 entropy(熵值越高 = 可容忍更多突變)
55from scipy.stats import entropy
56
57position_entropy = []
58for pos in range(1, len(target_seq) + 1):  # skip start token
59    probs = likelihoods[0, pos, :]
60    probs_normalized = np.exp(probs) / np.exp(probs).sum()  # softmax
61    position_entropy.append(entropy(probs_normalized))
62
63print(f"\n位置 entropy 統計:")
64print(f"  平均: {np.mean(position_entropy):.3f}")
65print(f"  最低(最保守): {np.min(position_entropy):.3f} at position {np.argmin(position_entropy)+1}")
66print(f"  最高(最可變): {np.max(position_entropy):.3f} at position {np.argmax(position_entropy)+1}")

5. 在蛋白質設計/基因組模擬生態系中的定位

5.1 Bio-SDG Domain 5 生態系定位

在蛋白質設計與基因組模擬 (Protein Design & Genomics Simulation) 的 22 個專案中,AbLang 佔據一個獨特的生態位:

分類代表工具與 AbLang 的關係
通用蛋白質語言模型ESM, ProstT5AbLang 是抗體專用版,在抗體任務上優於通用模型
蛋白質生成擴散模型RFdiffusion, Chroma, EvoDiff這些生成結構/序列;AbLang 提供序列理解品質評估
抗體結構設計DiffAbDiffAb 設計 3D 結構;AbLang 在序列空間操作,兩者互補
蛋白質結構預測ColabFold, la-proteina結構預測需要完整序列輸入,AbLang 可先修復缺失序列
通用蛋白質生成ProGen2ProGen2 生成全新蛋白質;AbLang 專注於抗體序列的理解與修復

5.2 在抗體開發管線 (Antibody Development Pipeline) 中的位置

1NGS 定序 → 序列組裝 → [AbLang 修復缺失] → ANARCI 編號 → 功能篩選 →
2  ├── 親和力成熟 (Affinity Maturation): [AbLang likelihood] 引導突變設計
3  ├── 可開發性評估 (Developability): [AbLang seqcoding] 作為特徵輸入
4  ├── 結構建模: [AbLang 完整序列] → ColabFold/AlphaFold2
5  └── 抗體設計: [AbLang rescoding] + DiffAb 3D 設計

5.3 在 AIKT Pipeline 中的應用 (WP1-WP7)

工作包AbLang 的角色
WP1 靶點鑑定 (Target Identification)分析 BCR repertoire 資料,用 seqcoding 聚類找出疾病特異性抗體 clonotype
WP2 靶點驗證 (Target Validation)利用 likelihood 模式評估治療性抗體候選分子的序列合理性
WP5 先導物優化 (Lead Optimization)用 likelihood 進行 in-silico 飽和突變掃描,指導親和力成熟實驗
WP7 生物製劑開發 (Biologics Development)修復 NGS 定序缺失、嵌入向量作為 ML 特徵預測 CMC 屬性

5.4 Blue Ocean 機會

  1. 抗體-抗原結合預測:結合 AbLang 序列嵌入 + 抗原結構資訊 → 結合親和力預測模型
  2. 多特異性抗體設計:利用 likelihood 矩陣探索 bispecific (雙特異性) 抗體的序列空間
  3. 合成 BCR 資料生成:基於 AbLang 的 likelihood 分布,生成符合天然分布的合成抗體序列,用於訓練資料增強

6. 與其他工具的整合

6.1 與 DiffAb(抗體 3D 結構設計)整合

1AbLang 序列修復/生成候選 → ANARCI IMGT 編號 → DiffAb CDR 結構設計 → 結合 AbLang 嵌入評分

應用場景:先用 AbLang 修復 BCR repertoire 中的缺失序列,提供完整輸入給 DiffAb 進行結構優化。

6.2 與 ColabFold / AlphaFold2(結構預測)整合

1缺失序列 → AbLang restore → 完整序列 → ColabFold multimer → 抗體-抗原複合體結構

關鍵價值:ColabFold 需要完整序列才能產生可靠的結構預測,AbLang 的修復能力直接提升結構預測品質。

6.3 與 ESM / ProstT5(通用蛋白質語言模型)互補

面向AbLangESM-2 / ProstT5
訓練資料OAS 抗體序列 (~10 億條)UniRef 通用蛋白質
抗體修復優異可用但次優
抗原蛋白質分析不適用優異
推薦策略抗體部分用 AbLang抗原/linker 部分用 ESM

6.4 與 scGPT / scvi-tools(單細胞模型)整合

情境:從 scRNA-seq 取得 BCR 序列 → AbLang 修復 → 與 scGPT 細胞嵌入關聯分析

1scRNA-seq → cellranger → BCR 序列 (常有缺失) → AbLang restore →
2  ├── AbLang seqcoding → 與 scGPT cell embedding 整合 → 功能性 B 細胞分群
3  └── AbLang likelihood → 體細胞超突變 (SHM) 熱點分析

6.5 與 paper-search / paper-qa-lite(AIKT Layer 9-10)整合

在 research pipeline 中,可用 paper: AbLang antibody restoration 搜尋最新應用文獻,再用 pq: 對搜到的論文集合做 RAG 問答,快速掌握 AbLang 在特定適應症的應用案例。


7. 優缺點分析

7.1 優點

面向說明
專用性強專為抗體訓練,在抗體任務上顯著優於通用語言模型 (ESM-1b)
速度快比 ESM-1b 快 7 倍,適合大規模 repertoire 分析
不需 germline不依賴事先知道 V/D/J germline,降低前處理需求
API 簡潔一行 heavy_ablang(seqs, mode='restore') 即可完成修復
輕量部署模型權重自動下載,CPU 即可運行
多用途輸出四種模式覆蓋從修復到設計的完整需求
BSD-3 授權商業友善,適合藥廠內部整合

7.2 缺點

面向說明建議
僅限序列不考慮 3D 結構資訊搭配 DiffAb / ColabFold
單鏈模型Heavy 與 Light 分開處理,無法建模 VH-VL 配對考慮 AbLang2 或 IgBERT
訓練資料偏差OAS 以人類/小鼠為主非常規物種需謹慎使用
無 fine-tune 介面未提供官方的微調 API需自行擴展 unfreeze() + 自訂訓練迴圈
固定長度限制Heavy 128 / Light 127 位置上限超長 CDR3 可能被截斷
相依性需要 numba (JIT),安裝有時會有環境衝突建議使用隔離虛擬環境
align 需 ANARCIANARCI 安裝稍複雜,依賴 HMMER用 bioconda 安裝較穩定

7.3 與競品比較

特性AbLangAbLang2IgBERTESM-2AntiBERTy
抗體專用
VH-VL 配對
結構感知
序列修復優異優異可用次優可用
訓練資料量OAS ~10 億OAS 更新版OAS 子集UniRef50OAS 子集
推論速度

7.4 建議使用場景

  • 強烈推薦:BCR repertoire 定序資料修復、抗體序列編碼作為 ML 特徵
  • 適合使用:in-silico 突變掃描、抗體序列聚類分析
  • 搭配使用:與 DiffAb(結構)、ColabFold(結構預測)、scGPT(單細胞)組合
  • 不建議使用:非抗體蛋白質分析、需要結構資訊的任務、需要 VH-VL 配對建模的場景

參考資源