scRNA-seq解析:大規模言語モデル(LLM)で細胞型を自動アノテーション(GPTCelltype)

scRNA-seq

📚 この記事について:「scRNA-seq解析 実践シリーズ」アノテーション編・最終回。クラスタの上位マーカーを大規模言語モデル(LLM)に渡して細胞型を推定する方法を、GPTCelltype と Python での実装で解説します。手法全体の地図は アノテーション手法の全体像 を参照。

🔙 前の記事基盤モデルによる自動アノテーション(scGPT/Geneformer) / 🏁 自動アノテーション編はこれで完結(基準となる手動による細胞型アノテーションもあわせて)

🧩 前提:クラスタリングと各クラスタの上位マーカー(rank_genes_groups)が出ていること/OpenAI などの API キー/Python の基本。


この記事のゴール

LLM 型のアノテーションがどういうもので、いつ役立ち、何に注意すべきかを理解すること。Python で実際に動かせる形(OpenAI API)も示します。


LLM 型とは

各クラスタの上位マーカー遺伝子のリストを、GPT-4 などの大規模言語モデル(LLM)に渡し、「このマーカーならどの細胞型か」を文章で推定させる方法です。LLM が学習で得た膨大な生物学知識を使うため、参照データもマーカーDBも不要です。クラスタ単位で、しかも理由を添えて答えさせることもできます。

位置づけは、これまでの4系統とは別枠の「知識ベースの推論」です。手早く初稿を作るのに向きます。

LLM 型の仕組み。クラスタごとの上位マーカー遺伝子を、組織名つきのプロンプトに整形して LLM に渡し、各クラスタの細胞型を文章で推定させる。参照もマーカーDBも要らない一方、もっともらしい誤り(ハルシネーション)に注意する。
LLM 型の仕組み。クラスタごとの上位マーカー遺伝子を、組織名つきのプロンプトに整形して LLM に渡し、各クラスタの細胞型を文章で推定させる。参照もマーカーDBも要らない一方、もっともらしい誤り(ハルシネーション)に注意する。

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・自前実装)。
  • よく特徴づけられた系・再現性が大事CellTypistSingleRマウス発生期なら Developing_Mouse_Brain)。参照に根拠があり、結果が安定。
  • いずれの場合も、結果は手動アノテーションで検証します(上節)。

落とし穴(全系統共通)

⚠️ 自動アノテーションは「下書き」。必ず手動で検証
– LLM は特にハルシネーションに注意。確信度も出ません。
データを外部 API に送る点(プライバシー)にも配慮します。
– 付いたラベルは、UMAP へのマーカー投影(上節)で確認してから採用します。


まとめ(アノテーション編の総括)

  • LLM 型は、クラスタの上位マーカーを LLM に渡して細胞型を推定する。参照・DB 不要で高速だが、ハルシネーション・再現性・データ外部送信に注意。
  • 代表は GPTCelltype(GPT-4 で手動と高一致)。Python でも「整形→問い合わせ→パース」で容易に実装できる(上のコード)。
  • 自動アノテーションは全5系統①マーカーDB②参照相関③教師あり・マッピング④基盤モデル/⑤LLM)。共通原則は同じ:自動は下書き、最後は UMAP へのマーカー投影で検証し、想定外の発現があれば QC・ダブレットを再点検する。

これで「scRNA-seq解析 実践シリーズ:アノテーション編」は完結です。基準となる手動アノテーションと、自動の5系統を、用途に応じて組み合わせてください。


関連記事


参考文献

  • 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

コメント

タイトルとURLをコピーしました