この記事のゴール
LLM 型のアノテーションがどういうもので、いつ役立ち、何に注意すべきかを理解すること。Python で実際に動かせる形(OpenAI API)も示します。
LLM 型とは
各クラスタの上位マーカー遺伝子のリストを、GPT-4 などの大規模言語モデル(LLM)に渡し、「このマーカーならどの細胞型か」を文章で推定させる方法です。LLM が学習で得た膨大な生物学知識を使うため、参照データもマーカーDBも不要です。クラスタ単位で、しかも理由を添えて答えさせることもできます。
位置づけは、これまでの4系統とは別枠の「知識ベースの推論」です。手早く初稿を作るのに向きます。
GPTCelltype
GPTCelltype(Hou & Ji, 2024)は、GPT-4 を使ったアノテーションを手軽にする R パッケージです。クラスタのマーカー遺伝子や上位 DE 遺伝子を入力すると、次のようなプロンプトを自動生成して OpenAI API に問い合わせ、結果を細胞型に変換します(要約)。
「{組織名} の細胞型を、各行のマーカーから個別に推定してください。細胞型名のみを示し、番号は付けないでください。複数型の混合もあり得ます。{マーカーのリスト}」
論文の評価では、GPT-4 は手動アノテーションと強く一致し、数百の組織・細胞型で良好でした。GPT-3.5 は SingleR・scType・CellMarker2.0 と同程度で、GPT-4 がそれらを上回ったと報告されています。DE 遺伝子をそのまま使えるため高速で、参照不要・低コストが利点です。
Python で同じことをする
GPTCelltype 自体は R ですが、やっていることは「マーカーを整形して LLM に問い合わせ、結果をパースする」だけなので、Python でも同じことができます。OpenAI の Python ライブラリを使います。
pythonimport os
import scanpy as sc
from openai import OpenAI
# 1) クラスタごとの上位マーカーを取得(Wilcoxon)
sc.tl.rank_genes_groups(adata, groupby="leiden", method="wilcoxon")
top_markers = {
cl: list(adata.uns["rank_genes_groups"]["names"][cl][:10])
for cl in adata.obs["leiden"].cat.categories
}
# 2) プロンプトを組み立てる(GPTCelltype と同じ方針)
tissue = "マウス胎仔脳(E14、皮質・基底核原基)"
gene_lines = "\n".join(f"{cl}: {', '.join(genes)}"
for cl, genes in top_markers.items())
prompt = (
f"組織:{tissue}\n"
"次のマーカーから、各行(クラスタ)の細胞型を1つ推定してください。\n"
"細胞型名のみを1行ずつ返し、行番号や説明は不要です。複数型の混合もあり得ます。\n\n"
f"{gene_lines}"
)
# 3) OpenAI API に問い合わせ(API キーは環境変数 OPENAI_API_KEY に設定しておく)
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
resp = client.chat.completions.create(
model="gpt-4o", # GPT-4 系のモデル
messages=[{"role": "user", "content": prompt}],
temperature=0, # 再現性のため 0 にする
)
answer = resp.choices[0].message.content
print(answer)
# 4) 回答(1行=1クラスタ)をパースして adata に書き戻す
labels = [ln.strip() for ln in answer.strip().split("\n") if ln.strip()]
assert len(labels) == len(top_markers), "回答の行数がクラスタ数と一致しません(要確認)"
mapping = dict(zip(top_markers.keys(), labels))
adata.obs["llm"] = adata.obs["leiden"].map(mapping).astype("category")
sc.pl.umap(adata, color="llm", legend_loc="on data", frameon=False)
🔧 環境メモ:API キーはコードに直接書かず、環境変数(OPENAI_API_KEY)に入れて読み込みます。temperature=0 で出力のばらつきを抑えます。回答の行数がクラスタ数と一致するかを必ず確認し、ずれたらプロンプトを調整します。OpenAI 以外(Claude など)でも、同様に「整形→問い合わせ→パース」で実装できます。
プロンプトの工夫
- 組織・発生段階を明記:「マウス胎仔脳 E14」のように具体的に書くほど精度が上がります。
- 粒度を指定:「大分類で」「サブタイプまで細かく」など、欲しい解像度を指示できます。
- 再現性:
temperature=0。それでもモデル更新で結果が変わり得ます(後述)。
落とし穴(使う前に)
⚠️ LLM 特有の注意
– ハルシネーション:もっともらしいが誤った細胞型を返すことがあります。正しさは保証されません。
– 再現性:出力が実行ごと・モデルのバージョンごとに変わり得ます(temperature=0 でも完全には固定されない)。論文では使用したモデルとバージョンを明記します。
– データの外部送信(プライバシー):マーカー遺伝子のリストが外部 API に送られます。未公開データや機微なデータでは、送信して良いか確認します。
– マーカー品質に依存:QC やクラスタリングが甘く DE が乱れていると、そのまま誤った注釈になります。
– 確信度が出ない:分類器のような確率が得られず、確からしさを測りにくい。
– コストと API 依存:API キー・課金・レート制限が必要。
LLM 型の主なツール
| ツール | 言語 | 方式 | ひとこと |
|---|---|---|---|
| GPTCelltype | R(+OpenAI API) | マーカー→GPT-4 で注釈 | 代表的・高速・参照不要(本記事) |
| 自前実装(OpenAI / Claude) | Python | 同上を自分で実装 | プロンプトを自由に設計(上のコード) |
| CASSIA | Python | 複数エージェントで合議 | 推論過程や根拠を出す新しめの方式 |
迷わないための地図:自動アノテーションの系統(完)
「自動アノテーション」のツールは多数ありますが、すべて次の5系統のどれかでした。本記事は⑤LLM型で、これで全系統が揃いました(全体像は アノテーション手法の全体像)。
| 系統 | 代表ツール | 参照/DB | 詳細 |
|---|---|---|---|
| ① マーカーDB | scType, decoupler, SCSA | マーカーDB | マーカーDBによる自動アノテーション |
| ② 参照相関 | SingleR, scmap, CHETAH | 注釈済み参照 | 参照相関による自動アノテーション |
| ③ 教師あり/マッピング | CellTypist, Azimuth, scANVI | 参照/事前学習 | 学習済みモデルによる自動アノテーション |
| ④ 深層学習/基盤モデル | scGPT, Geneformer | 事前学習 | 基盤モデルによる自動アノテーション |
| ⑤ LLM | GPTCelltype, CASSIA | 不要 | 本記事 |
付いたラベルは UMAP で検証する
LLM の出力は特に鵜呑みにできません。代表的なマーカーの発現を UMAP に投影して、本当にそのクラスタに特異的かを目で確かめます。ドットプロットは平均値に要約されるため、UMAP に重ねて細胞ごとの発現を見るのが確実です。
python# 代表マーカーの発現を UMAP に投影して、付いたラベルを検証する
sc.pl.umap(
adata,
color=["Pax6", "Eomes", "Neurod6", "Gad2", "Cx3cr1", "Cldn5"],
ncols=3, cmap="viridis", frameon=False,
)
UMAP に重ねると、次の点が確認できます。
- 他のクラスタにも発現がないか:そのマーカーが目的以外のクラスタでも光っていないか。
- クラスタ内での広がり:そのクラスタの全細胞で出ているのか、一部だけか、発現が低いだけか。
- 複数クラスタにまたがらないか:生物学的に複数の細胞型で発現するマーカーもあります(組み合わせで判断)。
⚠️ 本来発現しないはずのクラスタに発現がある → データ品質を疑う
あるマーカーが、組織学的に発現するはずのないクラスタに出ている場合、QC の不備やダブレット(2細胞が1液滴に入ったもの)の混入を疑います。たとえばニューロンのマーカーと血管内皮のマーカーが同じ細胞群で同時に光るなら、ダブレットの可能性があります。このときは QC の閾値やダブレット除去を見直す(→ QC・ダブレットの検出の記事)のが安全です。
どれを使えばよいか
- 参照もモデルも無い/珍しい組織/素早く初稿がほしい → LLM 型(GPTCelltype・自前実装)。
- よく特徴づけられた系・再現性が大事 → CellTypist や SingleR(マウス発生期なら
Developing_Mouse_Brain)。参照に根拠があり、結果が安定。 - いずれの場合も、結果は手動アノテーションで検証します(上節)。
落とし穴(全系統共通)
⚠️ 自動アノテーションは「下書き」。必ず手動で検証
– LLM は特にハルシネーションに注意。確信度も出ません。
– データを外部 API に送る点(プライバシー)にも配慮します。
– 付いたラベルは、UMAP へのマーカー投影(上節)で確認してから採用します。
まとめ(アノテーション編の総括)
- LLM 型は、クラスタの上位マーカーを LLM に渡して細胞型を推定する。参照・DB 不要で高速だが、ハルシネーション・再現性・データ外部送信に注意。
- 代表は GPTCelltype(GPT-4 で手動と高一致)。Python でも「整形→問い合わせ→パース」で容易に実装できる(上のコード)。
- 自動アノテーションは全5系統(①マーカーDB/②参照相関/③教師あり・マッピング/④基盤モデル/⑤LLM)。共通原則は同じ:自動は下書き、最後は UMAP へのマーカー投影で検証し、想定外の発現があれば QC・ダブレットを再点検する。
これで「scRNA-seq解析 実践シリーズ:アノテーション編」は完結です。基準となる手動アノテーションと、自動の5系統を、用途に応じて組み合わせてください。
関連記事
- 📖 細胞型アノテーション手法の全体像 … 手動・自動の地図(編のハブ)
- 📖 手動アノテーション … 基準となる方法
- 📖 自動アノテーション5系統:①scType/②SingleR/③CellTypist・Azimuth/④scGPT・Geneformer(前の記事)
- 📖 品質管理(QC) / 📖 ダブレット検出(scrublet・SOLO)/ 📖 AnnDataのデータ構造
参考文献
- Hou, W., & Ji, Z. (2024). Assessing GPT-4 for cell type annotation in single-cell RNA-seq analysis. Nature Methods, 21, 1462–1465. doi:10.1038/s41592-024-02235-4
- Pasquini, G., Rojo Arias, J. E., Schäfer, P., & Busskamp, V. (2021). Automated methods for cell type annotation on scRNA-seq data. Computational and Structural Biotechnology Journal, 19, 961–969. doi:10.1016/j.csbj.2021.01.015
- Domínguez Conde, C., Xu, C., Jarvis, L. B., et al. (2022). Cross-tissue immune cell analysis reveals tissue-specific features in humans. Science, 376, eabl5197. doi:10.1126/science.abl5197
- Heumos, L., Schaar, A. C., Lance, C., et al. (2023). Best practices for single-cell analysis across modalities. Nature Reviews Genetics, 24, 550–572. doi:10.1038/s41576-023-00586-w


コメント