个人推荐指数:⭐️⭐️⭐️⭐️

CellWhisperer 简介

CellWhisperer 是一个多模态 AI 模型,它将转录组数据与自然语言相结合,使用户能够通过自然语言对话的方式探索单细胞 RNA 测序(scRNA-seq)数据。该工具发表于 Nature Biotechnology(2025年11月)。

CellWhisperer 的核心功能包括:

  • 自由文本搜索:例如”Show me tissue-resident T cells in the intestine”
  • 回答关于细胞的各种问题:例如”What are these selected cells?”、”Which genes are highly expressed in these cells?”
  • 基于转录组数据和 LLM 的生物学知识生成回答

CellWhisperer 由两个相互关联的 AI 模型组成:

CellWhisperer Embedding Model(嵌入模型):通过多模态对比学习,将 RNA 表达谱与其文本注释整合到一个联合嵌入空间中。训练数据包含超过 100 万个转录组及其自然语言描述,来源于 GEO 和 CELLxGENE Census 两个大型数据库。

CellWhisperer Chat Model(对话模型):基于 Mistral 7B 开源 LLM 进行微调,能够在考虑用户提供的转录组数据的同时回答自由文本问题。


方法原理

训练数据准备

CellWhisperer 的训练数据包含 1,082,413 对人类 RNA-seq 表达谱及其匹配的文本注释:

  • 从 GEO 数据库获取 705,430 个bulk RNA-seq 转录组数据,使用 ARCHS4 统一重处理的数据
  • 从 CELLxGENE Census 获取 376,983 个scRNA-seq 衍生的伪批量谱(pseudo-bulk)转录组
  • 使用 LLM 辅助策划,将上述转录组样本或细胞组附带的原始、分散的元数据(如细胞类型、组织、疾病、实验方法等)浓缩并转换为简洁、连贯且具有生物学信息量的自然语言描述(即文本注释)。
  • 例子:
    • 原始分散的元数据:“疾病:肾细胞癌”,“阶段:2”,“性别:男性”
    • 整合后的自然语言描述:“Renal cell carcinoma tissue sample taken from a male individual at stage 2, with no metastasis, preserved in formalin-fixed paraffin-embedded blocks”

嵌入模型架构

CellWhisperer 采用 CLIP(对比语言图像预训练)架构:

  • 转录组编码器:使用 Geneformer 模型处理基因表达数据
  • 文本编码器:使用 BioBERT 模型处理生物医学文本
  • 两个编码器的输出通过前馈神经网络映射到 2,048 维的多模态嵌入空间
  • 通过对比学习训练,使匹配的转录组-文本对在嵌入空间中靠近

对话模型

数据来源

  • 从用于嵌入模型训练的 1,082,413 对人类 RNA-seq 表达谱及其匹配的文本注释中,优先选取低覆盖区域的 106,610 个转录组-文本对。
  • 随后,对于这些文本对,使用 LLM 生成对话。结合以下三种信息作为输入语境:
    1. 50 个表达最高的基因(基于数据集上的归一化表达)。
    2. 50 个通过 GSVA(基因集变异分析)衍生的基因集。
    3. 转录组的文本注释(之前通过 AI 辅助策展生成)
  • 生成的 106,610 个对话分为四种类型:
    1. 会话型对话 (Conversational chats, 81,610 个): 使用 Mixtral 8x7b 通过少样本提示(few-shot prompt)生成,模拟研究人员和 AI 助手之间包含多个问题和答案的自然对话。
    2. 简单对话 (Simple chats, 10,000 个): 使用通用问题(例如“这个样本代表什么?”),并使用转录组的文本注释作为指定答案。
    3. 详细对话 (Detailed chats, 10,000 个): 使用 GPT-4 通过零样本提示(zero-shot prompting)生成,答案比简单的文本注释更广泛。
    4. 复杂对话 (Complex chats, 5,000 个): 使用 GPT-4 通过少样本提示和预行动推理(pre-action reasoning)来生成更深入的问答对。

模型训练

  • 第一阶段
    • 目的:让模型学会如何将 CellWhisperer 多模态嵌入(transcriptome embeddings)转换为 LLM(Mistral 7B)能够理解的 token 嵌入。
    • 保持 Mistral 7B LLM 冻结,只使用 “简单对话” (simple chats) 的扩展版本训练用于连接嵌入和 LLM 的两层转换模块(adapter layers)

      这个转换模块(adapter layers)将 2,048 维的 CellWhisperer 多模态嵌入转换为 8 个 4,096 维的嵌入,这 8 个嵌入对应于 Mistral 7B LLM 中的 8 个 token 嵌入

  • 第二阶段
    • 目的:利用复杂、真实感的对话数据,让整个 LLM 体系能够进行连贯的、具有生物学洞察力的聊天。
    • 解冻 Mistral LLM,并使用 106,610 个生成的训练对话对 LLM 和转换层进行微调。

性能评估

CellWhisperer 在多个基准测试中表现出色:

  • 在 Tabula Sapiens 数据集上,区分 20 种常见细胞类型的 AUROC 达到 0.94
  • 在 ImmGen 免疫细胞数据集上,AUROC 超过 0.99
  • 零样本预测性能优于基于标记基因的方法,与经过微调的单细胞基础模型相当

安装和使用

环境安装

1
2
3
4
5
6
7
8
9
10
11
12
13
# 克隆仓库(包含所有子模块)
git clone [email protected]:epigen/cellwhisperer.git --recurse-submodules
cd cellwhisperer

# 如果已经克隆但没有子模块,运行:
git submodule update --init --recursive

# 设置 conda 环境
./envs/setup.sh

# 验证安装
conda activate cellwhisperer
cellxgene --version

Docker 安装(可选)

1
2
3
4
5
6
7
8
# 构建 Docker 镜像
docker build -t cellwhisperer .

# 运行容器
docker run --gpus all -it --volume .:/opt/cellwhisperer cellwhisperer bash

# 在容器内激活环境
conda activate cellwhisperer

分析自己的数据

步骤 1:准备数据集

将数据集放置在 <PROJECT_ROOT>/resources/<dataset_name>/read_count_table.h5ad

数据要求:

  • 原始读数计数(int32 格式)存储在 .X.layers["counts"]
  • .var 必须有唯一索引(如 Ensembl ID)和 gene_name 字段
  • 计数矩阵中不能有 NaN 值
  • 建议过滤表达基因数少于 100 的细胞

步骤 2:处理数据集

1
2
cd <PROJECT_ROOT>/src/cellxgene_preprocessing
snakemake --use-conda --cores 8 --config 'datasets=["<dataset_name>"]'

处理时间:在 CPU 上约 2 小时/10,000 细胞,GPU 可显著加速。

如需使用 GPT-4 生成聚类标签(推荐),设置:

1
export OPENAI_API_KEY=sk-your-key

步骤 3:启动 CellWhisperer

1
2
3
4
conda activate cellwhisperer
cellxgene launch -p 5005 --host 0.0.0.0 --max-category-items 500 \
--var-names gene_name \
<PROJECT_ROOT>/results/<dataset_name>/cellwhisperer_clip_v1/cellxgene.h5ad

访问 http://localhost:5005 即可开始使用自然语言查询探索数据。


本地部署 AI 模型(可选)

默认情况下,Web 应用访问 https://cellwhisperer.bocklab.org 托管的 CellWhisperer API。如需本地运行:

嵌入模型(需要 4GB 显存)

cellxgene launch 命令中添加:

1
--cellwhisperer-clip-model <PROJECT_ROOT>/results/models/jointemb/cellwhisperer_clip_v1.ckpt

对话模型(需要 20GB 显存)

启动控制器:

1
2
conda activate llava
python -m llava.serve.controller --host 0.0.0.0 --port 10000

启动模型工作器:

1
2
3
4
conda activate llava
python -m llava.serve.model_worker --multi-modal --host 0.0.0.0 \
--controller localhost:10000 --port 40000 --worker localhost:40000 \
--model-path <path_to_mistral_model>

相关链接